]> Pileus Git - ~andy/gtk/commitdiff
*** empty log message ***
authorMatthias Clasen <matthiasc@src.gnome.org>
Tue, 20 Sep 2005 05:28:34 +0000 (05:28 +0000)
committerMatthias Clasen <matthiasc@src.gnome.org>
Tue, 20 Sep 2005 05:28:34 +0000 (05:28 +0000)
ChangeLog
ChangeLog.pre-2-10
gdk/x11/gdkdisplay-x11.c
gdk/x11/gdkevents-x11.c
gdk/x11/gdkkeys-x11.c
gdk/x11/gdkprivate-x11.h

index ce73bde5aa13fa71cbc9e6cbfb1c45df8f62c901..9f02a50938316233b8cbd25d4b5886346d6b509b 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,17 @@
+2005-09-20  Matthias Clasen  <mclasen@redhat.com>
+
+       Avoid unnecessary XkbGetState() calls and XkbStateNotify
+       events.  (#151555, Søren Sandmann)
+
+       * gdk/x11/gdkdisplay-x11.c (gdk_display_open): Use 
+       XkbSelectEventDetails() to select XkbStateNotify events
+       for only the state we care about.
+
+       * gdk/x11/gdkprivate-x11.h:
+       * gdk/x11/gdkkeys-x11.c (_gdk_keymap_state_changed): Pass
+       the event into the function and update the keymap state from
+       the state information contained in the event. Adjust all callers.
+       
 2005-09-19  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkiconview.c: Use g_list_nth_data() instead of g_list_nth()->data
index ce73bde5aa13fa71cbc9e6cbfb1c45df8f62c901..9f02a50938316233b8cbd25d4b5886346d6b509b 100644 (file)
@@ -1,3 +1,17 @@
+2005-09-20  Matthias Clasen  <mclasen@redhat.com>
+
+       Avoid unnecessary XkbGetState() calls and XkbStateNotify
+       events.  (#151555, Søren Sandmann)
+
+       * gdk/x11/gdkdisplay-x11.c (gdk_display_open): Use 
+       XkbSelectEventDetails() to select XkbStateNotify events
+       for only the state we care about.
+
+       * gdk/x11/gdkprivate-x11.h:
+       * gdk/x11/gdkkeys-x11.c (_gdk_keymap_state_changed): Pass
+       the event into the function and update the keymap state from
+       the state information contained in the event. Adjust all callers.
+       
 2005-09-19  Matthias Clasen  <mclasen@redhat.com>
 
        * gtk/gtkiconview.c: Use g_list_nth_data() instead of g_list_nth()->data
index fac1a5ef52977923ac91993c6e75aca413a98a15..14a46deed54cb121fd6cac843df1c352cbdfee4c 100644 (file)
@@ -281,6 +281,11 @@ gdk_display_open (const gchar *display_name)
                              XkbNewKeyboardNotifyMask | XkbMapNotifyMask | XkbStateNotifyMask,
                              XkbNewKeyboardNotifyMask | XkbMapNotifyMask | XkbStateNotifyMask);
 
+           /* keep this in sync with _gdk_keymap_state_changed() */ 
+           XkbSelectEventDetails (display_x11->xdisplay,
+                                  XkbUseCoreKbd, XkbStateNotify,
+                                  XkbGroupLockMask, XkbGroupLockMask);
+
            XkbSetDetectableAutoRepeat (display_x11->xdisplay,
                                        True,
                                        &detectable_autorepeat_supported);
index d2e6a0d7c33ec7786c68a20506a7b83854946d35..522e1cdf68c6df18721518950bcf5baf76d6325b 100644 (file)
@@ -2050,7 +2050,7 @@ gdk_event_translate (GdkDisplay *display,
              break;
              
            case XkbStateNotify:
-             _gdk_keymap_state_changed (display);
+             _gdk_keymap_state_changed (display, xevent);
              break;
            }
        }
