]> Pileus Git - ~andy/gtk/blobdiff - gdk/x11/gdkscreen-x11.c
x11: Introduce _gdk_x11_get_xatom_for_display_printf()
[~andy/gtk] / gdk / x11 / gdkscreen-x11.c
index 4ab66c3575ceb8286961b893bc48d3197811cc5e..1c260423d466424191e28a9fd00f4743cf02f885 100644 (file)
@@ -135,7 +135,7 @@ _gdk_x11_screen_events_uninit (GdkScreen *screen)
 
   if (x11_screen->xsettings_client)
     {
-      xsettings_client_destroy (x11_screen->xsettings_client);
+      _gdk_x11_xsettings_client_destroy (x11_screen->xsettings_client);
       x11_screen->xsettings_client = NULL;
     }
 }
@@ -434,27 +434,23 @@ gdk_x11_screen_get_screen_number (GdkScreen *screen)
   return GDK_X11_SCREEN (screen)->screen_num;
 }
 
+static Atom
+get_cm_atom (GdkX11Screen *x11_screen)
+{
+  return _gdk_x11_get_xatom_for_display_printf (x11_screen->display, "_NET_WM_CM_S%d", x11_screen->screen_num);
+}
+
 static gboolean
 check_is_composited (GdkDisplay *display,
                     GdkX11Screen *x11_screen)
 {
-  Atom xselection = gdk_x11_atom_to_xatom_for_display (display, x11_screen->cm_selection_atom);
   Window xwindow;
   
-  xwindow = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), xselection);
+  xwindow = XGetSelectionOwner (GDK_DISPLAY_XDISPLAY (display), get_cm_atom (x11_screen));
 
   return xwindow != None;
 }
 
-static GdkAtom
-make_cm_atom (int screen_number)
-{
-  gchar *name = g_strdup_printf ("_NET_WM_CM_S%d", screen_number);
-  GdkAtom atom = gdk_atom_intern (name, FALSE);
-  g_free (name);
-  return atom;
-}
-
 static void
 init_monitor_geometry (GdkX11Monitor *monitor,
                       int x, int y, int width, int height)
@@ -1076,9 +1072,8 @@ _gdk_x11_screen_setup (GdkScreen *screen)
 {
   GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
 
-  x11_screen->cm_selection_atom = make_cm_atom (x11_screen->screen_num);
   gdk_display_request_selection_notification (x11_screen->display,
-                                             x11_screen->cm_selection_atom);
+                                             gdk_x11_xatom_to_atom_for_display (x11_screen->display, get_cm_atom (x11_screen)));
   x11_screen->is_composited = check_is_composited (x11_screen->display, x11_screen);
 }
 
@@ -1095,6 +1090,7 @@ init_randr_support (GdkScreen *screen)
 {
   GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
 
+  /* NB: This is also needed for XSettings, so don't remove. */
   XSelectInput (GDK_SCREEN_XDISPLAY (screen),
                 x11_screen->xroot_window,
                 StructureNotifyMask);
@@ -1193,10 +1189,8 @@ _gdk_x11_screen_process_owner_change (GdkScreen *screen,
 #ifdef HAVE_XFIXES
   XFixesSelectionNotifyEvent *selection_event = (XFixesSelectionNotifyEvent *)event;
   GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
-  Atom xcm_selection_atom = gdk_x11_atom_to_xatom_for_display (x11_screen->display,
-                                                              x11_screen->cm_selection_atom);
 
-  if (selection_event->selection == xcm_selection_atom)
+  if (selection_event->selection == get_cm_atom (x11_screen))
     {
       gboolean composited = selection_event->owner != None;
 
@@ -1327,87 +1321,33 @@ gdk_x11_screen_get_window_stack (GdkScreen *screen)
   return ret;
 }
 
-static gboolean
-check_transform (const gchar *xsettings_name,
-                GType        src_type,
-                GType        dest_type)
-{
-  if (!g_value_type_transformable (src_type, dest_type))
-    {
-      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));
-      return FALSE;
-    }
-  else
-    return TRUE;
-}
-
 static gboolean
 gdk_x11_screen_get_setting (GdkScreen   *screen,
                            const gchar *name,
                            GValue      *value)
 {
   GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
-  const XSettingsSetting *setting;
-  gboolean success = FALSE;
-  GValue tmp_val = G_VALUE_INIT;
+  const GValue *setting;
 
-  setting = xsettings_client_get_setting (x11_screen->xsettings_client, name);
+  setting = _gdk_x11_xsettings_client_get_setting (x11_screen->xsettings_client, name);
   if (setting == NULL)
     goto out;
 
-  switch (setting->type)
+  if (!g_value_type_transformable (G_VALUE_TYPE (setting), G_VALUE_TYPE (value)))
     {
-    case XSETTINGS_TYPE_INT:
-      if (check_transform (name, G_TYPE_INT, G_VALUE_TYPE (value)))
-       {
-         g_value_init (&tmp_val, G_TYPE_INT);
-         g_value_set_int (&tmp_val, setting->data.v_int);
-         g_value_transform (&tmp_val, value);
-
-         success = TRUE;
-       }
-      break;
-    case XSETTINGS_TYPE_STRING:
-      if (check_transform (name, G_TYPE_STRING, G_VALUE_TYPE (value)))
-       {
-         g_value_init (&tmp_val, G_TYPE_STRING);
-         g_value_set_string (&tmp_val, setting->data.v_string);
-         g_value_transform (&tmp_val, value);
-
-         success = TRUE;
-       }
-      break;
-    case XSETTINGS_TYPE_COLOR:
-      if (!check_transform (name, GDK_TYPE_RGBA, G_VALUE_TYPE (value)))
-       {
-         GdkRGBA rgba;
-
-         g_value_init (&tmp_val, GDK_TYPE_RGBA);
-
-         rgba.red = setting->data.v_color.red / 65535.0;
-         rgba.green = setting->data.v_color.green / 65535.0;
-         rgba.blue = setting->data.v_color.blue / 65535.0;
-         rgba.alpha = setting->data.v_color.alpha / 65535.0;
-
-         g_value_set_boxed (&tmp_val, &rgba);
-
-         g_value_transform (&tmp_val, value);
-
-         success = TRUE;
-       }
-      break;
+      g_warning ("Cannot transform xsetting %s of type %s to type %s\n",
+                name,
+                g_type_name (G_VALUE_TYPE (setting)),
+                g_type_name (G_VALUE_TYPE (value)));
+      goto out;
     }
 
-  g_value_unset (&tmp_val);
+  g_value_transform (setting, value);
+
+  return TRUE;
 
  out:
-  if (success)
-    return TRUE;
-  else
-    return _gdk_x11_get_xft_setting (screen, name, value);
+  return _gdk_x11_get_xft_setting (screen, name, value);
 }
 
 static void
@@ -1607,11 +1547,7 @@ _gdk_x11_screen_init_events (GdkScreen *screen)
 {
   GdkX11Screen *x11_screen = GDK_X11_SCREEN (screen);
 
-  /* Keep a flag to avoid extra notifies that we don't need
-   */
-  x11_screen->xsettings_in_init = TRUE;
-  x11_screen->xsettings_client = xsettings_client_new (screen);
-  x11_screen->xsettings_in_init = FALSE;
+  x11_screen->xsettings_client = _gdk_x11_xsettings_client_new (screen);
 }
 
 /**