yeppers, accelerator changes to fix the gimp. commit message dedicated to

yeppers, accelerator changes to fix the gimp.
commit message dedicated to sopwith ;)

Thu Jun 18 03:30:06 1998  Tim Janik  <timj@gtk.org>

        * gtk/gtkaccellabel.h:
        * gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
        request the size of the accelerator portion of an accel label.
        (gtk_accel_label_size_request): don't request for the accelerators size.
        (gtk_accel_label_expose_event): only draw the accelerator if we got
        enough extra space.

        * gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
        width from children.

        * gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
        object (after removal has been requested) check if there is still an
        accelerator remaining to avoid adding two accelerators on an object.
        this can happen for locked accelerators (or accelerator-frozen widgets).
        (gtk_menu_size_request): feature childrens accelerator width in size
        requests.

        * gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
        gtk_widget_freeze_accelerators() for dynamically created menu items.

        * gtk/gtksignal.h:
        * gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
        which will return a handler_id > 0 if the specified function is pending
        for `signal_id'.

        * gtk/gtkwidget.h:
        * gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
        a signal handler function to stop accelerator addition.
        added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
        which will prevent (undo) any accelerators from being added to or
        removed from a widget.
This commit is contained in:
Tim Janik 1998-06-18 03:22:09 +00:00 committed by Tim Janik
parent 85adae970a
commit f83d57e91b
22 changed files with 548 additions and 79 deletions

View File

@ -1,3 +1,37 @@
Thu Jun 18 03:30:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
request the size of the accelerator portion of an accel label.
(gtk_accel_label_size_request): don't request for the accelerators size.
(gtk_accel_label_expose_event): only draw the accelerator if we got
enough extra space.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
width from children.
* gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
object (after removal has been requested) check if there is still an
accelerator remaining to avoid adding two accelerators on an object.
this can happen for locked accelerators (or accelerator-frozen widgets).
(gtk_menu_size_request): feature childrens accelerator width in size
requests.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
gtk_widget_freeze_accelerators() for dynamically created menu items.
* gtk/gtksignal.h:
* gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
which will return a handler_id > 0 if the specified function is pending
for `signal_id'.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
a signal handler function to stop accelerator addition.
added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
which will prevent (undo) any accelerators from being added to or
removed from a widget.
Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org> Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org>
* gtkspinbutton.h gtkspinbutton.c testgtk.c: * gtkspinbutton.h gtkspinbutton.c testgtk.c:

View File

@ -1,3 +1,37 @@
Thu Jun 18 03:30:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
request the size of the accelerator portion of an accel label.
(gtk_accel_label_size_request): don't request for the accelerators size.
(gtk_accel_label_expose_event): only draw the accelerator if we got
enough extra space.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
width from children.
* gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
object (after removal has been requested) check if there is still an
accelerator remaining to avoid adding two accelerators on an object.
this can happen for locked accelerators (or accelerator-frozen widgets).
(gtk_menu_size_request): feature childrens accelerator width in size
requests.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
gtk_widget_freeze_accelerators() for dynamically created menu items.
* gtk/gtksignal.h:
* gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
which will return a handler_id > 0 if the specified function is pending
for `signal_id'.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
a signal handler function to stop accelerator addition.
added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
which will prevent (undo) any accelerators from being added to or
removed from a widget.
Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org> Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org>
* gtkspinbutton.h gtkspinbutton.c testgtk.c: * gtkspinbutton.h gtkspinbutton.c testgtk.c:

View File

@ -1,3 +1,37 @@
Thu Jun 18 03:30:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
request the size of the accelerator portion of an accel label.
(gtk_accel_label_size_request): don't request for the accelerators size.
(gtk_accel_label_expose_event): only draw the accelerator if we got
enough extra space.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
width from children.
* gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
object (after removal has been requested) check if there is still an
accelerator remaining to avoid adding two accelerators on an object.
this can happen for locked accelerators (or accelerator-frozen widgets).
(gtk_menu_size_request): feature childrens accelerator width in size
requests.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
gtk_widget_freeze_accelerators() for dynamically created menu items.
* gtk/gtksignal.h:
* gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
which will return a handler_id > 0 if the specified function is pending
for `signal_id'.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
a signal handler function to stop accelerator addition.
added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
which will prevent (undo) any accelerators from being added to or
removed from a widget.
Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org> Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org>
* gtkspinbutton.h gtkspinbutton.c testgtk.c: * gtkspinbutton.h gtkspinbutton.c testgtk.c:

View File

@ -1,3 +1,37 @@
Thu Jun 18 03:30:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
request the size of the accelerator portion of an accel label.
(gtk_accel_label_size_request): don't request for the accelerators size.
(gtk_accel_label_expose_event): only draw the accelerator if we got
enough extra space.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
width from children.
* gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
object (after removal has been requested) check if there is still an
accelerator remaining to avoid adding two accelerators on an object.
this can happen for locked accelerators (or accelerator-frozen widgets).
(gtk_menu_size_request): feature childrens accelerator width in size
requests.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
gtk_widget_freeze_accelerators() for dynamically created menu items.
* gtk/gtksignal.h:
* gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
which will return a handler_id > 0 if the specified function is pending
for `signal_id'.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
a signal handler function to stop accelerator addition.
added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
which will prevent (undo) any accelerators from being added to or
removed from a widget.
Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org> Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org>
* gtkspinbutton.h gtkspinbutton.c testgtk.c: * gtkspinbutton.h gtkspinbutton.c testgtk.c:

View File

@ -1,3 +1,37 @@
Thu Jun 18 03:30:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
request the size of the accelerator portion of an accel label.
(gtk_accel_label_size_request): don't request for the accelerators size.
(gtk_accel_label_expose_event): only draw the accelerator if we got
enough extra space.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
width from children.
* gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
object (after removal has been requested) check if there is still an
accelerator remaining to avoid adding two accelerators on an object.
this can happen for locked accelerators (or accelerator-frozen widgets).
(gtk_menu_size_request): feature childrens accelerator width in size
requests.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
gtk_widget_freeze_accelerators() for dynamically created menu items.
* gtk/gtksignal.h:
* gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
which will return a handler_id > 0 if the specified function is pending
for `signal_id'.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
a signal handler function to stop accelerator addition.
added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
which will prevent (undo) any accelerators from being added to or
removed from a widget.
Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org> Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org>
* gtkspinbutton.h gtkspinbutton.c testgtk.c: * gtkspinbutton.h gtkspinbutton.c testgtk.c:

View File

@ -1,3 +1,37 @@
Thu Jun 18 03:30:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
request the size of the accelerator portion of an accel label.
(gtk_accel_label_size_request): don't request for the accelerators size.
(gtk_accel_label_expose_event): only draw the accelerator if we got
enough extra space.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
width from children.
* gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
object (after removal has been requested) check if there is still an
accelerator remaining to avoid adding two accelerators on an object.
this can happen for locked accelerators (or accelerator-frozen widgets).
(gtk_menu_size_request): feature childrens accelerator width in size
requests.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
gtk_widget_freeze_accelerators() for dynamically created menu items.
* gtk/gtksignal.h:
* gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
which will return a handler_id > 0 if the specified function is pending
for `signal_id'.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
a signal handler function to stop accelerator addition.
added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
which will prevent (undo) any accelerators from being added to or
removed from a widget.
Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org> Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org>
* gtkspinbutton.h gtkspinbutton.c testgtk.c: * gtkspinbutton.h gtkspinbutton.c testgtk.c:

View File

@ -1,3 +1,37 @@
Thu Jun 18 03:30:06 1998 Tim Janik <timj@gtk.org>
* gtk/gtkaccellabel.h:
* gtk/gtkaccellabel.c: new function gtk_accel_label_accelerator_width to
request the size of the accelerator portion of an accel label.
(gtk_accel_label_size_request): don't request for the accelerators size.
(gtk_accel_label_expose_event): only draw the accelerator if we got
enough extra space.
* gtk/gtkmenuitem.c (gtk_menu_item_size_request): request accelerator
width from children.
* gtk/gtkmenu.c (gtk_menu_key_press): when adding an accelerator to an
object (after removal has been requested) check if there is still an
accelerator remaining to avoid adding two accelerators on an object.
this can happen for locked accelerators (or accelerator-frozen widgets).
(gtk_menu_size_request): feature childrens accelerator width in size
requests.
* gtk/gtknotebook.c (gtk_notebook_menu_item_create): use
gtk_widget_freeze_accelerators() for dynamically created menu items.
* gtk/gtksignal.h:
* gtk/gtksignal.c: new function gtk_signal_handler_pending_by_func()
which will return a handler_id > 0 if the specified function is pending
for `signal_id'.
* gtk/gtkwidget.h:
* gtk/gtkwidget.c: remove gtk_widget_stop_accelerator, which was just
a signal handler function to stop accelerator addition.
added gtk_widget_freeze_accelerators and gtk_widget_thaw_accelerators
which will prevent (undo) any accelerators from being added to or
removed from a widget.
Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org> Wed Jun 17 21:59:09 1998 Stefan Jeske <stefan@gtk.org>
* gtkspinbutton.h gtkspinbutton.c testgtk.c: * gtkspinbutton.h gtkspinbutton.c testgtk.c:

