summaryrefslogtreecommitdiff
path: root/gtk
diff options
context:
space:
mode:
Diffstat (limited to 'gtk')
-rw-r--r--gtk/gtklabel.c72
-rw-r--r--gtk/gtklabel.h72
-rw-r--r--gtk/gtknotebook.c13
-rw-r--r--gtk/gtkwidget.c59
-rw-r--r--gtk/gtkwidget.h9
-rw-r--r--gtk/gtkwindow.c72
-rw-r--r--gtk/gtkwindow.h3
-rw-r--r--gtk/testgtk.c4
8 files changed, 162 insertions, 142 deletions
diff --git a/gtk/gtklabel.c b/gtk/gtklabel.c
index a269f8634f..42d6300f56 100644
--- a/gtk/gtklabel.c
+++ b/gtk/gtklabel.c
@@ -54,7 +54,8 @@ enum {
PROP_PATTERN,
PROP_WRAP,
PROP_SELECTABLE,
- PROP_MNEMONIC_KEYVAL
+ PROP_MNEMONIC_KEYVAL,
+ PROP_MNEMONIC_WIDGET
};
static void gtk_label_class_init (GtkLabelClass *klass);
@@ -67,6 +68,7 @@ static void gtk_label_get_property (GObject *object,
guint prop_id,
GValue *value,
GParamSpec *pspec);
+static void gtk_label_destroy (GtkObject *object);
static void gtk_label_finalize (GObject *object);
static void gtk_label_size_request (GtkWidget *widget,
GtkRequisition *requisition);
@@ -158,17 +160,16 @@ static void
gtk_label_class_init (GtkLabelClass *class)
{
GObjectClass *gobject_class = G_OBJECT_CLASS (class);
- GtkObjectClass *object_class;
- GtkWidgetClass *widget_class;
-
- object_class = (GtkObjectClass*) class;
- widget_class = (GtkWidgetClass*) class;
-
+ GtkObjectClass *object_class = GTK_OBJECT_CLASS (class);
+ GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
+
parent_class = gtk_type_class (GTK_TYPE_MISC);
gobject_class->set_property = gtk_label_set_property;
gobject_class->get_property = gtk_label_get_property;
gobject_class->finalize = gtk_label_finalize;
+
+ object_class->destroy = gtk_label_destroy;
widget_class->size_request = gtk_label_size_request;
widget_class->size_allocate = gtk_label_size_allocate;
@@ -248,13 +249,20 @@ gtk_label_class_init (GtkLabelClass *class)
g_object_class_install_property (gobject_class,
PROP_MNEMONIC_KEYVAL,
g_param_spec_uint ("mnemonic_keyval",
- _("Mnemonic accelerator key value"),
+ _("Mnemonic key"),
_("The mnemonic accelerator key for this label."),
0,
G_MAXUINT,
GDK_VoidSymbol,
G_PARAM_READABLE));
-
+ g_object_class_install_property (gobject_class,
+ PROP_MNEMONIC_WIDGET,
+ g_param_spec_object ("mnemonic_widget",
+ _("Mnemonic widget"),
+ _("The widget to be activated when the label's mnemonic "
+ "key is pressed."),
+ GTK_TYPE_WIDGET,
+ G_PARAM_READWRITE));
}
static void
@@ -297,6 +305,9 @@ gtk_label_set_property (GObject *object,
case PROP_SELECTABLE:
gtk_label_set_selectable (label, g_value_get_boolean (value));
break;
+ case PROP_MNEMONIC_WIDGET:
+ gtk_label_set_mnemonic_widget (label, (GtkWidget*) g_value_get_object (value));
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
break;
@@ -339,6 +350,9 @@ gtk_label_get_property (GObject *object,
case PROP_MNEMONIC_KEYVAL:
g_value_set_uint (value, label->mnemonic_keyval);
break;
+ case PROP_MNEMONIC_WIDGET:
+ g_value_set_object (value, (GObject*) label->mnemonic_widget);
+ break;
default:
G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
@@ -425,21 +439,21 @@ gtk_label_activate_mnemonic (GtkWidget *widget,
if (GTK_LABEL (widget)->mnemonic_widget)
return gtk_widget_activate_mnemonic (GTK_LABEL (widget)->mnemonic_widget, group_cycling);
- /* Try to find the widget to activate by traversing the widget
- * hierarachy.
+ /* Try to find the widget to activate by traversing the
+ * widget's ancestry.
*/
-
parent = widget->parent;
while (parent)
{
if (GTK_WIDGET_CAN_FOCUS (parent) ||
(!group_cycling && GTK_WIDGET_GET_CLASS (parent)->activate_signal) ||
- (parent->parent && GTK_IS_NOTEBOOK (parent->parent)) ||
+ (parent->parent && GTK_IS_NOTEBOOK (parent->parent)) ||
(GTK_IS_MENU_ITEM (parent)))
return gtk_widget_activate_mnemonic (parent, group_cycling);
parent = parent->parent;
}
+ /* barf if there was nothing to activate */
g_warning ("Couldn't find a target for a mnemonic activation.");
gdk_beep ();
@@ -447,11 +461,12 @@ gtk_label_activate_mnemonic (GtkWidget *widget,
}
static void
-gtk_label_setup_mnemonic (GtkLabel *label, guint last_key)
+gtk_label_setup_mnemonic (GtkLabel *label,
+ guint last_key)
{
GtkWidget *toplevel;
- if ((last_key != GDK_VoidSymbol) && label->mnemonic_window)
+ if (last_key != GDK_VoidSymbol && label->mnemonic_window)
gtk_window_remove_mnemonic (label->mnemonic_window,
last_key,
GTK_WIDGET (label));
@@ -499,13 +514,18 @@ gtk_label_hierarchy_changed (GtkWidget *widget)
* mnemonic collisions and toggle focus between the colliding widgets otherwise.
**/
void
-gtk_label_set_mnemonic_widget (GtkLabel *label,
- GtkWidget *widget)
+gtk_label_set_mnemonic_widget (GtkLabel *label,
+ GtkWidget *widget)
{
g_return_if_fail (GTK_IS_LABEL (label));
- g_return_if_fail (GTK_IS_WIDGET (widget));
+ if (widget)
+ g_return_if_fail (GTK_IS_WIDGET (widget));
+ if (label->mnemonic_widget)
+ gtk_widget_unref (label->mnemonic_widget);
label->mnemonic_widget = widget;
+ if (label->mnemonic_widget)
+ gtk_widget_ref (label->mnemonic_widget);
}
@@ -584,7 +604,8 @@ gtk_label_set_attributes_internal (GtkLabel *label,
/* Calculates text, attrs and mnemonic_keyval from
- * label, use_underline and use_markup */
+ * label, use_underline and use_markup
+ */
static void
gtk_label_recalculate (GtkLabel *label)
{
@@ -604,6 +625,7 @@ gtk_label_recalculate (GtkLabel *label)
if (!label->use_underline)
{
guint keyval = label->mnemonic_keyval;
+
label->mnemonic_keyval = GDK_VoidSymbol;
gtk_label_setup_mnemonic (label, keyval);
}
@@ -874,6 +896,16 @@ gtk_label_get (GtkLabel *label,
}
static void
+gtk_label_destroy (GtkObject *object)
+{
+ GtkLabel *label = GTK_LABEL (object);
+
+ gtk_label_set_mnemonic_widget (label, NULL);
+
+ GTK_OBJECT_CLASS (parent_class)->destroy (object);
+}
+
+static void
gtk_label_finalize (GObject *object)
{
GtkLabel *label;
@@ -1497,6 +1529,7 @@ window_to_layout_coords (GtkLabel *label,
}
}
+#if 0
static void
layout_to_window_coords (GtkLabel *label,
gint *x,
@@ -1522,6 +1555,7 @@ layout_to_window_coords (GtkLabel *label,
*y -= widget->allocation.y; /* go to selection window */
}
}
+#endif
static void
get_layout_index (GtkLabel *label,
diff --git a/gtk/gtklabel.h b/gtk/gtklabel.h
index 3e3d783e4a..bef1ca491e 100644
--- a/gtk/gtklabel.h
+++ b/gtk/gtklabel.h
@@ -79,46 +79,38 @@ struct _GtkLabelClass
GtkMiscClass parent_class;
};
-GtkType gtk_label_get_type (void) G_GNUC_CONST;
-GtkWidget *gtk_label_new (const char *str);
-GtkWidget *gtk_label_new_with_mnemonic (const char *str);
-
-void gtk_label_set_text (GtkLabel *label,
- const char *str);
-G_CONST_RETURN gchar *gtk_label_get_text (GtkLabel *label);
-
-void gtk_label_set_attributes (GtkLabel *label,
- PangoAttrList *attrs);
-
-void gtk_label_set_markup (GtkLabel *label,
- const gchar *str);
-void gtk_label_set_markup_with_mnemonic (GtkLabel *label,
- const gchar *str);
-
-guint gtk_label_get_mnemonic_keyval (GtkLabel *label);
-void gtk_label_set_justify (GtkLabel *label,
- GtkJustification jtype);
-void gtk_label_set_pattern (GtkLabel *label,
- const gchar *pattern);
-void gtk_label_set_line_wrap (GtkLabel *label,
- gboolean wrap);
-
-void gtk_label_set_text_with_mnemonic (GtkLabel *label,
- const gchar *string);
-void gtk_label_set_mnemonic_widget (GtkLabel *label,
- GtkWidget *widget);
-
-void gtk_label_set_selectable (GtkLabel *label,
- gboolean setting);
-gboolean gtk_label_get_selectable (GtkLabel *label);
-
-void gtk_label_select_region (GtkLabel *label,
- gint start_offset,
- gint end_offset);
-
-void gtk_label_get_layout_offsets (GtkLabel *label,
- gint *x,
- gint *y);
+GtkType gtk_label_get_type (void) G_GNUC_CONST;
+GtkWidget* gtk_label_new (const char *str);
+GtkWidget* gtk_label_new_with_mnemonic (const char *str);
+void gtk_label_set_text (GtkLabel *label,
+ const char *str);
+G_CONST_RETURN gchar* gtk_label_get_text (GtkLabel *label);
+void gtk_label_set_attributes (GtkLabel *label,
+ PangoAttrList *attrs);
+void gtk_label_set_markup (GtkLabel *label,
+ const gchar *str);
+void gtk_label_set_markup_with_mnemonic (GtkLabel *label,
+ const gchar *str);
+guint gtk_label_get_mnemonic_keyval (GtkLabel *label);
+void gtk_label_set_mnemonic_widget (GtkLabel *label,
+ GtkWidget *widget);
+void gtk_label_set_text_with_mnemonic (GtkLabel *label,
+ const gchar *string);
+void gtk_label_set_justify (GtkLabel *label,
+ GtkJustification jtype);
+void gtk_label_set_pattern (GtkLabel *label,
+ const gchar *pattern);
+void gtk_label_set_line_wrap (GtkLabel *label,
+ gboolean wrap);
+void gtk_label_set_selectable (GtkLabel *label,
+ gboolean setting);
+gboolean gtk_label_get_selectable (GtkLabel *label);
+void gtk_label_select_region (GtkLabel *label,
+ gint start_offset,
+ gint end_offset);
+void gtk_label_get_layout_offsets (GtkLabel *label,
+ gint *x,
+ gint *y);
#ifndef GTK_DISABLE_COMPAT_H
# define gtk_label_set gtk_label_set_text
diff --git a/gtk/gtknotebook.c b/gtk/gtknotebook.c
index 390538de91..1ee200d4d8 100644
--- a/gtk/gtknotebook.c
+++ b/gtk/gtknotebook.c
@@ -3638,18 +3638,17 @@ gtk_notebook_activate_mnemonic_switch_page (GtkWidget *child,
gpointer data)
{
GtkNotebook *notebook = GTK_NOTEBOOK (data);
- GtkNotebookPage *page;
GList *list;
-
+
list = g_list_find_custom (notebook->children, child,
gtk_notebook_page_compare_tab);
- if (!list)
- return TRUE;
-
+ if (list)
+ {
+ GtkNotebookPage *page = list->data;
- page = list->data;
+ gtk_notebook_switch_page (notebook, page, -1);
+ }
- gtk_notebook_switch_page (notebook, page, -1);
return TRUE;
}
diff --git a/gtk/gtkwidget.c b/gtk/gtkwidget.c
index c63ff4a590..52cf619ad8 100644
--- a/gtk/gtkwidget.c
+++ b/gtk/gtkwidget.c
@@ -252,6 +252,22 @@ gtk_widget_get_type (void)
return widget_type;
}
+static gboolean
+accumulator_stop_handled_emission (GSignalInvocationHint *ihint,
+ GValue *return_accu,
+ const GValue *handler_return,
+ gpointer data)
+{
+ gboolean continue_emission;
+ gboolean signal_handled;
+
+ signal_handled = g_value_get_boolean (handler_return);
+ g_value_set_boolean (return_accu, signal_handled);
+ continue_emission = !signal_handled;
+
+ return continue_emission;
+}
+
/*****************************************
* gtk_widget_class_init:
*
@@ -465,13 +481,14 @@ gtk_widget_class_init (GtkWidgetClass *klass)
gtk_accel_group_create_remove (GTK_CLASS_TYPE (object_class), GTK_RUN_LAST,
GTK_SIGNAL_OFFSET (GtkWidgetClass, remove_accelerator));
widget_signals[ACTIVATE_MNEMONIC] =
- gtk_signal_new ("activate_mnemonic",
- GTK_RUN_LAST,
- GTK_CLASS_TYPE (object_class),
- GTK_SIGNAL_OFFSET (GtkWidgetClass, activate_mnemonic),
- gtk_marshal_BOOLEAN__BOOLEAN,
- GTK_TYPE_BOOL, 1,
- GTK_TYPE_BOOL);
+ g_signal_newc ("activate_mnemonic",
+ GTK_CLASS_TYPE (object_class),
+ GTK_RUN_LAST,
+ GTK_SIGNAL_OFFSET (GtkWidgetClass, activate_mnemonic),
+ accumulator_stop_handled_emission, NULL,
+ gtk_marshal_BOOLEAN__BOOLEAN,
+ GTK_TYPE_BOOL, 1,
+ GTK_TYPE_BOOL);
widget_signals[GRAB_FOCUS] =
gtk_signal_new ("grab_focus",
GTK_RUN_LAST | GTK_RUN_ACTION,
@@ -2191,17 +2208,18 @@ gboolean
gtk_widget_activate_mnemonic (GtkWidget *widget,
gboolean group_cycling)
{
- gboolean handled = FALSE;
+ gboolean handled;
g_return_val_if_fail (GTK_IS_WIDGET (widget), FALSE);
+ group_cycling = group_cycling != FALSE;
if (!GTK_WIDGET_IS_SENSITIVE (widget))
- return TRUE;
-
- gtk_signal_emit_by_name (GTK_OBJECT (widget),
- "activate_mnemonic",
- group_cycling,
- &handled);
+ handled = TRUE;
+ else
+ gtk_signal_emit (GTK_OBJECT (widget),
+ widget_signals[ACTIVATE_MNEMONIC],
+ group_cycling,
+ &handled);
return handled;
}
@@ -2209,14 +2227,19 @@ static gboolean
gtk_widget_real_activate_mnemonic (GtkWidget *widget,
gboolean group_cycling)
{
- if (group_cycling)
- gtk_widget_grab_focus (widget);
- else if (!group_cycling)
+ if (!group_cycling && GTK_WIDGET_GET_CLASS (widget)->activate_signal)
gtk_widget_activate (widget);
+ else if (GTK_WIDGET_CAN_FOCUS (widget))
+ gtk_widget_grab_focus (widget);
+ else
+ {
+ g_warning ("widget `%s' isn't suitable for mnemonic activation",
+ G_OBJECT_TYPE_NAME (widget));
+ gdk_beep ();
+ }
return TRUE;
}
-
static gint
gtk_widget_real_key_press_event (GtkWidget *widget,
GdkEventKey *event)
diff --git a/gtk/gtkwidget.h b/gtk/gtkwidget.h
index dbad8c98e8..1d5d4bee85 100644
--- a/gtk/gtkwidget.h
+++ b/gtk/gtkwidget.h
@@ -55,11 +55,13 @@ typedef enum
GTK_HAS_FOCUS = 1 << 12,
/* widget is allowed to receive the default via gtk_widget_grab_default
- * and will reserve space to draw the default if possible */
+ * and will reserve space to draw the default if possible
+ */
GTK_CAN_DEFAULT = 1 << 13,
/* the widget currently is receiving the default action and should be drawn
- * appropriately if possible */
+ * appropriately if possible
+ */
GTK_HAS_DEFAULT = 1 << 14,
GTK_HAS_GRAB = 1 << 15,
@@ -69,7 +71,8 @@ typedef enum
GTK_APP_PAINTABLE = 1 << 19,
/* the widget when focused will receive the default action and have
- * HAS_DEFAULT set even if there is a different widget set as default */
+ * HAS_DEFAULT set even if there is a different widget set as default
+ */
GTK_RECEIVES_DEFAULT = 1 << 20,
GTK_DOUBLE_BUFFERED = 1 << 21
diff --git a/gtk/gtkwindow.c b/gtk/gtkwindow.c
index 62067deacb..a61ca77414 100644
--- a/gtk/gtkwindow.c
+++ b/gtk/gtkwindow.c
@@ -822,29 +822,6 @@ gtk_window_remove_accel_group (GtkWindow *window,
gtk_accel_group_detach (accel_group, GTK_OBJECT (window));
}
-GtkAccelGroup*
-gtk_window_get_default_accel_group (GtkWindow *window)
-{
- GtkAccelGroup *group;
-
- g_return_val_if_fail (GTK_IS_WINDOW (window), NULL);
-
- group = gtk_object_get_data (GTK_OBJECT (window),
- "gtk-accel-group");
-
- if (group == NULL)
- {
- group = gtk_accel_group_new ();
- gtk_window_add_accel_group (window, group);
- gtk_object_set_data (GTK_OBJECT (window),
- "gtk-accel-group",
- group);
- gtk_accel_group_unref (group);
- }
-
- return group;
-}
-
void
gtk_window_add_mnemonic (GtkWindow *window,
guint keyval,
@@ -853,17 +830,18 @@ gtk_window_add_mnemonic (GtkWindow *window,
GtkWindowMnemonic key;
GtkWindowMnemonic *mnemonic;
- g_return_if_fail (window != NULL);
g_return_if_fail (GTK_IS_WINDOW (window));
g_return_if_fail (GTK_IS_WIDGET (target));
key.window = window;
key.keyval = keyval;
-
mnemonic = g_hash_table_lookup (mnemonic_hash_table, &key);
if (mnemonic)
- mnemonic->targets = g_slist_prepend (mnemonic->targets, target);
+ {
+ g_return_if_fail (g_slist_find (mnemonic->targets, target) == NULL);
+ mnemonic->targets = g_slist_prepend (mnemonic->targets, target);
+ }
else
{
mnemonic = g_new (GtkWindowMnemonic, 1);
@@ -881,26 +859,20 @@ gtk_window_remove_mnemonic (GtkWindow *window,
GtkWindowMnemonic key;
GtkWindowMnemonic *mnemonic;
- g_return_if_fail (window != NULL);
g_return_if_fail (GTK_IS_WINDOW (window));
g_return_if_fail (GTK_IS_WIDGET (target));
key.window = window;
key.keyval = keyval;
-
mnemonic = g_hash_table_lookup (mnemonic_hash_table, &key);
- g_assert (mnemonic);
+ g_return_if_fail (mnemonic && g_slist_find (mnemonic->targets, target) != NULL);
- if (mnemonic)
+ mnemonic->targets = g_slist_remove (mnemonic->targets, target);
+ if (mnemonic->targets == NULL)
{
- mnemonic->targets = g_slist_remove (mnemonic->targets, target);
-
- if (mnemonic->targets == NULL)
- {
- g_hash_table_remove (mnemonic_hash_table, mnemonic);
- g_free (mnemonic);
- }
+ g_hash_table_remove (mnemonic_hash_table, mnemonic);
+ g_free (mnemonic);
}
}
@@ -915,15 +887,13 @@ gtk_window_activate_mnemonic (GtkWindow *window,
GtkWidget *widget, *chosen_widget;
gboolean overloaded;
- g_return_val_if_fail (window != NULL, FALSE);
g_return_val_if_fail (GTK_IS_WINDOW (window), FALSE);
- if (modifier != window->mnemonic_modifier)
+ if (window->mnemonic_modifier != (modifier & gtk_accelerator_get_default_mod_mask ()))
return FALSE;
key.window = window;
key.keyval = keyval;
-
mnemonic = g_hash_table_lookup (mnemonic_hash_table, &key);
if (!mnemonic)
@@ -953,9 +923,11 @@ gtk_window_activate_mnemonic (GtkWindow *window,
if (chosen_widget)
{
/* For round robin we put the activated entry on
- * the end of the list after activation */
+ * the end of the list after activation
+ */
mnemonic->targets = g_slist_remove (mnemonic->targets, chosen_widget);
mnemonic->targets = g_slist_append (mnemonic->targets, chosen_widget);
+
return gtk_widget_activate_mnemonic (chosen_widget, overloaded);
}
return FALSE;
@@ -965,8 +937,8 @@ void
gtk_window_set_mnemonic_modifier (GtkWindow *window,
GdkModifierType modifier)
{
- g_return_if_fail (window != NULL);
g_return_if_fail (GTK_IS_WINDOW (window));
+ g_return_if_fail ((modifier & ~GDK_MODIFIER_MASK) == 0);
window->mnemonic_modifier = modifier;
}
@@ -975,7 +947,6 @@ void
gtk_window_set_position (GtkWindow *window,
GtkWindowPosition position)
{
- g_return_if_fail (window != NULL);
g_return_if_fail (GTK_IS_WINDOW (window));
window->position = position;
@@ -1539,6 +1510,14 @@ gtk_window_mnemonic_hash_remove (gpointer key,
if (mnemonic->window == window)
{
+ if (mnemonic->targets)
+ {
+ gchar *name = gtk_accelerator_name (mnemonic->keyval, 0);
+
+ g_warning ("mnemonic \"%s\" wasn't removed for widget (%p)",
+ name, mnemonic->targets->data);
+ g_free (name);
+ }
g_slist_free (mnemonic->targets);
g_free (mnemonic);
@@ -2064,12 +2043,9 @@ gtk_window_key_press_event (GtkWidget *widget,
handled = FALSE;
- if (window->focus_widget &&
- window->focus_widget != widget &&
+ if (window->focus_widget && window->focus_widget != widget &&
GTK_WIDGET_IS_SENSITIVE (window->focus_widget))
- {
- handled = gtk_widget_event (window->focus_widget, (GdkEvent*) event);
- }
+ handled = gtk_widget_event (window->focus_widget, (GdkEvent*) event);
if (!handled)
handled = gtk_window_activate_mnemonic (window,
diff --git a/gtk/gtkwindow.h b/gtk/gtkwindow.h
index 0de5aa5e6f..04e015c858 100644
--- a/gtk/gtkwindow.h
+++ b/gtk/gtkwindow.h
@@ -174,9 +174,6 @@ void gtk_window_set_modal (GtkWindow *window,
gboolean modal);
GList* gtk_window_list_toplevels (void);
-/* Get the "built-in" accel group (convenience thing) */
-GtkAccelGroup* gtk_window_get_default_accel_group (GtkWindow *window);
-
void gtk_window_add_mnemonic (GtkWindow *window,
guint keyval,
GtkWidget *target);
diff --git a/gtk/testgtk.c b/gtk/testgtk.c
index 49c405b0d7..b44d880c6f 100644
--- a/gtk/testgtk.c
+++ b/gtk/testgtk.c
@@ -166,12 +166,8 @@ create_buttons (void)
if (!window)
{
- GtkAccelGroup *accel_group;
-
window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- accel_group = gtk_window_get_default_accel_group (GTK_WINDOW (window));
-
gtk_signal_connect (GTK_OBJECT (window), "destroy",
GTK_SIGNAL_FUNC (gtk_widget_destroyed),
&window);