]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/gdkevents-x11.c
Apply a patch by Chris Wilson to avoid spurious valgrind warnings from
[~andy/gtk] / gdk / x11 / gdkevents-x11.c
index 4a06cb0dd624ade3effa0257b7ef3d6f1652c744..0dd3b847a907c6fd3a1fc76f7374da35b7a0ec9d 100644 (file)
@@ -18,7 +18,7 @@
  */
 
 /*
- * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
+ * Modified by the GTK+ Team and others 1997-2007.  See the AUTHORS
  * file for a list of people on the GTK+ Team.  See the ChangeLog
  * files for a list of changes.  These files are distributed with
  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
 #include <string.h>
 
 #include "gdkinputprivate.h"
-
+#include "gdksettings.c"
 #include "gdkalias.h"
 
+
 #ifdef HAVE_XKB
 #include <X11/XKBlib.h>
 #endif
@@ -176,15 +177,13 @@ _gdk_x11_events_init_screen (GdkScreen *screen)
   /* Keep a flag to avoid extra notifies that we don't need
    */
   screen_x11->xsettings_in_init = TRUE;
-  screen_x11->xsettings_client = xsettings_client_new (screen_x11->xdisplay,
-                                                      screen_x11->screen_num,
-                                                      gdk_xsettings_notify_cb,
-                                                      gdk_xsettings_watch_cb,
-                                                      screen);
-  xsettings_client_set_grab_func (screen_x11->xsettings_client,
-                                 refcounted_grab_server);
-  xsettings_client_set_ungrab_func (screen_x11->xsettings_client,
-                                   refcounted_ungrab_server);
+  screen_x11->xsettings_client = xsettings_client_new_with_grab_funcs (screen_x11->xdisplay,
+                                                                      screen_x11->screen_num,
+                                                                      gdk_xsettings_notify_cb,
+                                                                      gdk_xsettings_watch_cb,
+                                                                      screen,
+                                                                       refcounted_grab_server,
+                                                                       refcounted_ungrab_server);
   screen_x11->xsettings_in_init = FALSE;
 }
 
@@ -230,6 +229,20 @@ _gdk_events_init (GdkDisplay *display)
                                         NULL);
 }
 
+void
+_gdk_events_uninit (GdkDisplay *display)
+{
+  GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
+
+  if (display_x11->event_source)
+    {
+      display_sources = g_list_remove (display_sources,
+                                       display_x11->event_source);
+      g_source_destroy (display_x11->event_source);
+      g_source_unref (display_x11->event_source);
+      display_x11->event_source = NULL;
+    }
+}
 
 /**
  * gdk_events_pending:
@@ -1805,7 +1818,13 @@ gdk_event_translate (GdkDisplay *display,
                           ? " (discarding substructure)"
                           : ""));
       if (window && GDK_WINDOW_TYPE (window) == GDK_WINDOW_ROOT)
-       _gdk_x11_screen_size_changed (screen, xevent);
+        { 
+         window_impl->width = xevent->xconfigure.width;
+         window_impl->height = xevent->xconfigure.height;
+         
+         _gdk_x11_drawable_update_size (window_private->impl);
+         _gdk_x11_screen_size_changed (screen, xevent);
+        }
 
       if (window &&
          xevent->xconfigure.event == xevent->xconfigure.window &&
@@ -2063,6 +2082,9 @@ gdk_event_translate (GdkDisplay *display,
       if (xevent->type - display_x11->xfixes_event_base == XFixesSelectionNotify)
        {
          XFixesSelectionNotifyEvent *selection_notify = (XFixesSelectionNotifyEvent *)xevent;
+
+         _gdk_x11_screen_process_owner_change (screen, xevent);
+         
          event->owner_change.type = GDK_OWNER_CHANGE;
          event->owner_change.window = window;
          event->owner_change.owner = selection_notify->owner;
@@ -2072,7 +2094,7 @@ gdk_event_translate (GdkDisplay *display,
                                               selection_notify->selection);
          event->owner_change.time = selection_notify->timestamp;
          event->owner_change.selection_time = selection_notify->selection_timestamp;
-
+         
          return_val = TRUE;
        }
       else
@@ -2169,13 +2191,13 @@ gdk_wm_protocols_filter (GdkXEvent *xev,
           !_gdk_x11_display_is_root_window (display,
                                             xevent->xclient.window))
     {
-      XEvent xev = *xevent;
+      XClientMessageEvent xclient = xevent->xclient;
       
-      xev.xclient.window = GDK_WINDOW_XROOTWIN (win);
+      xclient.window = GDK_WINDOW_XROOTWIN (win);
       XSendEvent (GDK_WINDOW_XDISPLAY (win), 
-                 xev.xclient.window,
+                 xclient.window,
                  False, 
-                 SubstructureRedirectMask | SubstructureNotifyMask, &xev);
+                 SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *)&xclient);
 
       return GDK_FILTER_REMOVE;
     }
@@ -2557,6 +2579,8 @@ fetch_net_wm_check_window (GdkScreen *screen)
   
   screen_x11 = GDK_SCREEN_X11 (screen);
   display = screen_x11->display;
+
+  g_return_if_fail (GDK_DISPLAY_X11 (display)->trusted_client);
   
   if (screen_x11->wmspec_check_window != None)
     return; /* already have it */
@@ -2614,6 +2638,9 @@ gdk_x11_screen_get_window_manager_name (GdkScreen *screen)
 
   screen_x11 = GDK_SCREEN_X11 (screen);
   
+  if (!G_LIKELY (GDK_DISPLAY_X11 (screen_x11->display)->trusted_client))
+    return screen_x11->window_manager_name;
+
   fetch_net_wm_check_window (screen);
 
   if (screen_x11->need_refetch_wm_name)
