[maemo-commits] [maemo-commits] r9191 - in projects/haf/branches/gtk+/maemo-gtk-2-10: . docs/reference docs/reference/gtk docs/reference/gtk/tmpl gtk

From: subversion at stage.maemo.org subversion at stage.maemo.org
Date: Fri Jan 19 15:27:39 EET 2007
Author: mitch
Date: 2007-01-19 15:27:34 +0200 (Fri, 19 Jan 2007)
New Revision: 9191

Modified:
   projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
   projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/ChangeLog
   projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/gtk-sections.txt
   projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtk-unused.sgml
   projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkbindings.sgml
   projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkrc.sgml
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.c
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.h
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.c
   projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.h
Log:
2007-01-19  Michael Natterer  <mitch at gimp.org>

	Backport unbinding of keybindings, needed for combo box kaynav:

    Wed Oct 11 14:31:30 2006  Tim Janik  <timj at imendio.com>

	* docs/reference/gtk/gtk-sections.txt:
	* gtk/gtkbindings.c: document gtk_binding_entry_skip().

    Tue Oct 10 16:38:23 2006  Tim Janik  <timj at imendio.com>

	* gtk/tmpl/gtkbindings.sgml: 
	* gtk/gtkbindings.c: applied patch from Michael Natterer to move to 
	inline docs. applied wording fixes suggested by Martyn Russell.

    2006-10-05  Michael Natterer  <mitch at imendio.com>

	* gtk/gtkrc.[ch]: added new scanner token "unbind" which gets
	rid of a key binding (in fact, it only lets it appear unbound).

	* gtk/gtkbindings.[ch] (struct GtkBindingEntry): added
	"guint marks_unbound : 1"

	(gtk_binding_entry_skip): new API which marks the entry as unbound.

	Changed code so it returns FALSE when "marks_unbound == TRUE" is
	encountered while activating bindings, effectively letting the
	binding appear unbound (regardless of still existing bindings in
	lower binding priority levels). Fixes bug #358329.

	(gtk_binding_entry_add)
	(gtk_binding_entry_clear)
	(gtk_binding_entry_add_signall)
	(gtk_binding_parse_binding): deprected these functions.

	(_gtk_binding_parse_binding)
	(_gtk_binding_entry_add_signall): new internal API.

	* gtk/gtk.symbols: changed accordingly.



Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/ChangeLog	2007-01-19 13:27:34 UTC (rev 9191)
@@ -1,3 +1,43 @@
+2007-01-19  Michael Natterer  <mitch at gimp.org>
+
+	Backport unbinding of keybindings, needed for combo box kaynav:
+
+    Wed Oct 11 14:31:30 2006  Tim Janik  <timj at imendio.com>
+
+	* docs/reference/gtk/gtk-sections.txt:
+	* gtk/gtkbindings.c: document gtk_binding_entry_skip().
+
+    Tue Oct 10 16:38:23 2006  Tim Janik  <timj at imendio.com>
+
+	* gtk/tmpl/gtkbindings.sgml: 
+	* gtk/gtkbindings.c: applied patch from Michael Natterer to move to 
+	inline docs. applied wording fixes suggested by Martyn Russell.
+
+    2006-10-05  Michael Natterer  <mitch at imendio.com>
+
+	* gtk/gtkrc.[ch]: added new scanner token "unbind" which gets
+	rid of a key binding (in fact, it only lets it appear unbound).
+
+	* gtk/gtkbindings.[ch] (struct GtkBindingEntry): added
+	"guint marks_unbound : 1"
+
+	(gtk_binding_entry_skip): new API which marks the entry as unbound.
+
+	Changed code so it returns FALSE when "marks_unbound == TRUE" is
+	encountered while activating bindings, effectively letting the
+	binding appear unbound (regardless of still existing bindings in
+	lower binding priority levels). Fixes bug #358329.
+
+	(gtk_binding_entry_add)
+	(gtk_binding_entry_clear)
+	(gtk_binding_entry_add_signall)
+	(gtk_binding_parse_binding): deprected these functions.
+
+	(_gtk_binding_parse_binding)
+	(_gtk_binding_entry_add_signall): new internal API.
+
+	* gtk/gtk.symbols: changed accordingly.
+
 2007-01-19  Michael Natterer  <mitch at imendio.com>
 
 	Backport gdk_window_beep() from upstream trunk, needed

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/ChangeLog
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/ChangeLog	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/ChangeLog	2007-01-19 13:27:34 UTC (rev 9191)
@@ -1,3 +1,13 @@
+2007-01-19  Michael Natterer  <mitch at gimp.org>
+
+	Backport unbinding of keybindings:
+
+    Tue Oct 10 16:38:23 2006  Tim Janik  <timj at imendio.com>
+
+	* gtk/tmpl/gtkbindings.sgml: 
+	* gtk/gtkbindings.c: applied patch from Michael Natterer to move to 
+	inline docs. applied wording fixes suggested by Martyn Russell.
+
 2007-01-19  Michael Natterer  <mitch at imendio.com>
 
 	Backport gdk_window_beep():

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/gtk-sections.txt
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/gtk-sections.txt	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/gtk-sections.txt	2007-01-19 13:27:34 UTC (rev 9191)
@@ -5796,13 +5796,10 @@
 gtk_bindings_activate
 gtk_bindings_activate_event
 gtk_binding_set_activate
