[BACK]Return to server-client.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / tmux

Diff for /src/usr.bin/tmux/server-client.c between version 1.222 and 1.223

version 1.222, 2017/04/21 14:01:19 version 1.223, 2017/04/21 16:04:18
Line 138 
Line 138 
         return (name);          return (name);
 }  }
   
 /* Is this client using the default key table? */  /* Is this table the default key table? */
 int  static int
 server_client_is_default_key_table(struct client *c)  server_client_is_default_key_table(struct client *c, struct key_table *table)
 {  {
         return (strcmp(c->keytable->name, server_client_get_key_table(c)) == 0);          return (strcmp(table->name, server_client_get_key_table(c)) == 0);
 }  }
   
 /* Create a new client. */  /* Create a new client. */
Line 793 
Line 793 
         struct window           *w;          struct window           *w;
         struct window_pane      *wp;          struct window_pane      *wp;
         struct timeval           tv;          struct timeval           tv;
         const char              *name;          struct key_table        *table, *first;
         struct key_table        *table;  
         struct key_binding       bd_find, *bd;          struct key_binding       bd_find, *bd;
         int                      xtimeout;          int                      xtimeout;
         struct cmd_find_state    fs;          struct cmd_find_state    fs;
Line 870 
Line 869 
         if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s))          if (!KEYC_IS_MOUSE(key) && server_client_assume_paste(s))
                 goto forward;                  goto forward;
   
 retry:  
         /*          /*
          * Work out the current key table. If the pane is in a mode, use           * Work out the current key table. If the pane is in a mode, use
          * the mode table instead of the default key table.           * the mode table instead of the default key table.
          */           */
         name = NULL;          if (server_client_is_default_key_table(c, c->keytable) &&
         if (wp != NULL && wp->mode != NULL && wp->mode->key_table != NULL)              wp != NULL &&
                 name = wp->mode->key_table(wp);              wp->mode != NULL &&
         if (name == NULL || !server_client_is_default_key_table(c))              wp->mode->key_table != NULL)
                 table = c->keytable;                  table = key_bindings_get_table(wp->mode->key_table(wp), 1);
         else          else
                 table = key_bindings_get_table(name, 1);                  table = c->keytable;
         if (wp == NULL)          first = table;
                 log_debug("key table %s (no pane)", table->name);  
         else  
                 log_debug("key table %s (pane %%%u)", table->name, wp->id);  
   
         /*          /*
          * The prefix always takes precedence and forces a switch to the prefix           * The prefix always takes precedence and forces a switch to the prefix
Line 899 
Line 894 
                 return;                  return;
         }          }
   
   retry:
           /* Log key table. */
           if (wp == NULL)
                   log_debug("key table %s (no pane)", table->name);
           else
                   log_debug("key table %s (pane %%%u)", table->name, wp->id);
   
         /* Try to see if there is a key binding in the current table. */          /* Try to see if there is a key binding in the current table. */
         bd_find.key = key;          bd_find.key = key;
         bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);          bd = RB_FIND(key_bindings, &table->key_bindings, &bd_find);
Line 913 
Line 915 
                         server_client_set_key_table(c, NULL);                          server_client_set_key_table(c, NULL);
                         c->flags &= ~CLIENT_REPEAT;                          c->flags &= ~CLIENT_REPEAT;
                         server_status_client(c);                          server_status_client(c);
                           table = c->keytable;
                         goto retry;                          goto retry;
                 }                  }
                   log_debug("found in key table %s", table->name);
   
                 /*                  /*
                  * Take a reference to this table to make sure the key binding                   * Take a reference to this table to make sure the key binding
Line 959 
Line 963 
         }          }
   
         /*          /*
          * No match in this table. If repeating, switch the client back to the           * No match in this table. If not in the root table or if repeating,
          * root table and try again.           * switch the client back to the root table and try again.
          */           */
         if (c->flags & CLIENT_REPEAT) {          log_debug("not found in key table %s", table->name);
           if (!server_client_is_default_key_table(c, table) ||
               (c->flags & CLIENT_REPEAT)) {
                 server_client_set_key_table(c, NULL);                  server_client_set_key_table(c, NULL);
                 c->flags &= ~CLIENT_REPEAT;                  c->flags &= ~CLIENT_REPEAT;
                 server_status_client(c);                  server_status_client(c);
                   table = c->keytable;
                 goto retry;                  goto retry;
         }          }
   
         /* If no match and we're not in the root table, that's it. */          /*
         if (name == NULL && !server_client_is_default_key_table(c)) {           * No match in the root table either. If this wasn't the first table
                 log_debug("no key in key table %s", table->name);           * tried, don't pass the key to the pane.
            */
           if (first != table) {
                 server_client_set_key_table(c, NULL);                  server_client_set_key_table(c, NULL);
                 server_status_client(c);                  server_status_client(c);
                 return;                  return;

Legend:
Removed from v.1.222  
changed lines
  Added in v.1.223