#include <X11/extensions/Xfixes.h>
#endif
-#include "gdksettings.c"
-
static void gdk_x11_screen_dispose (GObject *object);
static void gdk_x11_screen_finalize (GObject *object);
static void init_randr_support (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;
}
}
{
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);
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 char *xsettings_name = NULL;
- const XSettingsSetting *setting;
- gboolean success = FALSE;
- GValue tmp_val = G_VALUE_INIT;
-
- xsettings_name = gdk_to_xsettings_name (name);
- if (!xsettings_name)
- goto out;
+ const GValue *setting;
- setting = xsettings_client_get_setting (x11_screen->xsettings_client, xsettings_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 (xsettings_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 (xsettings_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 (xsettings_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
return FALSE;
}
-static GdkFilterReturn
-gdk_xsettings_client_event_filter (GdkXEvent *xevent,
- GdkEvent *event,
- gpointer data)
-{
- GdkX11Screen *screen = data;
-
- if (xsettings_client_process_event (screen->xsettings_client, (XEvent *)xevent))
- return GDK_FILTER_REMOVE;
- else
- return GDK_FILTER_CONTINUE;
-}
-
-static Bool
-gdk_xsettings_watch_cb (Window window,
- Bool is_start,
- long mask,
- void *cb_data)
-{
- GdkWindow *gdkwin;
- GdkScreen *screen = cb_data;
-
- gdkwin = gdk_x11_window_lookup_for_display (gdk_screen_get_display (screen), window);
-
- if (is_start)
- {
- if (gdkwin)
- g_object_ref (gdkwin);
- else
- {
- gdkwin = gdk_x11_window_foreign_new_for_display (gdk_screen_get_display (screen), window);
-
- /* gdk_window_foreign_new_for_display() can fail and return NULL if the
- * window has already been destroyed.
- */
- if (!gdkwin)
- return False;
- }
-
- gdk_window_add_filter (gdkwin, gdk_xsettings_client_event_filter, screen);
- }
- else
- {
- if (!gdkwin)
- {
- /* gdkwin should not be NULL here, since if starting the watch succeeded
- * we have a reference on the window. It might mean that the caller didn't
- * remove the watch when it got a DestroyNotify event. Or maybe the
- * caller ignored the return value when starting the watch failed.
- */
- g_warning ("gdk_xsettings_watch_cb(): Couldn't find window to unwatch");
- return False;
- }
-
- gdk_window_remove_filter (gdkwin, gdk_xsettings_client_event_filter, screen);
- g_object_unref (gdkwin);
- }
-
- return True;
-}
-
-static void
-gdk_xsettings_notify_cb (const char *name,
- XSettingsAction action,
- XSettingsSetting *setting,
- void *data)
-{
- GdkEvent new_event;
- GdkScreen *screen = data;
- GdkX11Screen *x11_screen = data;
-
- if (x11_screen->xsettings_in_init)
- return;
-
- new_event.type = GDK_SETTING;
- new_event.setting.window = gdk_screen_get_root_window (screen);
- new_event.setting.send_event = FALSE;
- new_event.setting.name = (char*) gdk_from_xsettings_name (name);
-
- if (!new_event.setting.name)
- return;
-
- switch (action)
- {
- case XSETTINGS_ACTION_NEW:
- new_event.setting.action = GDK_SETTING_ACTION_NEW;
- break;
- case XSETTINGS_ACTION_CHANGED:
- new_event.setting.action = GDK_SETTING_ACTION_CHANGED;
- break;
- case XSETTINGS_ACTION_DELETED:
- new_event.setting.action = GDK_SETTING_ACTION_DELETED;
- break;
- }
-
- gdk_event_put (&new_event);
-}
-
void
_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,
- gdk_xsettings_notify_cb,
- gdk_xsettings_watch_cb,
- screen);
- x11_screen->xsettings_in_init = FALSE;
+ x11_screen->xsettings_client = _gdk_x11_xsettings_client_new (screen);
}
/**