diff --git a/ChangeLog b/ChangeLog index f4aa8770e..581c335f1 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,28 @@ +2002-03-17 Jonathan Blandford + + * Makefile.am: Add new Makefiles + * configure.in: ditto + * capplets/Makefile.am: Add keybindings dialog + + * capplets/keybindings/.cvsignore: shut up CVS + + * capplets/keybindings/Makefile.am: + * capplets/keybindings/eggcellrendererkeys.c: + * capplets/keybindings/eggcellrendererkeys.h: + * capplets/keybindings/gnome-keybinding-properties.c: + * capplets/keybindings/gnome-keybinding-properties.glade: + * capplets/keybindings/keybinding.desktop.in: + New properties dialog. Seems to work + + * schemas/.cvsignore: shut up CVS + + * schemas/Makefile.am: + * schemas/apps_gnome_keybinding_properties.schemas: New schemas + file for configuring the keybinding schemas. + * schemas/background.schemas: Remove unneeded schemas files + * schemas/peripherals.schemas: + * schemas/screensaver.schemas: + 2002-03-11 Richard Hestilow * Committed patches by Lauris Kaplinski for bugs 73571, 73587, diff --git a/Makefile.am b/Makefile.am index db0976f3e..edff67305 100644 --- a/Makefile.am +++ b/Makefile.am @@ -1,4 +1,4 @@ -SUBDIRS = po libsounds libbackground gnome-settings-daemon capplets control-center idl +SUBDIRS = po libsounds libbackground gnome-settings-daemon capplets control-center idl schemas #I removed the root-manager for now # diff --git a/capplets/Makefile.am b/capplets/Makefile.am index 9e44e69c4..5b0bd84c1 100644 --- a/capplets/Makefile.am +++ b/capplets/Makefile.am @@ -2,6 +2,6 @@ always_built_SUBDIRS = \ common default-applications desktop-links \ background keyboard mouse sound \ file-types theme-switcher ui-properties \ - screensaver font - + screensaver font keybindings + SUBDIRS = $(always_built_SUBDIRS) diff --git a/capplets/background/.cvsignore b/capplets/background/.cvsignore index 8b2eca396..df68b6217 100644 --- a/capplets/background/.cvsignore +++ b/capplets/background/.cvsignore @@ -5,5 +5,8 @@ Makefile.in *.o *.lo *.la -gnome2-background-properties background.desktop +background.desktop.in +gnome2-background-properties +gnome-background-properties +*.oaf \ No newline at end of file diff --git a/capplets/background/ChangeLog b/capplets/background/ChangeLog index 1151423c0..32b9179fb 100644 --- a/capplets/background/ChangeLog +++ b/capplets/background/ChangeLog @@ -1,3 +1,9 @@ +2002-03-17 Jonathan Blandford + + reviewed by: + + * .cvsignore: + 2002-03-14 Richard Hestilow * background-properties-capplet.c (setup_dialog): Use new enum diff --git a/capplets/common/ChangeLog b/capplets/common/ChangeLog index f1cf2b450..8bb529a3b 100644 --- a/capplets/common/ChangeLog +++ b/capplets/common/ChangeLog @@ -1,3 +1,12 @@ +2002-03-17 Jonathan Blandford + + reviewed by: + + * Makefile.am: + * theme-common.c: (themes_common_list_add_dir), + (theme_common_get_list), (theme_common_list_free): + * theme-common.h: + 2002-03-14 Richard Hestilow * gconf-property-editor.c: diff --git a/capplets/common/Makefile.am b/capplets/common/Makefile.am index 7615e490a..a9454b4e9 100644 --- a/capplets/common/Makefile.am +++ b/capplets/common/Makefile.am @@ -13,4 +13,5 @@ libcommon_a_SOURCES = \ activate-settings-daemon.c activate-settings-daemon.h \ capplet-util.c capplet-util.h \ gconf-property-editor.c gconf-property-editor.h \ - gconf-property-editor-marshal.c gconf-property-editor-marshal.h + gconf-property-editor-marshal.c gconf-property-editor-marshal.h \ + theme-common.c theme-common.h diff --git a/capplets/common/theme-common.c b/capplets/common/theme-common.c new file mode 100644 index 000000000..a9fc8cdee --- /dev/null +++ b/capplets/common/theme-common.c @@ -0,0 +1,91 @@ +#include + +#include +#include +#include + +#include +#include +#include +#include "theme-common.h" + +static GList * +themes_common_list_add_dir (GList *list, + const char *dirname) +{ + DIR *dir; + struct dirent *de; + const gchar *suffix = "gtk-2.0"; + const gchar *key_suffix = "gtk-2.0-key"; + + g_return_val_if_fail (dirname != NULL, list); + + dir = opendir (dirname); + if (!dir) + return list; + + while ((de = readdir (dir))) + { + char *tmp; + ThemeInfo *info = NULL; + + if (de->d_name[0] == '.') + continue; + + tmp = g_build_filename (dirname, de->d_name, suffix, NULL); + if (g_file_test (tmp, G_FILE_TEST_IS_DIR)) + { + info = g_new0 (ThemeInfo, 1); + info->path = g_build_filename (dirname, de->d_name, NULL); + info->name = g_strdup (de->d_name); + + info->has_gtk = TRUE; + } + g_free (tmp); + + tmp = g_build_filename (dirname, de->d_name, key_suffix, NULL); + if (g_file_test (tmp, G_FILE_TEST_IS_DIR)) + { + if (info == NULL) + { + info = g_new0 (ThemeInfo, 1); + info->path = g_build_filename (dirname, de->d_name, NULL); + info->name = g_strdup (de->d_name); + } + info->has_keybinding = TRUE; + } + g_free (tmp); + if (info) + list = g_list_prepend (list, info); + } + closedir (dir); + + return list; +} + +GList * +theme_common_get_list (void) +{ + gchar *dir; + GList *theme_list = NULL; + + dir = g_build_filename (g_get_home_dir (), ".themes", NULL); + theme_list = themes_common_list_add_dir (theme_list, dir); + g_free (dir); + + dir = gtk_rc_get_theme_dir (); + theme_list = themes_common_list_add_dir (theme_list, dir); + g_free (dir); + + return theme_list; +} + +void +theme_common_list_free (GList *list) +{ + if (list == NULL) + return; + + g_list_foreach (list, g_free, NULL); + g_list_free (list); +} diff --git a/capplets/common/theme-common.h b/capplets/common/theme-common.h new file mode 100644 index 000000000..bda610f6c --- /dev/null +++ b/capplets/common/theme-common.h @@ -0,0 +1,20 @@ + +#ifndef THEME_COMMON_H +#define THEME_COMMON_H + +#include + +typedef struct _ThemeInfo ThemeInfo; +struct _ThemeInfo +{ + gchar *path; + gchar *name; + gboolean has_gtk; + gboolean has_keybinding; +}; + +GList *theme_common_get_list (void); +void theme_common_list_free (GList *list); + + +#endif /* THEME_COMMON_H */ diff --git a/capplets/font/ChangeLog b/capplets/font/ChangeLog index 307c9c64f..855972c40 100644 --- a/capplets/font/ChangeLog +++ b/capplets/font/ChangeLog @@ -1,3 +1,10 @@ +2002-03-17 Jonathan Blandford + + reviewed by: + + * font-properties.glade: + * main.c: (setup_dialog): + 2002-02-27 Kjartan Maraas * main.c: s/PACKAGE/GETTEXT_PACKAGE/g diff --git a/capplets/font/font-properties.glade b/capplets/font/font-properties.glade index 4d3a79e07..4816b65f6 100644 --- a/capplets/font/font-properties.glade +++ b/capplets/font/font-properties.glade @@ -1,62 +1,177 @@ - + - - + + - Font properties + Font Preferences + GTK_WINDOW_TOPLEVEL + no + no + no yes + GTK_WIN_POS_NONE - - - - - 4 - - - Use a custom font. - yes - - - no - - - - - font-info - yes - yes - - - no - - - - + + no + 0 + yes - - - - - gtk-apply - yes - yes - 1 + + + GTK_BUTTONBOX_END + 8 yes + + + + yes + yes + yes + gtk-close + yes + yes + + + + 0 + no + yes + GTK_PACK_END + - - - gtk-close - yes - yes - 2 + + + + 10 + no + 10 yes + + + + Desktop Font + 0 + 250 + GTK_SHADOW_NONE + yes + + + + no + 10 + yes + + + + yes + Select the desktop font + AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz + GNOME_FONT_PICKER_MODE_FONT_INFO + yes + 14 + yes + yes + + + 0 + yes + yes + + + + + + yes + Set to Default + GTK_RELIEF_NORMAL + yes + + + 0 + no + no + + + + + + + 0 + yes + yes + + + + + + File Manager Font + 0 + GTK_SHADOW_NONE + yes + + + + no + 10 + yes + + + + yes + Pick a Font + AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz + GNOME_FONT_PICKER_MODE_FONT_INFO + yes + 14 + yes + yes + + + 0 + yes + yes + + + + + + yes + Set to Default + GTK_RELIEF_NORMAL + yes + + + 0 + no + no + + + + + + + 0 + yes + yes + + + + 0 + yes + yes + - + + 4 + yes + yes + + diff --git a/capplets/font/main.c b/capplets/font/main.c index b7c8216c4..3a8ac81fc 100644 --- a/capplets/font/main.c +++ b/capplets/font/main.c @@ -43,9 +43,9 @@ setup_dialog (void) { GObject *peditor; - peditor = gconf_peditor_new_boolean (changeset, "/desktop/gnome/interface/use_custom_font", WID ("custom_check"), NULL); + peditor = gconf_peditor_new_boolean (NULL, /*changeset,*/ "/desktop/gnome/interface/use_custom_font", WID ("custom_check"), NULL); gconf_peditor_widget_set_guard (GCONF_PROPERTY_EDITOR (peditor), WID ("font_picker")); - peditor = gconf_peditor_new_font (changeset, "/desktop/gnome/interface/font_name", WID ("font_picker"), NULL); + peditor = gconf_peditor_new_font (NULL, /*changeset,*/ "/desktop/gnome/interface/font_name", WID ("font_picker"), NULL); } int diff --git a/capplets/keybindings/.cvsignore b/capplets/keybindings/.cvsignore new file mode 100644 index 000000000..fdb74fa27 --- /dev/null +++ b/capplets/keybindings/.cvsignore @@ -0,0 +1,4 @@ +Makefile +Makefile.in +gnome-keybinding-properties +keybinding.desktop diff --git a/capplets/keybindings/Makefile.am b/capplets/keybindings/Makefile.am new file mode 100644 index 000000000..a2ecc48cb --- /dev/null +++ b/capplets/keybindings/Makefile.am @@ -0,0 +1,21 @@ +bin_PROGRAMS = gnome-keybinding-properties + +gnome_keybinding_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS) +gnome_keybinding_properties_SOURCES = \ + gnome-keybinding-properties.c \ + eggcellrendererkeys.c + +@INTLTOOL_DESKTOP_RULE@ + + +Gladedir = $(GNOMECC_GLADE_DIR) +Glade_DATA = gnome-keybinding-properties.glade + +desktopdir = $(GNOMECC_DESKTOP_DIR) +Desktop_in_files = keybinding.desktop.in +desktop_DATA = $(Desktop_in_files:.desktop.in=.desktop) + +INCLUDES = $(GNOMECC_CAPPLETS_CFLAGS) +CLEANFILES = $(GNOMECC_CAPPLETS_CLEANFILES) +EXTRA_DIST = $(Glade_DATA) $(Desktop_in_files) + diff --git a/capplets/keybindings/eggcellrendererkeys.c b/capplets/keybindings/eggcellrendererkeys.c new file mode 100644 index 000000000..08b67e428 --- /dev/null +++ b/capplets/keybindings/eggcellrendererkeys.c @@ -0,0 +1,529 @@ +#include +#include +#include +#include +#include +#include "eggcellrendererkeys.h" + +#ifndef _ +#define _(x) dgettext (GETTEXT_PACKAGE, x) +#define N_(x) x +#endif + +#define EGG_CELL_RENDERER_TEXT_PATH "egg-cell-renderer-text" +#define USED_MODS (GDK_SHIFT_MASK | GDK_CONTROL_MASK | GDK_MOD1_MASK) + +static void egg_cell_renderer_keys_finalize (GObject *object); +static void egg_cell_renderer_keys_init (EggCellRendererKeys *cell_keys); +static void egg_cell_renderer_keys_class_init (EggCellRendererKeysClass *cell_keys_class); +static GtkCellEditable *egg_cell_renderer_keys_start_editing (GtkCellRenderer *cell, + GdkEvent *event, + GtkWidget *widget, + const gchar *path, + GdkRectangle *background_area, + GdkRectangle *cell_area, + GtkCellRendererState flags); + + +static void egg_cell_renderer_keys_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec); +static void egg_cell_renderer_keys_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec); + +enum { + PROP_0, + + /* FIXME make names consistent with something else */ + PROP_ACCEL_KEY, + PROP_ACCEL_MASK +}; + +static GtkCellRendererTextClass *parent_class = NULL; + +GType +egg_cell_renderer_keys_get_type (void) +{ + static GType cell_keys_type = 0; + + if (!cell_keys_type) + { + static const GTypeInfo cell_keys_info = + { + sizeof (EggCellRendererKeysClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + (GClassInitFunc)egg_cell_renderer_keys_class_init, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (EggCellRendererKeys), + 0, /* n_preallocs */ + (GInstanceInitFunc) egg_cell_renderer_keys_init + }; + + cell_keys_type = g_type_register_static (GTK_TYPE_CELL_RENDERER_TEXT, "EggCellRendererKeys", &cell_keys_info, 0); + } + + return cell_keys_type; +} + +static void +egg_cell_renderer_keys_init (EggCellRendererKeys *cell_keys) +{ +} + +/* FIXME setup stuff to generate this */ +/* VOID:STRING,UINT,FLAGS */ +static void +marshal_VOID__STRING_UINT_FLAGS (GClosure *closure, + GValue *return_value, + guint n_param_values, + const GValue *param_values, + gpointer invocation_hint, + gpointer marshal_data) +{ + typedef void (*GMarshalFunc_VOID__STRING_UINT_FLAGS) (gpointer data1, + const char *arg_1, + guint arg_2, + int arg_3, + gpointer data2); + register GMarshalFunc_VOID__STRING_UINT_FLAGS callback; + register GCClosure *cc = (GCClosure*) closure; + register gpointer data1, data2; + + g_return_if_fail (n_param_values == 4); + + if (G_CCLOSURE_SWAP_DATA (closure)) + { + data1 = closure->data; + data2 = g_value_peek_pointer (param_values + 0); + } + else + { + data1 = g_value_peek_pointer (param_values + 0); + data2 = closure->data; + } + + callback = (GMarshalFunc_VOID__STRING_UINT_FLAGS) (marshal_data ? marshal_data : cc->callback); + + callback (data1, + g_value_get_string (param_values + 1), + g_value_get_uint (param_values + 2), + g_value_get_flags (param_values + 3), + data2); +} + +static void +egg_cell_renderer_keys_class_init (EggCellRendererKeysClass *cell_keys_class) +{ + GObjectClass *object_class; + + object_class = G_OBJECT_CLASS (cell_keys_class); + + parent_class = g_type_class_peek_parent (object_class); + + GTK_CELL_RENDERER_CLASS (cell_keys_class)->start_editing = egg_cell_renderer_keys_start_editing; + + object_class->set_property = egg_cell_renderer_keys_set_property; + object_class->get_property = egg_cell_renderer_keys_get_property; + + object_class->finalize = egg_cell_renderer_keys_finalize; + + /* FIXME if this gets moved to a real library, rename the properties + * to match whatever the GTK convention is + */ + + g_object_class_install_property (object_class, + PROP_ACCEL_MASK, + g_param_spec_flags ("accel_mask", + _("Accelerator modifiers"), + _("Accelerator modifiers"), + GDK_TYPE_MODIFIER_TYPE, + 0, + G_PARAM_READABLE | G_PARAM_WRITABLE)); + + g_object_class_install_property (object_class, + PROP_ACCEL_KEY, + g_param_spec_uint ("accel_key", + _("Accelerator key"), + _("Accelerator key"), + 0, + G_MAXINT, + 0, + G_PARAM_READABLE | G_PARAM_WRITABLE)); + + g_signal_new ("keys_edited", + EGG_TYPE_CELL_RENDERER_KEYS, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EggCellRendererKeysClass, keys_edited), + NULL, NULL, + marshal_VOID__STRING_UINT_FLAGS, + G_TYPE_NONE, 3, + G_TYPE_STRING, + G_TYPE_UINT, + GDK_TYPE_MODIFIER_TYPE); +} + + +GtkCellRenderer * +egg_cell_renderer_keys_new (void) +{ + return GTK_CELL_RENDERER (g_object_new (EGG_TYPE_CELL_RENDERER_KEYS, NULL)); +} + +static void +egg_cell_renderer_keys_finalize (GObject *object) +{ + + (* G_OBJECT_CLASS (parent_class)->finalize) (object); +} + +static gchar * +convert_keysym_state_to_string (guint keysym, + GdkModifierType state) +{ + if (keysym == 0) + return g_strdup (_("Disabled")); + else + return gtk_accelerator_name (keysym, state); +} + +static void +egg_cell_renderer_keys_get_property (GObject *object, + guint param_id, + GValue *value, + GParamSpec *pspec) +{ + EggCellRendererKeys *keys; + + g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (object)); + + keys = EGG_CELL_RENDERER_KEYS (object); + + switch (param_id) + { + case PROP_ACCEL_KEY: + g_value_set_uint (value, keys->accel_key); + break; + + case PROP_ACCEL_MASK: + g_value_set_flags (value, keys->accel_mask); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + } +} + +static void +egg_cell_renderer_keys_set_property (GObject *object, + guint param_id, + const GValue *value, + GParamSpec *pspec) +{ + EggCellRendererKeys *keys; + + g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (object)); + + keys = EGG_CELL_RENDERER_KEYS (object); + + switch (param_id) + { + case PROP_ACCEL_KEY: + egg_cell_renderer_keys_set_accelerator (keys, + g_value_get_uint (value), + keys->accel_mask); + break; + + case PROP_ACCEL_MASK: + egg_cell_renderer_keys_set_accelerator (keys, + keys->accel_key, + g_value_get_flags (value)); + break; + + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, param_id, pspec); + } +} + +static gboolean +is_modifier (guint keycode) +{ + gint i; + gint map_size; + XModifierKeymap *mod_keymap; + gboolean retval = FALSE; + + mod_keymap = XGetModifierMapping (gdk_display); + + map_size = 8 * mod_keymap->max_keypermod; + i = 0; + while (i < map_size) + { + if (keycode == mod_keymap->modifiermap[i]) + { + retval = TRUE; + break; + } + ++i; + } + + XFreeModifiermap (mod_keymap); + + return retval; +} + +static GdkFilterReturn +grab_key_filter (GdkXEvent *gdk_xevent, GdkEvent *event, gpointer data) +{ + XEvent *xevent = (XEvent *)gdk_xevent; + guint keycode, state; + char buf[10]; + KeySym keysym; + EggCellRendererKeys *keys; + char *path; + gboolean edited; + + if (xevent->type != KeyPress) + return GDK_FILTER_CONTINUE; + + keys = EGG_CELL_RENDERER_KEYS (data); + + keycode = xevent->xkey.keycode; + + if (is_modifier (keycode)) + return GDK_FILTER_CONTINUE; + + edited = FALSE; + + state = xevent->xkey.state & USED_MODS; + + XLookupString ((XKeyEvent*)xevent, buf, sizeof (buf), &keysym, NULL); + + if (state == 0 && keysym == GDK_Escape) + goto out; /* cancel */ + + /* clear the accelerator on Backspace */ + if (keys->edit_key != 0 && + state == 0 && + keysym == GDK_BackSpace) + keysym = 0; + + edited = TRUE; + + out: + path = g_strdup (g_object_get_data (G_OBJECT (keys->edit_widget), + EGG_CELL_RENDERER_TEXT_PATH)); + + gdk_keyboard_ungrab (xevent->xkey.time); + gdk_pointer_ungrab (xevent->xkey.time); + + gtk_cell_editable_editing_done (GTK_CELL_EDITABLE (keys->edit_widget)); + gtk_cell_editable_remove_widget (GTK_CELL_EDITABLE (keys->edit_widget)); + keys->edit_widget = NULL; + keys->filter_window = NULL; + + if (edited) + g_signal_emit_by_name (G_OBJECT (keys), "keys_edited", path, + keysym, state); + + g_free (path); + + return GDK_FILTER_REMOVE; +} + +static void +ungrab_stuff (GtkWidget *widget, gpointer data) +{ + EggCellRendererKeys *keys = EGG_CELL_RENDERER_KEYS (data); + + gdk_keyboard_ungrab (GDK_CURRENT_TIME); + gdk_pointer_ungrab (GDK_CURRENT_TIME); + + gdk_window_remove_filter (keys->filter_window, + grab_key_filter, data); +} + +static void +pointless_eventbox_start_editing (GtkCellEditable *cell_editable, + GdkEvent *event) +{ + /* do nothing, because we are pointless */ +} + +static void +pointless_eventbox_cell_editable_init (GtkCellEditableIface *iface) +{ + iface->start_editing = pointless_eventbox_start_editing; +} + +static GType +pointless_eventbox_subclass_get_type (void) +{ + static GType eventbox_type = 0; + + if (!eventbox_type) + { + static const GTypeInfo eventbox_info = + { + sizeof (GtkEventBoxClass), + NULL, /* base_init */ + NULL, /* base_finalize */ + NULL, + NULL, /* class_finalize */ + NULL, /* class_data */ + sizeof (GtkEventBox), + 0, /* n_preallocs */ + (GInstanceInitFunc) NULL, + }; + + static const GInterfaceInfo cell_editable_info = { + (GInterfaceInitFunc) pointless_eventbox_cell_editable_init, + NULL, NULL }; + + eventbox_type = g_type_register_static (GTK_TYPE_EVENT_BOX, "EggCellEditableEventBox", &eventbox_info, 0); + + g_type_add_interface_static (eventbox_type, + GTK_TYPE_CELL_EDITABLE, + &cell_editable_info); + } + + return eventbox_type; +} + +static GtkCellEditable * +egg_cell_renderer_keys_start_editing (GtkCellRenderer *cell, + GdkEvent *event, + GtkWidget *widget, + const gchar *path, + GdkRectangle *background_area, + GdkRectangle *cell_area, + GtkCellRendererState flags) +{ + GtkCellRendererText *celltext; + EggCellRendererKeys *keys; + GtkWidget *label; + GtkWidget *eventbox; + + celltext = GTK_CELL_RENDERER_TEXT (cell); + keys = EGG_CELL_RENDERER_KEYS (cell); + + /* If the cell isn't editable we return NULL. */ + if (celltext->editable == FALSE) + return NULL; + + g_return_val_if_fail (widget->window != NULL, NULL); + + if (gdk_keyboard_grab (widget->window, FALSE, + gdk_event_get_time (event)) != GDK_GRAB_SUCCESS) + return NULL; + + if (gdk_pointer_grab (widget->window, FALSE, + GDK_BUTTON_PRESS_MASK, + FALSE, NULL, + gdk_event_get_time (event)) != GDK_GRAB_SUCCESS) + { + gdk_keyboard_ungrab (gdk_event_get_time (event)); + return NULL; + } + + keys->filter_window = widget->window; + + gdk_window_add_filter (keys->filter_window, grab_key_filter, keys); + + eventbox = g_object_new (pointless_eventbox_subclass_get_type (), + NULL); + keys->edit_widget = eventbox; + g_object_add_weak_pointer (G_OBJECT (keys->edit_widget), + (void**) &keys->edit_widget); + + label = gtk_label_new (NULL); + gtk_misc_set_alignment (GTK_MISC (label), 0.0, 0.5); + + gtk_widget_modify_bg (eventbox, GTK_STATE_NORMAL, + &widget->style->bg[GTK_STATE_SELECTED]); + + gtk_widget_modify_fg (label, GTK_STATE_NORMAL, + &widget->style->fg[GTK_STATE_SELECTED]); + + if (keys->accel_key != 0) + gtk_label_set_markup (GTK_LABEL (label), + _("Type a new accelerator, or press Backspace to clear")); + else + gtk_label_set_text (GTK_LABEL (label), + _("Type a new accelerator")); + + gtk_container_add (GTK_CONTAINER (eventbox), label); + + g_object_set_data_full (G_OBJECT (keys->edit_widget), EGG_CELL_RENDERER_TEXT_PATH, + g_strdup (path), g_free); + + gtk_widget_show_all (keys->edit_widget); + + g_signal_connect (G_OBJECT (keys->edit_widget), "unrealize", + G_CALLBACK (ungrab_stuff), keys); + + keys->edit_key = keys->accel_key; + keys->edit_mask = keys->accel_mask; + + return GTK_CELL_EDITABLE (keys->edit_widget); +} + +void +egg_cell_renderer_keys_set_accelerator (EggCellRendererKeys *keys, + guint keyval, + GdkModifierType mask) +{ + char *text; + gboolean changed; + GtkCellRendererText *celltext; + + g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (keys)); + + g_object_freeze_notify (G_OBJECT (keys)); + + changed = FALSE; + + if (keyval != keys->accel_key) + { + keys->accel_key = keyval; + g_object_notify (G_OBJECT (keys), "accel_key"); + changed = TRUE; + } + + if (mask != keys->accel_mask) + { + keys->accel_mask = mask; + + g_object_notify (G_OBJECT (keys), "accel_mask"); + changed = TRUE; + } + g_object_thaw_notify (G_OBJECT (keys)); + + if (changed) + { + /* sync string to the key values */ + celltext = GTK_CELL_RENDERER_TEXT (keys); + text = convert_keysym_state_to_string (keys->accel_key, keys->accel_mask); + g_object_set (keys, "text", text, NULL); + } + +} + + +void +egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys, + guint *keyval, + GdkModifierType *mask) +{ + g_return_if_fail (EGG_IS_CELL_RENDERER_KEYS (keys)); + + if (keyval) + *keyval = keys->accel_key; + + if (mask) + *mask = keys->accel_mask; +} diff --git a/capplets/keybindings/eggcellrendererkeys.h b/capplets/keybindings/eggcellrendererkeys.h new file mode 100644 index 000000000..c14adfc33 --- /dev/null +++ b/capplets/keybindings/eggcellrendererkeys.h @@ -0,0 +1,73 @@ +/* gtkcellrendererkeybinding.h + * Copyright (C) 2000 Red Hat, Inc., Jonathan Blandford + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library 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 + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __EGG_CELL_RENDERER_KEYS_H__ +#define __EGG_CELL_RENDERER_KEYS_H__ + +#include + +G_BEGIN_DECLS + +#define EGG_TYPE_CELL_RENDERER_KEYS (egg_cell_renderer_keys_get_type ()) +#define EGG_CELL_RENDERER_KEYS(obj) (GTK_CHECK_CAST ((obj), EGG_TYPE_CELL_RENDERER_KEYS, EggCellRendererKeys)) +#define EGG_CELL_RENDERER_KEYS_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), EGG_TYPE_CELL_RENDERER_KEYS, EggCellRendererKeysClass)) +#define EGG_IS_CELL_RENDERER_KEYS(obj) (GTK_CHECK_TYPE ((obj), EGG_TYPE_CELL_RENDERER_KEYS)) +#define EGG_IS_CELL_RENDERER_KEYS_CLASS(klass) (GTK_CHECK_CLASS_TYPE ((klass), EGG_TYPE_CELL_RENDERER_KEYS)) +#define EGG_CELL_RENDERER_KEYS_GET_CLASS(obj) (GTK_CHECK_GET_CLASS ((obj), EGG_TYPE_CELL_RENDERER_KEYS, EggCellRendererKeysClass)) + +typedef struct _EggCellRendererKeys EggCellRendererKeys; +typedef struct _EggCellRendererKeysClass EggCellRendererKeysClass; + +struct _EggCellRendererKeys +{ + GtkCellRendererText parent; + guint accel_key; + GdkModifierType accel_mask; + GtkWidget *edit_widget; + GdkWindow *filter_window; + guint edit_key; + GdkModifierType edit_mask; +}; + +struct _EggCellRendererKeysClass +{ + GtkCellRendererTextClass parent_class; + + void (* keys_edited) (EggCellRendererKeys *keys, + guint keyval, + GdkModifierType mask); +}; + +GType egg_cell_renderer_keys_get_type (void); +GtkCellRenderer *egg_cell_renderer_keys_new (void); + +void egg_cell_renderer_keys_set_accelerator (EggCellRendererKeys *keys, + guint keyval, + GdkModifierType mask); + + +void egg_cell_renderer_keys_get_accelerator (EggCellRendererKeys *keys, + guint *keyval, + GdkModifierType *mask); + + +G_END_DECLS + + +#endif /* __GTK_CELL_RENDERER_KEYS_H__ */ diff --git a/capplets/keybindings/gnome-keybinding-properties.c b/capplets/keybindings/gnome-keybinding-properties.c new file mode 100644 index 000000000..3f97a4957 --- /dev/null +++ b/capplets/keybindings/gnome-keybinding-properties.c @@ -0,0 +1,522 @@ +#include + +#include +#include +#include +#include + +#include "theme-common.h" +#include "capplet-util.h" +#include "eggcellrendererkeys.h" +#include "activate-settings-daemon.h" + +#define LABEL_DATA "gnome-keybinding-properties-label" + +/* FIXME: We currnetly leak the KeyEntry structures in the Model every time it + * changes + */ + +enum +{ + DESCRIPTION_COLUMN, + KEYENTRY_COLUMN, + N_COLUMNS +}; + +typedef struct +{ + char *gconf_key; + guint keyval; + GdkModifierType mask; + gboolean editable; + GtkTreeModel *model; + guint gconf_cnxn; +} KeyEntry; + +GList *signals = NULL; + +static GladeXML * +create_dialog (void) +{ + GladeXML *dialog; + + dialog = glade_xml_new ("gnome-keybinding-properties.glade", "gnome-keybinding-dialog", NULL); + if (dialog == NULL) + dialog = glade_xml_new (GNOMECC_DATA_DIR "/interfaces/gnome-mouse-properties.glade", "gnome-keybinding-dialog", NULL); + + return dialog; +} + +static char* +binding_name (guint keyval, + GdkModifierType mask, + gboolean translate) +{ + if (keyval != 0) + return gtk_accelerator_name (keyval, mask); + else + return translate ? g_strdup (_("Disabled")) : g_strdup ("disabled"); +} + +static void +accel_set_func (GtkTreeViewColumn *tree_column, + GtkCellRenderer *cell, + GtkTreeModel *model, + GtkTreeIter *iter, + gpointer data) +{ + KeyEntry *key_entry; + + gtk_tree_model_get (model, iter, + KEYENTRY_COLUMN, &key_entry, + -1); + + if (key_entry == NULL) + g_object_set (G_OBJECT (cell), + "visible", FALSE, + NULL); + else if (! key_entry->editable) + g_object_set (G_OBJECT (cell), + "visible", TRUE, + "editable", FALSE, + "accel_key", key_entry->keyval, + "accel_mask", key_entry->mask, + "style", PANGO_STYLE_ITALIC, + NULL); + else + g_object_set (G_OBJECT (cell), + "visible", TRUE, + "editable", TRUE, + "accel_key", key_entry->keyval, + "accel_mask", key_entry->mask, + "style", PANGO_STYLE_NORMAL, + NULL); +} + +static void +keybinding_key_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) +{ + KeyEntry *key_entry; + const gchar *key_value; + GtkTreePath *path; + GtkTreeIter iter; + gboolean valid; + + key_entry = (KeyEntry *)user_data; + key_value = gconf_value_get_string (entry->value); + + if (key_value != NULL) + { + gtk_accelerator_parse (key_value, &key_entry->keyval, &key_entry->mask); + } + else + { + key_entry->keyval = 0; + key_entry->mask = 0; + } + + path = gtk_tree_path_new_first (); + for (valid = gtk_tree_model_get_iter_first (key_entry->model, &iter); + valid; + valid = gtk_tree_model_iter_next (key_entry->model, &iter)) + { + KeyEntry *tmp_key_entry; + + gtk_tree_model_get (key_entry->model, &iter, + KEYENTRY_COLUMN, &tmp_key_entry, + -1); + if (tmp_key_entry == key_entry) + { + gtk_tree_model_row_changed (key_entry->model, path, &iter); + } + gtk_tree_path_next (path); + } + gtk_tree_path_free (path); +} + + +static void +clear_old_model (GtkWidget *tree_view) +{ + GtkTreeModel *model; + GtkTreeIter iter; + KeyEntry *key_entry; + gboolean valid; + GConfClient *client; + + client = gconf_client_get_default (); + model = gtk_tree_view_get_model (GTK_TREE_VIEW (tree_view)); + if (model == NULL) + return; + + g_object_ref (model); + gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), NULL); + + for (valid = gtk_tree_model_get_iter_first (model, &iter); + valid; + valid = gtk_tree_model_iter_next (model, &iter)) + { + gtk_tree_model_get (model, &iter, + KEYENTRY_COLUMN, &key_entry, + -1); + gconf_client_notify_remove (client, key_entry->gconf_cnxn); + g_free (key_entry->gconf_key); + g_free (key_entry); + } + + g_object_unref (model); +} + +static void +setup_tree (GladeXML *dialog, + GSList *keys_list) +{ + GConfClient *client; + GtkTreeModel *model; + GSList *list; + gint i = 0; + + clear_old_model (WID ("shortcut_treeview")); + client = gconf_client_get_default (); + model = (GtkTreeModel *) gtk_list_store_new (N_COLUMNS, G_TYPE_STRING, G_TYPE_POINTER); + + for (list = keys_list; list; list = list->next) + { + GConfEntry *entry; + GConfSchema *schema = NULL; + KeyEntry *key_entry; + GError *error = NULL; + GtkTreeIter iter; + gchar *key_string; + gchar *key_value; + + key_string = g_strdup ((gchar *) list->data); + entry = gconf_client_get_entry (client, + key_string, + NULL, + TRUE, + &error); + if (error || entry == NULL) + { + /* We don't actually want to popup a dialog */ + g_free (key_string); + if (error) + g_error_free (error); + continue; + } + + if (entry->schema_name) + schema = gconf_client_get_schema (client, entry->schema_name, &error); + + if (error || schema == NULL) + { + /* We don't actually want to popup a dialog */ + g_free (key_string); + if (error) + g_error_free (error); + continue; + } + + key_value = gconf_client_get_string (client, key_string, &error); + + key_entry = g_new0 (KeyEntry, 1); + key_entry->gconf_key = key_string; + key_entry->editable = TRUE; + key_entry->model = model; + gconf_client_add_dir (client, key_string, GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + key_entry->gconf_cnxn = gconf_client_notify_add (client, + key_string, + (GConfClientNotifyFunc) &keybinding_key_changed, + key_entry, NULL, NULL); + if (key_value) + { + gtk_accelerator_parse (key_value, &key_entry->keyval, &key_entry->mask); + } + else + { + key_entry->keyval = 0; + key_entry->mask = 0; + } + g_free (key_value); + + i++; + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + if (schema->short_desc) + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + DESCRIPTION_COLUMN, schema->short_desc, + KEYENTRY_COLUMN, key_entry, + -1); + else + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + DESCRIPTION_COLUMN, _(""), + KEYENTRY_COLUMN, key_entry, + -1); + gconf_entry_free (entry); + gconf_schema_free (schema); + } + + if (i > 8) + { + gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (WID ("actions_swindow")), + GTK_POLICY_AUTOMATIC, GTK_POLICY_NEVER); + } + + if (i == 0) + { + gtk_widget_hide (WID ("shortcuts_frame")); + } + else + { + gtk_widget_show (WID ("shortcuts_frame")); + } + gtk_tree_view_set_model (GTK_TREE_VIEW (WID ("shortcut_treeview")), model); +} + +static void +keybinding_key_list_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) +{ + GladeXML *dialog; + GSList *value_list, *list; + GSList *string_list = NULL; + + dialog = user_data; + + if (strcmp (entry->key, "/apps/gnome_keybinding_properties/keybinding_key_list")) + return; + + value_list = gconf_value_get_list (entry->value); + for (list = value_list; list; list = list->next) + { + GConfValue *value = list->data; + string_list = g_slist_append (string_list, (char *)gconf_value_get_string (value)); + } + setup_tree (dialog, string_list); + g_slist_free (string_list); +} + +static void +key_theme_changed (GConfClient *client, + guint cnxn_id, + GConfEntry *entry, + gpointer user_data) +{ + GtkWidget *omenu = (GtkWidget *) user_data; + GtkWidget *menu; + GtkWidget *menu_item; + GConfValue *value; + const gchar *new_key_theme; + GList *list; + gint i = 0; + + menu = gtk_option_menu_get_menu (GTK_OPTION_MENU (omenu)); + value = gconf_entry_get_value (entry); + new_key_theme = gconf_value_get_string (value); + + for (list = GTK_MENU_SHELL (menu)->children; list; list = list->next, i++) + { + gchar *text; + + menu_item = GTK_WIDGET (list->data); + text = g_object_get_data (G_OBJECT (menu_item), LABEL_DATA); + if (! strcmp (text, new_key_theme)) + { + if (gtk_option_menu_get_history (GTK_OPTION_MENU (omenu)) != i) + gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), i); + return; + } + } + + /* We didn't find our theme. Add it to our list. */ + menu_item = gtk_menu_item_new_with_label (new_key_theme); + g_object_set_data_full (G_OBJECT (menu_item), LABEL_DATA, g_strdup (new_key_theme), g_free); + gtk_widget_show (menu_item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), i); +} + + +static void +accel_edited_callback (GtkCellRendererText *cell, + const char *path_string, + guint keyval, + GdkModifierType mask, + gpointer data) +{ + GtkTreeView *view = (GtkTreeView *)data; + GtkTreeModel *model; + GtkTreePath *path = gtk_tree_path_new_from_string (path_string); + GtkTreeIter iter; + KeyEntry *key_entry; + GError *err = NULL; + char *str; + + model = gtk_tree_view_get_model (view); + gtk_tree_model_get_iter (model, &iter, path); + gtk_tree_model_get (model, &iter, + KEYENTRY_COLUMN, &key_entry, + -1); + + /* sanity check */ + if (key_entry == NULL) + return; + + str = binding_name (keyval, mask, FALSE); + + gconf_client_set_string (gconf_client_get_default(), + key_entry->gconf_key, + str, + &err); + g_free (str); + + if (err != NULL) + { + GtkWidget *dialog; + + dialog = gtk_message_dialog_new (GTK_WINDOW (gtk_widget_get_toplevel (GTK_WIDGET (view))), + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, + GTK_MESSAGE_WARNING, + GTK_BUTTONS_OK, + "Error setting new accelerator in configuration database: %s\n", + err->message); + gtk_dialog_run (GTK_DIALOG (dialog)); + + gtk_widget_destroy (dialog); + g_error_free (err); + key_entry->editable = FALSE; + } + + gtk_tree_path_free (path); +} + +static void +setup_dialog (GladeXML *dialog) +{ + GConfClient *client; + GList *key_theme_list; + GtkCellRenderer *renderer; + GSList *keys_list; + GtkWidget *widget; + + client = gconf_client_get_default (); + + key_theme_list = theme_common_get_list (); + + if (key_theme_list == NULL) + { + GtkWidget *msg_dialog = gtk_message_dialog_new (NULL, 0, + GTK_MESSAGE_ERROR, + GTK_BUTTONS_OK, + _("Unable to find any keyboard themes. This means your GTK+ " + "installation has been incompletely installed.")); + gtk_dialog_run (GTK_DIALOG (msg_dialog)); + gtk_widget_destroy (msg_dialog); + + gtk_widget_hide (WID ("shortcut_hbox")); + } + else + { + GtkWidget *omenu; + GtkWidget *menu; + GtkWidget *menu_item; + GList *list; + + omenu = WID ("key_theme_omenu"); + menu = gtk_menu_new (); + for (list = key_theme_list; list; list = list->next) + { + ThemeInfo *info = list->data; + + /* Make sure we have a default */ + if (!strcasecmp (info->name, "default")) + { + menu_item = gtk_menu_item_new_with_label (info->name); + g_object_set_data_full (G_OBJECT (menu_item), LABEL_DATA, g_strdup (info->name), g_free); + gtk_widget_show (menu_item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + } + } + for (list = key_theme_list; list; list = list->next) + { + ThemeInfo *info = list->data; + + if (strcasecmp (info->name, "default")) + { + menu_item = gtk_menu_item_new_with_label (info->name); + g_object_set_data_full (G_OBJECT (menu_item), LABEL_DATA, g_strdup (info->name), g_free); + gtk_widget_show (menu_item); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), menu_item); + } + } + gtk_widget_show (menu); + gtk_option_menu_set_menu (GTK_OPTION_MENU (omenu), menu); + + gconf_client_add_dir (client, "/desktop/gnome/interface", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + gconf_client_notify_add (client, + "/desktop/gnome/interface/gtk_key_theme", + (GConfClientNotifyFunc) &key_theme_changed, + omenu, NULL, NULL); + } + + + gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (WID ("shortcut_treeview")), + -1, + _("_Action"), + gtk_cell_renderer_text_new (), + "text", DESCRIPTION_COLUMN, + NULL); + renderer = (GtkCellRenderer *) g_object_new (EGG_TYPE_CELL_RENDERER_KEYS, + "editable", TRUE, + NULL); + g_signal_connect (G_OBJECT (renderer), + "keys_edited", + G_CALLBACK (accel_edited_callback), + WID ("shortcut_treeview")); + gtk_tree_view_insert_column_with_data_func (GTK_TREE_VIEW (WID ("shortcut_treeview")), + -1, _("_Shortcut"), + renderer, + accel_set_func, NULL, NULL); + gconf_client_add_dir (client, "/apps/gnome_keybinding_properties", GCONF_CLIENT_PRELOAD_ONELEVEL, NULL); + gconf_client_notify_add (client, + "/apps/gnome_keybinding_properties/keybinding_key_list", + (GConfClientNotifyFunc) &keybinding_key_list_changed, + dialog, NULL, NULL); + keys_list = gconf_client_get_list (client, "/apps/gnome_keybinding_properties/keybinding_key_list", GCONF_VALUE_STRING, NULL); + setup_tree (dialog, keys_list); + + widget = WID ("gnome-keybinding-dialog"); + gtk_widget_show (widget); + + g_signal_connect (G_OBJECT (widget), "response", gtk_main_quit, NULL); + g_signal_connect (G_OBJECT (widget), "close", gtk_main_quit, NULL); +} + +int +main (int argc, char *argv[]) +{ + GladeXML *dialog; + + gtk_init (&argc, &argv); + + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + textdomain (GETTEXT_PACKAGE); + + gnome_program_init (argv[0], VERSION, LIBGNOMEUI_MODULE, argc, argv, + GNOME_PARAM_APP_DATADIR, GNOMECC_DATA_DIR, + NULL); + + activate_settings_daemon (); + + dialog = create_dialog (); + setup_dialog (dialog); + + gtk_main (); + + return 0; +} diff --git a/capplets/keybindings/gnome-keybinding-properties.glade b/capplets/keybindings/gnome-keybinding-properties.glade new file mode 100644 index 000000000..ba10d6a43 --- /dev/null +++ b/capplets/keybindings/gnome-keybinding-properties.glade @@ -0,0 +1,186 @@ + + + + + + + False + Keyboard Shortcuts + GTK_WINDOW_TOPLEVEL + GTK_WIN_POS_NONE + False + True + False + False + + + + 2 + True + False + 0 + + + + 5 + True + GTK_BUTTONBOX_END + 10 + + + + True + True + True + gtk-close + True + GTK_RELIEF_NORMAL + -7 + + + + + 0 + False + True + GTK_PACK_END + + + + + + 8 + True + False + 8 + + + + True + False + 4 + + + + True + Keyboard _Navigation scheme for use in applications: + True + False + GTK_JUSTIFY_LEFT + False + False + 0.5 + 0.5 + 0 + 0 + key_theme_omenu + + + 0 + False + False + + + + + + True + True + -1 + + + 0 + True + True + + + + + 0 + False + True + + + + + + True + Desktop Shortcuts: + 0 + GTK_SHADOW_NONE + + + + 4 + True + False + 4 + + + + True + True + GTK_POLICY_NEVER + GTK_POLICY_NEVER + GTK_SHADOW_NONE + GTK_CORNER_TOP_LEFT + + + + True + True + True + True + False + True + + + + + 0 + True + True + + + + + + True + To assign a shortcut to an action, click in the shortcut column and press the key combination you want to associate with it. + False + False + GTK_JUSTIFY_LEFT + True + False + 0 + 0.5 + 0 + 0 + + + 0 + False + False + + + + + + + 0 + True + True + + + + + 0 + True + True + + + + + + + diff --git a/capplets/keybindings/keybinding.desktop.in b/capplets/keybindings/keybinding.desktop.in new file mode 100644 index 000000000..8abd721c7 --- /dev/null +++ b/capplets/keybindings/keybinding.desktop.in @@ -0,0 +1,7 @@ +[Desktop Entry] +_Name=Keybinding +_Comment=Keybinding Properties +Exec=gnome-keybinding-properties +Terminal=0 +Type=Application +Categories=Application;Settings; diff --git a/configure.in b/configure.in index 9b5a453e3..e0adee410 100644 --- a/configure.in +++ b/configure.in @@ -197,6 +197,7 @@ capplets/desktop-links/Sawfish/Makefile capplets/file-types/Makefile capplets/file-types/libuuid/Makefile capplets/font/Makefile +capplets/keybindings/Makefile capplets/keyboard/Makefile capplets/mouse/Makefile capplets/screensaver/Makefile @@ -204,4 +205,5 @@ capplets/sound/Makefile capplets/theme-switcher/Makefile capplets/theme-switcher/control/Makefile capplets/ui-properties/Makefile +schemas/Makefile libsounds/Makefile]) diff --git a/gnome-settings-daemon/ChangeLog b/gnome-settings-daemon/ChangeLog index e1f32e5d6..661e027f5 100644 --- a/gnome-settings-daemon/ChangeLog +++ b/gnome-settings-daemon/ChangeLog @@ -1,3 +1,7 @@ +2002-03-17 Jonathan Blandford + + * gnome-settings-xsettings.c: Add keybindingtheme + 2002-03-17 Kjartan Maraas * factory.c: Move include to the top. @@ -36,7 +40,6 @@ register it with bonobo-activation. Still has a main loop that can be run normally to launch the settings daemon. ->>>>>>> 1.26 2002-03-06 Miles Lane * gnome-settings-daemon.c -- Correct the gnome_program_init() diff --git a/gnome-settings-daemon/gnome-settings-xsettings.c b/gnome-settings-daemon/gnome-settings-xsettings.c index 7cf7ff639..742fd5949 100644 --- a/gnome-settings-daemon/gnome-settings-xsettings.c +++ b/gnome-settings-daemon/gnome-settings-xsettings.c @@ -59,6 +59,8 @@ static TranslationEntry translations [] = { translate_string_string }, { "/desktop/gnome/interface/gtk_theme", "Net/ThemeName", GCONF_VALUE_STRING, translate_string_string }, + { "/desktop/gnome/interface/gtk_key_theme", "Gtk/KeyThemeName", GCONF_VALUE_STRING, + translate_string_string }, { "/desktop/gnome/interface/font_name", "Gtk/FontName", GCONF_VALUE_STRING, translate_string_string } }; diff --git a/schemas/.cvsignore b/schemas/.cvsignore new file mode 100644 index 000000000..282522db0 --- /dev/null +++ b/schemas/.cvsignore @@ -0,0 +1,2 @@ +Makefile +Makefile.in diff --git a/schemas/Makefile.am b/schemas/Makefile.am index 3336b9f32..ff89e5909 100644 --- a/schemas/Makefile.am +++ b/schemas/Makefile.am @@ -1,9 +1,10 @@ schemadir = @GCONF_SCHEMA_FILE_DIR@ -schema_DATA = peripherals.schemas background.schemas screensaver.schemas +schema_DATA = \ + apps_gnome_keybinding_properties.schemas schema_source_data = $(foreach file, $(schema_DATA), $(srcdir)/$(file)) install-data-local: $(schema_installed_data) GCONF_CONFIG_SOURCE=$(GCONF_SCHEMA_CONFIG_SOURCE) $(GCONFTOOL) --makefile-install-rule $(schema_source_data) -EXTRA_DIST=$(schema_DATA) \ No newline at end of file +EXTRA_DIST=$(schema_DATA) diff --git a/schemas/apps_gnome_keybinding_properties.schemas b/schemas/apps_gnome_keybinding_properties.schemas new file mode 100644 index 000000000..1087f4d90 --- /dev/null +++ b/schemas/apps_gnome_keybinding_properties.schemas @@ -0,0 +1,19 @@ + + + + + /apps/gnome_keybinding_properties/keybinding_key_list + /schemas/apps/gnome_keybinding_properties/keybinding_key_list + gnome-control-center + list + string + [/apps/panel/global/run-key,/apps/panel/global/menu-key,/apps/panel/global/screenshot-key,/apps/panel/global/window-screenshot-key] + + List of GConf keys that the keybinding dialog can configure + List of GConf keys that the keybinding dialog can + configure. The keys pointed must be keys that use the standard + keybinding storage scheme. + + + + diff --git a/schemas/background.schemas b/schemas/background.schemas deleted file mode 100644 index e5223ebbc..000000000 --- a/schemas/background.schemas +++ /dev/null @@ -1,105 +0,0 @@ - - - - /schemas/desktop/gnome/background/background_properties_test - /desktop/gnome/background/background_properties_test - background-properties - string - test - - Test value to make sure gconf is set up properly - Test value to make sure gconf is set up properly. Can be - safely ignored. - - - - /schemas/desktop/gnome/background/enabled - /desktop/gnome/background/enabled - background-properties - bool - true - - - - - - - /schemas/desktop/gnome/background/wallpaper-enabled - /desktop/gnome/background/wallpaper-enabled - background-properties - bool - true - - - - - - - /schemas/desktop/gnome/background/wallpaper-type - /desktop/gnome/background/wallpaper-type - background-properties - int - 1 - - - - - - - /schemas/desktop/gnome/background/wallpaper-filename - /desktop/gnome/background/wallpaper-filename - background-properties - string - /home/hovinen/archive/XIMIAN-TranslucentWaves_1600x1200.png - - - - - - - /schemas/desktop/gnome/background/color1 - /desktop/gnome/background/color1 - background-properties - string - #39374b - - - - - - - /schemas/desktop/gnome/background/color2 - /desktop/gnome/background/color2 - background-properties - string - #42528f - - - - - - - /schemas/desktop/gnome/background/opacity - /desktop/gnome/background/opacity - background-properties - int - 100 - - - - - - - /schemas/desktop/gnome/background/orientation - /desktop/gnome/background/orientation - background-properties - int - 0 - - - - - - - - diff --git a/schemas/peripherals.schemas b/schemas/peripherals.schemas deleted file mode 100644 index f0d86b4ae..000000000 --- a/schemas/peripherals.schemas +++ /dev/null @@ -1,163 +0,0 @@ - - - - - /desktop/gnome/peripherals/mouse/left_handed - /schemas/desktop/gnome/peripherals/mouse/left_handed - gnome - bool - true - - Mouse button orientation - Swap left and right mouse buttons for left-handed mice - - - - /desktop/gnome/peripherals/mouse/single_click - /schemas/desktop/gnome/peripherals/mouse/single_click - gnome - bool - true - - Single Click - Single click to open icons - - - - /desktop/gnome/peripherals/mouse/motion_acceleration - /schemas/desktop/gnome/peripherals/mouse/motion_acceleration - gnome - float - -1 - - Single Click - Acceleration multiplier for mouse motion. A value of -1 - is the system default. - - - - /desktop/gnome/peripherals/mouse/motion_threshold - /schemas/desktop/gnome/peripherals/mouse/motion_threshold - gnome - int - -1 - - Motion Threshold - Distance in pixels the pointer must move before - accelerated mouse motion is activated. A value of -1 is the - system default. - - - - /desktop/gnome/peripherals/mouse/drag_threshold - /schemas/desktop/gnome/peripherals/mouse/drag_threshold - gnome - int - 8 - - Drag Threshold - Distance before a drag is started - - - - /desktop/gnome/peripherals/mouse/double_click - /schemas/desktop/gnome/peripherals/mouse/double_click - gnome - int - 400 - - Double Click Time - Length of a double click - - - - - /desktop/gnome/peripherals/keyboard/repeat - /schemas/desktop/gnome/peripherals/keyboard/repeat - gnome - bool - true - - - - - - - /desktop/gnome/peripherals/keyboard/click - /schemas/desktop/gnome/peripherals/keyboard/click - gnome - bool - true - - - - - - - /desktop/gnome/peripherals/keyboard/rate - /schemas/desktop/gnome/peripherals/keyboard/rate - gnome - int - 30 - - - - - - - /desktop/gnome/peripherals/keyboard/delay - /schemas/desktop/gnome/peripherals/keyboard/delay - gnome - int - 500 - - - - - - - /desktop/gnome/peripherals/keyboard/clickvolume - /schemas/desktop/gnome/peripherals/keyboard/clickvolume - gnome - int - 0 - - - - - - - /desktop/gnome/peripherals/keyboard/bell_percent - /schemas/desktop/gnome/peripherals/keyboard/bell_percent - gnome - int - 50 - - - - - - - /desktop/gnome/peripherals/keyboard/bell_pitch - /schemas/desktop/gnome/peripherals/keyboard/bell_pitch - gnome - int - 50 - - - - - - - /desktop/gnome/peripherals/keyboard/bell_duration - /schemas/desktop/gnome/peripherals/keyboard/bell_duration - gnome - int - 100 - - - - - - - diff --git a/schemas/screensaver.schemas b/schemas/screensaver.schemas deleted file mode 100644 index f646e930b..000000000 --- a/schemas/screensaver.schemas +++ /dev/null @@ -1,59 +0,0 @@ - - - - /schemas/apps/screensaver/selection_mode - /apps/screensaver/selection_mode - screensaver - int - 2 - - Current selection mode - Selection mode to use in capplet [0-4] - - - - /schemas/apps/screensaver/use_dpms - /apps/screensaver/use_dpms - screensaver - bool - false - - Enable DPMS - Enable DPMS when starting screensaver - - - - /schemas/apps/screensaver/standby_time - /apps/screensaver/standby_time - screensaver - int - 0 - - Time before standby - Time to wait before setting computer to "standby" - - - - /schemas/apps/screensaver/suspend_time - /apps/screensaver/suspend_time - screensaver - int - 0 - - Time before suspend - Time to wait before setting computer to "suspend" - - - - /schemas/apps/screensaver/shutdown_time - /apps/screensaver/shutdown_time - screensaver - int - 0 - - Time before shutdown - Time to wait before shutting down computer - - - -