-gtk_binding_entry_add
-gtk_binding_entry_clear
 gtk_binding_entry_add_signal
-gtk_binding_set_add_path
+gtk_binding_entry_skip
 gtk_binding_entry_remove
-gtk_binding_entry_add_signall
-gtk_binding_parse_binding
+gtk_binding_set_add_path
 </SECTION>
 
 <SECTION>

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtk-unused.sgml
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtk-unused.sgml	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtk-unused.sgml	2007-01-19 13:27:34 UTC (rev 9191)
@@ -1858,6 +1858,40 @@
 @n_args_p: the number of arguments this object accepts.
 @Returns: the array of arguments (or NULL on error).
 
+<!-- ##### MACRO gtk_binding_entry_add ##### -->
+<para>
+Deprecated.
+</para>
+
+
+<!-- ##### FUNCTION gtk_binding_entry_add_signall ##### -->
+<para>
+
+</para>
+
+ at binding_set: 
+ at keyval: 
+ at modifiers: 
+ at signal_name: 
+ at binding_args: 
+
+<!-- ##### FUNCTION gtk_binding_entry_clear ##### -->
+<para>
+
+</para>
+
+ at binding_set: 
+ at keyval: 
+ at modifiers: 
+
+<!-- ##### FUNCTION gtk_binding_parse_binding ##### -->
+<para>
+
+</para>
+
+ at scanner: 
+ at Returns: 
+
 <!-- ##### FUNCTION gtk_button_box_child_requisition ##### -->
 <para>
 This is an internally used function and should never be called from an

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkbindings.sgml
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkbindings.sgml	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkbindings.sgml	2007-01-19 13:27:34 UTC (rev 9191)
@@ -6,12 +6,108 @@
 
 <!-- ##### SECTION Long_Description ##### -->
 <para>
+GtkBinding provides a mechanism for configuring Gtk+ key bindings through RC files.
+This eases key binding adjustments for application developers as well as users and
+provides Gtk+ users or administrators with high key binding configurability which
+requires no application or toolkit side changes.
+</para>
 
+<refsect2>
+<anchor id="gtk-bindings-install"/>
+<title>Installing a key binding</title>
+
+<para>
+A resource file binding consists of a 'binding' definition and a match statement to
+apply the binding to specific widget types. Details on the matching mechanism are
+described under <link linkend="gtkrc-pathnames-and-patterns">Pathnames and patterns</link>.
+Inside the binding definition, key combinations are bound to specific signal emissions
+on the target widget. Key combinations are strings consisting of an optional #GdkModifierType
+name and <link linkend="gdk-Keyboard-Handling">key names</link> such as those defined in
+<filename>&lt;gdk/gdkkeysyms.h&gt;</filename> or returned from gdk_keyval_name(), they have
+to be parsable by gtk_accelerator_parse().
+Specifications of signal emissions consist of a string identifying the signal name, and
+a list of signal specific arguments in parenthesis.
+
+For example for binding Control and the left or right cursor keys of a #GtkEntry widget to the
+#GtkEntry::move-cursor signal, so movement occurs in 3 letter steps,
+the following binding can be used:
+
+<informalexample><programlisting>
+binding "MoveCursor3" {
+  bind "&lt;Control&gt;Right" {
+    "move-cursor" (visual-positions, 3, 0)
+  }
+  bind "&lt;Control&gt;Left" {
+    "move-cursor" (visual-positions, -3, 0)
+  }
+}
+class "GtkEntry" binding "MoveCursor3"
+</programlisting></informalexample>
 </para>
 
