diff options
Diffstat (limited to 'gtk/gtkoptionmenu.c')
-rw-r--r-- | gtk/gtkoptionmenu.c | 48 |
1 files changed, 17 insertions, 31 deletions
diff --git a/gtk/gtkoptionmenu.c b/gtk/gtkoptionmenu.c index cca763d1a7..db1a4f4b6e 100644 --- a/gtk/gtkoptionmenu.c +++ b/gtk/gtkoptionmenu.c @@ -65,6 +65,7 @@ static void gtk_option_menu_calc_size (GtkOptionMenu *option_menu); static void gtk_option_menu_position (GtkMenu *menu, gint *x, gint *y, + gint *scroll_offet, gpointer user_data); static void gtk_option_menu_show_all (GtkWidget *widget); static void gtk_option_menu_hide_all (GtkWidget *widget); @@ -498,6 +499,7 @@ gtk_option_menu_button_press (GtkWidget *widget, GdkEventButton *event) { GtkOptionMenu *option_menu; + GtkWidget *menu_item; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); @@ -512,6 +514,9 @@ gtk_option_menu_button_press (GtkWidget *widget, gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL, gtk_option_menu_position, option_menu, event->button, event->time); + menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu)); + if (menu_item) + gtk_menu_shell_select_item (GTK_MENU_SHELL (option_menu->menu), menu_item); return TRUE; } @@ -523,6 +528,7 @@ gtk_option_menu_key_press (GtkWidget *widget, GdkEventKey *event) { GtkOptionMenu *option_menu; + GtkWidget *menu_item; g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE); @@ -537,6 +543,9 @@ gtk_option_menu_key_press (GtkWidget *widget, gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL, gtk_option_menu_position, option_menu, 0, event->time); + menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu)); + if (menu_item) + gtk_menu_shell_select_item (GTK_MENU_SHELL (option_menu->menu), menu_item); return TRUE; } @@ -650,6 +659,7 @@ static void gtk_option_menu_position (GtkMenu *menu, gint *x, gint *y, + gboolean *push_in, gpointer user_data) { GtkOptionMenu *option_menu; @@ -657,13 +667,10 @@ gtk_option_menu_position (GtkMenu *menu, GtkWidget *child; GtkRequisition requisition; GList *children; - gint shift_menu; gint screen_width; - gint screen_height; gint menu_xpos; gint menu_ypos; - gint width; - gint height; + gint menu_width; g_return_if_fail (user_data != NULL); g_return_if_fail (GTK_IS_OPTION_MENU (user_data)); @@ -671,11 +678,9 @@ gtk_option_menu_position (GtkMenu *menu, option_menu = GTK_OPTION_MENU (user_data); gtk_widget_get_child_requisition (GTK_WIDGET (menu), &requisition); - width = requisition.width; - height = requisition.height; + menu_width = requisition.width; active = gtk_menu_get_active (GTK_MENU (option_menu->menu)); - children = GTK_MENU_SHELL (option_menu->menu)->children; gdk_window_get_origin (GTK_WIDGET (option_menu)->window, &menu_xpos, &menu_ypos); menu_ypos += GTK_WIDGET (option_menu)->allocation.height / 2 - 2; @@ -686,6 +691,7 @@ gtk_option_menu_position (GtkMenu *menu, menu_ypos -= requisition.height / 2; } + children = GTK_MENU_SHELL (option_menu->menu)->children; while (children) { child = children->data; @@ -703,35 +709,15 @@ gtk_option_menu_position (GtkMenu *menu, } screen_width = gdk_screen_width (); - screen_height = gdk_screen_height (); - - shift_menu = FALSE; - if (menu_ypos < 0) - { - menu_ypos = 0; - shift_menu = TRUE; - } - else if ((menu_ypos + height) > screen_height) - { - menu_ypos -= ((menu_ypos + height) - screen_height); - shift_menu = TRUE; - } - - if (shift_menu) - { - if ((menu_xpos + GTK_WIDGET (option_menu)->allocation.width + width) <= screen_width) - menu_xpos += GTK_WIDGET (option_menu)->allocation.width; - else - menu_xpos -= width; - } - + if (menu_xpos < 0) menu_xpos = 0; - else if ((menu_xpos + width) > screen_width) - menu_xpos -= ((menu_xpos + width) - screen_width); + else if ((menu_xpos + menu_width) > screen_width) + menu_xpos -= ((menu_xpos + menu_width) - screen_width); *x = menu_xpos; *y = menu_ypos; + *push_in = TRUE; } |