diff options
author | Thomas Wood <thomas.wood@intel.com> | 2010-05-24 17:42:52 +0100 |
---|---|---|
committer | Thomas Wood <thomas.wood@intel.com> | 2010-05-24 21:51:28 +0100 |
commit | 19b7502f5efb35a133119df43520496ccfb9c8b3 (patch) | |
tree | 3a1df067af0fae52d52e8619973c8d7c77ecdd4f | |
parent | f112fc3a8edcf68c6c8f4cc8af575f978deb2bc4 (diff) | |
download | gnome-control-center-19b7502f5efb35a133119df43520496ccfb9c8b3.tar.gz |
keybindings: convert capplet to a settings panel
Add a module and CcPanel implementation for keyboard shortcuts settings.
-rw-r--r-- | capplets/Makefile.am | 2 | ||||
-rw-r--r-- | configure.ac | 6 | ||||
-rw-r--r-- | panels/Makefile.am | 2 | ||||
-rw-r--r-- | panels/keybindings/00-multimedia-key.xml.in (renamed from capplets/keybindings/00-multimedia-key.xml.in) | 0 | ||||
-rw-r--r-- | panels/keybindings/01-desktop-key.xml.in (renamed from capplets/keybindings/01-desktop-key.xml.in) | 0 | ||||
-rw-r--r-- | panels/keybindings/Makefile.am (renamed from capplets/keybindings/Makefile.am) | 13 | ||||
-rw-r--r-- | panels/keybindings/cc-keybindings-panel.c | 130 | ||||
-rw-r--r-- | panels/keybindings/cc-keybindings-panel.h | 74 | ||||
-rw-r--r-- | panels/keybindings/eggaccelerators.c (renamed from capplets/keybindings/eggaccelerators.c) | 0 | ||||
-rw-r--r-- | panels/keybindings/eggaccelerators.h (renamed from capplets/keybindings/eggaccelerators.h) | 0 | ||||
-rw-r--r-- | panels/keybindings/eggcellrendererkeys.c (renamed from capplets/keybindings/eggcellrendererkeys.c) | 0 | ||||
-rw-r--r-- | panels/keybindings/eggcellrendererkeys.h (renamed from capplets/keybindings/eggcellrendererkeys.h) | 0 | ||||
-rw-r--r-- | panels/keybindings/gnome-keybinding-properties.c (renamed from capplets/keybindings/gnome-keybinding-properties.c) | 95 | ||||
-rw-r--r-- | panels/keybindings/gnome-keybinding-properties.ui (renamed from capplets/keybindings/gnome-keybinding-properties.ui) | 76 | ||||
-rw-r--r-- | panels/keybindings/gnome-keybindings.pc.in (renamed from capplets/keybindings/gnome-keybindings.pc.in) | 0 | ||||
-rw-r--r-- | panels/keybindings/keybinding.desktop.in.in (renamed from capplets/keybindings/keybinding.desktop.in.in) | 0 | ||||
-rw-r--r-- | panels/keybindings/keybindings-module.c | 41 | ||||
-rw-r--r-- | panels/keybindings/wm-common.c | 184 | ||||
-rw-r--r-- | panels/keybindings/wm-common.h | 17 | ||||
-rw-r--r-- | po/POTFILES.in | 12 | ||||
-rw-r--r-- | po/POTFILES.skip | 2 |
21 files changed, 561 insertions, 93 deletions
diff --git a/capplets/Makefile.am b/capplets/Makefile.am index c8262fa50..460600ed2 100644 --- a/capplets/Makefile.am +++ b/capplets/Makefile.am @@ -3,14 +3,12 @@ SUBDIRS = \ accessibility \ appearance \ display \ - keybindings \ windows DIST_SUBDIRS = \ common \ accessibility \ appearance \ - keybindings \ windows \ display \ about-me diff --git a/configure.ac b/configure.ac index d39ae05c2..e49fb24e1 100644 --- a/configure.ac +++ b/configure.ac @@ -387,9 +387,9 @@ panels/default-applications/gnome-at-session.desktop.in panels/default-applications/gnome-default-applications.pc capplets/display/Makefile capplets/display/display-properties.desktop.in -capplets/keybindings/Makefile -capplets/keybindings/gnome-keybindings.pc -capplets/keybindings/keybinding.desktop.in +panels/keybindings/Makefile +panels/keybindings/gnome-keybindings.pc +panels/keybindings/keybinding.desktop.in capplets/windows/Makefile capplets/windows/window-properties.desktop.in docs/Makefile diff --git a/panels/Makefile.am b/panels/Makefile.am index 1a7acd706..3d62fefc9 100644 --- a/panels/Makefile.am +++ b/panels/Makefile.am @@ -1 +1 @@ -SUBDIRS=mouse keyboard network default-applications +SUBDIRS=mouse keyboard network default-applications keybindings diff --git a/capplets/keybindings/00-multimedia-key.xml.in b/panels/keybindings/00-multimedia-key.xml.in index b3d16819d..b3d16819d 100644 --- a/capplets/keybindings/00-multimedia-key.xml.in +++ b/panels/keybindings/00-multimedia-key.xml.in diff --git a/capplets/keybindings/01-desktop-key.xml.in b/panels/keybindings/01-desktop-key.xml.in index 2c9753743..2c9753743 100644 --- a/capplets/keybindings/01-desktop-key.xml.in +++ b/panels/keybindings/01-desktop-key.xml.in diff --git a/capplets/keybindings/Makefile.am b/panels/keybindings/Makefile.am index 62847faa6..85d4def8f 100644 --- a/capplets/keybindings/Makefile.am +++ b/panels/keybindings/Makefile.am @@ -1,10 +1,15 @@ # This is used in GNOMECC_CAPPLETS_CFLAGS cappletname = keybinding -bin_PROGRAMS = gnome-keybinding-properties - -gnome_keybinding_properties_LDADD = $(GNOMECC_CAPPLETS_LIBS) -gnome_keybinding_properties_SOURCES = \ +ccpanelsdir = $(PANELS_DIR) +ccpanels_LTLIBRARIES = libkeybinding-properties.la + +libkeybinding_properties_la_SOURCES = \ + keybindings-module.c \ + cc-keybindings-panel.c \ + cc-keybindings-panel.h \ + wm-common.c \ + wm-common.h \ gnome-keybinding-properties.c \ eggcellrendererkeys.c \ eggcellrendererkeys.h \ diff --git a/panels/keybindings/cc-keybindings-panel.c b/panels/keybindings/cc-keybindings-panel.c new file mode 100644 index 000000000..a4479f9aa --- /dev/null +++ b/panels/keybindings/cc-keybindings-panel.c @@ -0,0 +1,130 @@ +/* + * Copyright (C) 2010 Intel, 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 of the License, 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: Thomas Wood <thomas.wood@intel.com> + * + */ + +#include "cc-keybindings-panel.h" + +G_DEFINE_DYNAMIC_TYPE (CcKeybindingsPanel, cc_keybindings_panel, CC_TYPE_PANEL) + +#define KEYBINDINGS_PANEL_PRIVATE(o) \ + (G_TYPE_INSTANCE_GET_PRIVATE ((o), CC_TYPE_KEYBINDINGS_PANEL, CcKeybindingsPanelPrivate)) + +struct _CcKeybindingsPanelPrivate +{ + GtkBuilder *builder; +}; + + +static void +cc_keybindings_panel_get_property (GObject *object, + guint property_id, + GValue *value, + GParamSpec *pspec) +{ + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +cc_keybindings_panel_set_property (GObject *object, + guint property_id, + const GValue *value, + GParamSpec *pspec) +{ + switch (property_id) + { + default: + G_OBJECT_WARN_INVALID_PROPERTY_ID (object, property_id, pspec); + } +} + +static void +cc_keybindings_panel_dispose (GObject *object) +{ + G_OBJECT_CLASS (cc_keybindings_panel_parent_class)->dispose (object); +} + +static void +cc_keybindings_panel_finalize (GObject *object) +{ + G_OBJECT_CLASS (cc_keybindings_panel_parent_class)->finalize (object); +} + +static void +cc_keybindings_panel_class_init (CcKeybindingsPanelClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + + g_type_class_add_private (klass, sizeof (CcKeybindingsPanelPrivate)); + + object_class->get_property = cc_keybindings_panel_get_property; + object_class->set_property = cc_keybindings_panel_set_property; + object_class->dispose = cc_keybindings_panel_dispose; + object_class->finalize = cc_keybindings_panel_finalize; +} + +static void +cc_keybindings_panel_class_finalize (CcKeybindingsPanelClass *klass) +{ +} + +static void +cc_keybindings_panel_init (CcKeybindingsPanel *self) +{ + CcKeybindingsPanelPrivate *priv; + GError *error = NULL; + const gchar *uifile = GNOMECC_UI_DIR "/gnome-keybinding-properties.ui"; + + priv = self->priv = KEYBINDINGS_PANEL_PRIVATE (self); + + + priv->builder = gtk_builder_new (); + + if (gtk_builder_add_from_file (priv->builder, uifile, &error) == 0) + { + g_warning ("Could not load UI: %s", error->message); + g_clear_error (&error); + g_object_unref (priv->builder); + priv->builder = NULL; + return; + } + + gnome_keybinding_properties_init (priv->builder); + + GtkWidget *widget; + + widget = (GtkWidget *) gtk_builder_get_object (priv->builder, + "vbox3"); + + gtk_widget_reparent (widget, (GtkWidget *) self); +} + +void +cc_keybindings_panel_register (GIOModule *module) +{ + cc_keybindings_panel_register_type (G_TYPE_MODULE (module)); + g_io_extension_point_implement (CC_SHELL_PANEL_EXTENSION_POINT, + CC_TYPE_KEYBINDINGS_PANEL, + "keybinding.desktop", 0); +} + diff --git a/panels/keybindings/cc-keybindings-panel.h b/panels/keybindings/cc-keybindings-panel.h new file mode 100644 index 000000000..cfd7be230 --- /dev/null +++ b/panels/keybindings/cc-keybindings-panel.h @@ -0,0 +1,74 @@ +/* + * Copyright (C) 2010 Intel, 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 of the License, 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: Thomas Wood <thomas.wood@intel.com> + * + */ + + +#ifndef _CC_KEYBINDINGS_PANEL_H +#define _CC_KEYBINDINGS_PANEL_H + +#include <libgnome-control-center/cc-panel.h> + +G_BEGIN_DECLS + +#define CC_TYPE_KEYBINDINGS_PANEL cc_keybindings_panel_get_type() + +#define CC_KEYBINDINGS_PANEL(obj) \ + (G_TYPE_CHECK_INSTANCE_CAST ((obj), \ + CC_TYPE_KEYBINDINGS_PANEL, CcKeybindingsPanel)) + +#define CC_KEYBINDINGS_PANEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_CAST ((klass), \ + CC_TYPE_KEYBINDINGS_PANEL, CcKeybindingsPanelClass)) + +#define CC_IS_KEYBINDINGS_PANEL(obj) \ + (G_TYPE_CHECK_INSTANCE_TYPE ((obj), \ + CC_TYPE_KEYBINDINGS_PANEL)) + +#define CC_IS_KEYBINDINGS_PANEL_CLASS(klass) \ + (G_TYPE_CHECK_CLASS_TYPE ((klass), \ + CC_TYPE_KEYBINDINGS_PANEL)) + +#define CC_KEYBINDINGS_PANEL_GET_CLASS(obj) \ + (G_TYPE_INSTANCE_GET_CLASS ((obj), \ + CC_TYPE_KEYBINDINGS_PANEL, CcKeybindingsPanelClass)) + +typedef struct _CcKeybindingsPanel CcKeybindingsPanel; +typedef struct _CcKeybindingsPanelClass CcKeybindingsPanelClass; +typedef struct _CcKeybindingsPanelPrivate CcKeybindingsPanelPrivate; + +struct _CcKeybindingsPanel +{ + CcPanel parent; + + CcKeybindingsPanelPrivate *priv; +}; + +struct _CcKeybindingsPanelClass +{ + CcPanelClass parent_class; +}; + +GType cc_keybindings_panel_get_type (void) G_GNUC_CONST; + +void cc_keybindings_panel_register (GIOModule *module); + +G_END_DECLS + +#endif /* _CC_KEYBINDINGS_PANEL_H */ diff --git a/capplets/keybindings/eggaccelerators.c b/panels/keybindings/eggaccelerators.c index 0728229d1..0728229d1 100644 --- a/capplets/keybindings/eggaccelerators.c +++ b/panels/keybindings/eggaccelerators.c diff --git a/capplets/keybindings/eggaccelerators.h b/panels/keybindings/eggaccelerators.h index 9e22fc8da..9e22fc8da 100644 --- a/capplets/keybindings/eggaccelerators.h +++ b/panels/keybindings/eggaccelerators.h diff --git a/capplets/keybindings/eggcellrendererkeys.c b/panels/keybindings/eggcellrendererkeys.c index 776a5391e..776a5391e 100644 --- a/capplets/keybindings/eggcellrendererkeys.c +++ b/panels/keybindings/eggcellrendererkeys.c diff --git a/capplets/keybindings/eggcellrendererkeys.h b/panels/keybindings/eggcellrendererkeys.h index 24e58aea2..24e58aea2 100644 --- a/capplets/keybindings/eggcellrendererkeys.h +++ b/panels/keybindings/eggcellrendererkeys.h diff --git a/capplets/keybindings/gnome-keybinding-properties.c b/panels/keybindings/gnome-keybinding-properties.c index d383def0f..afaec744f 100644 --- a/capplets/keybindings/gnome-keybinding-properties.c +++ b/panels/keybindings/gnome-keybinding-properties.c @@ -14,7 +14,6 @@ #include <gdk/gdkkeysyms.h> #include "wm-common.h" -#include "capplet-util.h" #include "eggcellrendererkeys.h" #include "activate-settings-daemon.h" @@ -88,23 +87,6 @@ _gtk_builder_get_widget (GtkBuilder *builder, const gchar *name) return GTK_WIDGET (gtk_builder_get_object (builder, name)); } -static GtkBuilder * -create_builder (void) -{ - GtkBuilder *builder = gtk_builder_new(); - GError *error = NULL; - static const gchar *uifile = GNOMECC_UI_DIR "/gnome-keybinding-properties.ui"; - - if (gtk_builder_add_from_file (builder, uifile, &error) == 0) { - g_warning ("Could not load UI: %s", error->message); - g_error_free (error); - g_object_unref (builder); - builder = NULL; - } - - return builder; -} - static char* binding_name (guint keyval, guint keycode, @@ -1745,6 +1727,7 @@ maybe_block_accels (GtkWidget *widget, return FALSE; } +#if 0 static void cb_dialog_response (GtkWidget *widget, gint response_id, gpointer data) { @@ -1781,6 +1764,7 @@ cb_dialog_response (GtkWidget *widget, gint response_id, gpointer data) gtk_main_quit (); } } +#endif static void selection_changed (GtkTreeSelection *selection, gpointer data) @@ -1803,6 +1787,40 @@ selection_changed (GtkTreeSelection *selection, gpointer data) } static void +add_button_clicked (GtkWidget *button, + GtkBuilder *builder) +{ + GtkTreeView *treeview; + GtkTreeModel *model; + + treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, + "shortcut_treeview")); + model = gtk_tree_view_get_model (treeview); + + add_custom_shortcut (treeview, model); +} + +static void +remove_button_clicked (GtkWidget *button, + GtkBuilder *builder) +{ + GtkTreeView *treeview; + GtkTreeModel *model; + GtkTreeSelection *selection; + GtkTreeIter iter; + + treeview = GTK_TREE_VIEW (gtk_builder_get_object (builder, + "shortcut_treeview")); + model = gtk_tree_view_get_model (treeview); + + selection = gtk_tree_view_get_selection (treeview); + if (gtk_tree_selection_get_selected (selection, NULL, &iter)) + { + remove_custom_shortcut (model, &iter); + } +} + +static void setup_dialog (GtkBuilder *builder) { GConfClient *client; @@ -1869,11 +1887,8 @@ setup_dialog (GtkBuilder *builder) reload_key_entries (builder); widget = _gtk_builder_get_widget (builder, "gnome-keybinding-dialog"); - capplet_set_icon (widget, "preferences-desktop-keyboard-shortcuts"); - gtk_widget_show (widget); g_signal_connect (widget, "key_press_event", G_CALLBACK (maybe_block_accels), NULL); - g_signal_connect (widget, "response", G_CALLBACK (cb_dialog_response), builder); selection = gtk_tree_view_get_selection (GTK_TREE_VIEW (treeview)); g_signal_connect (selection, "changed", @@ -1901,10 +1916,18 @@ setup_dialog (GtkBuilder *builder) "custom-shortcut-name-entry"); custom_shortcut_command_entry = _gtk_builder_get_widget (builder, "custom-shortcut-command-entry"); + g_signal_connect (_gtk_builder_get_widget (builder, "add-button"), + "clicked", G_CALLBACK (add_button_clicked), builder); + g_signal_connect (_gtk_builder_get_widget (builder, "remove-button"), + "clicked", G_CALLBACK (remove_button_clicked), builder); + +#if 0 gtk_dialog_set_default_response (GTK_DIALOG (custom_shortcut_dialog), GTK_RESPONSE_OK); + gtk_window_set_transient_for (GTK_WINDOW (custom_shortcut_dialog), GTK_WINDOW (widget)); +#endif } static void @@ -1913,34 +1936,12 @@ on_window_manager_change (const char *wm_name, GtkBuilder *builder) reload_key_entries (builder); } -int -main (int argc, char *argv[]) +void +gnome_keybinding_properties_init (GtkBuilder *builder) { - GtkBuilder *builder; - - g_thread_init (NULL); - gtk_init (&argc, &argv); - - bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); - bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); - textdomain (GETTEXT_PACKAGE); - - gtk_init (&argc, &argv); - - activate_settings_daemon (); - - builder = create_builder (); - - if (!builder) /* Warning was already printed to console */ - exit (EXIT_FAILURE); - - wm_common_register_window_manager_change ((GFunc) on_window_manager_change, builder); + wm_common_register_window_manager_change ((GFunc) on_window_manager_change, + builder); setup_dialog (builder); - - gtk_main (); - - g_object_unref (builder); - return 0; } /* diff --git a/capplets/keybindings/gnome-keybinding-properties.ui b/panels/keybindings/gnome-keybinding-properties.ui index 75795b40f..85754481a 100644 --- a/capplets/keybindings/gnome-keybinding-properties.ui +++ b/panels/keybindings/gnome-keybinding-properties.ui @@ -10,15 +10,18 @@ <child internal-child="vbox"> <object class="GtkVBox" id="shortcut_dialog"> <property name="visible">True</property> + <property name="orientation">vertical</property> <property name="spacing">2</property> <child> <object class="GtkVBox" id="vbox3"> <property name="visible">True</property> <property name="border_width">5</property> + <property name="orientation">vertical</property> <property name="spacing">12</property> <child> <object class="GtkVBox" id="shortcuts_vbox"> <property name="visible">True</property> + <property name="orientation">vertical</property> <property name="spacing">6</property> <child> <object class="GtkScrolledWindow" id="actions_swindow"> @@ -80,6 +83,48 @@ <property name="position">0</property> </packing> </child> + <child> + <object class="GtkHButtonBox" id="hbuttonbox1"> + <property name="visible">True</property> + <property name="spacing">6</property> + <property name="layout_style">end</property> + <child> + <object class="GtkButton" id="add-button"> + <property name="label">gtk-add</property> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">0</property> + </packing> + </child> + <child> + <object class="GtkButton" id="remove-button"> + <property name="label">gtk-remove</property> + <property name="visible">True</property> + <property name="sensitive">False</property> + <property name="can_focus">True</property> + <property name="can_default">True</property> + <property name="receives_default">True</property> + <property name="use_stock">True</property> + </object> + <packing> + <property name="expand">False</property> + <property name="fill">False</property> + <property name="position">1</property> + </packing> + </child> + </object> + <packing> + <property name="expand">False</property> + <property name="position">1</property> + </packing> + </child> </object> <packing> <property name="position">1</property> @@ -105,35 +150,10 @@ </packing> </child> <child> - <object class="GtkButton" id="add-button"> - <property name="label">gtk-add</property> - <property name="visible">True</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">1</property> - </packing> + <placeholder/> </child> <child> - <object class="GtkButton" id="remove-button"> - <property name="label">gtk-remove</property> - <property name="visible">True</property> - <property name="sensitive">False</property> - <property name="can_focus">True</property> - <property name="can_default">True</property> - <property name="receives_default">False</property> - <property name="use_stock">True</property> - </object> - <packing> - <property name="expand">False</property> - <property name="fill">False</property> - <property name="position">2</property> - </packing> + <placeholder/> </child> <child> <object class="GtkButton" id="button1"> @@ -161,8 +181,6 @@ </child> <action-widgets> <action-widget response="-11">helpbutton1</action-widget> - <action-widget response="0">add-button</action-widget> - <action-widget response="1">remove-button</action-widget> <action-widget response="-7">button1</action-widget> </action-widgets> </object> diff --git a/capplets/keybindings/gnome-keybindings.pc.in b/panels/keybindings/gnome-keybindings.pc.in index e099b4c72..e099b4c72 100644 --- a/capplets/keybindings/gnome-keybindings.pc.in +++ b/panels/keybindings/gnome-keybindings.pc.in diff --git a/capplets/keybindings/keybinding.desktop.in.in b/panels/keybindings/keybinding.desktop.in.in index 74f07b759..74f07b759 100644 --- a/capplets/keybindings/keybinding.desktop.in.in +++ b/panels/keybindings/keybinding.desktop.in.in diff --git a/panels/keybindings/keybindings-module.c b/panels/keybindings/keybindings-module.c new file mode 100644 index 000000000..09ed93437 --- /dev/null +++ b/panels/keybindings/keybindings-module.c @@ -0,0 +1,41 @@ +/* + * Copyright (C) 2010 Intel, 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 of the License, 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: Thomas Wood <thomas.wood@intel.com> + * + */ + +#include <config.h> + +#include "cc-keybindings-panel.h" + +#include <glib/gi18n.h> + +void +g_io_module_load (GIOModule *module) +{ + bindtextdomain (GETTEXT_PACKAGE, GNOMELOCALEDIR); + bind_textdomain_codeset (GETTEXT_PACKAGE, "UTF-8"); + + /* register the panel */ + cc_keybindings_panel_register (module); +} + +void +g_io_module_unload (GIOModule *module) +{ +} diff --git a/panels/keybindings/wm-common.c b/panels/keybindings/wm-common.c new file mode 100644 index 000000000..6ffc6beec --- /dev/null +++ b/panels/keybindings/wm-common.c @@ -0,0 +1,184 @@ +#include <X11/Xatom.h> +#include <gdk/gdkx.h> +#include <gdk/gdk.h> +#include <string.h> +#include <glib.h> +#include <glib-object.h> +#include "wm-common.h" + +typedef struct _WMCallbackData +{ + GFunc func; + gpointer data; +} WMCallbackData; + +/* Our WM Window */ +static Window wm_window = None; + +static char * +wm_common_get_window_manager_property (Atom atom) +{ + Atom utf8_string, type; + int result; + char *retval; + int format; + gulong nitems; + gulong bytes_after; + gchar *val; + + if (wm_window == None) + return NULL; + + utf8_string = XInternAtom (GDK_DISPLAY (), "UTF8_STRING", False); + + gdk_error_trap_push (); + + val = NULL; + result = XGetWindowProperty (GDK_DISPLAY (), + wm_window, + atom, + 0, G_MAXLONG, + False, utf8_string, + &type, &format, &nitems, + &bytes_after, (guchar **) &val); + + if (gdk_error_trap_pop () || result != Success || + type != utf8_string || format != 8 || nitems == 0 || + !g_utf8_validate (val, nitems, NULL)) + { + retval = NULL; + } + else + { + retval = g_strndup (val, nitems); + } + + if (val) + XFree (val); + + return retval; +} + +char* +wm_common_get_current_window_manager (void) +{ + Atom atom = XInternAtom (GDK_DISPLAY (), "_NET_WM_NAME", False); + char *result; + + result = wm_common_get_window_manager_property (atom); + if (result) + return result; + else + return g_strdup (WM_COMMON_UNKNOWN); +} + +char** +wm_common_get_current_keybindings (void) +{ + Atom keybindings_atom = XInternAtom (GDK_DISPLAY (), "_GNOME_WM_KEYBINDINGS", False); + char *keybindings = wm_common_get_window_manager_property (keybindings_atom); + char **results; + + if (keybindings) + { + char **p; + results = g_strsplit(keybindings, ",", -1); + for (p = results; *p; p++) + g_strstrip (*p); + g_free (keybindings); + } + else + { + Atom wm_atom = XInternAtom (GDK_DISPLAY (), "_NET_WM_NAME", False); + char *wm_name = wm_common_get_window_manager_property (wm_atom); + char *to_copy[] = { NULL, NULL }; + + to_copy[0] = wm_name ? wm_name : WM_COMMON_UNKNOWN; + + results = g_strdupv (to_copy); + g_free (wm_name); + } + + return results; +} + +static void +update_wm_window (void) +{ + Window *xwindow; + Atom type; + gint format; + gulong nitems; + gulong bytes_after; + + XGetWindowProperty (GDK_DISPLAY (), GDK_ROOT_WINDOW (), + XInternAtom (GDK_DISPLAY (), "_NET_SUPPORTING_WM_CHECK", False), + 0, G_MAXLONG, False, XA_WINDOW, &type, &format, + &nitems, &bytes_after, (guchar **) &xwindow); + + if (type != XA_WINDOW) + { + wm_window = None; + return; + } + + gdk_error_trap_push (); + XSelectInput (GDK_DISPLAY (), *xwindow, StructureNotifyMask | PropertyChangeMask); + XSync (GDK_DISPLAY (), False); + + if (gdk_error_trap_pop ()) + { + XFree (xwindow); + wm_window = None; + return; + } + + wm_window = *xwindow; + XFree (xwindow); +} + +static GdkFilterReturn +wm_window_event_filter (GdkXEvent *xev, + GdkEvent *event, + gpointer data) +{ + WMCallbackData *ncb_data = (WMCallbackData*) data; + XEvent *xevent = (XEvent *)xev; + + if ((xevent->type == DestroyNotify && + wm_window != None && xevent->xany.window == wm_window) || + (xevent->type == PropertyNotify && + xevent->xany.window == GDK_ROOT_WINDOW () && + xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY (), "_NET_SUPPORTING_WM_CHECK", False))) || + (xevent->type == PropertyNotify && + wm_window != None && xevent->xany.window == wm_window && + xevent->xproperty.atom == (XInternAtom (GDK_DISPLAY (), "_NET_WM_NAME", False)))) + { + update_wm_window (); + (* ncb_data->func) ((gpointer)wm_common_get_current_window_manager(), + ncb_data->data); + } + + return GDK_FILTER_CONTINUE; +} + +void +wm_common_register_window_manager_change (GFunc func, + gpointer data) +{ + WMCallbackData *ncb_data; + + ncb_data = g_new0 (WMCallbackData, 1); + + ncb_data->func = func; + ncb_data->data = data; + + gdk_window_add_filter (NULL, wm_window_event_filter, ncb_data); + + update_wm_window (); + + XSelectInput (GDK_DISPLAY (), GDK_ROOT_WINDOW (), PropertyChangeMask); + XSync (GDK_DISPLAY (), False); +} + + diff --git a/panels/keybindings/wm-common.h b/panels/keybindings/wm-common.h new file mode 100644 index 000000000..4da0d2821 --- /dev/null +++ b/panels/keybindings/wm-common.h @@ -0,0 +1,17 @@ +#ifndef WM_COMMON_H +#define WM_COMMON_H + +#define WM_COMMON_METACITY "Metacity" +#define WM_COMMON_SAWFISH "Sawfish" +#define WM_COMMON_UNKNOWN "Unknown" + +gchar *wm_common_get_current_window_manager (void); +/* Returns a strv of keybinding names for the window manager; + * using _GNOME_WM_KEYBINDINGS if available, _NET_WM_NAME otherwise. */ +char **wm_common_get_current_keybindings (void); + +void wm_common_register_window_manager_change (GFunc func, + gpointer data); + +#endif /* WM_COMMON_H */ + diff --git a/po/POTFILES.in b/po/POTFILES.in index 0e29468e3..f6218618f 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -46,12 +46,12 @@ capplets/display/display-properties.desktop.in.in capplets/display/gnome-display-properties-install-systemwide.c capplets/display/org.gnome.randr.policy.in capplets/display/xrandr-capplet.c -capplets/keybindings/00-multimedia-key.xml.in -capplets/keybindings/01-desktop-key.xml.in -capplets/keybindings/eggcellrendererkeys.c -capplets/keybindings/gnome-keybinding-properties.c -[type: gettext/glade]capplets/keybindings/gnome-keybinding-properties.ui -capplets/keybindings/keybinding.desktop.in.in +panels/keybindings/00-multimedia-key.xml.in +panels/keybindings/01-desktop-key.xml.in +panels/keybindings/eggcellrendererkeys.c +panels/keybindings/gnome-keybinding-properties.c +[type: gettext/glade]panels/keybindings/gnome-keybinding-properties.ui +panels/keybindings/keybinding.desktop.in.in panels/keyboard/gnome-keyboard-properties.c [type: gettext/glade]panels/keyboard/gnome-keyboard-properties-a11y-notifications.ui [type: gettext/glade]panels/keyboard/gnome-keyboard-properties-dialog.ui diff --git a/po/POTFILES.skip b/po/POTFILES.skip index 13bbcdd17..0986458c7 100644 --- a/po/POTFILES.skip +++ b/po/POTFILES.skip @@ -7,7 +7,7 @@ capplets/appearance/data/gnome-theme-package.xml panels/default-applications/default-applications.desktop.in panels/default-applications/gnome-at-session.desktop.in capplets/display/display-properties.desktop.in -capplets/keybindings/keybinding.desktop.in +panels/keybindings/keybinding.desktop.in panels/keyboard/keyboard.desktop.in capplets/localization/localization.desktop.in capplets/mouse/gnome-settings-mouse.desktop.in |