View File

@ -274,10 +274,9 @@
; enumerations from "./gtkspinbutton.h" ; enumerations from "./gtkspinbutton.h"
(define-flags GtkSpinButtonUpdatePolicy (define-enum GtkSpinButtonUpdatePolicy
(always GTK_UPDATE_ALWAYS) (always GTK_UPDATE_ALWAYS)
(if-valid GTK_UPDATE_IF_VALID) (if-valid GTK_UPDATE_IF_VALID))
(snap-to-ticks GTK_UPDATE_SNAP_TO_TICKS))
; enumerations from "./gtktoolbar.h" ; enumerations from "./gtktoolbar.h"

View File

@ -194,6 +194,15 @@ gtk_accel_label_finalize (GtkObject *object)
GTK_OBJECT_CLASS (parent_class)->finalize (object); GTK_OBJECT_CLASS (parent_class)->finalize (object);
} }
guint
gtk_accel_label_accelerator_width (GtkAccelLabel *accel_label)
{
g_return_if_fail (accel_label != NULL);
g_return_if_fail (GTK_IS_ACCEL_LABEL (accel_label));
return accel_label->accel_padding + accel_label->accel_string_width;
}
static void static void
gtk_accel_label_size_request (GtkWidget *widget, gtk_accel_label_size_request (GtkWidget *widget,
GtkRequisition *requisition) GtkRequisition *requisition)
@ -211,7 +220,6 @@ gtk_accel_label_size_request (GtkWidget *widget,
accel_label->accel_string_width = gdk_string_width (GTK_WIDGET (accel_label)->style->font, accel_label->accel_string_width = gdk_string_width (GTK_WIDGET (accel_label)->style->font,
accel_label->accel_string); accel_label->accel_string);
requisition->width += accel_label->accel_padding + accel_label->accel_string_width;
} }
static gint static gint
@ -232,9 +240,9 @@ gtk_accel_label_expose_event (GtkWidget *widget,
{ {
guint ac_width; guint ac_width;
ac_width = accel_label->accel_padding + accel_label->accel_string_width; ac_width = gtk_accel_label_accelerator_width (accel_label);
if (widget->allocation.width > ac_width + misc->xpad * 2) if (widget->allocation.width >= widget->requisition.width + ac_width)
{ {
guint x; guint x;
guint y; guint y;

View File

@ -50,7 +50,7 @@ struct _GtkAccelLabel
guint accel_padding; guint accel_padding;
GtkWidget *accel_widget; GtkWidget *accel_widget;
gchar *accel_string; gchar *accel_string;
guint accel_string_width : 16; guint16 accel_string_width;
}; };
struct _GtkAccelLabelClass struct _GtkAccelLabelClass
@ -68,11 +68,12 @@ struct _GtkAccelLabelClass
}; };
GtkType gtk_accel_label_get_type (void); GtkType gtk_accel_label_get_type (void);
GtkWidget* gtk_accel_label_new (const gchar *string); GtkWidget* gtk_accel_label_new (const gchar *string);
void gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label, guint gtk_accel_label_accelerator_width (GtkAccelLabel *accel_label);
GtkWidget *accel_widget); void gtk_accel_label_set_accel_widget (GtkAccelLabel *accel_label,
gboolean gtk_accel_label_refetch (GtkAccelLabel *accel_label); GtkWidget *accel_widget);
gboolean gtk_accel_label_refetch (GtkAccelLabel *accel_label);
#ifdef __cplusplus #ifdef __cplusplus