index 48aa0383e9d324c66c5a0005310d5dd3b8a268cc..bf0f39b1d0bb66a79620ac3a34df2cda5e2284a2 100644 (file)
@@ -536,16 +536,12 @@ get_direction (XkbDescRec *xkb,
 }
 
 static void
-update_direction (GdkKeymapX11 *keymap_x11)
+update_direction (GdkKeymapX11 *keymap_x11,
+                 gint          group)
 {
   XkbDescRec *xkb = get_xkb (keymap_x11);
-  XkbStateRec state_rec;
-  GdkDisplay *display = GDK_KEYMAP (keymap_x11)->display;
-  gint group;
   Atom group_atom;
 
-  XkbGetState (GDK_DISPLAY_XDISPLAY (display), XkbUseCoreKbd, &state_rec);
-  group = XkbGroupLock (&state_rec);
   group_atom = xkb->names->groups[group];
 
   /* a group change? */
@@ -609,32 +605,29 @@ update_direction (GdkKeymapX11 *keymap_x11)
     }
 }
 
-static void
-_gdk_keymap_direction_changed (GdkKeymapX11 *keymap_x11)
-{
-  gboolean had_direction;
-  PangoDirection direction;
-
-  had_direction = keymap_x11->have_direction;
-  direction = keymap_x11->current_direction;
-
-  update_direction (keymap_x11);
-  
-  if (!had_direction || direction != keymap_x11->current_direction)
-    g_signal_emit_by_name (keymap_x11, "direction_changed");
-}
-
-
+/* keep this in sync with the XkbSelectEventDetails() call 
+ * in gdk_display_open()
+ */
 void
-_gdk_keymap_state_changed (GdkDisplay *display)
+_gdk_keymap_state_changed (GdkDisplay *display,
+                          XEvent     *xevent)
 {
   GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
+  XkbEvent *xkb_event = (XkbEvent *)xevent;
   
   if (display_x11->keymap)
     {
       GdkKeymapX11 *keymap_x11 = GDK_KEYMAP_X11 (display_x11->keymap);
+      gboolean had_direction;
+      PangoDirection direction;
+      
+      had_direction = keymap_x11->have_direction;
+      direction = keymap_x11->current_direction;
       
-      _gdk_keymap_direction_changed (keymap_x11);
+      update_direction (keymap_x11, xkb_event->state.locked_group);
+      
+      if (!had_direction || direction != keymap_x11->current_direction)
+       g_signal_emit_by_name (keymap_x11, "direction_changed");      
     }
 }
 
@@ -660,9 +653,16 @@ gdk_keymap_get_direction (GdkKeymap *keymap)
   if (KEYMAP_USE_XKB (keymap))
     {
       GdkKeymapX11 *keymap_x11 = GDK_KEYMAP_X11 (keymap);
-      
+
       if (!keymap_x11->have_direction)
-       update_direction (keymap_x11);
+       {
+         GdkDisplay *display = GDK_KEYMAP (keymap_x11)->display;
+         XkbStateRec state_rec;
+
+         XkbGetState (GDK_DISPLAY_XDISPLAY (display), XkbUseCoreKbd, 
+                      &state_rec);
+         update_direction (keymap_x11, XkbGroupLock (&state_rec));
+       }
   
       return keymap_x11->current_direction;
     }
index 26f94fe349a6bcecec9e0c7b37859446e50d9a6a..73f4410c327f04dacaf29b1df569c86430016413 100644 (file)
@@ -139,7 +139,8 @@ gboolean _gdk_moveresize_handle_event   (XEvent     *event);
 gboolean _gdk_moveresize_configure_done (GdkDisplay *display,
                                         GdkWindow  *window);
 
-void _gdk_keymap_state_changed    (GdkDisplay      *display);
+void _gdk_keymap_state_changed    (GdkDisplay      *display,
+                                  XEvent          *event);
 void _gdk_keymap_keys_changed     (GdkDisplay      *display);
 gint _gdk_x11_get_group_for_state (GdkDisplay      *display,
                                   GdkModifierType  state);