+
+<anchor id="gtk-bindings-unbind"/>
+<title>Unbinding existing key bindings</title>
+<para>
+Gtk+ already defines a number of useful bindings for the widgets it provides.
+Because custom bindings set up in RC files take precedence over the default bindings
+shipped with Gtk+, overriding existing bindings as demonstrated in 
+<link linkend="gtk-bindings-install">Installing a key binding</link>
+works as expected. The same mechanism can not be used to "unbind" existing bindings,
+however.
+
+<informalexample><programlisting>
+binding "MoveCursor3" {
+  bind "&lt;Control&gt;Right" { }
+  bind "&lt;Control&gt;Left" { }
+}
+class "GtkEntry" binding "MoveCursor3"
+</programlisting></informalexample>
+
+The above example will not have the desired effect of causing "&lt;Control&gt;Right"
+and "&lt;Control&gt;Left" key presses to be ignored by Gtk+. Instead, it just causes
+any existing bindings from the bindings set "MoveCursor3" to be deleted, so when
+"&lt;Control&gt;Right" or "&lt;Control&gt;Left" are pressed, no binding for these keys
+is found in binding set "MoveCursor3". Gtk+ will thus continue to search for matching
+key bindings, and will eventually lookup and find the default Gtk+ bindings for entries
+which implement word movement. To keep Gtk+ from activating its default bindings, the
+"unbind" keyword can be used like this:
+
+<informalexample><programlisting>
+binding "MoveCursor3" {
+  unbind "&lt;Control&gt;Right"
+  unbind "&lt;Control&gt;Left"
+}
+class "GtkEntry" binding "MoveCursor3"
+</programlisting></informalexample>
+
+Now, Gtk+ will find a match when looking up "&lt;Control&gt;Right" and "&lt;Control&gt;Left"
+key presses before it resorts to its default bindings, and the match instructs it to abort
+("unbind") the search, so the key presses are not consumed by this widget. 
+As usual, further processing of the key presses, e.g. by an entries parent widget,
+is now possible.
+
+</para>
+
+</refsect2>
+
 <!-- ##### SECTION See_Also ##### -->
 <para>
+<variablelist>
 
+<varlistentry>
+<term><link linkend="gtk-keyboard-accelerators">Keyboard Accelerators</link>
+</term>
+<listitem><para>installing and using keyboard short-cuts.</para></listitem>
+</varlistentry>
+
+<varlistentry>
+<term><link linkend="Resource-Files">Resource Files</link>
+</term>
+<listitem><para>Gtk+ Resource Files - behavior and style definitions.</para></listitem>
+</varlistentry>
+
+</variablelist>
 </para>
 
 <!-- ##### SECTION Stability_Level ##### -->
@@ -19,49 +115,94 @@
 
 <!-- ##### STRUCT GtkBindingSet ##### -->
 <para>
-
+A binding set maintains a list of activatable key bindings.
+A single binding set can match multiple types of widgets.
+Similar to styles, widgets can be mapped by widget name paths, widget class paths or widget class types.
+When a binding within a set is matched upon activation, an action signal is emitted on
+the target widget to carry out the actual activation.
 </para>
 
- at set_name: 
- at priority: 
- at widget_path_pspecs: 
- at widget_class_pspecs: 
- at class_branch_pspecs: 
- at entries: 
- at current: 
- at parsed: 
+ at set_name: 		unique binding set name
+ at priority: 		unused
+ at widget_path_pspecs: 	widgets matched by path that this binding set applies to
+ at widget_class_pspecs: 	widgets matched by class path that this binding set applies to
+ at class_branch_pspecs: 	widgets matched by class that this binding set applies to
+ at entries: 		the key binding entries in this binding set
+ at current: 		implementation detail
+ at parsed: 		whether this binding set stems from an RC file and is reset upon theme changes
 
 <!-- ##### STRUCT GtkBindingEntry ##### -->
 <para>
+Each key binding element of a binding sets binding list is represented by a #GtkBindingEntry.
+</para>
 
+ at keyval: 	key value to match
+ at modifiers: 	key modifier to match
+ at binding_set: 	binding set this entry belongs to
+ at destroyed:  	implementation detail
+ at in_emission: 	implementation detail
+ at marks_unbound: 
+ at set_next: 	linked list of entries maintained by binding set
+ at hash_next: 	implementation detail
+ at signals: 	action signals of this entry
+
+<!-- ##### STRUCT GtkBindingSignal ##### -->
+<para>
+A #GtkBindingSignal stores the necessary information to activate a widget
+in response to a key press via a signal emission.
 </para>
 
