1 /* GTK - The GIMP Toolkit
2 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the
16 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17 * Boston, MA 02111-1307, USA.
21 * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS
22 * file for a list of people on the GTK+ Team. See the ChangeLog
23 * files for a list of changes. These files are distributed with
24 * GTK+ at ftp://ftp.gtk.org/pub/gtk/.
28 #include "gtkmenuitem.h"
29 #include "gtkoptionmenu.h"
30 #include "gtksignal.h"
31 #include "gdk/gdkkeysyms.h"
34 #define CHILD_LEFT_SPACING 5
35 #define CHILD_RIGHT_SPACING 1
36 #define CHILD_TOP_SPACING 1
37 #define CHILD_BOTTOM_SPACING 1
38 #define OPTION_INDICATOR_WIDTH 12
39 #define OPTION_INDICATOR_HEIGHT 8
40 #define OPTION_INDICATOR_SPACING 2
43 static void gtk_option_menu_class_init (GtkOptionMenuClass *klass);
44 static void gtk_option_menu_init (GtkOptionMenu *option_menu);
45 static void gtk_option_menu_destroy (GtkObject *object);
46 static void gtk_option_menu_size_request (GtkWidget *widget,
47 GtkRequisition *requisition);
48 static void gtk_option_menu_size_allocate (GtkWidget *widget,
49 GtkAllocation *allocation);
50 static void gtk_option_menu_paint (GtkWidget *widget,
52 static gint gtk_option_menu_expose (GtkWidget *widget,
53 GdkEventExpose *event);
54 static gint gtk_option_menu_button_press (GtkWidget *widget,
55 GdkEventButton *event);
56 static gint gtk_option_menu_key_press (GtkWidget *widget,
58 static void gtk_option_menu_deactivate (GtkMenuShell *menu_shell,
59 GtkOptionMenu *option_menu);
60 static void gtk_option_menu_update_contents (GtkOptionMenu *option_menu);
61 static void gtk_option_menu_remove_contents (GtkOptionMenu *option_menu);
62 static void gtk_option_menu_calc_size (GtkOptionMenu *option_menu);
63 static void gtk_option_menu_position (GtkMenu *menu,
68 static void gtk_option_menu_show_all (GtkWidget *widget);
69 static void gtk_option_menu_hide_all (GtkWidget *widget);
70 static GtkType gtk_option_menu_child_type (GtkContainer *container);
78 static GtkButtonClass *parent_class = NULL;
79 static guint signals[LAST_SIGNAL] = { 0 };
83 gtk_option_menu_get_type (void)
85 static GtkType option_menu_type = 0;
87 if (!option_menu_type)
89 static const GtkTypeInfo option_menu_info =
92 sizeof (GtkOptionMenu),
93 sizeof (GtkOptionMenuClass),
94 (GtkClassInitFunc) gtk_option_menu_class_init,
95 (GtkObjectInitFunc) gtk_option_menu_init,
96 /* reserved_1 */ NULL,
97 /* reserved_2 */ NULL,
98 (GtkClassInitFunc) NULL,
101 option_menu_type = gtk_type_unique (gtk_button_get_type (), &option_menu_info);
104 return option_menu_type;
108 gtk_option_menu_class_init (GtkOptionMenuClass *class)
110 GtkObjectClass *object_class;
111 GtkWidgetClass *widget_class;
112 GtkButtonClass *button_class;
113 GtkContainerClass *container_class;
115 object_class = (GtkObjectClass*) class;
116 widget_class = (GtkWidgetClass*) class;
117 button_class = (GtkButtonClass*) class;
118 container_class = (GtkContainerClass*) class;
120 parent_class = gtk_type_class (gtk_button_get_type ());
123 g_signal_newc ("changed",
124 G_TYPE_FROM_CLASS (class),
126 G_STRUCT_OFFSET (GtkOptionMenuClass, changed),
128 gtk_marshal_VOID__VOID,
131 object_class->destroy = gtk_option_menu_destroy;
133 widget_class->size_request = gtk_option_menu_size_request;
134 widget_class->size_allocate = gtk_option_menu_size_allocate;
135 widget_class->expose_event = gtk_option_menu_expose;
136 widget_class->button_press_event = gtk_option_menu_button_press;
137 widget_class->key_press_event = gtk_option_menu_key_press;
138 widget_class->show_all = gtk_option_menu_show_all;
139 widget_class->hide_all = gtk_option_menu_hide_all;
141 container_class->child_type = gtk_option_menu_child_type;
145 gtk_option_menu_child_type (GtkContainer *container)
147 return GTK_TYPE_NONE;
151 gtk_option_menu_init (GtkOptionMenu *option_menu)
153 GTK_WIDGET_SET_FLAGS (option_menu, GTK_CAN_FOCUS);
154 GTK_WIDGET_UNSET_FLAGS (option_menu, GTK_CAN_DEFAULT | GTK_RECEIVES_DEFAULT);
156 option_menu->menu = NULL;
157 option_menu->menu_item = NULL;
158 option_menu->width = 0;
159 option_menu->height = 0;
163 gtk_option_menu_new (void)
165 return GTK_WIDGET (gtk_type_new (gtk_option_menu_get_type ()));
169 gtk_option_menu_get_menu (GtkOptionMenu *option_menu)
171 g_return_val_if_fail (option_menu != NULL, NULL);
172 g_return_val_if_fail (GTK_IS_OPTION_MENU (option_menu), NULL);
174 return option_menu->menu;
178 gtk_option_menu_detacher (GtkWidget *widget,
181 GtkOptionMenu *option_menu;
183 g_return_if_fail (widget != NULL);
184 g_return_if_fail (GTK_IS_OPTION_MENU (widget));
186 option_menu = GTK_OPTION_MENU (widget);
187 g_return_if_fail (option_menu->menu == (GtkWidget*) menu);
189 gtk_option_menu_remove_contents (option_menu);
190 gtk_signal_disconnect_by_data (GTK_OBJECT (option_menu->menu),
193 option_menu->menu = NULL;
197 gtk_option_menu_set_menu (GtkOptionMenu *option_menu,
200 g_return_if_fail (option_menu != NULL);
201 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
202 g_return_if_fail (menu != NULL);
203 g_return_if_fail (GTK_IS_MENU (menu));
205 if (option_menu->menu != menu)
207 gtk_option_menu_remove_menu (option_menu);
209 option_menu->menu = menu;
210 gtk_menu_attach_to_widget (GTK_MENU (menu),
211 GTK_WIDGET (option_menu),
212 gtk_option_menu_detacher);
214 gtk_option_menu_calc_size (option_menu);
216 gtk_signal_connect (GTK_OBJECT (option_menu->menu), "deactivate",
217 (GtkSignalFunc) gtk_option_menu_deactivate,
219 gtk_signal_connect_object (GTK_OBJECT (option_menu->menu), "size_request",
220 (GtkSignalFunc) gtk_option_menu_calc_size,
221 GTK_OBJECT (option_menu));
223 if (GTK_WIDGET (option_menu)->parent)
224 gtk_widget_queue_resize (GTK_WIDGET (option_menu));
226 gtk_option_menu_update_contents (option_menu);
231 gtk_option_menu_remove_menu (GtkOptionMenu *option_menu)
233 g_return_if_fail (option_menu != NULL);
234 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
236 if (option_menu->menu)
237 gtk_menu_detach (GTK_MENU (option_menu->menu));
241 gtk_option_menu_set_history (GtkOptionMenu *option_menu,
244 GtkWidget *menu_item;
246 g_return_if_fail (option_menu != NULL);
247 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
249 if (option_menu->menu)
251 gtk_menu_set_active (GTK_MENU (option_menu->menu), index);
252 menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu));
254 if (menu_item != option_menu->menu_item)
255 gtk_option_menu_update_contents (option_menu);
260 * gtk_option_menu_get_history:
261 * @option_menu: a #GtkOptionMenu
263 * Retrieves the index of the currently selected menu item. The menu
264 * items are numbered from top to bottom, starting with 0.
266 * Return value: index of the selected menu item, or -1 if there are no menu items
269 gtk_option_menu_get_history (GtkOptionMenu *option_menu)
271 GtkWidget *active_widget;
273 g_return_val_if_fail (GTK_IS_OPTION_MENU (option_menu), -1);
275 if (option_menu->menu)
277 active_widget = gtk_menu_get_active (GTK_MENU (option_menu->menu));
280 return g_list_index (GTK_MENU_SHELL (option_menu->menu)->children,
290 gtk_option_menu_destroy (GtkObject *object)
292 GtkOptionMenu *option_menu;
294 g_return_if_fail (object != NULL);
295 g_return_if_fail (GTK_IS_OPTION_MENU (object));
297 option_menu = GTK_OPTION_MENU (object);
299 if (option_menu->menu)
300 gtk_widget_destroy (option_menu->menu);
302 if (GTK_OBJECT_CLASS (parent_class)->destroy)
303 (* GTK_OBJECT_CLASS (parent_class)->destroy) (object);
307 gtk_option_menu_size_request (GtkWidget *widget,
308 GtkRequisition *requisition)
310 GtkOptionMenu *option_menu;
312 GtkRequisition child_requisition = { 0, 0 };
315 g_return_if_fail (widget != NULL);
316 g_return_if_fail (GTK_IS_OPTION_MENU (widget));
317 g_return_if_fail (requisition != NULL);
319 option_menu = GTK_OPTION_MENU (widget);
321 if (GTK_BIN (option_menu)->child && GTK_WIDGET_VISIBLE (GTK_BIN (option_menu)->child))
323 gtk_widget_size_request (GTK_BIN (option_menu)->child, &child_requisition);
325 requisition->width += child_requisition.width;
326 requisition->height += child_requisition.height;
329 requisition->width = ((GTK_CONTAINER (widget)->border_width +
330 GTK_WIDGET (widget)->style->xthickness) * 2 +
331 MAX (child_requisition.width, option_menu->width) +
332 OPTION_INDICATOR_WIDTH +
333 OPTION_INDICATOR_SPACING * 5 +
334 CHILD_LEFT_SPACING + CHILD_RIGHT_SPACING + 2);
335 requisition->height = ((GTK_CONTAINER (widget)->border_width +
336 GTK_WIDGET (widget)->style->ythickness) * 2 +
337 MAX (child_requisition.height, option_menu->height) +
338 CHILD_TOP_SPACING + CHILD_BOTTOM_SPACING + 2);
340 tmp = (requisition->height - option_menu->height +
341 OPTION_INDICATOR_HEIGHT + OPTION_INDICATOR_SPACING * 2);
342 requisition->height = MAX (requisition->height, tmp);
346 gtk_option_menu_size_allocate (GtkWidget *widget,
347 GtkAllocation *allocation)
350 GtkAllocation child_allocation;
352 g_return_if_fail (widget != NULL);
353 g_return_if_fail (GTK_IS_OPTION_MENU (widget));
354 g_return_if_fail (allocation != NULL);
356 widget->allocation = *allocation;
357 if (GTK_WIDGET_REALIZED (widget))
358 gdk_window_move_resize (widget->window,
359 allocation->x, allocation->y,
360 allocation->width, allocation->height);
362 child = GTK_BIN (widget)->child;
363 if (child && GTK_WIDGET_VISIBLE (child))
365 child_allocation.x = (GTK_CONTAINER (widget)->border_width +
366 GTK_WIDGET (widget)->style->xthickness) + 1;
367 child_allocation.y = (GTK_CONTAINER (widget)->border_width +
368 GTK_WIDGET (widget)->style->ythickness) + 1;
369 child_allocation.width = MAX (1, (gint)allocation->width - child_allocation.x * 2 -
370 OPTION_INDICATOR_WIDTH - OPTION_INDICATOR_SPACING * 5 -
371 CHILD_LEFT_SPACING - CHILD_RIGHT_SPACING - 2);
372 child_allocation.height = MAX (1, (gint)allocation->height - child_allocation.y * 2 -
373 CHILD_TOP_SPACING - CHILD_BOTTOM_SPACING - 2);
374 child_allocation.x += CHILD_LEFT_SPACING;
375 child_allocation.y += CHILD_RIGHT_SPACING;
377 gtk_widget_size_allocate (child, &child_allocation);
382 gtk_option_menu_paint (GtkWidget *widget,
385 GdkRectangle button_area;
387 g_return_if_fail (widget != NULL);
388 g_return_if_fail (GTK_IS_OPTION_MENU (widget));
389 g_return_if_fail (area != NULL);
391 if (GTK_WIDGET_DRAWABLE (widget))
393 button_area.x = GTK_CONTAINER (widget)->border_width + 1;
394 button_area.y = GTK_CONTAINER (widget)->border_width + 1;
395 button_area.width = widget->allocation.width - button_area.x * 2;
396 button_area.height = widget->allocation.height - button_area.y * 2;
398 /* This is evil, and should be elimated here and in the button
399 * code. The point is to clear the focus, and make it
400 * sort of transparent if it isn't there.
402 gdk_window_set_back_pixmap (widget->window, NULL, TRUE);
403 gdk_window_clear_area (widget->window, area->x, area->y, area->width, area->height);
405 gtk_paint_box(widget->style, widget->window,
406 GTK_WIDGET_STATE (widget), GTK_SHADOW_OUT,
407 area, widget, "optionmenu",
408 button_area.x, button_area.y,
409 button_area.width, button_area.height);
411 gtk_paint_tab (widget->style, widget->window,
412 GTK_WIDGET_STATE (widget), GTK_SHADOW_OUT,
413 area, widget, "optionmenutab",
414 button_area.x + button_area.width - button_area.x -
415 OPTION_INDICATOR_WIDTH - OPTION_INDICATOR_SPACING * 4,
416 button_area.y + (button_area.height - OPTION_INDICATOR_HEIGHT) / 2,
417 OPTION_INDICATOR_WIDTH, OPTION_INDICATOR_HEIGHT);
419 if (GTK_WIDGET_HAS_FOCUS (widget))
420 gtk_paint_focus (widget->style, widget->window,
421 area, widget, "button",
424 button_area.width + 1,
425 button_area.height + 1);
430 gtk_option_menu_expose (GtkWidget *widget,
431 GdkEventExpose *event)
434 GdkEventExpose child_event;
437 g_return_val_if_fail (widget != NULL, FALSE);
438 g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE);
439 g_return_val_if_fail (event != NULL, FALSE);
441 if (GTK_WIDGET_DRAWABLE (widget))
443 gtk_option_menu_paint (widget, &event->area);
446 /* The following code tries to draw the child in two places at
447 * once. It fails miserably for several reasons
449 * - If the child is not no-window, removing generates
450 * more expose events. Bad, bad, bad.
452 * - Even if the child is no-window, removing it now (properly)
453 * clears the space where it was, so it does no good
457 remove_child = FALSE;
458 child = GTK_BUTTON (widget)->child;
462 if (!GTK_OPTION_MENU (widget)->menu)
464 gtk_option_menu_update_contents (GTK_OPTION_MENU (widget));
465 child = GTK_BUTTON (widget)->child;
471 child_event = *event;
473 if (GTK_WIDGET_NO_WINDOW (child) &&
474 gtk_widget_intersect (child, &event->area, &child_event.area))
475 gtk_widget_event (child, (GdkEvent*) &child_event);
478 gtk_option_menu_remove_contents (GTK_OPTION_MENU (widget));
480 remove_child = FALSE;
481 child = GTK_BIN (widget)->child;
482 child_event = *event;
483 if (child && GTK_WIDGET_NO_WINDOW (child) &&
484 gtk_widget_intersect (child, &event->area, &child_event.area))
485 gtk_widget_event (child, (GdkEvent*) &child_event);
494 gtk_option_menu_button_press (GtkWidget *widget,
495 GdkEventButton *event)
497 GtkOptionMenu *option_menu;
498 GtkWidget *menu_item;
500 g_return_val_if_fail (widget != NULL, FALSE);
501 g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE);
502 g_return_val_if_fail (event != NULL, FALSE);
504 option_menu = GTK_OPTION_MENU (widget);
506 if ((event->type == GDK_BUTTON_PRESS) &&
507 (event->button == 1))
509 gtk_option_menu_remove_contents (option_menu);
510 gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL,
511 gtk_option_menu_position, option_menu,
512 event->button, event->time);
513 menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu));
515 gtk_menu_shell_select_item (GTK_MENU_SHELL (option_menu->menu), menu_item);
523 gtk_option_menu_key_press (GtkWidget *widget,
526 GtkOptionMenu *option_menu;
527 GtkWidget *menu_item;
529 g_return_val_if_fail (widget != NULL, FALSE);
530 g_return_val_if_fail (GTK_IS_OPTION_MENU (widget), FALSE);
531 g_return_val_if_fail (event != NULL, FALSE);
533 option_menu = GTK_OPTION_MENU (widget);
535 switch (event->keyval)
538 gtk_option_menu_remove_contents (option_menu);
539 gtk_menu_popup (GTK_MENU (option_menu->menu), NULL, NULL,
540 gtk_option_menu_position, option_menu,
542 menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu));
544 gtk_menu_shell_select_item (GTK_MENU_SHELL (option_menu->menu), menu_item);
552 gtk_option_menu_deactivate (GtkMenuShell *menu_shell,
553 GtkOptionMenu *option_menu)
555 g_return_if_fail (menu_shell != NULL);
556 g_return_if_fail (option_menu != NULL);
557 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
559 gtk_option_menu_update_contents (option_menu);
563 gtk_option_menu_changed (GtkOptionMenu *option_menu)
565 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
567 g_signal_emit (G_OBJECT (option_menu), signals[CHANGED], 0);
571 gtk_option_menu_select_first_sensitive (GtkOptionMenu *option_menu)
573 if (option_menu->menu)
575 GList *children = GTK_MENU_SHELL (option_menu->menu)->children;
580 if (GTK_WIDGET_SENSITIVE (children->data))
582 gtk_option_menu_set_history (option_menu, index);
586 children = children->next;
593 gtk_option_menu_item_state_changed_cb (GtkWidget *widget,
594 GtkStateType previous_state,
595 GtkOptionMenu *option_menu)
597 GtkWidget *child = GTK_BIN (option_menu)->child;
599 if (child && GTK_WIDGET_SENSITIVE (child) != GTK_WIDGET_IS_SENSITIVE (widget))
600 gtk_widget_set_sensitive (child, GTK_WIDGET_IS_SENSITIVE (widget));
604 gtk_option_menu_item_destroy_cb (GtkWidget *widget,
605 GtkOptionMenu *option_menu)
607 GtkWidget *child = GTK_BIN (option_menu)->child;
611 gtk_widget_ref (child);
612 gtk_option_menu_remove_contents (option_menu);
613 gtk_widget_destroy (child);
614 gtk_widget_unref (child);
616 gtk_option_menu_select_first_sensitive (option_menu);
621 gtk_option_menu_update_contents (GtkOptionMenu *option_menu)
624 GtkRequisition child_requisition;
626 g_return_if_fail (option_menu != NULL);
627 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
629 if (option_menu->menu)
631 GtkWidget *old_item = option_menu->menu_item;
633 gtk_option_menu_remove_contents (option_menu);
635 option_menu->menu_item = gtk_menu_get_active (GTK_MENU (option_menu->menu));
636 if (option_menu->menu_item)
638 gtk_widget_ref (option_menu->menu_item);
639 child = GTK_BIN (option_menu->menu_item)->child;
642 if (!GTK_WIDGET_IS_SENSITIVE (option_menu->menu_item))
643 gtk_widget_set_sensitive (child, FALSE);
644 gtk_widget_reparent (child, GTK_WIDGET (option_menu));
647 gtk_signal_connect (GTK_OBJECT (option_menu->menu_item), "state_changed",
648 GTK_SIGNAL_FUNC (gtk_option_menu_item_state_changed_cb), option_menu);
649 gtk_signal_connect (GTK_OBJECT (option_menu->menu_item), "destroy",
650 GTK_SIGNAL_FUNC (gtk_option_menu_item_destroy_cb), option_menu);
652 gtk_widget_size_request (child, &child_requisition);
653 gtk_widget_size_allocate (GTK_WIDGET (option_menu),
654 &(GTK_WIDGET (option_menu)->allocation));
656 if (GTK_WIDGET_DRAWABLE (option_menu))
657 gtk_widget_queue_draw (GTK_WIDGET (option_menu));
660 if (old_item != option_menu->menu_item)
661 gtk_option_menu_changed (option_menu);
666 gtk_option_menu_remove_contents (GtkOptionMenu *option_menu)
670 g_return_if_fail (option_menu != NULL);
671 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
673 if (option_menu->menu_item)
675 child = GTK_BIN (option_menu)->child;
679 gtk_widget_set_sensitive (child, TRUE);
680 gtk_widget_reparent (child, option_menu->menu_item);
683 gtk_signal_disconnect_by_func (GTK_OBJECT (option_menu->menu_item),
684 GTK_SIGNAL_FUNC (gtk_option_menu_item_state_changed_cb),
686 gtk_signal_disconnect_by_func (GTK_OBJECT (option_menu->menu_item),
687 GTK_SIGNAL_FUNC (gtk_option_menu_item_destroy_cb),
690 gtk_widget_unref (option_menu->menu_item);
691 option_menu->menu_item = NULL;
696 gtk_option_menu_calc_size (GtkOptionMenu *option_menu)
700 GtkRequisition child_requisition;
701 gint old_width = option_menu->width;
702 gint old_height = option_menu->height;
704 g_return_if_fail (option_menu != NULL);
705 g_return_if_fail (GTK_IS_OPTION_MENU (option_menu));
707 option_menu->width = 0;
708 option_menu->height = 0;
710 if (option_menu->menu)
712 children = GTK_MENU_SHELL (option_menu->menu)->children;
715 child = children->data;
716 children = children->next;
718 if (GTK_WIDGET_VISIBLE (child))
720 gtk_widget_size_request (child, &child_requisition);
722 option_menu->width = MAX (option_menu->width, child_requisition.width);
723 option_menu->height = MAX (option_menu->height, child_requisition.height);
728 if (old_width != option_menu->width || old_height != option_menu->height)
729 gtk_widget_queue_resize (GTK_WIDGET (option_menu));
733 gtk_option_menu_position (GtkMenu *menu,
739 GtkOptionMenu *option_menu;
742 GtkRequisition requisition;
749 g_return_if_fail (user_data != NULL);
750 g_return_if_fail (GTK_IS_OPTION_MENU (user_data));
752 option_menu = GTK_OPTION_MENU (user_data);
754 gtk_widget_get_child_requisition (GTK_WIDGET (menu), &requisition);
755 menu_width = requisition.width;
757 active = gtk_menu_get_active (GTK_MENU (option_menu->menu));
758 gdk_window_get_origin (GTK_WIDGET (option_menu)->window, &menu_xpos, &menu_ypos);
760 menu_ypos += GTK_WIDGET (option_menu)->allocation.height / 2 - 2;
764 gtk_widget_get_child_requisition (active, &requisition);
765 menu_ypos -= requisition.height / 2;
768 children = GTK_MENU_SHELL (option_menu->menu)->children;
771 child = children->data;
776 if (GTK_WIDGET_VISIBLE (child))
778 gtk_widget_get_child_requisition (child, &requisition);
779 menu_ypos -= requisition.height;
782 children = children->next;
785 screen_width = gdk_screen_width ();
789 else if ((menu_xpos + menu_width) > screen_width)
790 menu_xpos -= ((menu_xpos + menu_width) - screen_width);
799 gtk_option_menu_show_all (GtkWidget *widget)
801 GtkContainer *container;
802 GtkOptionMenu *option_menu;
804 g_return_if_fail (widget != NULL);
805 g_return_if_fail (GTK_IS_OPTION_MENU (widget));
806 container = GTK_CONTAINER (widget);
807 option_menu = GTK_OPTION_MENU (widget);
809 gtk_widget_show (widget);
810 gtk_container_foreach (container, (GtkCallback) gtk_widget_show_all, NULL);
811 if (option_menu->menu)
812 gtk_widget_show_all (option_menu->menu);
813 if (option_menu->menu_item)
814 gtk_widget_show_all (option_menu->menu_item);
819 gtk_option_menu_hide_all (GtkWidget *widget)
821 GtkContainer *container;
823 g_return_if_fail (widget != NULL);
824 g_return_if_fail (GTK_IS_OPTION_MENU (widget));
825 container = GTK_CONTAINER (widget);
827 gtk_widget_hide (widget);
828 gtk_container_foreach (container, (GtkCallback) gtk_widget_hide_all, NULL);