diff --git a/gnome-settings-daemon/ChangeLog b/gnome-settings-daemon/ChangeLog index 001c46beb..c1e800c33 100644 --- a/gnome-settings-daemon/ChangeLog +++ b/gnome-settings-daemon/ChangeLog @@ -1,3 +1,17 @@ +2005-01-29 Shakti Sen + + * gnome-settings-keyboard-xkb.c + (gnome_settings_keyboard_xkb_chk_lcl_xmm): Calls the modmap load + dialog. + * gnome-settings-daemon.c (gnome_settings_daemon_new): + Loads the modmap files. + * gnome-settings-xmodmap.h: Added newly + * gnome-settings-xmodmap.c: Also added newly which handles the modmap + settings. + * modmap-dialog.glade: Added newly. + + Solved bug #143487 + 2005-01-12 Sebastien Bacher * gnome-settings-accessibility-keyboard.c: (warning_dialog_post): diff --git a/gnome-settings-daemon/Makefile.am b/gnome-settings-daemon/Makefile.am index 9d4612a01..95ea97ea8 100644 --- a/gnome-settings-daemon/Makefile.am +++ b/gnome-settings-daemon/Makefile.am @@ -53,6 +53,8 @@ gnome_settings_daemon_SOURCES = \ gnome-settings-typing-break.h \ reaper.c \ reaper.h \ + gnome-settings-xmodmap.c \ + gnome-settings-xmodmap.h \ $(CORBA_GENERATED) # $(AccessX_files) @@ -92,13 +94,16 @@ IDL_FLAGS = -D__GNOME_SettingsDaemon_COMPILATION -I $(idl_dir) -I $(datadir)/idl $(CORBA_GENERATED): $(idl_dir)/GNOME_SettingsDaemon.idl $(ORBIT_IDL) $(ORBIT_IDL) $(IDL_FLAGS) $(idl_dir)/GNOME_SettingsDaemon.idl +Gladedir = $(GNOMECC_GLADE_DIR) +Glade_DATA = modmap-dialog.glade + serverfile = GNOME_SettingsDaemon.server.in serverdir = $(libdir)/bonobo/servers install-data-hook : $(mkinstalldirs) $(DESTDIR)$(serverdir) sed -e "s|\@LIBEXECDIR\@|$(libexecdir)|" $(srcdir)/$(serverfile) > $(DESTDIR)$(serverdir)/$(serverfile:.in=) -EXTRA_DIST = $(serverfile) +EXTRA_DIST = $(serverfile) $(Glade_DATA) CLEANFILES = $(BUILT_SOURCES) uninstall-local: diff --git a/gnome-settings-daemon/gnome-settings-daemon.c b/gnome-settings-daemon/gnome-settings-daemon.c index e0db68e47..30bb3e44d 100644 --- a/gnome-settings-daemon/gnome-settings-daemon.c +++ b/gnome-settings-daemon/gnome-settings-daemon.c @@ -39,6 +39,7 @@ #include "xsettings-manager.h" #include "gnome-settings-daemon.h" +#include "gnome-settings-xmodmap.h" /*#include "gnome-settings-disk.h"*/ #include "gnome-settings-font.h" @@ -275,6 +276,7 @@ gnome_settings_daemon_new (void) gnome_settings_xsettings_init (client); gnome_settings_mouse_init (client); /* Essential - xkb initialization should happen before */ + gnome_settings_keyboard_xkb_set_post_activation_callback (gnome_settings_load_modmap_files, NULL); gnome_settings_keyboard_xkb_init (client); gnome_settings_keyboard_init (client); gnome_settings_multimedia_keys_init (client); diff --git a/gnome-settings-daemon/gnome-settings-keyboard-xkb.c b/gnome-settings-daemon/gnome-settings-keyboard-xkb.c index 0ff732881..4cb150413 100644 --- a/gnome-settings-daemon/gnome-settings-keyboard-xkb.c +++ b/gnome-settings-daemon/gnome-settings-keyboard-xkb.c @@ -30,6 +30,7 @@ #include #include #include +#include "gnome-settings-xmodmap.h" #include #include @@ -56,6 +57,8 @@ static void *paCallbackUserData = NULL; static const char DISABLE_XMM_WARNING_KEY[] = "/desktop/gnome/peripherals/keyboard/disable_xmm_and_xkb_warning"; +static const char KNOWN_FILES_KEY[] = + "/desktop/gnome/peripherals/keyboard/general/known_file_list"; typedef enum { RESPONSE_USE_X, @@ -229,55 +232,70 @@ gnome_settings_keyboard_xkb_analyze_sysconfig (void) GSwitchItKbdConfigTerm (&backupGConfKbdConfig); } -static void -gnome_settings_keyboard_xkb_chk_lcl_xmm_response (GtkDialog * dlg, - gint response) +static gboolean +gnome_settings_chk_file_list (void) { + GDir *homeDir; + G_CONST_RETURN gchar *fname; + GSList *file_list = NULL; + GSList *last_login_file_list = NULL; + GSList *tmp = NULL; + GSList *tmp_l = NULL; + gboolean new_file_exist = FALSE; GConfClient *confClient = gconf_client_get_default (); - switch (response) { - case GTK_RESPONSE_OK: - gconf_client_set_bool (confClient, DISABLE_XMM_WARNING_KEY, TRUE, - NULL); - break; + + homeDir = g_dir_open (g_get_home_dir (), 0, NULL); + while ((fname = g_dir_read_name (homeDir)) != NULL) { + if (g_strrstr (fname, "modmap")) { + file_list = g_slist_append (file_list, g_strdup (fname)); + } } + + last_login_file_list = gconf_client_get_list (confClient, KNOWN_FILES_KEY, GCONF_VALUE_STRING, NULL); + + /* Compare between the two file list, currently available modmap files + and the files available in the last log in */ + tmp = file_list; + while (tmp != NULL) { + tmp_l = last_login_file_list; + new_file_exist = TRUE; + while (tmp_l != NULL) { + if (strcmp (tmp->data, tmp_l->data) == 0) { + new_file_exist = FALSE; + break; + } + else + tmp_l = tmp_l->next; + } + if (new_file_exist) + break; + else + tmp = tmp->next; + } + + if (new_file_exist) + gconf_client_set_list (confClient, KNOWN_FILES_KEY, GCONF_VALUE_STRING, file_list, NULL); + + g_slist_foreach (file_list, (GFunc) g_free, NULL); + g_slist_free (file_list); + + g_slist_foreach (last_login_file_list, (GFunc) g_free, NULL); + g_slist_free (last_login_file_list); + g_object_unref (G_OBJECT (confClient)); - gtk_widget_destroy (GTK_WIDGET (dlg)); + + return new_file_exist; + } static void gnome_settings_keyboard_xkb_chk_lcl_xmm (void) { - GConfClient *confClient = gconf_client_get_default (); - gboolean disableWarning = - gconf_client_get_bool (confClient, DISABLE_XMM_WARNING_KEY, NULL); - GDir *homeDir; - G_CONST_RETURN gchar *fname; - g_object_unref (G_OBJECT (confClient)); - if (disableWarning) - return; + if (gnome_settings_chk_file_list ()) + gnome_settings_modmap_dialog_call (); + gnome_settings_load_modmap_files (); - homeDir = g_dir_open (g_get_home_dir (), 0, NULL); - if (homeDir == NULL) - return; - while ((fname = g_dir_read_name (homeDir)) != NULL) - if (strlen (fname) >= 8 - && !g_ascii_strncasecmp (fname, ".xmodmap", 8)) { - GtkWidget *msg = - gtk_message_dialog_new_with_markup (NULL, 0, - GTK_MESSAGE_WARNING, - GTK_BUTTONS_OK, - _ - ("You have a keyboard remapping file (%s) in your home directory whose contents will now be ignored." - " You can use the keyboard preferences to restore them."), - fname); - g_signal_connect (msg, "response", - G_CALLBACK - (gnome_settings_keyboard_xkb_chk_lcl_xmm_response), - NULL); - gtk_widget_show (msg); - break; - } - g_dir_close (homeDir); + } void diff --git a/schemas/desktop_gnome_peripherals_keyboard_xkb.schemas.in b/schemas/desktop_gnome_peripherals_keyboard_xkb.schemas.in index 57e0e6019..488218b53 100644 --- a/schemas/desktop_gnome_peripherals_keyboard_xkb.schemas.in +++ b/schemas/desktop_gnome_peripherals_keyboard_xkb.schemas.in @@ -65,6 +65,20 @@ + + /schemas/desktop/gnome/peripherals/keyboard/general/known_file_list + /desktop/gnome/peripherals/keyboard/general/known_file_list + gnome + list + string + [] + + modmap file list + A list of modmap files available in the $HOME directory. + + + + /schemas/desktop/gnome/peripherals/keyboard/general/defaultGroup /desktop/gnome/peripherals/keyboard/general/defaultGroup