+ at next: 		implementation detail
+ at signal_name: 	the action signal to be emitted
+ at n_args: 	number of arguments specified for the signal
+ at args: 		the arguments specified for the signal
+
+<!-- ##### STRUCT GtkBindingArg ##### -->
+<para>
+A #GtkBindingArg holds the data associated with an argument for a
+key binding signal emission as stored in #GtkBindingSignal.
+</para>
+
+ at arg_type: implementation detail
+
+<!-- ##### MACRO gtk_binding_entry_add ##### -->
+<para>
+Deprecated.
+</para>
+
+
+
+<!-- ##### FUNCTION gtk_binding_entry_add_signall ##### -->
+<para>
+
+</para>
+
+ at binding_set: 
 @keyval: 
 @modifiers: 
- at binding_set: 
- at destroyed: 
- at in_emission: 
- at set_next: 
- at hash_next: 
- at signals: 
+ at signal_name: 
+ at binding_args: 
 
-<!-- ##### STRUCT GtkBindingSignal ##### -->
+
+<!-- ##### FUNCTION gtk_binding_entry_clear ##### -->
 <para>
 
 </para>
 
- at next: 
- at signal_name: 
- at n_args: 
- at args: 
+ at binding_set: 
+ at keyval: 
+ at modifiers: 
 
-<!-- ##### STRUCT GtkBindingArg ##### -->
+
+<!-- ##### FUNCTION gtk_binding_parse_binding ##### -->
 <para>
 
 </para>
 
- at arg_type: 
+ at scanner: 
+ at Returns: 
 
+
 <!-- ##### FUNCTION gtk_binding_set_new ##### -->
 <para>
 
@@ -102,7 +243,7 @@
 
 <!-- ##### FUNCTION gtk_bindings_activate_event ##### -->
 <para>
-
+<!-- documented inline -->
 </para>
 
 @object: 
@@ -122,23 +263,6 @@
 @Returns: 
 
 
-<!-- ##### MACRO gtk_binding_entry_add ##### -->
-<para>
-
-</para>
-
-
-
-<!-- ##### FUNCTION gtk_binding_entry_clear ##### -->
-<para>
-
-</para>
-
- at binding_set: 
- at keyval: 
- at modifiers: 
-
-
 <!-- ##### FUNCTION gtk_binding_entry_add_signal ##### -->
 <para>
 
@@ -152,15 +276,14 @@
 @Varargs: 
 
 
-<!-- ##### FUNCTION gtk_binding_set_add_path ##### -->
+<!-- ##### FUNCTION gtk_binding_entry_skip ##### -->
 <para>
 
 </para>
 
 @binding_set: 
- at path_type: 
- at path_pattern: 
- at priority: 
+ at keyval: 
+ at modifiers: 
 
 
 <!-- ##### FUNCTION gtk_binding_entry_remove ##### -->
@@ -173,24 +296,14 @@
 @modifiers: 
 
 
-<!-- ##### FUNCTION gtk_binding_entry_add_signall ##### -->
+<!-- ##### FUNCTION gtk_binding_set_add_path ##### -->
 <para>
 
 </para>
 
 @binding_set: 
- at keyval: 
- at modifiers: 
- at signal_name: 
- at binding_args: 
+ at path_type: 
+ at path_pattern: 
+ at priority: 
 
 
-<!-- ##### FUNCTION gtk_binding_parse_binding ##### -->
-<para>
-
-</para>
-
- at scanner: 
- at Returns: 
-
-

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkrc.sgml
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkrc.sgml	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/docs/reference/gtk/tmpl/gtkrc.sgml	2007-01-19 13:27:34 UTC (rev 9191)
@@ -813,6 +813,7 @@
 @GTK_RC_TOKEN_LTR: 
 @GTK_RC_TOKEN_RTL: 
 @GTK_RC_TOKEN_COLOR: 
+ at GTK_RC_TOKEN_UNBIND: 
 @GTK_RC_TOKEN_LAST: 
 
 <!-- ##### FUNCTION gtk_rc_scanner_new ##### -->

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtk.symbols	2007-01-19 13:27:34 UTC (rev 9191)
@@ -372,11 +372,14 @@
 
 #if IN_HEADER(__GTK_BINDINGS_H__)
 #if IN_FILE(__GTK_BINDINGS_C__)
+#ifndef GTK_DISABLE_DEPRECATED
+gtk_binding_entry_clear
+gtk_binding_entry_add_signall
+gtk_binding_parse_binding
+#endif
+gtk_binding_entry_skip
 gtk_binding_entry_add_signal
-gtk_binding_entry_add_signall
-gtk_binding_entry_clear
 gtk_binding_entry_remove
-gtk_binding_parse_binding
 gtk_bindings_activate
 gtk_bindings_activate_event
 gtk_binding_set_activate

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.c
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.c	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.c	2007-01-19 13:27:34 UTC (rev 9191)
@@ -206,6 +206,7 @@
   entry->binding_set = binding_set,
   entry->destroyed = FALSE;
   entry->in_emission = FALSE;
