diff --git a/gnome-settings-daemon/ChangeLog b/gnome-settings-daemon/ChangeLog index be8af9774..55fabb308 100644 --- a/gnome-settings-daemon/ChangeLog +++ b/gnome-settings-daemon/ChangeLog @@ -1,3 +1,20 @@ +2007-06-21 Rodrigo Moya + + * gnome-settings-accessibility-keyboard.c: + * gnome-settings-keybindings.c: + * gnome-settings-keyboard.c: + * gnome-settings-multimedia-keys.c: + * gnome-settings-xrdb.c: + * gnome-settings-daemon.c: all modules use now the new arch. + + * gnome-settings-background.c (background_callback): pass the correct + argument to the idle callback. + +2007-06-21 Matthias Clasen + + * gnome-settings-screensaver.c (gnome_settings_module_screensaver_start): + fix spawning of gnome-screensaver. + 2007-06-19 Rodrigo Moya * gnome-settings-module.c (gnome_settings_module_start|_stop): return diff --git a/gnome-settings-daemon/Makefile.am b/gnome-settings-daemon/Makefile.am index 363d496dd..06b23e360 100644 --- a/gnome-settings-daemon/Makefile.am +++ b/gnome-settings-daemon/Makefile.am @@ -20,7 +20,6 @@ gnome_settings_daemon_SOURCES = \ eggaccelerators.h \ eggaccelerators.c \ factory.c \ - gnome-settings-accessibility-keyboard.h \ gnome-settings-accessibility-keyboard.c \ gnome-settings-background.c \ gnome-settings-clipboard.c \ @@ -32,17 +31,14 @@ gnome_settings_daemon_SOURCES = \ gnome-settings-font.c \ gnome-settings-gtk1theme.c \ gnome-settings-keybindings.c \ - gnome-settings-keybindings.h \ gnome-settings-keyboard-xkb.h \ gnome-settings-keyboard-xkb.c \ - gnome-settings-keyboard.h \ gnome-settings-keyboard.c \ gnome-settings-locate-pointer.c \ gnome-settings-locate-pointer.h \ gnome-settings-module.c \ gnome-settings-module.h \ gnome-settings-mouse.c \ - gnome-settings-multimedia-keys.h \ gnome-settings-multimedia-keys.c \ gnome-settings-screensaver.c \ gnome-settings-server.h \ @@ -51,7 +47,6 @@ gnome_settings_daemon_SOURCES = \ gnome-settings-xmodmap.c \ gnome-settings-xmodmap.h \ gnome-settings-xrdb.c \ - gnome-settings-xrdb.h \ gnome-settings-xsettings.c \ gsd-media-keys-window.c \ gsd-media-keys-window.h \ diff --git a/gnome-settings-daemon/gnome-settings-accessibility-keyboard.c b/gnome-settings-daemon/gnome-settings-accessibility-keyboard.c index 0e1881f9e..534726fc8 100644 --- a/gnome-settings-daemon/gnome-settings-accessibility-keyboard.c +++ b/gnome-settings-daemon/gnome-settings-accessibility-keyboard.c @@ -31,8 +31,71 @@ #include #include -#include "gnome-settings-accessibility-keyboard.h" -#include "gnome-settings-daemon.h" +#include "gnome-settings-module.h" +#include "utils.h" + +typedef struct { + GnomeSettingsModule parent; +} GnomeSettingsModuleAccessibilityKeyboard; + +typedef struct { + GnomeSettingsModuleClass parent_class; +} GnomeSettingsModuleAccessibilityKeyboardClass; + +static GnomeSettingsModuleRunlevel gnome_settings_module_accessibility_keyboard_get_runlevel (GnomeSettingsModule *module); +static gboolean gnome_settings_module_accessibility_keyboard_initialize (GnomeSettingsModule *module, + GConfClient *client); +static gboolean gnome_settings_module_accessibility_keyboard_start (GnomeSettingsModule *module); +static gboolean gnome_settings_module_accessibility_keyboard_stop (GnomeSettingsModule *module); + +static void +gnome_settings_module_accessibility_keyboard_class_init (GnomeSettingsModuleAccessibilityKeyboardClass *klass) +{ + GnomeSettingsModuleClass *module_class; + + module_class = (GnomeSettingsModuleClass *) klass; + module_class->get_runlevel = gnome_settings_module_accessibility_keyboard_get_runlevel; + module_class->initialize = gnome_settings_module_accessibility_keyboard_initialize; + module_class->start = gnome_settings_module_accessibility_keyboard_start; + module_class->stop = gnome_settings_module_accessibility_keyboard_stop; +} + +static void +gnome_settings_module_accessibility_keyboard_init (GnomeSettingsModuleAccessibilityKeyboard *module) +{ +} + +GType +gnome_settings_module_accessibility_keyboard_get_type (void) +{ + static GType module_type = 0; + + if (!module_type) { + static const GTypeInfo module_info = { + sizeof (GnomeSettingsModuleAccessibilityKeyboardClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gnome_settings_module_accessibility_keyboard_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GnomeSettingsModuleAccessibilityKeyboard), + 0, /* n_preallocs */ + (GInstanceInitFunc) gnome_settings_module_accessibility_keyboard_init, + }; + + module_type = g_type_register_static (GNOME_SETTINGS_TYPE_MODULE, + "GnomeSettingsModuleAccessibilityKeyboard", + &module_info, 0); + } + + return module_type; +} + +static GnomeSettingsModuleRunlevel +gnome_settings_module_accessibility_keyboard_get_runlevel (GnomeSettingsModule *module) +{ + return GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS; +} #ifdef HAVE_X11_EXTENSIONS_XKB_H # include @@ -142,19 +205,19 @@ set_bool (GConfClient *client, GConfChangeSet *cs, static unsigned long set_clear (gboolean flag, unsigned long value, unsigned long mask) { - if (flag) - return value | mask; - return value & ~mask; + if (flag) + return value | mask; + return value & ~mask; } static gboolean set_ctrl_from_gconf (XkbDescRec *desc, GConfClient *client, char const *key, unsigned long mask, gboolean flag) { - gboolean result = flag && gconf_client_get_bool (client, key, NULL); - desc->ctrls->enabled_ctrls = - set_clear (result, desc->ctrls->enabled_ctrls, mask); - return result; + gboolean result = flag && gconf_client_get_bool (client, key, NULL); + desc->ctrls->enabled_ctrls = + set_clear (result, desc->ctrls->enabled_ctrls, mask); + return result; } static void @@ -293,55 +356,51 @@ ax_response_callback (gint response_id, guint revert_controls_mask, gboolean ena GError *err = NULL; gboolean success; - switch (response_id) - { - case GTK_RESPONSE_DELETE_EVENT: - case GTK_RESPONSE_REJECT: - case GTK_RESPONSE_CANCEL: - { - GConfClient *client = gnome_settings_get_config_client (); + switch (response_id) { + case GTK_RESPONSE_DELETE_EVENT: + case GTK_RESPONSE_REJECT: + case GTK_RESPONSE_CANCEL: { + GConfClient *client = gnome_settings_get_config_client (); - /* we're reverting, so we invert sense of 'enabled' flag */ - d ("cancelling AccessX request"); - if (revert_controls_mask == XkbStickyKeysMask) - { - success = gconf_client_set_bool (client, CONFIG_ROOT "/stickykeys_enable", !enabled, &err); - if (err != NULL) - g_error_free (err); - } - if (revert_controls_mask == XkbSlowKeysMask) - { - success = gconf_client_set_bool (client, CONFIG_ROOT "/slowkeys_enable", !enabled, &err); - if (err != NULL) - g_error_free (err); - } - gconf_client_suggest_sync (client, NULL); - set_server_from_gconf (NULL); - break; + /* we're reverting, so we invert sense of 'enabled' flag */ + d ("cancelling AccessX request"); + if (revert_controls_mask == XkbStickyKeysMask) { + success = gconf_client_set_bool (client, CONFIG_ROOT "/stickykeys_enable", !enabled, &err); + if (err != NULL) + g_error_free (err); } - case GTK_RESPONSE_HELP: - gnome_help_display_desktop (NULL, - "user-guide", - "user-guide.xml", - "goscustaccess-6", - &err); - if (err != NULL) { - GtkWidget *error_dialog = gtk_message_dialog_new (NULL, - 0, - GTK_MESSAGE_ERROR, - GTK_BUTTONS_CLOSE, - _("There was an error displaying help: %s"), - err->message); - g_signal_connect (G_OBJECT (error_dialog), - "response", - G_CALLBACK (gtk_widget_destroy), NULL); - gtk_window_set_resizable (GTK_WINDOW (error_dialog), FALSE); - gtk_widget_show (error_dialog); - g_error_free (err); - } - return FALSE; - default: - break; + if (revert_controls_mask == XkbSlowKeysMask) { + success = gconf_client_set_bool (client, CONFIG_ROOT "/slowkeys_enable", !enabled, &err); + if (err != NULL) + g_error_free (err); + } + gconf_client_suggest_sync (client, NULL); + set_server_from_gconf (NULL); + break; + } + case GTK_RESPONSE_HELP: + gnome_help_display_desktop (NULL, + "user-guide", + "user-guide.xml", + "goscustaccess-6", + &err); + if (err != NULL) { + GtkWidget *error_dialog = gtk_message_dialog_new (NULL, + 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_CLOSE, + _("There was an error displaying help: %s"), + err->message); + g_signal_connect (G_OBJECT (error_dialog), + "response", + G_CALLBACK (gtk_widget_destroy), NULL); + gtk_window_set_resizable (GTK_WINDOW (error_dialog), FALSE); + gtk_widget_show (error_dialog); + g_error_free (err); + } + return FALSE; + default: + break; } return TRUE; } @@ -503,8 +562,7 @@ set_gconf_from_server (GConfEntry *ignored) changed |= set_bool (client, cs, in_gconf, CONFIG_ROOT "/togglekeys_enable", desc->ctrls->ax_options & XkbAX_IndicatorFBMask); - if (!changed && stickykeys_changed^slowkeys_changed) - { + if (!changed && stickykeys_changed^slowkeys_changed) { /* * sticky or slowkeys has changed, singly, without our intervention. * 99% chance this is due to a keyboard shortcut being used. @@ -515,8 +573,7 @@ set_gconf_from_server (GConfEntry *ignored) */ /* sanity check: are keyboard shortcuts available? */ - if (desc->ctrls->enabled_ctrls & XkbAccessXKeysMask) - { + if (desc->ctrls->enabled_ctrls & XkbAccessXKeysMask) { if (slowkeys_changed) ax_slowkeys_warning_dialog_post (desc->ctrls->enabled_ctrls & XkbSlowKeysMask); else @@ -561,15 +618,24 @@ cb_xkb_event_filter (GdkXEvent *xevent, GdkEvent *ignored1, gpointer ignored2) return GDK_FILTER_CONTINUE; } -void -gnome_settings_accessibility_keyboard_load (GConfClient *client) +static gboolean +gnome_settings_module_accessibility_keyboard_initialize (GnomeSettingsModule *module, GConfClient *client) +{ + gnome_settings_register_config_callback (CONFIG_ROOT, &set_server_from_gconf); + + return TRUE; +} + +static gboolean +gnome_settings_module_accessibility_keyboard_start (GnomeSettingsModule *module) { guint event_mask = XkbControlsNotifyMask; #ifdef DEBUG_ACCESSIBILITY - event_mask = XkbControlsNotifyMask | XkbAccessXNotifyMask); /* make default when AXN_AXKWarning works */ + event_mask = XkbControlsNotifyMask | XkbAccessXNotifyMask; /* make default when AXN_AXKWarning works */ #endif + if (!xkb_enabled ()) - return; + return FALSE; /* be sure to init before starting to monitor the server */ set_server_from_gconf (NULL); @@ -584,23 +650,30 @@ gnome_settings_accessibility_keyboard_load (GConfClient *client) gdk_error_trap_pop (); gdk_window_add_filter (NULL, cb_xkb_event_filter, NULL); + + return TRUE; } - -void -gnome_settings_accessibility_keyboard_init (GConfClient *client) -{ - gnome_settings_register_config_callback (CONFIG_ROOT, &set_server_from_gconf); -} #else -void -gnome_settings_accessibility_keyboard_load (GConfClient *client) +static gboolean +gnome_settings_module_accessibility_keyboard_initialize (GnomeSettingsModule *module, GConfClient *client) { g_warning ("Unsupported in this build"); + return TRUE; } -void -gnome_settings_accessibility_keyboard_init (GConfClient *client) + +static gboolean +gnome_settings_module_accessibility_keyboard_start (GnomeSettingsModule *module) { + g_warning ("Unsupported in this build"); + return TRUE; } + #endif + +static gboolean +gnome_settings_module_accessibility_keyboard_stop (GnomeSettingsModule *module) +{ + return TRUE; +} diff --git a/gnome-settings-daemon/gnome-settings-accessibility-keyboard.h b/gnome-settings-daemon/gnome-settings-accessibility-keyboard.h deleted file mode 100644 index e38cb7ba8..000000000 --- a/gnome-settings-daemon/gnome-settings-accessibility-keyboard.h +++ /dev/null @@ -1,32 +0,0 @@ -/* gnome-settings-accessibility-keyboard.h - * - * Copyright © 2002 Ximian, Inc. - * - * Written by Jody Goldberg - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#ifndef __GNOME_SETTINGS_ACCESSIBILITY_KEYBOARD_H -#define __GNOME_SETTINGS_ACCESSIBILITY_KEYBOARD_H - -#include -#include - -void gnome_settings_accessibility_keyboard_init (GConfClient *client); -void gnome_settings_accessibility_keyboard_load (GConfClient *client); - -#endif /* __GNOME_SETTINGS_ACCESSIBILITY_KEYBOARD_H */ diff --git a/gnome-settings-daemon/gnome-settings-background.c b/gnome-settings-daemon/gnome-settings-background.c index 91eb03d3f..cf3c69cb1 100644 --- a/gnome-settings-daemon/gnome-settings-background.c +++ b/gnome-settings-daemon/gnome-settings-background.c @@ -31,7 +31,6 @@ #include #include -#include "gnome-settings-keyboard.h" #include "gnome-settings-module.h" #include "preferences.h" @@ -89,7 +88,7 @@ background_callback (GConfClient *client, g_source_remove (module_bg->applier_idle_id); } - module_bg->applier_idle_id = g_timeout_add (100, applier_idle, NULL); + module_bg->applier_idle_id = g_timeout_add (100, applier_idle, module_bg); } static void diff --git a/gnome-settings-daemon/gnome-settings-daemon.c b/gnome-settings-daemon/gnome-settings-daemon.c index f004227dd..9168e58c2 100644 --- a/gnome-settings-daemon/gnome-settings-daemon.c +++ b/gnome-settings-daemon/gnome-settings-daemon.c @@ -33,29 +33,25 @@ #include "xsettings-manager.h" #include "gnome-settings-daemon.h" #include "gnome-settings-module.h" -#include "gnome-settings-xmodmap.h" - -/*#include "gnome-settings-disk.h"*/ -#include "gnome-settings-keyboard-xkb.h" -#include "gnome-settings-keyboard.h" -#include "gnome-settings-accessibility-keyboard.h" -#include "gnome-settings-keybindings.h" -#include "gnome-settings-multimedia-keys.h" -#include "gnome-settings-xrdb.h" struct _GnomeSettingsDaemonPrivate { GHashTable *loaded_modules; }; +GType gnome_settings_module_accessibility_keyboard_get_type (void); GType gnome_settings_module_background_get_type (void); GType gnome_settings_module_clipboard_get_type (void); GType gnome_settings_module_default_editor_get_type (void); GType gnome_settings_module_font_get_type (void); GType gnome_settings_module_gtk1_get_type (void); +GType gnome_settings_module_keybindings_get_type (void); +GType gnome_settings_module_keyboard_get_type (void); GType gnome_settings_module_mouse_get_type (void); +GType gnome_settings_module_multimedia_keys_get_type (void); GType gnome_settings_module_screensaver_get_type (void); GType gnome_settings_module_sound_get_type (void); GType gnome_settings_module_typing_break_get_type (void); +GType gnome_settings_module_xrdb_get_type (void); GType gnome_settings_module_xsettings_get_type (void); static GObjectClass *parent_class = NULL; @@ -187,15 +183,20 @@ gnome_settings_daemon_init (GnomeSettingsDaemon *settings) settings->priv = g_new (GnomeSettingsDaemonPrivate, 1); /* register all internal modules types */ - if (!gnome_settings_module_background_get_type () + if (!gnome_settings_module_accessibility_keyboard_get_type () + || !gnome_settings_module_background_get_type () || !gnome_settings_module_clipboard_get_type () || !gnome_settings_module_default_editor_get_type () || !gnome_settings_module_font_get_type () || !gnome_settings_module_gtk1_get_type () + || !gnome_settings_module_keybindings_get_type () + || !gnome_settings_module_keyboard_get_type () || !gnome_settings_module_mouse_get_type () + || !gnome_settings_module_multimedia_keys_get_type () || !gnome_settings_module_screensaver_get_type () || !gnome_settings_module_sound_get_type () || !gnome_settings_module_typing_break_get_type () + || !gnome_settings_module_xrdb_get_type () || !gnome_settings_module_xsettings_get_type ()) return; @@ -281,17 +282,6 @@ gnome_settings_daemon_new (void) client = gnome_settings_get_config_client (); - /* gnome_settings_disk_init (client);*/ - /* Essential - xkb initialization should happen before */ - gnome_settings_keyboard_xkb_set_post_activation_callback ((PostActivationCallback) gnome_settings_load_modmap_files, NULL); - gnome_settings_keyboard_xkb_init (client); - gnome_settings_keyboard_init (client); - gnome_settings_multimedia_keys_init (client); - /* */ - gnome_settings_accessibility_keyboard_init (client); - gnome_settings_keybindings_init (client); - gnome_settings_xrdb_init (client); - /* load all modules */ initialize_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_XSETTINGS); initialize_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS); @@ -307,16 +297,6 @@ gnome_settings_daemon_new (void) manager_event_filter, GINT_TO_POINTER (i)); } - /* gnome_settings_disk_load (client);*/ - /* Essential - xkb initialization should happen before */ - gnome_settings_keyboard_xkb_load (client); - gnome_settings_keyboard_load (client); - gnome_settings_multimedia_keys_load (client); - /* */ - gnome_settings_accessibility_keyboard_load (client); - gnome_settings_keybindings_load (client); - gnome_settings_xrdb_load (client); - /* start all modules */ start_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_XSETTINGS); start_modules (daemon, GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS); diff --git a/gnome-settings-daemon/gnome-settings-keybindings.c b/gnome-settings-daemon/gnome-settings-keybindings.c index 7266f585e..378a8c938 100644 --- a/gnome-settings-daemon/gnome-settings-keybindings.c +++ b/gnome-settings-daemon/gnome-settings-keybindings.c @@ -6,8 +6,7 @@ #include #include #include -#include "gnome-settings-daemon.h" -#include "gnome-settings-keybindings.h" +#include "gnome-settings-module.h" #include "eggaccelerators.h" /* we exclude shift, GDK_CONTROL_MASK and GDK_MOD1_MASK since we know what @@ -22,47 +21,109 @@ #define GCONF_BINDING_DIR "/desktop/gnome/keybindings" typedef struct { - guint keysym; - guint state; - guint keycode; + GnomeSettingsModule parent; +} GnomeSettingsModuleKeybindings; + +typedef struct { + GnomeSettingsModuleClass parent_class; +} GnomeSettingsModuleKeybindingsClass; + +typedef struct { + guint keysym; + guint state; + guint keycode; } Key; typedef struct { - char *binding_str; - char *action; - char *gconf_key; - Key key; - Key previous_key; + char *binding_str; + char *action; + char *gconf_key; + Key key; + Key previous_key; } Binding; - + +static GnomeSettingsModuleRunlevel gnome_settings_module_keybindings_get_runlevel (GnomeSettingsModule *module); +static gboolean gnome_settings_module_keybindings_initialize (GnomeSettingsModule *module, GConfClient *client); +static gboolean gnome_settings_module_keybindings_start (GnomeSettingsModule *module); +static gboolean gnome_settings_module_keybindings_stop (GnomeSettingsModule *module); + static GSList *binding_list = NULL; static GSList *screens = NULL; +static void +gnome_settings_module_keybindings_class_init (GnomeSettingsModuleKeybindingsClass *klass) +{ + GnomeSettingsModuleClass *module_class; + + module_class = GNOME_SETTINGS_MODULE_CLASS (klass); + module_class->get_runlevel = gnome_settings_module_keybindings_get_runlevel; + module_class->initialize = gnome_settings_module_keybindings_initialize; + module_class->start = gnome_settings_module_keybindings_start; + module_class->stop = gnome_settings_module_keybindings_stop; +} + +static void +gnome_settings_module_keybindings_init (GnomeSettingsModuleKeybindings *module) +{ +} + +GType +gnome_settings_module_keybindings_get_type (void) +{ + static GType module_type = 0; + + if (!module_type) { + static const GTypeInfo module_info = { + sizeof (GnomeSettingsModuleKeybindingsClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gnome_settings_module_keybindings_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GnomeSettingsModuleKeybindings), + 0, /* n_preallocs */ + (GInstanceInitFunc) gnome_settings_module_keybindings_init, + }; + + module_type = g_type_register_static (GNOME_SETTINGS_TYPE_MODULE, + "GnomeSettingsModuleKeybindings", + &module_info, 0); + } + + return module_type; +} + +static GnomeSettingsModuleRunlevel +gnome_settings_module_keybindings_get_runlevel (GnomeSettingsModule *module) +{ + return GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS; +} + static GSList * get_screens_list (void) { - GdkDisplay *display = gdk_display_get_default(); - int n_screens; - GSList *list = NULL; - int i; + GdkDisplay *display = gdk_display_get_default(); + int n_screens; + GSList *list = NULL; + int i; - n_screens = gdk_display_get_n_screens (display); + n_screens = gdk_display_get_n_screens (display); - if (n_screens == 1) { - list = g_slist_append (list, gdk_screen_get_default ()); - } else { - for (i = 0; i < n_screens; i++) { - GdkScreen *screen; + if (n_screens == 1) { + list = g_slist_append (list, gdk_screen_get_default ()); + } else { + for (i = 0; i < n_screens; i++) { + GdkScreen *screen; - screen = gdk_display_get_screen (display, i); - if (screen != NULL) { - list = g_slist_prepend (list, screen); - } - } - list = g_slist_reverse (list); - } + screen = gdk_display_get_screen (display, i); + if (screen != NULL) { + list = g_slist_prepend (list, screen); + } + } + list = g_slist_reverse (list); + } - return list; + return list; } extern char **environ; @@ -70,24 +131,24 @@ extern char **environ; static char * screen_exec_display_string (GdkScreen *screen) { - GString *str; - const char *old_display; - char *p; + GString *str; + const char *old_display; + char *p; - g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); - old_display = gdk_display_get_name (gdk_screen_get_display (screen)); + old_display = gdk_display_get_name (gdk_screen_get_display (screen)); - str = g_string_new ("DISPLAY="); - g_string_append (str, old_display); + str = g_string_new ("DISPLAY="); + g_string_append (str, old_display); - p = strrchr (str->str, '.'); - if (p && p > strchr (str->str, ':')) - g_string_truncate (str, p - str->str); + p = strrchr (str->str, '.'); + if (p && p > strchr (str->str, ':')) + g_string_truncate (str, p - str->str); - g_string_append_printf (str, ".%d", gdk_screen_get_number (screen)); + g_string_append_printf (str, ".%d", gdk_screen_get_number (screen)); - return g_string_free (str, FALSE); + return g_string_free (str, FALSE); } /** @@ -106,201 +167,191 @@ screen_exec_display_string (GdkScreen *screen) static char ** get_exec_environment (XEvent *xevent) { - char **retval = NULL; - int i; - int display_index = -1; + char **retval = NULL; + int i; + int display_index = -1; - GdkScreen *screen = NULL; + GdkScreen *screen = NULL; - GdkWindow *window = gdk_xid_table_lookup (xevent->xkey.root); + GdkWindow *window = gdk_xid_table_lookup (xevent->xkey.root); - if (window) - screen = gdk_drawable_get_screen (GDK_DRAWABLE (window)); + if (window) + screen = gdk_drawable_get_screen (GDK_DRAWABLE (window)); - g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); + g_return_val_if_fail (GDK_IS_SCREEN (screen), NULL); - for (i = 0; environ [i]; i++) - if (!strncmp (environ [i], "DISPLAY", 7)) - display_index = i; + for (i = 0; environ [i]; i++) + if (!strncmp (environ [i], "DISPLAY", 7)) + display_index = i; - if (display_index == -1) - display_index = i++; + if (display_index == -1) + display_index = i++; - retval = g_new (char *, i + 1); + retval = g_new (char *, i + 1); - for (i = 0; environ [i]; i++) - if (i == display_index) - retval [i] = screen_exec_display_string (screen); - else - retval [i] = g_strdup (environ [i]); + for (i = 0; environ [i]; i++) + if (i == display_index) + retval [i] = screen_exec_display_string (screen); + else + retval [i] = g_strdup (environ [i]); - retval [i] = NULL; + retval [i] = NULL; - return retval; + return retval; } static gint compare_bindings (gconstpointer a, gconstpointer b) { - Binding *key_a = (Binding*) a; - char *key_b = (char*) b; + Binding *key_a = (Binding*) a; + char *key_b = (char*) b; - return strcmp (key_b, key_a->gconf_key); + return strcmp (key_b, key_a->gconf_key); } static gboolean parse_binding (Binding *binding) { - g_return_val_if_fail (binding != NULL, FALSE); + g_return_val_if_fail (binding != NULL, FALSE); - binding->key.keysym = 0; - binding->key.state = 0; + binding->key.keysym = 0; + binding->key.state = 0; - if (binding->binding_str == NULL || - binding->binding_str[0] == '\0' || - strcmp (binding->binding_str, "Disabled") == 0) - return FALSE; + if (binding->binding_str == NULL || + binding->binding_str[0] == '\0' || + strcmp (binding->binding_str, "Disabled") == 0) + return FALSE; - if (egg_accelerator_parse_virtual (binding->binding_str, &binding->key.keysym, &binding->key.keycode, &binding->key.state) == FALSE) - return FALSE; + if (egg_accelerator_parse_virtual (binding->binding_str, &binding->key.keysym, &binding->key.keycode, &binding->key.state) == FALSE) + return FALSE; - return TRUE; + return TRUE; } static char * entry_get_string (GConfEntry *entry) { - GConfValue *value = gconf_entry_get_value (entry); + GConfValue *value = gconf_entry_get_value (entry); - if (value == NULL || value->type != GCONF_VALUE_STRING) - return NULL; + if (value == NULL || value->type != GCONF_VALUE_STRING) + return NULL; - return g_strdup (gconf_value_get_string (value)); + return g_strdup (gconf_value_get_string (value)); } static gboolean bindings_get_entry (const char *subdir) { - Binding *new_binding; - GSList *tmp_elem, *list, *li; - char *gconf_key; - char *action = NULL; - char *key = NULL; - gboolean ret = FALSE; - GConfClient *client = gnome_settings_get_config_client (); + Binding *new_binding; + GSList *tmp_elem, *list, *li; + char *gconf_key; + char *action = NULL; + char *key = NULL; + gboolean ret = FALSE; + GConfClient *client = gnome_settings_get_config_client (); - g_return_val_if_fail (subdir != NULL, FALSE); + g_return_val_if_fail (subdir != NULL, FALSE); - /* value = gconf_entry_get_value (entry); */ - gconf_key = g_path_get_basename (subdir); + /* value = gconf_entry_get_value (entry); */ + gconf_key = g_path_get_basename (subdir); - if (!gconf_key) - return FALSE; + if (!gconf_key) + return FALSE; - /* Get entries for this binding */ - list = gconf_client_all_entries (client, subdir, NULL); + /* Get entries for this binding */ + list = gconf_client_all_entries (client, subdir, NULL); - for (li = list; li != NULL; li = li->next) - { - GConfEntry *entry = li->data; - char *key_name = g_path_get_basename (gconf_entry_get_key (entry)); + for (li = list; li != NULL; li = li->next) { + GConfEntry *entry = li->data; + char *key_name = g_path_get_basename (gconf_entry_get_key (entry)); - if (key_name == NULL) - goto out; - else if (strcmp (key_name, "action") == 0) - { - if (!action) - action = entry_get_string (entry); - else - g_warning (_("Key Binding (%s) has its action defined multiple times\n"), - gconf_key); - } - else if (strcmp (key_name, "binding") == 0) - { - if (!key) - key = entry_get_string (entry); - else - g_warning (_("Key Binding (%s) has its binding defined multiple times\n"), - gconf_key); + if (key_name == NULL) + goto out; + else if (strcmp (key_name, "action") == 0) { + if (!action) + action = entry_get_string (entry); + else + g_warning (_("Key Binding (%s) has its action defined multiple times\n"), + gconf_key); + } else if (strcmp (key_name, "binding") == 0) { + if (!key) + key = entry_get_string (entry); + else + g_warning (_("Key Binding (%s) has its binding defined multiple times\n"), + gconf_key); + } + + gconf_entry_free (entry); } - gconf_entry_free (entry); - } - - if (!action || !key) - { - g_warning (_("Key Binding (%s) is incomplete\n"), gconf_key); - goto out; - } + if (!action || !key) { + g_warning (_("Key Binding (%s) is incomplete\n"), gconf_key); + goto out; + } - tmp_elem = g_slist_find_custom (binding_list, gconf_key, - compare_bindings); + tmp_elem = g_slist_find_custom (binding_list, gconf_key, + compare_bindings); - if (!tmp_elem) - new_binding = g_new0 (Binding, 1); - else - { - new_binding = (Binding*) tmp_elem->data; - g_free (new_binding->binding_str); - g_free (new_binding->action); - } + if (!tmp_elem) + new_binding = g_new0 (Binding, 1); + else { + new_binding = (Binding*) tmp_elem->data; + g_free (new_binding->binding_str); + g_free (new_binding->action); + } - new_binding->binding_str = key; - new_binding->action = action; - new_binding->gconf_key = gconf_key; + new_binding->binding_str = key; + new_binding->action = action; + new_binding->gconf_key = gconf_key; - new_binding->previous_key.keysym = new_binding->key.keysym; - new_binding->previous_key.state = new_binding->key.state; - new_binding->previous_key.keycode = new_binding->key.keycode; + new_binding->previous_key.keysym = new_binding->key.keysym; + new_binding->previous_key.state = new_binding->key.state; + new_binding->previous_key.keycode = new_binding->key.keycode; - if (parse_binding (new_binding)) - { - binding_list = g_slist_append (binding_list, new_binding); - ret = TRUE; - } - else - { - g_warning (_("Key Binding (%s) is invalid\n"), gconf_key); - g_free (new_binding->binding_str); - g_free (new_binding->action); - } + if (parse_binding (new_binding)) { + binding_list = g_slist_append (binding_list, new_binding); + ret = TRUE; + } else { + g_warning (_("Key Binding (%s) is invalid\n"), gconf_key); + g_free (new_binding->binding_str); + g_free (new_binding->action); + } -out: - g_slist_free (list); - return ret; + out: + g_slist_free (list); + return ret; } static gboolean key_already_used (Binding *binding) { - GSList *li; + GSList *li; - for (li = binding_list; li != NULL; li = li->next) - { - Binding *tmp_binding = (Binding*) li->data; + for (li = binding_list; li != NULL; li = li->next) { + Binding *tmp_binding = (Binding*) li->data; - if (tmp_binding != binding && tmp_binding->key.keycode == binding->key.keycode && - tmp_binding->key.state == binding->key.state) - return TRUE; - } - return FALSE; + if (tmp_binding != binding && tmp_binding->key.keycode == binding->key.keycode && + tmp_binding->key.state == binding->key.state) + return TRUE; + } + return FALSE; } static void grab_key (GdkWindow *root, Key *key, int result, gboolean grab) { - gdk_error_trap_push (); - if (grab) - XGrabKey (GDK_DISPLAY(), key->keycode, (result | key->state), - GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); - else - XUngrabKey(GDK_DISPLAY(), key->keycode, (result | key->state), - GDK_WINDOW_XID (root)); - gdk_flush (); - if (gdk_error_trap_pop ()) { - g_warning (_("It seems that another application already has" - " access to key '%u'."), key->keycode); - } + gdk_error_trap_push (); + if (grab) + XGrabKey (GDK_DISPLAY(), key->keycode, (result | key->state), + GDK_WINDOW_XID (root), True, GrabModeAsync, GrabModeAsync); + else + XUngrabKey(GDK_DISPLAY(), key->keycode, (result | key->state), + GDK_WINDOW_XID (root)); + gdk_flush (); + if (gdk_error_trap_pop ()) { + g_warning (_("It seems that another application already has" + " access to key '%u'."), key->keycode); + } } /* inspired from all_combinations from gnome-panel/gnome-panel/global-keys.c */ @@ -343,51 +394,47 @@ do_grab (gboolean grab, static void binding_register_keys (void) { - GSList *li; + GSList *li; - gdk_error_trap_push(); + gdk_error_trap_push(); - /* Now check for changes and grab new key if not already used */ - for (li = binding_list ; li != NULL; li = li->next) - { - Binding *binding = (Binding *) li->data; + /* Now check for changes and grab new key if not already used */ + for (li = binding_list ; li != NULL; li = li->next) { + Binding *binding = (Binding *) li->data; - if (binding->previous_key.keycode != binding->key.keycode || - binding->previous_key.state != binding->key.state) - { - /* Ungrab key if it changed and not clashing with previously set binding */ - if (!key_already_used (binding)) - { - if (binding->previous_key.keycode) - do_grab (FALSE, &binding->previous_key); - do_grab (TRUE, &binding->key); + if (binding->previous_key.keycode != binding->key.keycode || + binding->previous_key.state != binding->key.state) { + /* Ungrab key if it changed and not clashing with previously set binding */ + if (!key_already_used (binding)) { + if (binding->previous_key.keycode) + do_grab (FALSE, &binding->previous_key); + do_grab (TRUE, &binding->key); - binding->previous_key.keysym = binding->key.keysym; - binding->previous_key.state = binding->key.state; - binding->previous_key.keycode = binding->key.keycode; - } - else - g_warning (_("Key Binding (%s) is already in use\n"), binding->binding_str); - } - } - gdk_flush (); - gdk_error_trap_pop(); + binding->previous_key.keysym = binding->key.keysym; + binding->previous_key.state = binding->key.state; + binding->previous_key.keycode = binding->key.keycode; + } else + g_warning (_("Key Binding (%s) is already in use\n"), binding->binding_str); + } + } + gdk_flush (); + gdk_error_trap_pop(); } static void bindings_callback (GConfEntry *entry) { - /* ensure we get binding dir not a sub component */ - gchar** key_elems = g_strsplit (gconf_entry_get_key (entry), "/", 15); - gchar* binding_entry = g_strdup_printf ("/%s/%s/%s/%s", key_elems[1], - key_elems[2], key_elems[3], - key_elems[4]); - g_strfreev (key_elems); + /* ensure we get binding dir not a sub component */ + gchar** key_elems = g_strsplit (gconf_entry_get_key (entry), "/", 15); + gchar* binding_entry = g_strdup_printf ("/%s/%s/%s/%s", key_elems[1], + key_elems[2], key_elems[3], + key_elems[4]); + g_strfreev (key_elems); - bindings_get_entry (binding_entry); - g_free (binding_entry); + bindings_get_entry (binding_entry); + g_free (binding_entry); - binding_register_keys (); + binding_register_keys (); } static GdkFilterReturn @@ -395,102 +442,105 @@ keybindings_filter (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) { - XEvent *xevent = (XEvent *)gdk_xevent; - guint keycode, state; - GSList *li; + XEvent *xevent = (XEvent *)gdk_xevent; + guint keycode, state; + GSList *li; - if(xevent->type != KeyPress) - return GDK_FILTER_CONTINUE; + if(xevent->type != KeyPress) + return GDK_FILTER_CONTINUE; - keycode = xevent->xkey.keycode; - state = xevent->xkey.state; + keycode = xevent->xkey.keycode; + state = xevent->xkey.state; - for (li = binding_list; li != NULL; li = li->next) - { - Binding *binding = (Binding*) li->data; + for (li = binding_list; li != NULL; li = li->next) { + Binding *binding = (Binding*) li->data; - if (keycode == binding->key.keycode && - (state & USED_MODS) == binding->key.state) - { - GError* error = NULL; - gboolean retval; - gchar **argv = NULL; - gchar **envp = NULL; + if (keycode == binding->key.keycode && + (state & USED_MODS) == binding->key.state) { + GError* error = NULL; + gboolean retval; + gchar **argv = NULL; + gchar **envp = NULL; - g_return_val_if_fail (binding->action != NULL, GDK_FILTER_CONTINUE); + g_return_val_if_fail (binding->action != NULL, GDK_FILTER_CONTINUE); - if (!g_shell_parse_argv (binding->action, - NULL, &argv, - &error)) - return GDK_FILTER_CONTINUE; + if (!g_shell_parse_argv (binding->action, + NULL, &argv, + &error)) + return GDK_FILTER_CONTINUE; - envp = get_exec_environment (xevent); + envp = get_exec_environment (xevent); - - retval = g_spawn_async (NULL, - argv, - envp, - G_SPAWN_SEARCH_PATH, - NULL, - NULL, - NULL, - &error); - g_strfreev (argv); - g_strfreev (envp); + retval = g_spawn_async (NULL, + argv, + envp, + G_SPAWN_SEARCH_PATH, + NULL, + NULL, + NULL, + &error); + g_strfreev (argv); + g_strfreev (envp); - if (!retval) - { - GtkWidget *dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_WARNING, - GTK_BUTTONS_CLOSE, - _("Error while trying to run (%s)\n"\ - "which is linked to the key (%s)"), - binding->action, - binding->binding_str); - g_signal_connect (dialog, "response", - G_CALLBACK (gtk_widget_destroy), - NULL); - gtk_widget_show (dialog); - } - return GDK_FILTER_REMOVE; - } - } - return GDK_FILTER_CONTINUE; + if (!retval) { + GtkWidget *dialog = gtk_message_dialog_new (NULL, 0, GTK_MESSAGE_WARNING, + GTK_BUTTONS_CLOSE, + _("Error while trying to run (%s)\n"\ + "which is linked to the key (%s)"), + binding->action, + binding->binding_str); + g_signal_connect (dialog, "response", + G_CALLBACK (gtk_widget_destroy), + NULL); + gtk_widget_show (dialog); + } + return GDK_FILTER_REMOVE; + } + } + return GDK_FILTER_CONTINUE; } -void -gnome_settings_keybindings_init (GConfClient *client) +static gboolean +gnome_settings_module_keybindings_initialize (GnomeSettingsModule *module, GConfClient *client) { - GdkDisplay *dpy = gdk_display_get_default (); - GdkScreen *screen; - int screen_num = gdk_display_get_n_screens (dpy); - int i; + GdkDisplay *dpy = gdk_display_get_default (); + GdkScreen *screen; + int screen_num = gdk_display_get_n_screens (dpy); + int i; - gnome_settings_register_config_callback (GCONF_BINDING_DIR, bindings_callback); + gnome_settings_register_config_callback (GCONF_BINDING_DIR, bindings_callback); - for (i = 0; i < screen_num; i++) - { - screen = gdk_display_get_screen (dpy, i); - gdk_window_add_filter (gdk_screen_get_root_window (screen), - keybindings_filter, NULL); - } + for (i = 0; i < screen_num; i++) { + screen = gdk_display_get_screen (dpy, i); + gdk_window_add_filter (gdk_screen_get_root_window (screen), + keybindings_filter, NULL); + } + + return TRUE; } -void -gnome_settings_keybindings_load (GConfClient *client) +static gboolean +gnome_settings_module_keybindings_start (GnomeSettingsModule *module) { - GSList *list, *li; + GSList *list, *li; - list = gconf_client_all_dirs (client, GCONF_BINDING_DIR, NULL); - screens = get_screens_list (); + list = gconf_client_all_dirs (gnome_settings_module_get_config_client (module), GCONF_BINDING_DIR, NULL); + screens = get_screens_list (); - for (li = list; li != NULL; li = li->next) - { - bindings_get_entry (li->data); - g_free (li->data); - } + for (li = list; li != NULL; li = li->next) { + bindings_get_entry (li->data); + g_free (li->data); + } - g_slist_free (list); + g_slist_free (list); - binding_register_keys (); + binding_register_keys (); + + return TRUE; } +static gboolean +gnome_settings_module_keybindings_stop (GnomeSettingsModule *module) +{ + return TRUE; +} diff --git a/gnome-settings-daemon/gnome-settings-keybindings.h b/gnome-settings-daemon/gnome-settings-keybindings.h deleted file mode 100644 index eadd4ae91..000000000 --- a/gnome-settings-daemon/gnome-settings-keybindings.h +++ /dev/null @@ -1,33 +0,0 @@ -/* gnome-settings-keybindings.h - * - * Copyright (C) 2002 Sun Microsystems Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Author: Erwann Chénedé - */ - - -#ifndef __GNOME_SETTINGS_KEYBINDINGS_H__ -#define __GNOME_SETTINGS_KEYBINDINGS_H__ - -#include -#include - -void gnome_settings_keybindings_init (GConfClient *client); -void gnome_settings_keybindings_load (GConfClient *client); - -#endif /*__GNOME_SETTINGS_KEYBINDINGS_H__*/ diff --git a/gnome-settings-daemon/gnome-settings-keyboard.c b/gnome-settings-daemon/gnome-settings-keyboard.c index a09573655..60e5d8512 100644 --- a/gnome-settings-daemon/gnome-settings-keyboard.c +++ b/gnome-settings-daemon/gnome-settings-keyboard.c @@ -28,10 +28,11 @@ #include #include -#include -#include "gnome-settings-keyboard.h" -#include "gnome-settings-daemon.h" +#include "gnome-settings-keyboard-xkb.h" +#include "gnome-settings-module.h" +#include "gnome-settings-xmodmap.h" +#include "utils.h" #ifdef HAVE_X11_EXTENSIONS_XF86MISC_H # include @@ -44,6 +45,68 @@ #include #include +typedef struct { + GnomeSettingsModule parent; +} GnomeSettingsModuleKeyboard; + +typedef struct { + GnomeSettingsModuleClass parent_class; +} GnomeSettingsModuleKeyboardClass; + +static GnomeSettingsModuleRunlevel gnome_settings_module_keyboard_get_runlevel (GnomeSettingsModule *module); +static gboolean gnome_settings_module_keyboard_initialize (GnomeSettingsModule *module, GConfClient *config_client); +static gboolean gnome_settings_module_keyboard_start (GnomeSettingsModule *module); +static gboolean gnome_settings_module_keyboard_stop (GnomeSettingsModule *module); + +static void +gnome_settings_module_keyboard_class_init (GnomeSettingsModuleKeyboardClass *klass) +{ + GnomeSettingsModuleClass *module_class; + + module_class = (GnomeSettingsModuleClass *) klass; + module_class->get_runlevel = gnome_settings_module_keyboard_get_runlevel; + module_class->initialize = gnome_settings_module_keyboard_initialize; + module_class->start = gnome_settings_module_keyboard_start; + module_class->stop = gnome_settings_module_keyboard_stop; +} + +static void +gnome_settings_module_keyboard_init (GnomeSettingsModuleKeyboard *module) +{ +} + +GType +gnome_settings_module_keyboard_get_type (void) +{ + static GType module_type = 0; + + if (!module_type) { + static const GTypeInfo module_info = { + sizeof (GnomeSettingsModuleKeyboardClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gnome_settings_module_keyboard_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GnomeSettingsModuleKeyboard), + 0, /* n_preallocs */ + (GInstanceInitFunc) gnome_settings_module_keyboard_init, + }; + + module_type = g_type_register_static (GNOME_SETTINGS_TYPE_MODULE, + "GnomeSettingsModuleKeyboard", + &module_info, 0); + } + + return module_type; +} + +static GnomeSettingsModuleRunlevel +gnome_settings_module_keyboard_get_runlevel (GnomeSettingsModule *module) +{ + return GNOME_SETTINGS_MODULE_RUNLEVEL_XSETTINGS; +} + #ifdef HAVE_X11_EXTENSIONS_XF86MISC_H static gboolean xfree86_set_keyboard_autorepeat_rate (int delay, int rate) @@ -53,8 +116,7 @@ xfree86_set_keyboard_autorepeat_rate (int delay, int rate) if (XF86MiscQueryExtension (GDK_DISPLAY (), &event_base_return, - &error_base_return) == True) - { + &error_base_return) == True) { /* load the current settings */ XF86MiscKbdSettings kbdsettings; XF86MiscGetKbdSettings (GDK_DISPLAY (), &kbdsettings); @@ -74,7 +136,8 @@ static gboolean xkb_set_keyboard_autorepeat_rate (int delay, int rate) { int interval = (rate <= 0) ? 1000000 : 1000/rate; - if (delay <= 0) delay = 1; + if (delay <= 0) + delay = 1; return XkbSetAutoRepeatRate (GDK_DISPLAY (), XkbUseCoreKbd, delay, interval); } @@ -93,8 +156,7 @@ gsd_keyboard_get_hostname_key (const char *subkey) if (gethostname (hostname, sizeof (hostname)) == 0 && strcmp (hostname, "localhost") != 0 && - strcmp (hostname, "localhost.localdomain") != 0) - { + strcmp (hostname, "localhost.localdomain") != 0) { char *key = g_strconcat (GSD_KEYBOARD_KEY "/host-", hostname, @@ -102,8 +164,7 @@ gsd_keyboard_get_hostname_key (const char *subkey) subkey, (char *)NULL); return key; - } - else + } else return NULL; } @@ -152,8 +213,7 @@ static char * numlock_gconf_state_key (void) { char *key = gsd_keyboard_get_hostname_key ("numlock_on"); - if (!key) - { + if (!key) { numlock_setup_error = TRUE; g_warning ("numlock: Numlock remembering disabled because your hostname is set to \"localhost\"."); } @@ -218,8 +278,7 @@ numlock_install_xkb_callback (void) int have_xkb = XkbQueryExtension (dpy, &op_code, &xkb_event_code, &error_code, &major, &minor); - if (have_xkb != True) - { + if (have_xkb != True) { numlock_setup_error = TRUE; g_warning ("numlock: XkbQueryExtension returned an error"); return; @@ -316,19 +375,34 @@ apply_settings (void) gdk_error_trap_pop (); } - -void -gnome_settings_keyboard_init (GConfClient *client) +static gboolean +gnome_settings_module_keyboard_initialize (GnomeSettingsModule *module, GConfClient *client) { + /* Essential - xkb initialization should happen before */ + gnome_settings_keyboard_xkb_set_post_activation_callback ((PostActivationCallback) gnome_settings_load_modmap_files, NULL); + gnome_settings_keyboard_xkb_init (client); + gnome_settings_register_config_callback (GSD_KEYBOARD_KEY, (GnomeSettingsConfigCallback) apply_settings); #ifdef HAVE_X11_EXTENSIONS_XKB_H numlock_install_xkb_callback (); #endif /* HAVE_X11_EXTENSIONS_XKB_H */ + + return TRUE; } -void -gnome_settings_keyboard_load (GConfClient *client) +static gboolean +gnome_settings_module_keyboard_start (GnomeSettingsModule *module) { + /* Essential - xkb initialization should happen before */ + gnome_settings_keyboard_xkb_load (gnome_settings_module_get_config_client (module)); + apply_settings (); + + return TRUE; } +static gboolean +gnome_settings_module_keyboard_stop (GnomeSettingsModule *module) +{ + return TRUE; +} diff --git a/gnome-settings-daemon/gnome-settings-keyboard.h b/gnome-settings-daemon/gnome-settings-keyboard.h deleted file mode 100644 index 503081bea..000000000 --- a/gnome-settings-daemon/gnome-settings-keyboard.h +++ /dev/null @@ -1,34 +0,0 @@ -/* -*- mode: c; style: linux -*- */ - -/* gnome-settings-keyboard.h - * - * Copyright © 2001 Ximian, Inc. - * - * Written by Bradford Hovinen - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#ifndef __GNOME_SETTINGS_KEYBOARD_H -#define __GNOME_SETTINGS_KEYBOARD_H - -#include -#include - -void gnome_settings_keyboard_init (GConfClient *client); -void gnome_settings_keyboard_load (GConfClient *client); - -#endif diff --git a/gnome-settings-daemon/gnome-settings-multimedia-keys.c b/gnome-settings-daemon/gnome-settings-multimedia-keys.c index 9e21fa352..0626a6913 100644 --- a/gnome-settings-daemon/gnome-settings-multimedia-keys.c +++ b/gnome-settings-daemon/gnome-settings-multimedia-keys.c @@ -32,14 +32,13 @@ #include #include -#include - #include "eggaccelerators.h" #include "actions/acme.h" #include "actions/acme-volume.h" #include "gsd-media-keys-window.h" #include "gnome-settings-dbus.h" +#include "gnome-settings-module.h" #define VOLUME_STEP 6 /* percents for one volume button press */ @@ -52,6 +51,14 @@ * for these set */ #define USED_MODS (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK) +typedef struct { + GnomeSettingsModule parent; +} GnomeSettingsModuleMultimediaKeys; + +typedef struct { + GnomeSettingsModuleClass parent_class; +} GnomeSettingsModuleMultimediaKeysClass; + typedef struct Acme Acme; struct Acme { @@ -67,6 +74,61 @@ struct Acme { GObject *server; }; +static GnomeSettingsModuleRunlevel gnome_settings_module_multimedia_keys_get_runlevel (GnomeSettingsModule *module); +static gboolean gnome_settings_module_multimedia_keys_initialize (GnomeSettingsModule *module, + GConfClient *client); +static gboolean gnome_settings_module_multimedia_keys_start (GnomeSettingsModule *module); +static gboolean gnome_settings_module_multimedia_keys_stop (GnomeSettingsModule *module); + +static void +gnome_settings_module_multimedia_keys_class_init (GnomeSettingsModuleMultimediaKeysClass *klass) +{ + GnomeSettingsModuleClass *module_class; + + module_class = (GnomeSettingsModuleClass *) klass; + module_class->get_runlevel = gnome_settings_module_multimedia_keys_get_runlevel; + module_class->initialize = gnome_settings_module_multimedia_keys_initialize; + module_class->start = gnome_settings_module_multimedia_keys_start; + module_class->stop = gnome_settings_module_multimedia_keys_stop; +} + +static void +gnome_settings_module_multimedia_keys_init (GnomeSettingsModuleMultimediaKeys *module) +{ +} + +GType +gnome_settings_module_multimedia_keys_get_type (void) +{ + static GType module_type = 0; + + if (!module_type) { + static const GTypeInfo module_info = { + sizeof (GnomeSettingsModuleMultimediaKeysClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gnome_settings_module_multimedia_keys_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GnomeSettingsModuleMultimediaKeys), + 0, /* n_preallocs */ + (GInstanceInitFunc) gnome_settings_module_multimedia_keys_init, + }; + + module_type = g_type_register_static (GNOME_SETTINGS_TYPE_MODULE, + "GnomeSettingsModuleMultimediaKeys", + &module_info, 0); + } + + return module_type; +} + +static GnomeSettingsModuleRunlevel +gnome_settings_module_multimedia_keys_get_runlevel (GnomeSettingsModule *module) +{ + return GNOME_SETTINGS_MODULE_RUNLEVEL_GNOME_SETTINGS; +} + static void acme_error (char * msg) { @@ -87,16 +149,17 @@ acme_error (char * msg) } static char * -get_term_command (Acme *acme) { +get_term_command (Acme *acme) +{ gchar *cmd_term; gchar *cmd = NULL; cmd_term = gconf_client_get_string (acme->conf_client, - "/desktop/gnome/applications/terminal/exec", NULL); + "/desktop/gnome/applications/terminal/exec", NULL); if ((cmd_term != NULL) && (strcmp (cmd_term, "") != 0)) { gchar *cmd_args; cmd_args = gconf_client_get_string (acme->conf_client, - "/desktop/gnome/applications/terminal/exec_arg", NULL); + "/desktop/gnome/applications/terminal/exec_arg", NULL); if ((cmd_args != NULL) && (strcmp (cmd_term, "") != 0)) cmd = g_strdup_printf ("%s %s -e", cmd_term, cmd_args); else @@ -139,8 +202,7 @@ execute (Acme *acme, char *cmd, gboolean sync, gboolean need_term) retval = g_spawn_sync (g_get_home_dir (), argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL, NULL, NULL); - } - else { + } else { retval = g_spawn_async (g_get_home_dir (), argv, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, NULL, NULL); @@ -148,8 +210,7 @@ execute (Acme *acme, char *cmd, gboolean sync, gboolean need_term) g_strfreev (argv); } - if (retval == FALSE) - { + if (retval == FALSE) { char *msg; msg = g_strdup_printf (_("Couldn't execute command: %s\n" @@ -165,10 +226,8 @@ execute (Acme *acme, char *cmd, gboolean sync, gboolean need_term) static void do_sleep_action (char *cmd1, char *cmd2) { - if (g_spawn_command_line_async (cmd1, NULL) == FALSE) - { - if (g_spawn_command_line_async (cmd2, NULL) == FALSE) - { + if (g_spawn_command_line_async (cmd1, NULL) == FALSE) { + if (g_spawn_command_line_async (cmd2, NULL) == FALSE) { acme_error (_("Couldn't put the machine to sleep.\n" "Verify that the machine is correctly configured.")); } @@ -179,8 +238,7 @@ static void dialog_init (Acme *acme) { if (acme->dialog != NULL && - !gsd_media_keys_window_is_valid (GSD_MEDIA_KEYS_WINDOW (acme->dialog))) - { + !gsd_media_keys_window_is_valid (GSD_MEDIA_KEYS_WINDOW (acme->dialog))) { g_object_unref (acme->dialog); acme->dialog = NULL; } @@ -264,10 +322,8 @@ update_kbd_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) g_return_if_fail (entry->key != NULL); /* Find the key that was modified */ - for (i = 0; i < HANDLED_KEYS; i++) - { - if (strcmp (entry->key, keys[i].gconf_key) == 0) - { + for (i = 0; i < HANDLED_KEYS; i++) { + if (strcmp (entry->key, keys[i].gconf_key) == 0) { char *tmp; Key *key; @@ -282,16 +338,14 @@ update_kbd_cb (GConfClient *client, guint id, GConfEntry *entry, gpointer data) tmp = gconf_client_get_string (acme->conf_client, keys[i].gconf_key, NULL); - if (is_valid_shortcut (tmp) == FALSE) - { + if (is_valid_shortcut (tmp) == FALSE) { g_free (tmp); break; } key = g_new0 (Key, 1); if (egg_accelerator_parse_virtual (tmp, &key->keysym, &key->keycode, &key->state) == FALSE - || key->keycode == 0) - { + || key->keycode == 0) { g_free (tmp); g_free (key); break; @@ -323,8 +377,7 @@ init_screens (Acme *acme) return; } - for (i = 0; i < gdk_display_get_n_screens (display); i++) - { + for (i = 0; i < gdk_display_get_n_screens (display); i++) { GdkScreen *screen; screen = gdk_display_get_screen (display, i); @@ -341,8 +394,7 @@ init_kbd (Acme *acme) { int i; - for (i = 0; i < HANDLED_KEYS; i++) - { + for (i = 0; i < HANDLED_KEYS; i++) { char *tmp; Key *key; @@ -359,20 +411,18 @@ init_kbd (Acme *acme) key = g_new0 (Key, 1); if (!egg_accelerator_parse_virtual (tmp, &key->keysym, &key->keycode, &key->state) - || key->keycode == 0) - { + || key->keycode == 0) { g_free (tmp); g_free (key); continue; } /*avoid grabbing all the keyboard when KeyCode cannot be retrieved */ - if (key->keycode == AnyKey) - { - g_warning ("The shortcut key \"%s\" cannot be found on the current system, ignoring the binding", tmp); - g_free (tmp); - g_free (key); - continue; - } + if (key->keycode == AnyKey) { + g_warning ("The shortcut key \"%s\" cannot be found on the current system, ignoring the binding", tmp); + g_free (tmp); + g_free (key); + continue; + } g_free (tmp); @@ -447,8 +497,8 @@ do_unknown_action (Acme *acme, const char *url) g_return_if_fail (url != NULL); string = gconf_client_get_string (acme->conf_client, - "/desktop/gnome/url-handlers/unknown/command", - NULL); + "/desktop/gnome/url-handlers/unknown/command", + NULL); if ((string != NULL) && (strcmp (string, "") != 0)) { gchar *cmd; @@ -465,8 +515,8 @@ do_help_action (Acme *acme) char *string; string = gconf_client_get_string (acme->conf_client, - "/desktop/gnome/url-handlers/ghelp/command", - NULL); + "/desktop/gnome/url-handlers/ghelp/command", + NULL); if ((string != NULL) && (strcmp (string, "") != 0)) { gchar *cmd; @@ -485,14 +535,15 @@ do_mail_action (Acme *acme) char *string; string = gconf_client_get_string (acme->conf_client, - "/desktop/gnome/url-handlers/mailto/command", - NULL); + "/desktop/gnome/url-handlers/mailto/command", + NULL); if ((string != NULL) && (strcmp (string, "") != 0)) { gchar *cmd; cmd = g_strdup_printf (string, ""); - execute (acme, cmd, FALSE, gconf_client_get_bool (acme->conf_client, - "/desktop/gnome/url-handlers/mailto/needs_terminal", NULL)); + execute (acme, cmd, FALSE, + gconf_client_get_bool (acme->conf_client, + "/desktop/gnome/url-handlers/mailto/needs_terminal", NULL)); g_free (cmd); } g_free (string); @@ -518,8 +569,8 @@ do_www_action (Acme *acme, const char *url) char *string; string = gconf_client_get_string (acme->conf_client, - "/desktop/gnome/url-handlers/http/command", - NULL); + "/desktop/gnome/url-handlers/http/command", + NULL); if ((string != NULL) && (strcmp (string, "") != 0)) { gchar *cmd; @@ -589,16 +640,14 @@ do_sound_action (Acme *acme, int type) acme_volume_mute_toggle (acme->volobj); break; case VOLUME_DOWN_KEY: - if (muted) - { + if (muted) { acme_volume_mute_toggle(acme->volobj); } else { acme_volume_set_volume (acme->volobj, vol - vol_step); } break; case VOLUME_UP_KEY: - if (muted) - { + if (muted) { acme_volume_mute_toggle(acme->volobj); } else { acme_volume_set_volume (acme->volobj, vol + vol_step); @@ -708,13 +757,11 @@ acme_get_screen_from_event (Acme *acme, XAnyEvent *xanyev) GSList *l; /* Look for which screen we're receiving events */ - for (l = acme->screens; l != NULL; l = l->next) - { + for (l = acme->screens; l != NULL; l = l->next) { screen = (GdkScreen *) l->data; window = gdk_screen_get_root_window (screen); - if (GDK_WINDOW_XID (window) == xanyev->window) - { + if (GDK_WINDOW_XID (window) == xanyev->window) { return screen; } } @@ -739,14 +786,12 @@ acme_filter_events (GdkXEvent *xevent, GdkEvent *event, gpointer data) keycode = xev->xkey.keycode; state = xev->xkey.state; - for (i = 0; i < HANDLED_KEYS; i++) - { + for (i = 0; i < HANDLED_KEYS; i++) { if (keys[i].key == NULL) continue; if (keys[i].key->keycode == keycode && - (state & USED_MODS) == keys[i].key->state) - { + (state & USED_MODS) == keys[i].key->state) { switch (keys[i].key_type) { case VOLUME_DOWN_KEY: case VOLUME_UP_KEY: @@ -772,20 +817,21 @@ acme_filter_events (GdkXEvent *xevent, GdkEvent *event, gpointer data) return GDK_FILTER_CONTINUE; } -void -gnome_settings_multimedia_keys_init (GConfClient *client) +static gboolean +gnome_settings_module_multimedia_keys_initialize (GnomeSettingsModule *module, GConfClient *client) { + return TRUE; } -void -gnome_settings_multimedia_keys_load (GConfClient *client) +static gboolean +gnome_settings_module_multimedia_keys_start (GnomeSettingsModule *module) { GSList *l; Acme *acme; acme = g_new0 (Acme, 1); - acme->conf_client = client; + acme->conf_client = gnome_settings_module_get_config_client (module); gconf_client_add_dir (acme->conf_client, GCONF_BINDING_DIR, GCONF_CLIENT_PRELOAD_ONELEVEL, @@ -803,5 +849,13 @@ gnome_settings_multimedia_keys_load (GConfClient *client) for (l = acme->screens; l != NULL; l = l->next) gdk_window_add_filter (gdk_screen_get_root_window (l->data), acme_filter_events, (gpointer) acme); + + return TRUE; +} + +static gboolean +gnome_settings_module_multimedia_keys_stop (GnomeSettingsModule *module) +{ + return TRUE; } diff --git a/gnome-settings-daemon/gnome-settings-multimedia-keys.h b/gnome-settings-daemon/gnome-settings-multimedia-keys.h deleted file mode 100644 index 6ef45837b..000000000 --- a/gnome-settings-daemon/gnome-settings-multimedia-keys.h +++ /dev/null @@ -1,31 +0,0 @@ -/* gnome-settings-multimedia_keys.h - * - * Copyright (C) 2002 Sun Microsystems Inc. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - * - * Author: Erwann Chénedé - */ - - -#ifndef __GNOME_SETTINGS_MULTIMEDIA_KEYS_H__ -#define __GNOME_SETTINGS_MULTIMEDIA_KEYS_H__ - -#include -void gnome_settings_multimedia_keys_init (GConfClient *client); -void gnome_settings_multimedia_keys_load (GConfClient *client); - -#endif /*__GNOME_SETTINGS_MULTIMEDIA_KEYS_H__*/ diff --git a/gnome-settings-daemon/gnome-settings-screensaver.c b/gnome-settings-daemon/gnome-settings-screensaver.c index c86a9f0bf..92e38cebe 100644 --- a/gnome-settings-daemon/gnome-settings-screensaver.c +++ b/gnome-settings-daemon/gnome-settings-screensaver.c @@ -173,7 +173,7 @@ gnome_settings_module_screensaver_start (GnomeSettingsModule *module) return FALSE; args[2] = NULL; - if (g_spawn_async (g_get_home_dir (), args, NULL, 0, NULL, NULL, &module_ss->screensaver_pid, &gerr)) + if (g_spawn_async (g_get_home_dir (), args, NULL, G_SPAWN_SEARCH_PATH, NULL, NULL, &module_ss->screensaver_pid, &gerr)) return TRUE; show_error = gconf_client_get_bool (gnome_settings_module_get_config_client (module), diff --git a/gnome-settings-daemon/gnome-settings-xrdb.c b/gnome-settings-daemon/gnome-settings-xrdb.c index 2e7ddf683..5f54c3dc8 100644 --- a/gnome-settings-daemon/gnome-settings-xrdb.c +++ b/gnome-settings-daemon/gnome-settings-xrdb.c @@ -27,10 +27,16 @@ #include #include #include -#include -#include "gnome-settings-daemon.h" -#include "gnome-settings-xrdb.h" +#include "gnome-settings-module.h" + +typedef struct { + GnomeSettingsModule parent; +} GnomeSettingsModuleXrdb; + +typedef struct { + GnomeSettingsModuleClass parent_class; +} GnomeSettingsModuleXrdbClass; #define SYSTEM_AD_DIR GNOMECC_DATA_DIR "/xrdb" #define GENERAL_AD SYSTEM_AD_DIR "/General.ad" @@ -40,8 +46,30 @@ #define GTK_THEME_KEY "/desktop/gnome/interface/gtk_theme" +static GnomeSettingsModuleRunlevel gnome_settings_module_xrdb_get_runlevel (GnomeSettingsModule *module); +static gboolean gnome_settings_module_xrdb_initialize (GnomeSettingsModule *module, GConfClient *client); +static gboolean gnome_settings_module_xrdb_start (GnomeSettingsModule *module); +static gboolean gnome_settings_module_xrdb_stop (GnomeSettingsModule *module); + static GtkWidget *widget; +static void +gnome_settings_module_xrdb_class_init (GnomeSettingsModuleXrdbClass *klass) +{ + GnomeSettingsModuleClass *module_class; + + module_class = GNOME_SETTINGS_MODULE_CLASS (klass); + module_class->get_runlevel = gnome_settings_module_xrdb_get_runlevel; + module_class->initialize = gnome_settings_module_xrdb_initialize; + module_class->start = gnome_settings_module_xrdb_start; + module_class->stop = gnome_settings_module_xrdb_stop; +} + +static void +gnome_settings_module_xrdb_init (GnomeSettingsModuleXrdb *module) +{ +} + /* * Theme colour functions */ @@ -127,14 +155,16 @@ append_theme_colours (GtkStyle *style, GString *string) static gint compare_basenames (gconstpointer a, gconstpointer b) { - char *base_a, *base_b; - int res; - base_a = g_path_get_basename (a); - base_b = g_path_get_basename (b); - res = strcmp (base_a, base_b); - g_free (base_a); - g_free (base_b); - return res; + char *base_a, *base_b; + int res; + + base_a = g_path_get_basename (a); + base_b = g_path_get_basename (b); + res = strcmp (base_a, base_b); + g_free (base_a); + g_free (base_b); + + return res; } /** @@ -326,28 +356,69 @@ static void theme_changed (GtkSettings *settings, apply_settings (gtk_widget_get_style (widget)); } -void -gnome_settings_xrdb_init (GConfClient *client) +GType +gnome_settings_module_xrdb_get_type (void) { + static GType module_type = 0; + + if (!module_type) { + static const GTypeInfo module_info = { + sizeof (GnomeSettingsModuleXrdbClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc) gnome_settings_module_xrdb_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GnomeSettingsModuleXrdb), + 0, /* n_preallocs */ + (GInstanceInitFunc) gnome_settings_module_xrdb_init, + }; + + module_type = g_type_register_static (GNOME_SETTINGS_TYPE_MODULE, + "GnomeSettingsModuleXrdb", + &module_info, 0); + } + + return module_type; } -void -gnome_settings_xrdb_load (GConfClient *client) +static GnomeSettingsModuleRunlevel +gnome_settings_module_xrdb_get_runlevel (GnomeSettingsModule *module) +{ + return GNOME_SETTINGS_MODULE_RUNLEVEL_XSETTINGS; +} + +static gboolean +gnome_settings_module_xrdb_initialize (GnomeSettingsModule *module, GConfClient *client) +{ + return TRUE; +} + +static gboolean +gnome_settings_module_xrdb_start (GnomeSettingsModule *module) { static gboolean initialized = FALSE; - if (!initialized) - { /* the initialization is done here otherwise - gnome_settings_xsettings_load would generate - false hit as gtk-theme-name is set to Default in - gnome_settings_xsettings_init */ - GtkSettings *settings = gtk_settings_get_default (); - widget = gtk_window_new (GTK_WINDOW_TOPLEVEL); - g_signal_connect (settings, - "notify::gtk-theme-name", - G_CALLBACK (theme_changed), - widget); - gtk_widget_ensure_style (widget); - initialized = TRUE; - } + if (!initialized) { + /* the initialization is done here otherwise + gnome_settings_xsettings_load would generate + false hit as gtk-theme-name is set to Default in + gnome_settings_xsettings_init */ + GtkSettings *settings = gtk_settings_get_default (); + widget = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (settings, + "notify::gtk-theme-name", + G_CALLBACK (theme_changed), + widget); + gtk_widget_ensure_style (widget); + initialized = TRUE; + } + + return TRUE; +} + +static gboolean +gnome_settings_module_xrdb_stop (GnomeSettingsModule *module) +{ + return TRUE; } diff --git a/gnome-settings-daemon/gnome-settings-xrdb.h b/gnome-settings-daemon/gnome-settings-xrdb.h deleted file mode 100644 index 8bc1d1e5f..000000000 --- a/gnome-settings-daemon/gnome-settings-xrdb.h +++ /dev/null @@ -1,33 +0,0 @@ -/* -*- mode: c; style: linux -*- */ - -/* gnome-settings-xrdb - * - * Copyright © 2003 Ross Burton - * - * Written by Ross Burton - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA - * 02111-1307, USA. - */ - -#ifndef __GNOME_SETTINGS_XRDB_H -#define __GNOME_SETTINGS_XRDB_H - -#include - -void gnome_settings_xrdb_init (GConfClient *client); -void gnome_settings_xrdb_load (GConfClient *client); - -#endif