@@ -2709,6 +2736,9 @@ gdk_x11_screen_supports_net_wm_hint (GdkScreen *screen,
   screen_x11 = GDK_SCREEN_X11 (screen);
   display = screen_x11->display;
 
+  if (!G_LIKELY (GDK_DISPLAY_X11 (display)->trusted_client))
+    return FALSE;
+
   supported_atoms = g_object_get_data (G_OBJECT (screen), "gdk-net-wm-supported-atoms");
   if (!supported_atoms)
     {
@@ -2780,42 +2810,6 @@ gdk_net_wm_supports (GdkAtom property)
   return gdk_x11_screen_supports_net_wm_hint (gdk_screen_get_default (), property);
 }
 
-static const struct
-{
-  const char *xsettings_name;
-  const char *gdk_name;
-} settings_map[] = {
-  { "Net/DoubleClickTime", "gtk-double-click-time" },
-  { "Net/DoubleClickDistance", "gtk-double-click-distance" },
-  { "Net/DndDragThreshold", "gtk-dnd-drag-threshold" },
-  { "Net/CursorBlink", "gtk-cursor-blink" },
-  { "Net/CursorBlinkTime", "gtk-cursor-blink-time" },
-  { "Net/ThemeName", "gtk-theme-name" },
-  { "Net/IconThemeName", "gtk-icon-theme-name" },
-  { "Gtk/CanChangeAccels", "gtk-can-change-accels" },
-  { "Gtk/ColorPalette", "gtk-color-palette" },
-  { "Gtk/FontName", "gtk-font-name" },
-  { "Gtk/IconSizes", "gtk-icon-sizes" },
-  { "Gtk/KeyThemeName", "gtk-key-theme-name" },
-  { "Gtk/ToolbarStyle", "gtk-toolbar-style" },
-  { "Gtk/ToolbarIconSize", "gtk-toolbar-icon-size" },
-  { "Gtk/IMPreeditStyle", "gtk-im-preedit-style" },
-  { "Gtk/IMStatusStyle", "gtk-im-status-style" },
-  { "Gtk/Modules", "gtk-modules" },
-  { "Gtk/FileChooserBackend", "gtk-file-chooser-backend" },
-  { "Gtk/ButtonImages", "gtk-button-images" },
-  { "Gtk/MenuImages", "gtk-menu-images" },
-  { "Gtk/MenuBarAccel", "gtk-menu-bar-accel" },
-  { "Gtk/CursorThemeName", "gtk-cursor-theme-name" },
-  { "Gtk/CursorThemeSize", "gtk-cursor-theme-size" },
-  { "Gtk/ShowInputMethodMenu", "gtk-show-input-method-menu" },
-  { "Gtk/ShowUnicodeMenu", "gtk-show-unicode-menu" },
-  { "Xft/Antialias", "gtk-xft-antialias" },
-  { "Xft/Hinting", "gtk-xft-hinting" },
-  { "Xft/HintStyle", "gtk-xft-hintstyle" },
-  { "Xft/RGBA", "gtk-xft-rgba" },
-  { "Xft/DPI", "gtk-xft-dpi" },
-};
 
 static void
 gdk_xsettings_notify_cb (const char       *name,
@@ -2836,10 +2830,10 @@ gdk_xsettings_notify_cb (const char       *name,
   new_event.setting.send_event = FALSE;
   new_event.setting.name = NULL;
 
-  for (i = 0; i < G_N_ELEMENTS (settings_map) ; i++)
-    if (strcmp (settings_map[i].xsettings_name, name) == 0)
+  for (i = 0; i < GDK_SETTINGS_N_ELEMENTS() ; i++)
+    if (strcmp (GDK_SETTINGS_X_NAME (i), name) == 0)
       {
-       new_event.setting.name = (char *)settings_map[i].gdk_name;
+       new_event.setting.name = (char*) GDK_SETTINGS_GDK_NAME (i);
        break;
       }
   
@@ -2869,7 +2863,7 @@ check_transform (const gchar *xsettings_name,
 {
   if (!g_value_type_transformable (src_type, dest_type))
     {
-      g_warning ("Cannot tranform xsetting %s of type %s to type %s\n",
+      g_warning ("Cannot transform xsetting %s of type %s to type %s\n",
                 xsettings_name,
                 g_type_name (src_type),
                 g_type_name (dest_type));
@@ -2914,10 +2908,10 @@ gdk_screen_get_setting (GdkScreen   *screen,
   
   screen_x11 = GDK_SCREEN_X11 (screen);
 
-  for (i = 0; i < G_N_ELEMENTS (settings_map) ; i++)
-    if (strcmp (settings_map[i].gdk_name, name) == 0)
+  for (i = 0; i < GDK_SETTINGS_N_ELEMENTS(); i++)
+    if (strcmp (GDK_SETTINGS_GDK_NAME (i), name) == 0)
       {
-       xsettings_name = settings_map[i].xsettings_name;
+       xsettings_name = GDK_SETTINGS_X_NAME (i);
        break;
       }
 
@@ -3012,16 +3006,13 @@ gdk_xsettings_watch_cb (Window   window,
     {
       if (!gdkwin)
        gdkwin = gdk_window_foreign_new_for_display (gdk_screen_get_display (screen), window);
-      else
-       g_object_ref (gdkwin);
       
       gdk_window_add_filter (gdkwin, gdk_xsettings_client_event_filter, screen);
     }
   else
     {
-      g_assert (gdkwin);
-      gdk_window_remove_filter (gdkwin, gdk_xsettings_client_event_filter, screen);
-      g_object_unref (gdkwin);
+      if (gdkwin)
+        gdk_window_remove_filter (gdkwin, gdk_xsettings_client_event_filter, screen);
     }
 }