+  entry->marks_unbound = FALSE;
   entry->signals = NULL;
 
   entry->set_next = binding_set->entries;
@@ -560,15 +561,24 @@
   return handled;
 }
 
+/**
+ * gtk_binding_set_new:
+ * @set_name: unique name of this binding set
+ *
+ * Gtk+ maintains a global list of binding sets. Each binding set has
+ * a unique name which needs to be specified upon creation.
+ *
+ * Return value: new binding set
+ **/
 GtkBindingSet*
-gtk_binding_set_new (const gchar    *set_name)
+gtk_binding_set_new (const gchar *set_name)
 {
   GtkBindingSet *binding_set;
   
   g_return_val_if_fail (set_name != NULL, NULL);
   
   binding_set = g_new (GtkBindingSet, 1);
-  binding_set->set_name = g_intern_string (set_name);
+  binding_set->set_name = (gchar *) g_intern_string (set_name);
   binding_set->widget_path_pspecs = NULL;
   binding_set->widget_class_pspecs = NULL;
   binding_set->class_branch_pspecs = NULL;
@@ -581,6 +591,16 @@
   return binding_set;
 }
 
+/**
+ * gtk_binding_set_by_class:
+ * @object_class: a valid #GtkObject class
+ *
+ * This function returns the binding set named after the type name of
+ * the passed in class structure. New binding sets are created on
+ * demand by this function.
+ *
+ * Return value: the binding set corresponding to @object_class
+ **/
 GtkBindingSet*
 gtk_binding_set_by_class (gpointer object_class)
 {
@@ -607,8 +627,18 @@
   return binding_set;
 }
 
+/**
+ * gtk_binding_set_find:
+ * @set_name: unique binding set name
+ *
+ * Find a binding set by its globally unique name. The @set_name can
+ * either be a name used for gtk_binding_set_new() or the type name of
+ * a class used in gtk_binding_set_by_class().
+ *
+ * Return value: %NULL or the specified binding set
+ **/
 GtkBindingSet*
-gtk_binding_set_find (const gchar    *set_name)
+gtk_binding_set_find (const gchar *set_name)
 {
   GSList *slist;
   
@@ -625,6 +655,18 @@
   return NULL;
 }
 
+/**
+ * gtk_binding_set_activate:
+ * @binding_set: @binding_set to activate
+ * @keyval:      key value of the binding
+ * @modifiers:   key modifier of the binding
+ * @object:      object to activate when binding found
+ *
+ * Find a key binding matching @keyval and @modifiers within
+ * @binding_set and activate the binding on @object.
+ *
+ * Return value: %TRUE if a binding was found and activated
+ **/
 gboolean
 gtk_binding_set_activate (GtkBindingSet	 *binding_set,
 			  guint		  keyval,
@@ -646,6 +688,14 @@
   return FALSE;
 }
 
+/**
+ * gtk_binding_entry_clear:
+ * @binding_set:
+ * @keyval:
+ * @modifiers:
+ *
+ * Use of this function is deprecated.
+ **/
 void
 gtk_binding_entry_clear (GtkBindingSet	*binding_set,
 			 guint		 keyval,
@@ -665,7 +715,48 @@
   entry = binding_entry_new (binding_set, keyval, modifiers);
 }
 
+/**
+ * gtk_binding_entry_skip:
+ * @binding_set: @binding_set to skip an entry of
+ * @keyval:      key value of binding to skip
+ * @modifiers:   key modifier of binding to skip
+ *
+ * Since: 2.12
+ *
+ * Install a binding on @binding_set which causes key lookups
+ * to be aborted, to prevent bindings from lower priority sets
+ * to be activated.
+ **/
 void
+gtk_binding_entry_skip (GtkBindingSet  *binding_set,
+                        guint           keyval,
+                        GdkModifierType modifiers)
+{
+  GtkBindingEntry *entry;
+
+  g_return_if_fail (binding_set != NULL);
+
+  keyval = gdk_keyval_to_lower (keyval);
+  modifiers = modifiers & BINDING_MOD_MASK ();
+
+  entry = binding_ht_lookup_entry (binding_set, keyval, modifiers);
+  if (entry)
+    binding_entry_destroy (entry);
+
+  entry = binding_entry_new (binding_set, keyval, modifiers);
+  entry->marks_unbound = TRUE;
+}
+
+/**
+ * gtk_binding_entry_remove:
+ * @binding_set: @binding_set to remove an entry of
+ * @keyval:      key value of binding to remove
+ * @modifiers:   key modifier of binding to remove
+ *
+ * Remove a binding previously installed via
+ * gtk_binding_entry_add_signal() on @binding_set.
+ **/
+void
 gtk_binding_entry_remove (GtkBindingSet	 *binding_set,
 			  guint		  keyval,
 			  GdkModifierType modifiers)
