]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/gdkwindow-x11.c
Fixes from #98358, Havoc Pennington.
[~andy/gtk] / gdk / x11 / gdkwindow-x11.c
index 9cd5f221678c1fb0d31ef46fb8958acb2c9aab2b..3904619f93d74b592f72e9a524c1365c03c70801 100644 (file)
@@ -83,6 +83,9 @@ static void     gdk_window_set_static_win_gravity (GdkWindow  *window,
 static gboolean gdk_window_have_shape_ext         (GdkDisplay *display);
 static gboolean gdk_window_icon_name_set          (GdkWindow  *window);
 static void     gdk_window_add_colormap_windows   (GdkWindow  *window);
+static void     set_wm_name                       (GdkDisplay  *display,
+                                                  Window       xwindow,
+                                                  const gchar *name);
 
 static GdkColormap* gdk_window_impl_x11_get_colormap (GdkDrawable *drawable);
 static void         gdk_window_impl_x11_set_colormap (GdkDrawable *drawable,
@@ -225,7 +228,7 @@ gdk_window_impl_x11_set_colormap (GdkDrawable *drawable,
   impl = GDK_WINDOW_IMPL_X11 (drawable);
   draw_impl = GDK_DRAWABLE_IMPL_X11 (drawable);
 
-  if (GDK_WINDOW_DESTROYED (draw_impl->wrapper))
+  if (cmap && GDK_WINDOW_DESTROYED (draw_impl->wrapper))
     return;
 
   /* chain up */
@@ -291,7 +294,8 @@ _gdk_windowing_window_init (GdkScreen * screen)
 
   g_assert (screen_x11->root_window == NULL);
 
-  screen_x11->default_colormap = gdk_screen_get_system_colormap (screen);
+  gdk_screen_set_default_colormap (screen,
+                                  gdk_screen_get_system_colormap (screen));
 
   XGetGeometry (screen_x11->xdisplay, screen_x11->xroot_window,
                &screen_x11->xroot_window, &x, &y, &width, &height, &border_width, &depth);
@@ -306,6 +310,7 @@ _gdk_windowing_window_init (GdkScreen * screen)
   draw_impl->xid = screen_x11->xroot_window;
   draw_impl->wrapper = GDK_DRAWABLE (private);
   draw_impl->colormap = gdk_screen_get_system_colormap (screen);
+  g_object_ref (draw_impl->colormap);
   
   private->window_type = GDK_WINDOW_ROOT;
   private->depth = depth;
@@ -333,6 +338,33 @@ set_wm_protocols (GdkWindow *window)
   XSetWMProtocols (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window), protocols, 3);
 }
 
+static const gchar *
+get_default_title (void)
+{
+  const char *title;
+
+  title = g_get_application_name ();
+  if (!title)
+    title = g_get_prgname ();
+
+  return title;
+}
+
+static void
+check_leader_window_title (GdkDisplay *display)
+{
+  GdkDisplayX11 *display_x11 = GDK_DISPLAY_X11 (display);
+
+  if (!display_x11->leader_window_title_set)
+    {
+      set_wm_name (display,
+                  display_x11->leader_window,
+                  get_default_title ());
+      
+      display_x11->leader_window_title_set = TRUE;
+    }
+}
+
 /**
  * gdk_window_new:
  * @parent: a #GdkWindow, or %NULL to create the window as a child of
@@ -373,7 +405,7 @@ gdk_window_new (GdkWindow     *parent,
   int x, y, depth;
   
   unsigned int class;
-  char *title;
+  const char *title;
   int i;
   long pid;
   
@@ -624,6 +656,8 @@ gdk_window_new (GdkWindow     *parent,
   size_hints.flags = PSize;
   size_hints.width = impl->width;
   size_hints.height = impl->height;
+
+  check_leader_window_title (screen_x11->display);
   
   wm_hints.flags = StateHint | WindowGroupHint;
   wm_hints.window_group = GDK_DISPLAY_X11 (screen_x11->display)->leader_window;
@@ -656,7 +690,7 @@ gdk_window_new (GdkWindow     *parent,
   if (attributes_mask & GDK_WA_TITLE)
     title = attributes->title;
   else
-    title = g_get_prgname ();
+    title = get_default_title ();
 
   gdk_window_set_title (window, title);
   
@@ -1630,7 +1664,7 @@ gdk_window_set_type_hint (GdkWindow        *window,
       atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_TYPE_UTILITY");
       break;
     case GDK_WINDOW_TYPE_HINT_SPLASHSCREEN:
-      atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_TYPE_SPLASHSCREEN");
+      atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_TYPE_SPLASH");
       break;
     case GDK_WINDOW_TYPE_HINT_DOCK:
       atom = gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_WINDOW_TYPE_DOCK");
@@ -2002,7 +2036,8 @@ utf8_is_latin1 (const gchar *str)
  * convertable to STRING, otherwise, set it as compound text
  */
 static void
-set_text_property (GdkWindow   *window,
+set_text_property (GdkDisplay  *display,
+                  Window       xwindow,
                   Atom         property,
                   const gchar *utf8_str)
 {
@@ -2022,17 +2057,16 @@ set_text_property (GdkWindow   *window,
     {
       GdkAtom gdk_type;
       
-      gdk_utf8_to_compound_text_for_display (gdk_drawable_get_display (window),
+      gdk_utf8_to_compound_text_for_display (display,
                                             utf8_str, &gdk_type, &prop_format,
                                             &prop_text, &prop_length);
-      prop_type = gdk_x11_atom_to_xatom_for_display 
-       (GDK_WINDOW_DISPLAY (window), gdk_type);
+      prop_type = gdk_x11_atom_to_xatom_for_display (display, gdk_type);
     }
 
   if (prop_text)
     {
-      XChangeProperty (GDK_WINDOW_XDISPLAY (window),
-                      GDK_WINDOW_XID (window),
+      XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
+                      xwindow,
                       property,
                       prop_type, prop_format,
                       PropModeReplace, prop_text,
@@ -2042,6 +2076,23 @@ set_text_property (GdkWindow   *window,
     }
 }
 
+/* Set WM_NAME and _NET_WM_NAME
+ */
+static void
+set_wm_name (GdkDisplay  *display,
+            Window       xwindow,
+            const gchar *name)
+{
+  XChangeProperty (GDK_DISPLAY_XDISPLAY (display), xwindow,
+                  gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_NAME"),
+                  gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"), 8,
+                  PropModeReplace, name, strlen (name));
+  
+  set_text_property (display, xwindow,
+                    gdk_x11_get_xatom_by_name_for_display (display, "WM_NAME"),
+                    name);
+}
+
 /**
  * gdk_window_set_title:
  * @window: a toplevel #GdkWindow
@@ -2058,6 +2109,8 @@ gdk_window_set_title (GdkWindow   *window,
                      const gchar *title)
 {
   GdkDisplay *display;
+  Display *xdisplay;
+  Window xwindow;
   
   g_return_if_fail (window != NULL);
   g_return_if_fail (GDK_IS_WINDOW (window));
@@ -2067,24 +2120,19 @@ gdk_window_set_title (GdkWindow   *window,
     return;
   
   display = gdk_drawable_get_display (window);
+  xdisplay = GDK_DISPLAY_XDISPLAY (display);
+  xwindow = GDK_WINDOW_XID (window);
 
-  XChangeProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window),
-                  gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_NAME"),
-                  gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"), 8,
-                  PropModeReplace, title, strlen (title));
-  
-  set_text_property (window,
-                    gdk_x11_get_xatom_by_name_for_display (display, "WM_NAME"),
-                    title);
+  set_wm_name (display, xwindow, title);
   
   if (!gdk_window_icon_name_set (window))
     {
-      XChangeProperty (GDK_DISPLAY_XDISPLAY (display), GDK_WINDOW_XID (window),
+      XChangeProperty (xdisplay, xwindow,
                       gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_ICON_NAME"),
                       gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"), 8,
                       PropModeReplace, title, strlen (title));
       
-      set_text_property (window,
+      set_text_property (display, xwindow,
                         gdk_x11_get_xatom_by_name_for_display (display, "WM_ICON_NAME"),
                         title);
     }
@@ -3243,13 +3291,13 @@ gdk_window_set_icon_name (GdkWindow   *window,
   g_object_set_qdata (G_OBJECT (window), g_quark_from_static_string ("gdk-icon-name-set"),
                      GUINT_TO_POINTER (TRUE));
 
-  XChangeProperty (GDK_WINDOW_XDISPLAY (window),
+  XChangeProperty (GDK_DISPLAY_XDISPLAY (display),
                   GDK_WINDOW_XID (window),
                   gdk_x11_get_xatom_by_name_for_display (display, "_NET_WM_ICON_NAME"),
                   gdk_x11_get_xatom_by_name_for_display (display, "UTF8_STRING"), 8,
                   PropModeReplace, name, strlen (name));
   
-  set_text_property (window,
+  set_text_property (display, GDK_WINDOW_XID (window),
                     gdk_x11_get_xatom_by_name_for_display (display, "WM_ICON_NAME"),
                     name);
 }
@@ -4607,7 +4655,7 @@ _gdk_moveresize_handle_event (XEvent *event)
   GdkDisplay *display= gdk_x11_lookup_xdisplay (event->xany.display);
   MoveResizeData *mv_resize = get_move_resize_data (display, FALSE);
 
-  if (!mv_resize || mv_resize->moveresize_window)
+  if (!mv_resize || !mv_resize->moveresize_window)
     return FALSE;
 
   window_private = (GdkWindowObject *) mv_resize->moveresize_window;