View File

@ -567,7 +567,8 @@ gtk_menu_size_request (GtkWidget *widget,
GtkMenuShell *menu_shell; GtkMenuShell *menu_shell;
GtkWidget *child; GtkWidget *child;
GList *children; GList *children;
gint max_toggle_size; guint max_toggle_size;
guint max_accel_width;
g_return_if_fail (widget != NULL); g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_MENU (widget)); g_return_if_fail (GTK_IS_MENU (widget));
@ -580,6 +581,7 @@ gtk_menu_size_request (GtkWidget *widget,
requisition->height = 0; requisition->height = 0;
max_toggle_size = 0; max_toggle_size = 0;
max_accel_width = 0;
children = menu_shell->children; children = menu_shell->children;
while (children) while (children)
@ -596,10 +598,11 @@ gtk_menu_size_request (GtkWidget *widget,
requisition->height += child->requisition.height; requisition->height += child->requisition.height;
max_toggle_size = MAX (max_toggle_size, MENU_ITEM_CLASS (child)->toggle_size); max_toggle_size = MAX (max_toggle_size, MENU_ITEM_CLASS (child)->toggle_size);
max_accel_width = MAX (max_accel_width, GTK_MENU_ITEM (child)->accelerator_width);
} }
} }
requisition->width += max_toggle_size; requisition->width += max_toggle_size + max_accel_width;
requisition->width += (GTK_CONTAINER (menu)->border_width + requisition->width += (GTK_CONTAINER (menu)->border_width +
widget->style->klass->xthickness) * 2; widget->style->klass->xthickness) * 2;
requisition->height += (GTK_CONTAINER (menu)->border_width + requisition->height += (GTK_CONTAINER (menu)->border_width +
@ -821,16 +824,34 @@ gtk_menu_key_press (GtkWidget *widget,
TRUE); TRUE);
if (!delete && if (!delete &&
gtk_widget_accelerator_signal (GTK_WIDGET (menu_item), 0 == gtk_widget_accelerator_signal (GTK_WIDGET (menu_item),
accel_group, accel_group,
event->keyval, event->keyval,
event->state) == 0) event->state))
gtk_widget_add_accelerator (GTK_WIDGET (menu_item), {
gtk_signal_name (menu_item->accelerator_signal), GSList *slist;
accel_group,
event->keyval, slist = gtk_accel_group_entries_from_object (GTK_OBJECT (menu_item));
event->state, while (slist)
GTK_ACCEL_VISIBLE); {
GtkAccelEntry *ac_entry;
ac_entry = slist->data;
if (ac_entry->signal_id == menu_item->accelerator_signal)
break;
slist = slist->next;
}
if (!slist)
gtk_widget_add_accelerator (GTK_WIDGET (menu_item),
gtk_signal_name (menu_item->accelerator_signal),
accel_group,
event->keyval,
event->state,
GTK_ACCEL_VISIBLE);
}
} }
} }

View File