@@ -682,13 +773,35 @@
     binding_entry_destroy (entry);
 }
 
+/**
+ * gtk_binding_entry_add_signall:
+ * @binding_set:  binding set to add a signal to
+ * @keyval:       key value
+ * @modifiers:    key modifier
+ * @signal_name:  signal name to be bound
+ * @binding_args: list of #GtkBindingArg signal arguments
+ *
+ * Deprecated.
+ **/
 void
 gtk_binding_entry_add_signall (GtkBindingSet  *binding_set,
-			       guint	       keyval,
-			       GdkModifierType modifiers,
-			       const gchar    *signal_name,
-			       GSList	      *binding_args)
+                               guint	       keyval,
+                               GdkModifierType modifiers,
+                               const gchar    *signal_name,
+                               GSList	      *binding_args)
 {
+  _gtk_binding_entry_add_signall (binding_set,
+                                  keyval, modifiers,
+                                  signal_name, binding_args);
+}
+
+void
+_gtk_binding_entry_add_signall (GtkBindingSet  *binding_set,
+                                guint	       keyval,
+                                GdkModifierType modifiers,
+                                const gchar    *signal_name,
+                                GSList	      *binding_args)
+{
   GtkBindingEntry *entry;
   GtkBindingSignal *signal, **signal_p;
   GSList *slist;
@@ -760,6 +873,20 @@
   *signal_p = signal;
 }
 
+/**
+ * gtk_binding_entry_add_signal:
+ * @binding_set: @binding_set to install an entry for
+ * @keyval:      key value of binding to install
+ * @modifiers:   key modifier of binding to install
+ * @signal_name: signal to execute upon activation
+ * @n_args:      number of arguments to @signal_name
+ * @:            arguments to @signal_name
+ *
+ * Override or install a new key binding for @keyval with @modifiers on
+ * @binding_set.  When the binding is activated, @signal_name will be
+ * emitted on the target widget, with @n_args @Varargs used as
+ * arguments.
+ **/
 void
 gtk_binding_entry_add_signal (GtkBindingSet  *binding_set,
 			      guint           keyval,
@@ -846,6 +973,16 @@
   g_slist_free (free_slist);
 }
 
+/**
+ * gtk_binding_set_add_path:
+ * @binding_set:  binding set to add a path to
+ * @path_type:    path type the pattern applies to
+ * @path_pattern: the actual match pattern
+ * @priority:     binding priority
+ *
+ * This function is used internally by the GtkRC parsing mechanism to
+ * assign match patterns to #GtkBindingSet structures.
+ **/
 void
 gtk_binding_set_add_path (GtkBindingSet	     *binding_set,
 			  GtkPathType	      path_type,
@@ -929,10 +1066,13 @@
 			GtkObject	*object,
 			guint	         path_length,
 			gchar           *path,
-			gchar           *path_reversed)
+			gchar           *path_reversed,
+                        gboolean        *unbound)
 {
   GSList *slist;
 
+  *unbound = FALSE;
+
   for (slist = pspec_list; slist; slist = slist->next)
     {
       PatternSpec *pspec;
@@ -952,8 +1092,17 @@
 	    binding_set = pspec->user_data;
         }
 
-      if (binding_set && gtk_binding_entry_activate (binding_set->current, object))
-        return TRUE;
+      if (binding_set)
+        {
+          if (binding_set->current->marks_unbound)
+            {
+              *unbound = TRUE;
+              return FALSE;
+            }
+
+          if (gtk_binding_entry_activate (binding_set->current, object))
+            return TRUE;
+        }
     }
 
   return FALSE;
@@ -1047,13 +1196,17 @@
       guint path_length;
       gchar *path, *path_reversed;
       GSList *patterns;
+      gboolean unbound;
 
       gtk_widget_path (widget, &path_length, &path, &path_reversed);
       patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET, is_release);
-      handled = binding_match_activate (patterns, object, path_length, path, path_reversed);
+      handled = binding_match_activate (patterns, object, path_length, path, path_reversed, &unbound);
       g_slist_free (patterns);
       g_free (path);
       g_free (path_reversed);
+
+      if (unbound)
+        return FALSE;
     }
 
   if (!handled)
@@ -1061,20 +1214,25 @@
       guint path_length;
       gchar *path, *path_reversed;
       GSList *patterns;
