]> git.sur5r.net Git - i3/i3/commitdiff
Merge branch 'master' into next
authorMichael Stapelberg <michael@stapelberg.de>
Sat, 17 Dec 2011 22:35:13 +0000 (22:35 +0000)
committerMichael Stapelberg <michael@stapelberg.de>
Sat, 17 Dec 2011 22:35:13 +0000 (22:35 +0000)
1  2 
src/config.c

diff --combined src/config.c
index 7b0b34e34eea6d1536c58ea3aefd3ed82c12bb6c,7fc15c0dc0d5fdf04828df77a4665f8f21083b59..47a701d2aef2c6c16a2f0e70f9be89165b88d890
@@@ -82,40 -82,48 +82,48 @@@ Binding *get_binding(uint16_t modifiers
   *
   */
  void translate_keysyms() {
-         Binding *bind;
-         TAILQ_FOREACH(bind, bindings, bindings) {
-                 if (bind->keycode > 0)
-                         continue;
-                 /* We need to translate the symbol to a keycode */
-                 xcb_keysym_t keysym = XStringToKeysym(bind->symbol);
-                 if (keysym == NoSymbol) {
-                         ELOG("Could not translate string to key symbol: \"%s\"\n", bind->symbol);
-                         continue;
-                 }
-                 uint32_t last_keycode = 0;
-                 xcb_keycode_t *keycodes = xcb_key_symbols_get_keycode(keysyms, keysym);
-                 if (keycodes == NULL) {
-                         DLOG("Could not translate symbol \"%s\"\n", bind->symbol);
-                         continue;
-                 }
-                 bind->number_keycodes = 0;
+     Binding *bind;
+     xcb_keysym_t keysym;
+     int col;
+     xcb_keycode_t i,
+                   min_keycode = xcb_get_setup(conn)->min_keycode,
+                   max_keycode = xcb_get_setup(conn)->max_keycode;
+     TAILQ_FOREACH(bind, bindings, bindings) {
+         if (bind->keycode > 0)
+             continue;
+         /* We need to translate the symbol to a keycode */
+         keysym = XStringToKeysym(bind->symbol);
+         if (keysym == NoSymbol) {
+             ELOG("Could not translate string to key symbol: \"%s\"\n",
+                  bind->symbol);
+             continue;
+         }
  
-                 for (xcb_keycode_t *walk = keycodes; *walk != 0; walk++) {
-                         /* We hope duplicate keycodes will be returned in order
-                          * and skip them */
-                         if (last_keycode == *walk)
-                                 continue;
-                         last_keycode = *walk;
-                         bind->number_keycodes++;
-                 }
-                 DLOG("Translated symbol \"%s\" to %d keycode\n", bind->symbol, bind->number_keycodes);
-                 bind->translated_to = smalloc(bind->number_keycodes * sizeof(xcb_keycode_t));
-                 memcpy(bind->translated_to, keycodes, bind->number_keycodes * sizeof(xcb_keycode_t));
-                 free(keycodes);
+         /* Base column we use for looking up key symbols. We always consider
+          * the base column and the corresponding shift column, so without
+          * mode_switch, we look in 0 and 1, with mode_switch we look in 2 and
+          * 3. */
+         col = (bind->mods & BIND_MODE_SWITCH ? 2 : 0);
+         FREE(bind->translated_to);
+         bind->number_keycodes = 0;
+         for (i = min_keycode; i && i <= max_keycode; i++) {
+             if ((xcb_key_symbols_get_keysym(keysyms, i, col) != keysym) &&
+                 (xcb_key_symbols_get_keysym(keysyms, i, col+1) != keysym))
+                 continue;
+             bind->number_keycodes++;
+             bind->translated_to = srealloc(bind->translated_to,
+                                            (sizeof(xcb_keycode_t) *
+                                             bind->number_keycodes));
+             bind->translated_to[bind->number_keycodes-1] = i;
          }
+         DLOG("Translated symbol \"%s\" to %d keycode\n", bind->symbol,
+              bind->number_keycodes);
+     }
  }
  
  /*
@@@ -299,7 -307,6 +307,7 @@@ void load_configuration(xcb_connection_
              FREE(barconfig->tray_output);
              FREE(barconfig->socket_path);
              FREE(barconfig->status_command);
 +            FREE(barconfig->i3bar_command);
              FREE(barconfig->font);
              FREE(barconfig->colors.background);
              FREE(barconfig->colors.statusline);
          TAILQ_FOREACH(ws, workspaces, workspaces)
              workspace_set_name(ws, NULL);
  #endif
 +
 +        /* Invalidate pixmap caches in case font or colors changed */
 +        Con *con;
 +        TAILQ_FOREACH(con, &all_cons, all_cons)
 +            FREE(con->deco_render_params);
 +
 +        /* Get rid of the current font */
 +        free_font();
      }
  
      SLIST_INIT(&modes);
      if (config.font.id == 0) {
          ELOG("You did not specify required configuration option \"font\"\n");
          config.font = load_font("fixed", true);
 +        set_font(&config.font);
 +    }
 +
 +    /* Redraw the currently visible decorations on reload, so that
 +     * the possibly new drawing parameters changed. */
 +    if (reload) {
 +        x_deco_recurse(croot);
 +        xcb_flush(conn);
      }
  
  #if 0