all modules use now the new arch.

2007-06-21  Rodrigo Moya <rodrigo@gnome-db.org>

	* 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.

svn path=/trunk/; revision=7756
This commit is contained in:
Rodrigo Moya 2007-06-21 12:19:06 +00:00 committed by Rodrigo Moya
parent 39fc05602e
commit 4f4291f6d4
15 changed files with 820 additions and 670 deletions

View file

@ -1,3 +1,20 @@
2007-06-21 Rodrigo Moya <rodrigo@gnome-db.org>
* 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 <mclasen@redhat.com>
* gnome-settings-screensaver.c (gnome_settings_module_screensaver_start):
fix spawning of gnome-screensaver.
2007-06-19 Rodrigo Moya <rodrigo@gnome-db.org>
* gnome-settings-module.c (gnome_settings_module_start|_stop): return

View file

@ -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 \

View file

@ -31,8 +31,71 @@
#include <gconf/gconf-client.h>
#include <libgnome/gnome-help.h>
#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 <X11/XKBlib.h>
@ -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;
}

View file

@ -1,32 +0,0 @@
/* gnome-settings-accessibility-keyboard.h
*
* Copyright © 2002 Ximian, Inc.
*
* Written by Jody Goldberg <jody@gnome.org>
*
* 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 <gconf/gconf.h>
#include <gconf/gconf-client.h>
void gnome_settings_accessibility_keyboard_init (GConfClient *client);
void gnome_settings_accessibility_keyboard_load (GConfClient *client);
#endif /* __GNOME_SETTINGS_ACCESSIBILITY_KEYBOARD_H */

View file

@ -31,7 +31,6 @@
#include <gdk/gdkx.h>
#include <gconf/gconf.h>
#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

View file

@ -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);

View file

@ -6,8 +6,7 @@
#include <gdk/gdk.h>
#include <gtk/gtk.h>
#include <gdk/gdkx.h>
#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;
}

View file

@ -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é <erwann.chenede@sun.com>
*/
#ifndef __GNOME_SETTINGS_KEYBINDINGS_H__
#define __GNOME_SETTINGS_KEYBINDINGS_H__
#include <gconf/gconf.h>
#include <gconf/gconf-client.h>
void gnome_settings_keybindings_init (GConfClient *client);
void gnome_settings_keybindings_load (GConfClient *client);
#endif /*__GNOME_SETTINGS_KEYBINDINGS_H__*/

View file

@ -28,10 +28,11 @@
#include <gdk/gdk.h>
#include <gdk/gdkx.h>
#include <gconf/gconf-client.h>
#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 <X11/extensions/xf86misc.h>
@ -44,6 +45,68 @@
#include <string.h>
#include <unistd.h>
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;
}

View file

@ -1,34 +0,0 @@
/* -*- mode: c; style: linux -*- */
/* gnome-settings-keyboard.h
*
* Copyright © 2001 Ximian, Inc.
*
* Written by Bradford Hovinen <hovinen@ximian.com>
*
* 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 <gconf/gconf.h>
#include <gconf/gconf-client.h>
void gnome_settings_keyboard_init (GConfClient *client);
void gnome_settings_keyboard_load (GConfClient *client);
#endif

View file

@ -32,14 +32,13 @@
#include <gdk/gdkx.h>
#include <gtk/gtk.h>
#include <gconf/gconf-client.h>
#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;
}

View file

@ -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é <erwann.chenede@sun.com>
*/
#ifndef __GNOME_SETTINGS_MULTIMEDIA_KEYS_H__
#define __GNOME_SETTINGS_MULTIMEDIA_KEYS_H__
#include <gconf/gconf.h>
void gnome_settings_multimedia_keys_init (GConfClient *client);
void gnome_settings_multimedia_keys_load (GConfClient *client);
#endif /*__GNOME_SETTINGS_MULTIMEDIA_KEYS_H__*/

View file

@ -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),

View file

@ -27,10 +27,16 @@
#include <string.h>
#include <glib/gi18n.h>
#include <gtk/gtkwindow.h>
#include <gconf/gconf-client.h>
#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;
}

View file

@ -1,33 +0,0 @@
/* -*- mode: c; style: linux -*- */
/* gnome-settings-xrdb
*
* Copyright © 2003 Ross Burton
*
* Written by Ross Burton <ross@burtonini.com>
*
* 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 <gconf/gconf-client.h>
void gnome_settings_xrdb_init (GConfClient *client);
void gnome_settings_xrdb_load (GConfClient *client);
#endif