@ -135,6 +135,7 @@ gtk_menu_item_init (GtkMenuItem *menu_item)
menu_item->submenu = NULL; menu_item->submenu = NULL;
menu_item->accelerator_signal = menu_item_signals[ACTIVATE]; menu_item->accelerator_signal = menu_item_signals[ACTIVATE];
menu_item->toggle_size = 0; menu_item->toggle_size = 0;
menu_item->accelerator_width = 0;
menu_item->show_toggle_indicator = FALSE; menu_item->show_toggle_indicator = FALSE;
menu_item->show_submenu_indicator = FALSE; menu_item->show_submenu_indicator = FALSE;
menu_item->submenu_direction = GTK_DIRECTION_RIGHT; menu_item->submenu_direction = GTK_DIRECTION_RIGHT;
@ -270,6 +271,24 @@ gtk_menu_item_activate (GtkMenuItem *menu_item)
gtk_signal_emit (GTK_OBJECT (menu_item), menu_item_signals[ACTIVATE]); gtk_signal_emit (GTK_OBJECT (menu_item), menu_item_signals[ACTIVATE]);
} }
static void
gtk_menu_item_accel_width_foreach (GtkWidget *widget,
gpointer data)
{
guint *width = data;
if (GTK_IS_ACCEL_LABEL (widget))
{
guint w;
w = gtk_accel_label_accelerator_width (GTK_ACCEL_LABEL (widget));
*width = MAX (*width, w);
}
else if (GTK_IS_CONTAINER (widget))
gtk_container_foreach (GTK_CONTAINER (widget),
gtk_menu_item_accel_width_foreach,
data);
}
static void static void
gtk_menu_item_size_request (GtkWidget *widget, gtk_menu_item_size_request (GtkWidget *widget,
@ -277,6 +296,7 @@ gtk_menu_item_size_request (GtkWidget *widget,
{ {
GtkMenuItem *menu_item; GtkMenuItem *menu_item;
GtkBin *bin; GtkBin *bin;
guint accel_width;
g_return_if_fail (widget != NULL); g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_MENU_ITEM (widget)); g_return_if_fail (GTK_IS_MENU_ITEM (widget));
@ -298,8 +318,15 @@ gtk_menu_item_size_request (GtkWidget *widget,
requisition->width += bin->child->requisition.width; requisition->width += bin->child->requisition.width;
requisition->height += bin->child->requisition.height; requisition->height += bin->child->requisition.height;
} }
if (menu_item->submenu && menu_item->show_submenu_indicator) if (menu_item->submenu && menu_item->show_submenu_indicator)
requisition->width += 21; requisition->width += 21;
accel_width = 0;
gtk_container_foreach (GTK_CONTAINER (menu_item),
gtk_menu_item_accel_width_foreach,
&accel_width);
menu_item->accelerator_width = accel_width;
} }
static void static void

View File

@ -48,6 +48,7 @@ struct _GtkMenuItem
guint accelerator_signal; guint accelerator_signal;
guint16 toggle_size; guint16 toggle_size;
guint16 accelerator_width;
guint show_toggle_indicator : 1; guint show_toggle_indicator : 1;
guint show_submenu_indicator : 1; guint show_submenu_indicator : 1;

View File

@ -2998,10 +2998,7 @@ gtk_notebook_menu_item_create (GtkNotebook *notebook,
} }
gtk_widget_show (page->menu_label); gtk_widget_show (page->menu_label);
menu_item = gtk_menu_item_new (); menu_item = gtk_menu_item_new ();
gtk_signal_connect (GTK_OBJECT (menu_item), gtk_widget_freeze_accelerators (menu_item);
"add_accelerator",
GTK_SIGNAL_FUNC (gtk_widget_stop_accelerator),
NULL);
gtk_container_add (GTK_CONTAINER (menu_item), page->menu_label); gtk_container_add (GTK_CONTAINER (menu_item), page->menu_label);
gtk_menu_insert (GTK_MENU (notebook->menu), menu_item, position); gtk_menu_insert (GTK_MENU (notebook->menu), menu_item, position);
gtk_signal_connect (GTK_OBJECT (menu_item), "activate", gtk_signal_connect (GTK_OBJECT (menu_item), "activate",

View File

@ -1501,7 +1501,44 @@ gtk_signal_handler_pending (GtkObject *object,
while (handlers && handlers->signal_id == signal_id) while (handlers && handlers->signal_id == signal_id)
{ {
if (handlers->id > 0 && if (handlers->id > 0 &&
(may_be_blocked || handlers->blocked == 0)) (may_be_blocked || handlers->blocked == FALSE))
{
handler_id = handlers->id;
break;
}
handlers = handlers->next;
}
return handler_id;
}
guint
gtk_signal_handler_pending_by_func (GtkObject *object,
guint signal_id,
gboolean may_be_blocked,
GtkSignalFunc func,
gpointer data)
{
GtkHandler *handlers;
guint handler_id;
g_return_val_if_fail (object != NULL, 0);
g_return_val_if_fail (func != NULL, 0);
g_return_val_if_fail (signal_id >= 1, 0);
if (GTK_OBJECT_CONNECTED (object))
handlers = gtk_signal_get_handlers (object, signal_id);
else
return 0;
handler_id = 0;
while (handlers && handlers->signal_id == signal_id)
{
if (handlers->id > 0 &&
handlers->func == func &&
handlers->func_data == data &&
(may_be_blocked || handlers->blocked == FALSE))
{ {
handler_id = handlers->id; handler_id = handlers->id;
break; break;

View File

@ -165,6 +165,11 @@ void gtk_signal_handler_unblock_by_data (GtkObject *object,
guint gtk_signal_handler_pending (GtkObject *object, guint gtk_signal_handler_pending (GtkObject *object,
guint signal_id, guint signal_id,
gboolean may_be_blocked); gboolean may_be_blocked);
guint gtk_signal_handler_pending_by_func (GtkObject *object,
guint signal_id,
gboolean may_be_blocked,
GtkSignalFunc func,
gpointer data);
void gtk_signal_handlers_destroy (GtkObject *object); void gtk_signal_handlers_destroy (GtkObject *object);
void gtk_signal_default_marshaller (GtkObject *object, void gtk_signal_default_marshaller (GtkObject *object,
GtkSignalFunc func, GtkSignalFunc func,

View File

@ -300,7 +300,6 @@ static GtkEnumValue _gtk_private_flags_values[] = {
static GtkEnumValue _gtk_spin_button_update_policy_values[] = { static GtkEnumValue _gtk_spin_button_update_policy_values[] = {
{ GTK_UPDATE_ALWAYS, "GTK_UPDATE_ALWAYS", "always" }, { GTK_UPDATE_ALWAYS, "GTK_UPDATE_ALWAYS", "always" },
{ GTK_UPDATE_IF_VALID, "GTK_UPDATE_IF_VALID", "if-valid" }, { GTK_UPDATE_IF_VALID, "GTK_UPDATE_IF_VALID", "if-valid" },
{ GTK_UPDATE_SNAP_TO_TICKS, "GTK_UPDATE_SNAP_TO_TICKS", "snap-to-ticks" },
{ 0, NULL, NULL } { 0, NULL, NULL }
}; };
static GtkEnumValue _gtk_toolbar_child_type_values[] = { static GtkEnumValue _gtk_toolbar_child_type_values[] = {

View File

@ -85,7 +85,7 @@
{ "GtkPrivateFlags", &GTK_TYPE_PRIVATE_FLAGS, { "GtkPrivateFlags", &GTK_TYPE_PRIVATE_FLAGS,
GTK_TYPE_FLAGS, _gtk_private_flags_values }, GTK_TYPE_FLAGS, _gtk_private_flags_values },
{ "GtkSpinButtonUpdatePolicy", &GTK_TYPE_SPIN_BUTTON_UPDATE_POLICY, { "GtkSpinButtonUpdatePolicy", &GTK_TYPE_SPIN_BUTTON_UPDATE_POLICY,
GTK_TYPE_FLAGS, _gtk_spin_button_update_policy_values }, GTK_TYPE_ENUM, _gtk_spin_button_update_policy_values },
{ "GtkToolbarChildType", &GTK_TYPE_TOOLBAR_CHILD_TYPE, { "GtkToolbarChildType", &GTK_TYPE_TOOLBAR_CHILD_TYPE,
GTK_TYPE_ENUM, _gtk_toolbar_child_type_values }, GTK_TYPE_ENUM, _gtk_toolbar_child_type_values },
{ "GtkTreeViewMode", &GTK_TYPE_TREE_VIEW_MODE, { "GtkTreeViewMode", &GTK_TYPE_TREE_VIEW_MODE,

View File

@ -1847,6 +1847,68 @@ gtk_widget_size_allocate (GtkWidget *widget,
gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation); gtk_signal_emit (GTK_OBJECT (widget), widget_signals[SIZE_ALLOCATE], &real_allocation);
} }
static void
gtk_widget_stop_add_accelerator (GtkWidget *widget)
{
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
}
static void
gtk_widget_stop_remove_accelerator (GtkWidget *widget)
{
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[REMOVE_ACCELERATOR]);
}
void
gtk_widget_freeze_accelerators (GtkWidget *widget)
{
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
widget_signals[ADD_ACCELERATOR],
TRUE,
GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
NULL) == 0)
{
gtk_signal_connect (GTK_OBJECT (widget),
"add_accelerator",
GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
NULL);
gtk_signal_connect (GTK_OBJECT (widget),
"remove_accelerator",
GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
NULL);
}
}
void
gtk_widget_thaw_accelerators (GtkWidget *widget)
{
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
if (gtk_signal_handler_pending_by_func (GTK_OBJECT (widget),
widget_signals[ADD_ACCELERATOR],
TRUE,
GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
NULL) > 0)
{
gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
GTK_SIGNAL_FUNC (gtk_widget_stop_add_accelerator),
NULL);
gtk_signal_disconnect_by_func (GTK_OBJECT (widget),
GTK_SIGNAL_FUNC (gtk_widget_stop_remove_accelerator),
NULL);
}
}
void void
gtk_widget_add_accelerator (GtkWidget *widget, gtk_widget_add_accelerator (GtkWidget *widget,
const gchar *accel_signal, const gchar *accel_signal,
@ -1867,15 +1929,6 @@ gtk_widget_add_accelerator (GtkWidget *widget,
accel_signal); accel_signal);
} }
void
gtk_widget_stop_accelerator (GtkWidget *widget)
{
g_return_if_fail (widget != NULL);
g_return_if_fail (GTK_IS_WIDGET (widget));
gtk_signal_emit_stop (GTK_OBJECT (widget), widget_signals[ADD_ACCELERATOR]);
}
void void
gtk_widget_remove_accelerator (GtkWidget *widget, gtk_widget_remove_accelerator (GtkWidget *widget,
GtkAccelGroup *accel_group, GtkAccelGroup *accel_group,

View File

@ -403,7 +403,6 @@ void gtk_widget_add_accelerator (GtkWidget *widget,
guint accel_key, guint accel_key,
guint accel_mods, guint accel_mods,
GtkAccelFlags accel_flags); GtkAccelFlags accel_flags);
void gtk_widget_stop_accelerator (GtkWidget *widget);
void gtk_widget_remove_accelerator (GtkWidget *widget, void gtk_widget_remove_accelerator (GtkWidget *widget,
GtkAccelGroup *accel_group, GtkAccelGroup *accel_group,
guint accel_key, guint accel_key,
@ -415,6 +414,8 @@ guint gtk_widget_accelerator_signal (GtkWidget *widget,
GtkAccelGroup *accel_group, GtkAccelGroup *accel_group,
guint accel_key, guint accel_key,
guint accel_mods); guint accel_mods);
void gtk_widget_freeze_accelerators (GtkWidget *widget);
void gtk_widget_thaw_accelerators (GtkWidget *widget);
gint gtk_widget_event (GtkWidget *widget, gint gtk_widget_event (GtkWidget *widget,
GdkEvent *event); GdkEvent *event);

View File

@ -23,6 +23,7 @@
#include "gtk.h" #include "gtk.h"
#include "../gdk/gdk.h" #include "../gdk/gdk.h"
#include "../gdk/gdkx.h" #include "../gdk/gdkx.h"
#include "../gdk/gdkkeysyms.h"
#include "circles.xbm" #include "circles.xbm"
@ -2056,14 +2057,16 @@ create_menus (void)
GtkWidget *box1; GtkWidget *box1;
GtkWidget *box2; GtkWidget *box2;
GtkWidget *button; GtkWidget *button;
GtkWidget *menu;
GtkWidget *menubar;
GtkWidget *menuitem;
GtkWidget *optionmenu; GtkWidget *optionmenu;
GtkWidget *separator; GtkWidget *separator;
if (!window) if (!window)
{ {
GtkWidget *menubar;
GtkWidget *menu;
GtkWidget *menuitem;
GtkAccelGroup *accel_group;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_signal_connect (GTK_OBJECT (window), "destroy",
@ -2110,10 +2113,48 @@ create_menus (void)
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
gtk_widget_show (box2); gtk_widget_show (box2);
menu = create_menu (1);
accel_group = gtk_accel_group_get_default ();
gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F1,
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE);
menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F2,
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F2,
0,
GTK_ACCEL_VISIBLE);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F3,
0,
GTK_ACCEL_VISIBLE);
gtk_widget_freeze_accelerators (menuitem);
optionmenu = gtk_option_menu_new (); optionmenu = gtk_option_menu_new ();
gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), create_menu (1)); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 4); gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
gtk_widget_show (optionmenu); gtk_widget_show (optionmenu);

View File

@ -23,6 +23,7 @@
#include "gtk.h" #include "gtk.h"
#include "../gdk/gdk.h" #include "../gdk/gdk.h"
#include "../gdk/gdkx.h" #include "../gdk/gdkx.h"
#include "../gdk/gdkkeysyms.h"
#include "circles.xbm" #include "circles.xbm"
@ -2056,14 +2057,16 @@ create_menus (void)
GtkWidget *box1; GtkWidget *box1;
GtkWidget *box2; GtkWidget *box2;
GtkWidget *button; GtkWidget *button;
GtkWidget *menu;
GtkWidget *menubar;
GtkWidget *menuitem;
GtkWidget *optionmenu; GtkWidget *optionmenu;
GtkWidget *separator; GtkWidget *separator;
if (!window) if (!window)
{ {
GtkWidget *menubar;
GtkWidget *menu;
GtkWidget *menuitem;
GtkAccelGroup *accel_group;
window = gtk_window_new (GTK_WINDOW_TOPLEVEL); window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
gtk_signal_connect (GTK_OBJECT (window), "destroy", gtk_signal_connect (GTK_OBJECT (window), "destroy",
@ -2110,10 +2113,48 @@ create_menus (void)
gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box1), box2, TRUE, TRUE, 0);
gtk_widget_show (box2); gtk_widget_show (box2);
menu = create_menu (1);
accel_group = gtk_accel_group_get_default ();
gtk_menu_set_accel_group (GTK_MENU (menu), accel_group);
menuitem = gtk_check_menu_item_new_with_label ("Accelerate Me");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F1,
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_SIGNAL_VISIBLE);
menuitem = gtk_check_menu_item_new_with_label ("Accelerator Locked");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F2,
0,
GTK_ACCEL_VISIBLE | GTK_ACCEL_LOCKED);
menuitem = gtk_check_menu_item_new_with_label ("Accelerators Frozen");
gtk_menu_append (GTK_MENU (menu), menuitem);
gtk_widget_show (menuitem);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F2,
0,
GTK_ACCEL_VISIBLE);
gtk_widget_add_accelerator (menuitem,
"activate",
accel_group,
GDK_F3,
0,
GTK_ACCEL_VISIBLE);
gtk_widget_freeze_accelerators (menuitem);
optionmenu = gtk_option_menu_new (); optionmenu = gtk_option_menu_new ();
gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), create_menu (1)); gtk_option_menu_set_menu (GTK_OPTION_MENU (optionmenu), menu);
gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 4); gtk_option_menu_set_history (GTK_OPTION_MENU (optionmenu), 3);
gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0); gtk_box_pack_start (GTK_BOX (box2), optionmenu, TRUE, TRUE, 0);
gtk_widget_show (optionmenu); gtk_widget_show (optionmenu);