+      gboolean unbound;
 
       gtk_widget_class_path (widget, &path_length, &path, &path_reversed);
       patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_WIDGET_CLASS, is_release);
-      handled = binding_match_activate (patterns, object, path_length, path, path_reversed);
+      handled = binding_match_activate (patterns, object, path_length, path, path_reversed, &unbound);
       g_slist_free (patterns);
       g_free (path);
       g_free (path_reversed);
+
+      if (unbound)
+        return FALSE;
     }
 
   if (!handled)
     {
       GSList *patterns;
       GType class_type;
-      
+      gboolean unbound = FALSE;
+
       patterns = gtk_binding_entries_sort_patterns (entries, GTK_PATH_CLASS, is_release);
       class_type = G_TYPE_FROM_INSTANCE (object);
       while (class_type && !handled)
@@ -1082,23 +1240,40 @@
 	  guint path_length;
 	  gchar *path;
 	  gchar *path_reversed;
-	  
+
 	  path = g_strdup (g_type_name (class_type));
 	  path_reversed = g_strdup (path);
 	  g_strreverse (path_reversed);
 	  path_length = strlen (path);
-	  handled = binding_match_activate (patterns, object, path_length, path, path_reversed);
+	  handled = binding_match_activate (patterns, object, path_length, path, path_reversed, &unbound);
 	  g_free (path);
 	  g_free (path_reversed);
 
+          if (unbound)
+            break;
+
 	  class_type = g_type_parent (class_type);
 	}
       g_slist_free (patterns);
+
+      if (unbound)
+        return FALSE;
     }
 
   return handled;
 }
 
