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:
parent
39fc05602e
commit
4f4291f6d4
15 changed files with 820 additions and 670 deletions
|
@ -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
|
||||
|
|
|
@ -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 \
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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 */
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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__*/
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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__*/
|
|
@ -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),
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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
|
Loading…
Add table
Add a link
Reference in a new issue