Add GdkEventSetting event for notification of changes to system settings,

Mon Apr  2 18:18:07 2001  Owen Taylor  <otaylor@redhat.com>

        * gdk/gdkevents.h: Add GdkEventSetting event for notification
	of changes to system settings, gdk_setting_get() to retrieve
	a single system setting.

	* gdk/x11/gdkevents-x11.c: Bridge gdk_setting_get() and GdkEventSetting
	to the draft XSETTINGS mechanism.

	* gdk/x11/xsettings-{common,client}.[ch]: Sample-implementation of
	XSETTINGS.

	* gtk/gtkmain.c gtk/gtksettings.[ch]: Propagate notification
	of GDK settings changes to the GtkSettings object.

	* gdk/gdkevents.[ch] gdk/gtk/gtksettings.c: Hook up the
	double-click-timeout property to GDK.

	* gdk/gdkcolor.[ch] gdk/gdkvisual.h gdk/gdkevent.[ch] gdk/gdkfont.[ch]:
	Define GDK boxed types here.

	* gdk/Makefile.am gdk/makeenums.pl: Generate source files
	gdk/gdkenumtypes.[ch] for enum definitions.

	* gtk/gtkcompat.h: Add defines for GTK_TYPE_GDK_*
	* gtk/gtk-boxed.defs: Comment out GDK types
	* gtk/gtktypeutils.h: Remove GDK types
	* gtk/Makefile.am: No longer scan GDK headers for enumerataions
This commit is contained in:
Owen Taylor
2001-04-02 23:33:47 +00:00
committed by Owen Taylor
parent 0aef43bcbc
commit b52b326d5f
42 changed files with 2001 additions and 246 deletions

View File

@ -31,6 +31,8 @@
#include "gdkkeysyms.h"
#include "xsettings-client.h"
#if HAVE_CONFIG_H
# include <config.h>
# if STDC_HEADERS
@ -103,6 +105,15 @@ GdkFilterReturn gdk_wm_protocols_filter (GdkXEvent *xev,
GdkEvent *event,
gpointer data);
static void gdk_xsettings_watch_cb (Window window,
Bool is_start,
long mask,
void *cb_data);
static void gdk_xsettings_notify_cb (const char *name,
XSettingsAction action,
XSettingsSetting *setting,
void *data);
/* Private variable declarations
*/
@ -125,6 +136,8 @@ static GPollFD event_poll_fd;
static Window wmspec_check_window = None;
static XSettingsClient *xsettings_client;
/*********************************************
* Functions for maintaining the event queue *
*********************************************/
@ -151,6 +164,11 @@ gdk_events_init (void)
gdk_add_client_message_filter (gdk_wm_protocols,
gdk_wm_protocols_filter, NULL);
xsettings_client = xsettings_client_new (gdk_display, DefaultScreen (gdk_display),
gdk_xsettings_notify_cb,
gdk_xsettings_watch_cb,
NULL);
}
/*
@ -1772,5 +1790,156 @@ gdk_net_wm_supports (GdkAtom property)
return gdk_net_wm_supports (property);
}
static struct
{
const char *xsettings_name;
const char *gdk_name;
} settings_map[] = {
{ "Net/DoubleClickTime", "double-click-timeout" },
{ "Net/DragThreshold", "drag-threshold" }
};
static void
gdk_xsettings_notify_cb (const char *name,
XSettingsAction action,
XSettingsSetting *setting,
void *data)
{
GdkEvent new_event;
int i;
new_event.type = GDK_SETTING;
new_event.setting.window = NULL;
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)
{
new_event.setting.name = g_strdup (settings_map[i].gdk_name);
break;
}
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);
}
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 tranform 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;
}
gboolean
gdk_setting_get (const gchar *name,
GValue *value)
{
const char *xsettings_name = NULL;
XSettingsResult result;
XSettingsSetting *setting;
gboolean success = FALSE;
gint i;
for (i = 0; i < G_N_ELEMENTS (settings_map) ; i++)
if (strcmp (settings_map[i].gdk_name, name) == 0)
{
xsettings_name = settings_map[i].xsettings_name;
break;
}
if (!xsettings_name)
return FALSE;
result = xsettings_client_get_setting (xsettings_client, xsettings_name, &setting);
if (result != XSETTINGS_SUCCESS)
return FALSE;
switch (setting->type)
{
case XSETTINGS_TYPE_INT:
if (check_transform (xsettings_name, G_TYPE_INT, G_VALUE_TYPE (value)))
{
g_value_set_int (value, setting->data.v_int);
success = TRUE;
}
break;
case XSETTINGS_TYPE_STRING:
if (check_transform (xsettings_name, G_TYPE_STRING, G_VALUE_TYPE (value)))
{
g_value_set_string (value, setting->data.v_string);
success = TRUE;
}
break;
case XSETTINGS_TYPE_COLOR:
if (!check_transform (xsettings_name, GDK_TYPE_COLOR, G_VALUE_TYPE (value)))
{
GdkColor color;
color.pixel = 0;
color.red = setting->data.v_color.red;
color.green = setting->data.v_color.green;
color.blue = setting->data.v_color.blue;
g_value_set_boxed (value, &color);
success = TRUE;
}
break;
}
xsettings_setting_free (setting);
return success;
}
GdkFilterReturn
gdk_xsettings_client_event_filter (GdkXEvent *xevent,
GdkEvent *event,
gpointer data)
{
if (xsettings_client_process_event (xsettings_client, (XEvent *)xevent))
return GDK_FILTER_REMOVE;
else
return GDK_FILTER_CONTINUE;
}
static void
gdk_xsettings_watch_cb (Window window,
Bool is_start,
long mask,
void *cb_data)
{
GdkWindow *gdkwin;
gdkwin = gdk_window_lookup (window);
if (is_start)
gdk_window_add_filter (gdkwin, gdk_xsettings_client_event_filter, NULL);
else
gdk_window_remove_filter (gdkwin, gdk_xsettings_client_event_filter, NULL);
}