+/**
+ * gtk_bindings_activate:
+ * @object: object to activate when binding found
+ * @keyval: key value of the binding
+ * @modifiers: key modifier of the binding
+ *
+ * Find a key binding matching @keyval and @modifiers and activate the
+ * binding on @object.
+ *
+ * Return value: %TRUE if a binding was found and activated
+ **/
 gboolean
 gtk_bindings_activate (GtkObject      *object,
 		       guint	       keyval,
@@ -1335,12 +1510,15 @@
 {
   guint keyval = 0;
   GdkModifierType modifiers = 0;
+  gboolean unbind = FALSE;
 
   g_return_val_if_fail (scanner != NULL, G_TOKEN_ERROR);
   
   g_scanner_get_next_token (scanner);
-  if (scanner->token != GTK_RC_TOKEN_BIND)
+  if (scanner->token != GTK_RC_TOKEN_BIND &&
+      scanner->token != GTK_RC_TOKEN_UNBIND)
     return GTK_RC_TOKEN_BIND;
+  unbind = scanner->token == GTK_RC_TOKEN_UNBIND;
   g_scanner_get_next_token (scanner);
   if (scanner->token != G_TOKEN_STRING)
     return G_TOKEN_STRING;
@@ -1349,7 +1527,14 @@
   if (keyval == 0)
     return G_TOKEN_STRING;
 
+  if (unbind)
+    {
+      gtk_binding_entry_skip (binding_set, keyval, modifiers);
+      return G_TOKEN_NONE;
+    }
+
   g_scanner_get_next_token (scanner);
+
   if (scanner->token != '{')
     return '{';
 
@@ -1381,9 +1566,23 @@
   return G_TOKEN_NONE;
 }
 
+/**
+ * gtk_binding_parse_binding:
+ * @scanner: GtkRC scanner
+ *
+ * Deprecated as public API, used only internally.
+ *
+ * Return value: expected token upon errors, %G_TOKEN_NONE on success.
+ **/
 guint
-gtk_binding_parse_binding (GScanner       *scanner)
+gtk_binding_parse_binding (GScanner *scanner)
 {
+  return _gtk_binding_parse_binding (scanner);
+}
+
+guint
+_gtk_binding_parse_binding (GScanner *scanner)
+{
   gchar *name;
   GtkBindingSet *binding_set;
 
@@ -1420,6 +1619,7 @@
 	  guint expected_token;
 
 	case GTK_RC_TOKEN_BIND:
+	case GTK_RC_TOKEN_UNBIND:
 	  expected_token = gtk_binding_parse_bind (scanner, binding_set);
 	  if (expected_token != G_TOKEN_NONE)
 	    return expected_token;

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.h
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.h	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkbindings.h	2007-01-19 13:27:34 UTC (rev 9191)
@@ -69,6 +69,7 @@
   GtkBindingSet		*binding_set;
   guint			destroyed : 1;
   guint			in_emission : 1;
+  guint                 marks_unbound : 1;
   GtkBindingEntry	*set_next;
   GtkBindingEntry	*hash_next;
   GtkBindingSignal	*signals;
@@ -106,16 +107,33 @@
 					 guint		 keyval,
 					 GdkModifierType modifiers,
 					 GtkObject	*object);
+
+#ifndef GTK_DISABLE_DEPRECATED
 #define	 gtk_binding_entry_add		gtk_binding_entry_clear
 void	 gtk_binding_entry_clear	(GtkBindingSet	*binding_set,
 					 guint		 keyval,
 					 GdkModifierType modifiers);
-void	 gtk_binding_entry_add_signal	(GtkBindingSet	*binding_set,
+void	 gtk_binding_entry_add_signall	(GtkBindingSet	*binding_set,
 					 guint		 keyval,
 					 GdkModifierType modifiers,
 					 const gchar	*signal_name,
-					 guint		 n_args,
-					 ...);
+					 GSList		*binding_args);
+guint	 gtk_binding_parse_binding      (GScanner       *scanner);
+#endif /* GTK_DISABLE_DEPRECATED */
+
+void	 gtk_binding_entry_skip         (GtkBindingSet  *binding_set,
+                                         guint           keyval,
+                                         GdkModifierType modifiers);
+void	 gtk_binding_entry_add_signal   (GtkBindingSet  *binding_set,
+                                         guint           keyval,
+                                         GdkModifierType modifiers,
+                                         const gchar    *signal_name,
+                                         guint           n_args,
+                                         ...);
+void	 gtk_binding_entry_remove	(GtkBindingSet	*binding_set,
+					 guint		 keyval,
+					 GdkModifierType modifiers);
+
 void	 gtk_binding_set_add_path	(GtkBindingSet	*binding_set,
 					 GtkPathType	 path_type,
 					 const gchar	*path_pattern,
@@ -124,19 +142,14 @@
 
 /* Non-public methods */
 
-void	 gtk_binding_entry_remove	(GtkBindingSet	*binding_set,
+guint	 _gtk_binding_parse_binding     (GScanner       *scanner);
+void     _gtk_binding_reset_parsed      (void);
+void	 _gtk_binding_entry_add_signall (GtkBindingSet  *binding_set,
 					 guint		 keyval,
-					 GdkModifierType modifiers);
-void	 gtk_binding_entry_add_signall	(GtkBindingSet	*binding_set,
-					 guint		 keyval,
 					 GdkModifierType modifiers,
 					 const gchar	*signal_name,
 					 GSList		*binding_args);
-guint	 gtk_binding_parse_binding	(GScanner	*scanner);
 
-
-void     _gtk_binding_reset_parsed    (void);
-
 /* Creates a signal with a fixed callback instead of a class offset;
  * useful for key binding signals
  */

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.c
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.c	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.c	2007-01-19 13:27:34 UTC (rev 9191)
@@ -319,7 +319,8 @@
   "im_module_file\0"
   "LTR\0"
   "RTL\0"
-  "color\0";
+  "color\0"
+  "unbind\0";
 
 static const struct
 {
@@ -361,7 +362,8 @@
   { 245, GTK_RC_TOKEN_IM_MODULE_FILE },
   { 260, GTK_RC_TOKEN_LTR },
   { 264, GTK_RC_TOKEN_RTL },
-  { 268, GTK_RC_TOKEN_COLOR }
+  { 268, GTK_RC_TOKEN_COLOR },
+  { 274, GTK_RC_TOKEN_UNBIND }
 };
 
 static GHashTable *realized_style_ht = NULL;
@@ -2864,7 +2866,7 @@
       return gtk_rc_parse_style (context, scanner);
       
     case GTK_RC_TOKEN_BINDING:
-      return gtk_binding_parse_binding (scanner);
+      return _gtk_binding_parse_binding (scanner);
       
     case GTK_RC_TOKEN_PIXMAP_PATH:
       return gtk_rc_parse_pixmap_path (context, scanner);

Modified: projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.h
===================================================================
--- projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.h	2007-01-19 12:39:18 UTC (rev 9190)
+++ projects/haf/branches/gtk+/maemo-gtk-2-10/gtk/gtkrc.h	2007-01-19 13:27:34 UTC (rev 9191)
@@ -217,6 +217,7 @@
   GTK_RC_TOKEN_LTR,
   GTK_RC_TOKEN_RTL,
   GTK_RC_TOKEN_COLOR,
+  GTK_RC_TOKEN_UNBIND,
   GTK_RC_TOKEN_LAST
 } GtkRcTokenType;
 


More information about the maemo-commits mailing list