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/.
30 #include "gtkbindings.h"
31 #include "gtksignal.h"
32 #include "gdk/gdkkeysyms.h"
33 #include "gtkwindow.h"
35 #include "gtkmarshalers.h"
36 #include "gtkprivate.h"
63 static void gtk_paned_class_init (GtkPanedClass *klass);
64 static void gtk_paned_init (GtkPaned *paned);
65 static void gtk_paned_set_property (GObject *object,
69 static void gtk_paned_get_property (GObject *object,
73 static void gtk_paned_set_child_property (GtkContainer *container,
78 static void gtk_paned_get_child_property (GtkContainer *container,
83 static void gtk_paned_finalize (GObject *object);
84 static void gtk_paned_realize (GtkWidget *widget);
85 static void gtk_paned_unrealize (GtkWidget *widget);
86 static void gtk_paned_map (GtkWidget *widget);
87 static void gtk_paned_unmap (GtkWidget *widget);
88 static gboolean gtk_paned_expose (GtkWidget *widget,
89 GdkEventExpose *event);
90 static gboolean gtk_paned_enter (GtkWidget *widget,
91 GdkEventCrossing *event);
92 static gboolean gtk_paned_leave (GtkWidget *widget,
93 GdkEventCrossing *event);
94 static gboolean gtk_paned_button_press (GtkWidget *widget,
95 GdkEventButton *event);
96 static gboolean gtk_paned_button_release (GtkWidget *widget,
97 GdkEventButton *event);
98 static gboolean gtk_paned_motion (GtkWidget *widget,
99 GdkEventMotion *event);
100 static gboolean gtk_paned_focus (GtkWidget *widget,
101 GtkDirectionType direction);
102 static gboolean gtk_paned_grab_broken (GtkWidget *widget,
103 GdkEventGrabBroken *event);
104 static void gtk_paned_add (GtkContainer *container,
106 static void gtk_paned_remove (GtkContainer *container,
108 static void gtk_paned_forall (GtkContainer *container,
109 gboolean include_internals,
110 GtkCallback callback,
111 gpointer callback_data);
112 static void gtk_paned_set_focus_child (GtkContainer *container,
114 static void gtk_paned_set_saved_focus (GtkPaned *paned,
116 static void gtk_paned_set_first_paned (GtkPaned *paned,
117 GtkPaned *first_paned);
118 static void gtk_paned_set_last_child1_focus (GtkPaned *paned,
120 static void gtk_paned_set_last_child2_focus (GtkPaned *paned,
122 static gboolean gtk_paned_cycle_child_focus (GtkPaned *paned,
124 static gboolean gtk_paned_cycle_handle_focus (GtkPaned *paned,
126 static gboolean gtk_paned_move_handle (GtkPaned *paned,
127 GtkScrollType scroll);
128 static gboolean gtk_paned_accept_position (GtkPaned *paned);
129 static gboolean gtk_paned_cancel_position (GtkPaned *paned);
130 static gboolean gtk_paned_toggle_handle_focus (GtkPaned *paned);
132 static GType gtk_paned_child_type (GtkContainer *container);
134 static GtkContainerClass *parent_class = NULL;
136 struct _GtkPanedPrivate
138 GtkWidget *saved_focus;
139 GtkPaned *first_paned;
144 gtk_paned_get_type (void)
146 static GType paned_type = 0;
150 static const GTypeInfo paned_info =
152 sizeof (GtkPanedClass),
153 NULL, /* base_init */
154 NULL, /* base_finalize */
155 (GClassInitFunc) gtk_paned_class_init,
156 NULL, /* class_finalize */
157 NULL, /* class_data */
160 (GInstanceInitFunc) gtk_paned_init,
161 NULL, /* value_table */
164 paned_type = g_type_register_static (GTK_TYPE_CONTAINER, "GtkPaned",
165 &paned_info, G_TYPE_FLAG_ABSTRACT);
171 static guint signals[LAST_SIGNAL] = { 0 };
174 add_tab_bindings (GtkBindingSet *binding_set,
175 GdkModifierType modifiers)
177 gtk_binding_entry_add_signal (binding_set, GDK_Tab, modifiers,
178 "toggle_handle_focus", 0);
179 gtk_binding_entry_add_signal (binding_set, GDK_KP_Tab, modifiers,
180 "toggle_handle_focus", 0);
184 add_move_binding (GtkBindingSet *binding_set,
186 GdkModifierType mask,
187 GtkScrollType scroll)
189 gtk_binding_entry_add_signal (binding_set, keyval, mask,
191 GTK_TYPE_SCROLL_TYPE, scroll);
195 gtk_paned_class_init (GtkPanedClass *class)
197 GObjectClass *object_class;
198 GtkWidgetClass *widget_class;
199 GtkContainerClass *container_class;
200 GtkPanedClass *paned_class;
201 GtkBindingSet *binding_set;
203 object_class = (GObjectClass *) class;
204 widget_class = (GtkWidgetClass *) class;
205 container_class = (GtkContainerClass *) class;
206 paned_class = (GtkPanedClass *) class;
208 parent_class = g_type_class_peek_parent (class);
210 object_class->set_property = gtk_paned_set_property;
211 object_class->get_property = gtk_paned_get_property;
212 object_class->finalize = gtk_paned_finalize;
214 widget_class->realize = gtk_paned_realize;
215 widget_class->unrealize = gtk_paned_unrealize;
216 widget_class->map = gtk_paned_map;
217 widget_class->unmap = gtk_paned_unmap;
218 widget_class->expose_event = gtk_paned_expose;
219 widget_class->focus = gtk_paned_focus;
220 widget_class->enter_notify_event = gtk_paned_enter;
221 widget_class->leave_notify_event = gtk_paned_leave;
222 widget_class->button_press_event = gtk_paned_button_press;
223 widget_class->button_release_event = gtk_paned_button_release;
224 widget_class->motion_notify_event = gtk_paned_motion;
225 widget_class->grab_broken_event = gtk_paned_grab_broken;
227 container_class->add = gtk_paned_add;
228 container_class->remove = gtk_paned_remove;
229 container_class->forall = gtk_paned_forall;
230 container_class->child_type = gtk_paned_child_type;
231 container_class->set_focus_child = gtk_paned_set_focus_child;
232 container_class->set_child_property = gtk_paned_set_child_property;
233 container_class->get_child_property = gtk_paned_get_child_property;
235 paned_class->cycle_child_focus = gtk_paned_cycle_child_focus;
236 paned_class->toggle_handle_focus = gtk_paned_toggle_handle_focus;
237 paned_class->move_handle = gtk_paned_move_handle;
238 paned_class->cycle_handle_focus = gtk_paned_cycle_handle_focus;
239 paned_class->accept_position = gtk_paned_accept_position;
240 paned_class->cancel_position = gtk_paned_cancel_position;
242 g_object_class_install_property (object_class,
244 g_param_spec_int ("position",
246 P_("Position of paned separator in pixels (0 means all the way to the left/top)"),
250 GTK_PARAM_READWRITE));
251 g_object_class_install_property (object_class,
253 g_param_spec_boolean ("position-set",
255 P_("TRUE if the Position property should be used"),
257 GTK_PARAM_READWRITE));
259 gtk_widget_class_install_style_property (widget_class,
260 g_param_spec_int ("handle-size",
262 P_("Width of handle"),
266 GTK_PARAM_READABLE));
268 * GtkPaned:min-position:
270 * The smallest possible value for the position property. This property is derived from the
271 * size and shrinkability of the widget's children.
275 g_object_class_install_property (object_class,
277 g_param_spec_int ("min-position",
278 P_("Minimal Position"),
279 P_("Smallest possible value for the \"position\" property"),
283 GTK_PARAM_READABLE));
286 * GtkPaned:max-position:
288 * The largest possible value for the position property. This property is derived from the
289 * size and shrinkability of the widget's children.
293 g_object_class_install_property (object_class,
295 g_param_spec_int ("max-position",
296 P_("Maximal Position"),
297 P_("Largest possible value for the \"position\" property"),
301 GTK_PARAM_READABLE));
306 * The "resize" child property determines whether the child expands and
307 * shrinks along with the paned widget.
311 gtk_container_class_install_child_property (container_class,
313 g_param_spec_boolean ("resize",
315 P_("If TRUE, the child expands and shrinks along with the paned widget"),
317 GTK_PARAM_READWRITE));
322 * The "shrink" child property determines whether the child can be made
323 * smaller than its requisition.
327 gtk_container_class_install_child_property (container_class,
329 g_param_spec_boolean ("shrink",
331 P_("If TRUE, the child can be made smaller than its requisition"),
333 GTK_PARAM_READWRITE));
335 signals [CYCLE_CHILD_FOCUS] =
336 g_signal_new ("cycle_child_focus",
337 G_TYPE_FROM_CLASS (object_class),
338 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
339 G_STRUCT_OFFSET (GtkPanedClass, cycle_child_focus),
341 _gtk_marshal_BOOLEAN__BOOLEAN,
345 signals [TOGGLE_HANDLE_FOCUS] =
346 g_signal_new ("toggle_handle_focus",
347 G_TYPE_FROM_CLASS (object_class),
348 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
349 G_STRUCT_OFFSET (GtkPanedClass, toggle_handle_focus),
351 _gtk_marshal_BOOLEAN__VOID,
354 signals[MOVE_HANDLE] =
355 g_signal_new ("move_handle",
356 G_TYPE_FROM_CLASS (object_class),
357 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
358 G_STRUCT_OFFSET (GtkPanedClass, move_handle),
360 _gtk_marshal_BOOLEAN__ENUM,
362 GTK_TYPE_SCROLL_TYPE);
364 signals [CYCLE_HANDLE_FOCUS] =
365 g_signal_new ("cycle_handle_focus",
366 G_TYPE_FROM_CLASS (object_class),
367 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
368 G_STRUCT_OFFSET (GtkPanedClass, cycle_handle_focus),
370 _gtk_marshal_BOOLEAN__BOOLEAN,
374 signals [ACCEPT_POSITION] =
375 g_signal_new ("accept_position",
376 G_TYPE_FROM_CLASS (object_class),
377 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
378 G_STRUCT_OFFSET (GtkPanedClass, accept_position),
380 _gtk_marshal_BOOLEAN__VOID,
383 signals [CANCEL_POSITION] =
384 g_signal_new ("cancel_position",
385 G_TYPE_FROM_CLASS (object_class),
386 G_SIGNAL_RUN_LAST | G_SIGNAL_ACTION,
387 G_STRUCT_OFFSET (GtkPanedClass, cancel_position),
389 _gtk_marshal_BOOLEAN__VOID,
392 binding_set = gtk_binding_set_by_class (class);
395 gtk_binding_entry_add_signal (binding_set,
397 "cycle_child_focus", 1,
398 G_TYPE_BOOLEAN, FALSE);
399 gtk_binding_entry_add_signal (binding_set,
400 GDK_F6, GDK_SHIFT_MASK,
401 "cycle_child_focus", 1,
402 G_TYPE_BOOLEAN, TRUE);
405 gtk_binding_entry_add_signal (binding_set,
407 "cycle_handle_focus", 1,
408 G_TYPE_BOOLEAN, FALSE);
410 gtk_binding_entry_add_signal (binding_set,
411 GDK_F8, GDK_SHIFT_MASK,
412 "cycle_handle_focus", 1,
413 G_TYPE_BOOLEAN, TRUE);
415 add_tab_bindings (binding_set, 0);
416 add_tab_bindings (binding_set, GDK_CONTROL_MASK);
417 add_tab_bindings (binding_set, GDK_SHIFT_MASK);
418 add_tab_bindings (binding_set, GDK_CONTROL_MASK | GDK_SHIFT_MASK);
420 /* accept and cancel positions */
421 gtk_binding_entry_add_signal (binding_set,
423 "cancel_position", 0);
425 gtk_binding_entry_add_signal (binding_set,
427 "accept_position", 0);
428 gtk_binding_entry_add_signal (binding_set,
430 "accept_position", 0);
431 gtk_binding_entry_add_signal (binding_set,
433 "accept_position", 0);
434 gtk_binding_entry_add_signal (binding_set,
436 "accept_position", 0);
439 add_move_binding (binding_set, GDK_Left, 0, GTK_SCROLL_STEP_LEFT);
440 add_move_binding (binding_set, GDK_KP_Left, 0, GTK_SCROLL_STEP_LEFT);
441 add_move_binding (binding_set, GDK_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
442 add_move_binding (binding_set, GDK_KP_Left, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_LEFT);
444 add_move_binding (binding_set, GDK_Right, 0, GTK_SCROLL_STEP_RIGHT);
445 add_move_binding (binding_set, GDK_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
446 add_move_binding (binding_set, GDK_KP_Right, 0, GTK_SCROLL_STEP_RIGHT);
447 add_move_binding (binding_set, GDK_KP_Right, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_RIGHT);
449 add_move_binding (binding_set, GDK_Up, 0, GTK_SCROLL_STEP_UP);
450 add_move_binding (binding_set, GDK_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
451 add_move_binding (binding_set, GDK_KP_Up, 0, GTK_SCROLL_STEP_UP);
452 add_move_binding (binding_set, GDK_KP_Up, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_UP);
453 add_move_binding (binding_set, GDK_Page_Up, 0, GTK_SCROLL_PAGE_UP);
454 add_move_binding (binding_set, GDK_KP_Page_Up, 0, GTK_SCROLL_PAGE_UP);
456 add_move_binding (binding_set, GDK_Down, 0, GTK_SCROLL_STEP_DOWN);
457 add_move_binding (binding_set, GDK_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
458 add_move_binding (binding_set, GDK_KP_Down, 0, GTK_SCROLL_STEP_DOWN);
459 add_move_binding (binding_set, GDK_KP_Down, GDK_CONTROL_MASK, GTK_SCROLL_PAGE_DOWN);
460 add_move_binding (binding_set, GDK_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
461 add_move_binding (binding_set, GDK_KP_Page_Down, 0, GTK_SCROLL_PAGE_RIGHT);
463 add_move_binding (binding_set, GDK_Home, 0, GTK_SCROLL_START);
464 add_move_binding (binding_set, GDK_KP_Home, 0, GTK_SCROLL_START);
465 add_move_binding (binding_set, GDK_End, 0, GTK_SCROLL_END);
466 add_move_binding (binding_set, GDK_KP_End, 0, GTK_SCROLL_END);
470 gtk_paned_child_type (GtkContainer *container)
472 if (!GTK_PANED (container)->child1 || !GTK_PANED (container)->child2)
473 return GTK_TYPE_WIDGET;
479 gtk_paned_init (GtkPaned *paned)
481 GTK_WIDGET_SET_FLAGS (paned, GTK_NO_WINDOW | GTK_CAN_FOCUS);
483 paned->child1 = NULL;
484 paned->child2 = NULL;
485 paned->handle = NULL;
486 paned->xor_gc = NULL;
487 paned->cursor_type = GDK_CROSS;
489 paned->handle_pos.width = 5;
490 paned->handle_pos.height = 5;
491 paned->position_set = FALSE;
492 paned->last_allocation = -1;
493 paned->in_drag = FALSE;
495 paned->priv = g_new0 (GtkPanedPrivate, 1);
496 paned->last_child1_focus = NULL;
497 paned->last_child2_focus = NULL;
498 paned->in_recursion = FALSE;
499 paned->handle_prelit = FALSE;
500 paned->original_position = -1;
502 paned->handle_pos.x = -1;
503 paned->handle_pos.y = -1;
505 paned->drag_pos = -1;
509 gtk_paned_set_property (GObject *object,
514 GtkPaned *paned = GTK_PANED (object);
519 gtk_paned_set_position (paned, g_value_get_int (value));
521 case PROP_POSITION_SET:
522 paned->position_set = g_value_get_boolean (value);
523 gtk_widget_queue_resize (GTK_WIDGET (paned));
526 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
532 gtk_paned_get_property (GObject *object,
537 GtkPaned *paned = GTK_PANED (object);
542 g_value_set_int (value, paned->child1_size);
544 case PROP_POSITION_SET:
545 g_value_set_boolean (value, paned->position_set);
547 case PROP_MIN_POSITION:
548 g_value_set_int (value, paned->min_position);
550 case PROP_MAX_POSITION:
551 g_value_set_int (value, paned->max_position);
554 G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec);
560 gtk_paned_set_child_property (GtkContainer *container,
566 GtkPaned *paned = GTK_PANED (container);
567 gboolean old_value, new_value;
569 g_assert (child == paned->child1 || child == paned->child2);
571 new_value = g_value_get_boolean (value);
574 case CHILD_PROP_RESIZE:
575 if (child == paned->child1)
577 old_value = paned->child1_resize;
578 paned->child1_resize = new_value;
582 old_value = paned->child2_resize;
583 paned->child2_resize = new_value;
586 case CHILD_PROP_SHRINK:
587 if (child == paned->child1)
589 old_value = paned->child1_shrink;
590 paned->child1_shrink = new_value;
594 old_value = paned->child2_shrink;
595 paned->child2_shrink = new_value;
599 GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
600 old_value = -1; /* quiet gcc */
603 if (old_value != new_value)
604 gtk_widget_queue_resize (GTK_WIDGET (container));
608 gtk_paned_get_child_property (GtkContainer *container,
614 GtkPaned *paned = GTK_PANED (container);
616 g_assert (child == paned->child1 || child == paned->child2);
620 case CHILD_PROP_RESIZE:
621 if (child == paned->child1)
622 g_value_set_boolean (value, paned->child1_resize);
624 g_value_set_boolean (value, paned->child2_resize);
626 case CHILD_PROP_SHRINK:
627 if (child == paned->child1)
628 g_value_set_boolean (value, paned->child1_shrink);
630 g_value_set_boolean (value, paned->child2_shrink);
633 GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec);
639 gtk_paned_finalize (GObject *object)
641 GtkPaned *paned = GTK_PANED (object);
643 gtk_paned_set_saved_focus (paned, NULL);
644 gtk_paned_set_first_paned (paned, NULL);
646 g_free (paned->priv);
648 G_OBJECT_CLASS (parent_class)->finalize (object);
652 gtk_paned_realize (GtkWidget *widget)
655 GdkWindowAttr attributes;
656 gint attributes_mask;
658 GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED);
659 paned = GTK_PANED (widget);
661 widget->window = gtk_widget_get_parent_window (widget);
662 g_object_ref (widget->window);
664 attributes.window_type = GDK_WINDOW_CHILD;
665 attributes.wclass = GDK_INPUT_ONLY;
666 attributes.x = paned->handle_pos.x;
667 attributes.y = paned->handle_pos.y;
668 attributes.width = paned->handle_pos.width;
669 attributes.height = paned->handle_pos.height;
670 attributes.cursor = gdk_cursor_new_for_display (gtk_widget_get_display (widget),
672 attributes.event_mask = gtk_widget_get_events (widget);
673 attributes.event_mask |= (GDK_BUTTON_PRESS_MASK |
674 GDK_BUTTON_RELEASE_MASK |
675 GDK_ENTER_NOTIFY_MASK |
676 GDK_LEAVE_NOTIFY_MASK |
677 GDK_POINTER_MOTION_MASK |
678 GDK_POINTER_MOTION_HINT_MASK);
679 attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_CURSOR;
681 paned->handle = gdk_window_new (widget->window,
682 &attributes, attributes_mask);
683 gdk_window_set_user_data (paned->handle, paned);
684 gdk_cursor_unref (attributes.cursor);
686 widget->style = gtk_style_attach (widget->style, widget->window);
688 if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) &&
689 paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
690 gdk_window_show (paned->handle);
694 gtk_paned_unrealize (GtkWidget *widget)
696 GtkPaned *paned = GTK_PANED (widget);
700 g_object_unref (paned->xor_gc);
701 paned->xor_gc = NULL;
706 gdk_window_set_user_data (paned->handle, NULL);
707 gdk_window_destroy (paned->handle);
708 paned->handle = NULL;
711 gtk_paned_set_last_child1_focus (paned, NULL);
712 gtk_paned_set_last_child2_focus (paned, NULL);
713 gtk_paned_set_saved_focus (paned, NULL);
714 gtk_paned_set_first_paned (paned, NULL);
716 if (GTK_WIDGET_CLASS (parent_class)->unrealize)
717 (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget);
721 gtk_paned_map (GtkWidget *widget)
723 GtkPaned *paned = GTK_PANED (widget);
725 gdk_window_show (paned->handle);
727 GTK_WIDGET_CLASS (parent_class)->map (widget);
731 gtk_paned_unmap (GtkWidget *widget)
733 GtkPaned *paned = GTK_PANED (widget);
735 gdk_window_hide (paned->handle);
737 GTK_WIDGET_CLASS (parent_class)->unmap (widget);
741 gtk_paned_expose (GtkWidget *widget,
742 GdkEventExpose *event)
744 GtkPaned *paned = GTK_PANED (widget);
746 if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget) &&
747 paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) &&
748 paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
752 if (gtk_widget_is_focus (widget))
753 state = GTK_STATE_SELECTED;
754 else if (paned->handle_prelit)
755 state = GTK_STATE_PRELIGHT;
757 state = GTK_WIDGET_STATE (widget);
759 gtk_paint_handle (widget->style, widget->window,
760 state, GTK_SHADOW_NONE,
761 &paned->handle_pos, widget, "paned",
762 paned->handle_pos.x, paned->handle_pos.y,
763 paned->handle_pos.width, paned->handle_pos.height,
767 /* Chain up to draw children */
768 GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event);
774 is_rtl (GtkPaned *paned)
776 if (paned->orientation == GTK_ORIENTATION_VERTICAL &&
777 gtk_widget_get_direction (GTK_WIDGET (paned)) == GTK_TEXT_DIR_RTL)
786 update_drag (GtkPaned *paned)
792 if (paned->orientation == GTK_ORIENTATION_HORIZONTAL)
793 gtk_widget_get_pointer (GTK_WIDGET (paned), NULL, &pos);
795 gtk_widget_get_pointer (GTK_WIDGET (paned), &pos, NULL);
797 pos -= paned->drag_pos;
801 gtk_widget_style_get (GTK_WIDGET (paned),
802 "handle-size", &handle_size,
805 size = GTK_WIDGET (paned)->allocation.width - pos - handle_size;
812 size -= GTK_CONTAINER (paned)->border_width;
814 size = CLAMP (size, paned->min_position, paned->max_position);
816 if (size != paned->child1_size)
817 gtk_paned_set_position (paned, size);
821 gtk_paned_enter (GtkWidget *widget,
822 GdkEventCrossing *event)
824 GtkPaned *paned = GTK_PANED (widget);
830 paned->handle_prelit = TRUE;
831 gtk_widget_queue_draw_area (widget,
834 paned->handle_pos.width,
835 paned->handle_pos.height);
842 gtk_paned_leave (GtkWidget *widget,
843 GdkEventCrossing *event)
845 GtkPaned *paned = GTK_PANED (widget);
851 paned->handle_prelit = FALSE;
852 gtk_widget_queue_draw_area (widget,
855 paned->handle_pos.width,
856 paned->handle_pos.height);
863 gtk_paned_focus (GtkWidget *widget,
864 GtkDirectionType direction)
869 /* This is a hack, but how can this be done without
870 * excessive cut-and-paste from gtkcontainer.c?
873 GTK_WIDGET_UNSET_FLAGS (widget, GTK_CAN_FOCUS);
874 retval = (* GTK_WIDGET_CLASS (parent_class)->focus) (widget, direction);
875 GTK_WIDGET_SET_FLAGS (widget, GTK_CAN_FOCUS);
881 gtk_paned_button_press (GtkWidget *widget,
882 GdkEventButton *event)
884 GtkPaned *paned = GTK_PANED (widget);
886 if (!paned->in_drag &&
887 (event->window == paned->handle) && (event->button == 1))
889 /* We need a server grab here, not gtk_grab_add(), since
890 * we don't want to pass events on to the widget's children */
891 if (gdk_pointer_grab (paned->handle, FALSE,
892 GDK_POINTER_MOTION_HINT_MASK
893 | GDK_BUTTON1_MOTION_MASK
894 | GDK_BUTTON_RELEASE_MASK
895 | GDK_ENTER_NOTIFY_MASK
896 | GDK_LEAVE_NOTIFY_MASK,
898 event->time) != GDK_GRAB_SUCCESS)
901 paned->in_drag = TRUE;
902 paned->priv->grab_time = event->time;
904 if (paned->orientation == GTK_ORIENTATION_HORIZONTAL)
905 paned->drag_pos = event->y;
907 paned->drag_pos = event->x;
916 gtk_paned_grab_broken (GtkWidget *widget,
917 GdkEventGrabBroken *event)
919 GtkPaned *paned = GTK_PANED (widget);
921 paned->in_drag = FALSE;
922 paned->drag_pos = -1;
923 paned->position_set = TRUE;
927 gtk_paned_button_release (GtkWidget *widget,
928 GdkEventButton *event)
930 GtkPaned *paned = GTK_PANED (widget);
932 if (paned->in_drag && (event->button == 1))
934 paned->in_drag = FALSE;
935 paned->drag_pos = -1;
936 paned->position_set = TRUE;
937 gdk_display_pointer_ungrab (gtk_widget_get_display (widget),
938 paned->priv->grab_time);
946 gtk_paned_motion (GtkWidget *widget,
947 GdkEventMotion *event)
949 GtkPaned *paned = GTK_PANED (widget);
961 gtk_paned_add1 (GtkPaned *paned,
964 gtk_paned_pack1 (paned, widget, FALSE, TRUE);
968 gtk_paned_add2 (GtkPaned *paned,
971 gtk_paned_pack2 (paned, widget, TRUE, TRUE);
975 gtk_paned_pack1 (GtkPaned *paned,
980 g_return_if_fail (GTK_IS_PANED (paned));
981 g_return_if_fail (GTK_IS_WIDGET (child));
985 paned->child1 = child;
986 paned->child1_resize = resize;
987 paned->child1_shrink = shrink;
989 gtk_widget_set_parent (child, GTK_WIDGET (paned));
994 gtk_paned_pack2 (GtkPaned *paned,
999 g_return_if_fail (GTK_IS_PANED (paned));
1000 g_return_if_fail (GTK_IS_WIDGET (child));
1004 paned->child2 = child;
1005 paned->child2_resize = resize;
1006 paned->child2_shrink = shrink;
1008 gtk_widget_set_parent (child, GTK_WIDGET (paned));
1014 gtk_paned_add (GtkContainer *container,
1019 g_return_if_fail (GTK_IS_PANED (container));
1021 paned = GTK_PANED (container);
1024 gtk_paned_add1 (paned, widget);
1025 else if (!paned->child2)
1026 gtk_paned_add2 (paned, widget);
1028 g_warning ("GtkPaned cannot have more than 2 children\n");
1032 gtk_paned_remove (GtkContainer *container,
1036 gboolean was_visible;
1038 paned = GTK_PANED (container);
1039 was_visible = GTK_WIDGET_VISIBLE (widget);
1041 if (paned->child1 == widget)
1043 gtk_widget_unparent (widget);
1045 paned->child1 = NULL;
1047 if (was_visible && GTK_WIDGET_VISIBLE (container))
1048 gtk_widget_queue_resize (GTK_WIDGET (container));
1050 else if (paned->child2 == widget)
1052 gtk_widget_unparent (widget);
1054 paned->child2 = NULL;
1056 if (was_visible && GTK_WIDGET_VISIBLE (container))
1057 gtk_widget_queue_resize (GTK_WIDGET (container));
1062 gtk_paned_forall (GtkContainer *container,
1063 gboolean include_internals,
1064 GtkCallback callback,
1065 gpointer callback_data)
1069 g_return_if_fail (callback != NULL);
1071 paned = GTK_PANED (container);
1074 (*callback) (paned->child1, callback_data);
1076 (*callback) (paned->child2, callback_data);
1080 * gtk_paned_get_position:
1081 * @paned: a #GtkPaned widget
1083 * Obtains the position of the divider between the two panes.
1085 * Return value: position of the divider
1088 gtk_paned_get_position (GtkPaned *paned)
1090 g_return_val_if_fail (GTK_IS_PANED (paned), 0);
1092 return paned->child1_size;
1096 * gtk_paned_set_position:
1097 * @paned: a #GtkPaned widget
1098 * @position: pixel position of divider, a negative value means that the position
1101 * Sets the position of the divider between the two panes.
1104 gtk_paned_set_position (GtkPaned *paned,
1109 g_return_if_fail (GTK_IS_PANED (paned));
1111 object = G_OBJECT (paned);
1115 /* We don't clamp here - the assumption is that
1116 * if the total allocation changes at the same time
1117 * as the position, the position set is with reference
1118 * to the new total size. If only the position changes,
1119 * then clamping will occur in gtk_paned_compute_position()
1122 paned->child1_size = position;
1123 paned->position_set = TRUE;
1127 paned->position_set = FALSE;
1130 g_object_freeze_notify (object);
1131 g_object_notify (object, "position");
1132 g_object_notify (object, "position-set");
1133 g_object_thaw_notify (object);
1135 gtk_widget_queue_resize (GTK_WIDGET (paned));
1139 * gtk_paned_get_child1:
1140 * @paned: a #GtkPaned widget
1142 * Obtains the first child of the paned widget.
1144 * Return value: first child, or %NULL if it is not set.
1149 gtk_paned_get_child1 (GtkPaned *paned)
1151 g_return_val_if_fail (GTK_IS_PANED (paned), NULL);
1153 return paned->child1;
1157 * gtk_paned_get_child2:
1158 * @paned: a #GtkPaned widget
1160 * Obtains the second child of the paned widget.
1162 * Return value: second child, or %NULL if it is not set.
1167 gtk_paned_get_child2 (GtkPaned *paned)
1169 g_return_val_if_fail (GTK_IS_PANED (paned), NULL);
1171 return paned->child2;
1175 gtk_paned_compute_position (GtkPaned *paned,
1181 gint old_min_position;
1182 gint old_max_position;
1184 g_return_if_fail (GTK_IS_PANED (paned));
1186 old_position = paned->child1_size;
1187 old_min_position = paned->min_position;
1188 old_max_position = paned->max_position;
1190 paned->min_position = paned->child1_shrink ? 0 : child1_req;
1192 paned->max_position = allocation;
1193 if (!paned->child2_shrink)
1194 paned->max_position = MAX (1, paned->max_position - child2_req);
1195 paned->max_position = MAX (paned->min_position, paned->max_position);
1197 if (!paned->position_set)
1199 if (paned->child1_resize && !paned->child2_resize)
1200 paned->child1_size = MAX (0, allocation - child2_req);
1201 else if (!paned->child1_resize && paned->child2_resize)
1202 paned->child1_size = child1_req;
1203 else if (child1_req + child2_req != 0)
1204 paned->child1_size = allocation * ((gdouble)child1_req / (child1_req + child2_req)) + 0.5;
1206 paned->child1_size = allocation * 0.5 + 0.5;
1210 /* If the position was set before the initial allocation.
1211 * (paned->last_allocation <= 0) just clamp it and leave it.
1213 if (paned->last_allocation > 0)
1215 if (paned->child1_resize && !paned->child2_resize)
1216 paned->child1_size += allocation - paned->last_allocation;
1217 else if (!(!paned->child1_resize && paned->child2_resize))
1218 paned->child1_size = allocation * ((gdouble) paned->child1_size / (paned->last_allocation)) + 0.5;
1222 paned->child1_size = CLAMP (paned->child1_size,
1223 paned->min_position,
1224 paned->max_position);
1226 gtk_widget_set_child_visible (paned->child1, paned->child1_size != 0);
1227 gtk_widget_set_child_visible (paned->child2, paned->child1_size != allocation);
1229 g_object_freeze_notify (G_OBJECT (paned));
1230 if (paned->child1_size != old_position)
1231 g_object_notify (G_OBJECT (paned), "position");
1232 if (paned->min_position != old_min_position)
1233 g_object_notify (G_OBJECT (paned), "min-position");
1234 if (paned->max_position != old_max_position)
1235 g_object_notify (G_OBJECT (paned), "max-position");
1236 g_object_thaw_notify (G_OBJECT (paned));
1238 paned->last_allocation = allocation;
1242 gtk_paned_set_saved_focus (GtkPaned *paned, GtkWidget *widget)
1244 if (paned->priv->saved_focus)
1245 g_object_remove_weak_pointer (G_OBJECT (paned->priv->saved_focus),
1246 (gpointer *)&(paned->priv->saved_focus));
1248 paned->priv->saved_focus = widget;
1250 if (paned->priv->saved_focus)
1251 g_object_add_weak_pointer (G_OBJECT (paned->priv->saved_focus),
1252 (gpointer *)&(paned->priv->saved_focus));
1256 gtk_paned_set_first_paned (GtkPaned *paned, GtkPaned *first_paned)
1258 if (paned->priv->first_paned)
1259 g_object_remove_weak_pointer (G_OBJECT (paned->priv->first_paned),
1260 (gpointer *)&(paned->priv->first_paned));
1262 paned->priv->first_paned = first_paned;
1264 if (paned->priv->first_paned)
1265 g_object_add_weak_pointer (G_OBJECT (paned->priv->first_paned),
1266 (gpointer *)&(paned->priv->first_paned));
1270 gtk_paned_set_last_child1_focus (GtkPaned *paned, GtkWidget *widget)
1272 if (paned->last_child1_focus)
1273 g_object_remove_weak_pointer (G_OBJECT (paned->last_child1_focus),
1274 (gpointer *)&(paned->last_child1_focus));
1276 paned->last_child1_focus = widget;
1278 if (paned->last_child1_focus)
1279 g_object_add_weak_pointer (G_OBJECT (paned->last_child1_focus),
1280 (gpointer *)&(paned->last_child1_focus));
1284 gtk_paned_set_last_child2_focus (GtkPaned *paned, GtkWidget *widget)
1286 if (paned->last_child2_focus)
1287 g_object_remove_weak_pointer (G_OBJECT (paned->last_child2_focus),
1288 (gpointer *)&(paned->last_child2_focus));
1290 paned->last_child2_focus = widget;
1292 if (paned->last_child2_focus)
1293 g_object_add_weak_pointer (G_OBJECT (paned->last_child2_focus),
1294 (gpointer *)&(paned->last_child2_focus));
1298 paned_get_focus_widget (GtkPaned *paned)
1300 GtkWidget *toplevel;
1302 toplevel = gtk_widget_get_toplevel (GTK_WIDGET (paned));
1303 if (GTK_WIDGET_TOPLEVEL (toplevel))
1304 return GTK_WINDOW (toplevel)->focus_widget;
1310 gtk_paned_set_focus_child (GtkContainer *container,
1311 GtkWidget *focus_child)
1315 g_return_if_fail (GTK_IS_PANED (container));
1317 paned = GTK_PANED (container);
1319 if (focus_child == NULL)
1321 GtkWidget *last_focus;
1324 last_focus = paned_get_focus_widget (paned);
1328 /* If there is one or more paned widgets between us and the
1329 * focus widget, we want the topmost of those as last_focus
1331 for (w = last_focus; w != GTK_WIDGET (paned); w = w->parent)
1332 if (GTK_IS_PANED (w))
1335 if (container->focus_child == paned->child1)
1336 gtk_paned_set_last_child1_focus (paned, last_focus);
1337 else if (container->focus_child == paned->child2)
1338 gtk_paned_set_last_child2_focus (paned, last_focus);
1342 if (parent_class->set_focus_child)
1343 (* parent_class->set_focus_child) (container, focus_child);
1347 gtk_paned_get_cycle_chain (GtkPaned *paned,
1348 GtkDirectionType direction,
1351 GtkContainer *container = GTK_CONTAINER (paned);
1352 GtkWidget *ancestor = NULL;
1353 GList *temp_list = NULL;
1356 if (paned->in_recursion)
1359 g_assert (widgets != NULL);
1361 if (paned->last_child1_focus &&
1362 !gtk_widget_is_ancestor (paned->last_child1_focus, GTK_WIDGET (paned)))
1364 gtk_paned_set_last_child1_focus (paned, NULL);
1367 if (paned->last_child2_focus &&
1368 !gtk_widget_is_ancestor (paned->last_child2_focus, GTK_WIDGET (paned)))
1370 gtk_paned_set_last_child2_focus (paned, NULL);
1373 if (GTK_WIDGET (paned)->parent)
1374 ancestor = gtk_widget_get_ancestor (GTK_WIDGET (paned)->parent, GTK_TYPE_PANED);
1376 /* The idea here is that temp_list is a list of widgets we want to cycle
1377 * to. The list is prioritized so that the first element is our first
1378 * choice, the next our second, and so on.
1380 * We can't just use g_list_reverse(), because we want to try
1381 * paned->last_child?_focus before paned->child?, both when we
1382 * are going forward and backward.
1384 if (direction == GTK_DIR_TAB_FORWARD)
1386 if (container->focus_child == paned->child1)
1388 temp_list = g_list_append (temp_list, paned->last_child2_focus);
1389 temp_list = g_list_append (temp_list, paned->child2);
1390 temp_list = g_list_append (temp_list, ancestor);
1392 else if (container->focus_child == paned->child2)
1394 temp_list = g_list_append (temp_list, ancestor);
1395 temp_list = g_list_append (temp_list, paned->last_child1_focus);
1396 temp_list = g_list_append (temp_list, paned->child1);
1400 temp_list = g_list_append (temp_list, paned->last_child1_focus);
1401 temp_list = g_list_append (temp_list, paned->child1);
1402 temp_list = g_list_append (temp_list, paned->last_child2_focus);
1403 temp_list = g_list_append (temp_list, paned->child2);
1404 temp_list = g_list_append (temp_list, ancestor);
1409 if (container->focus_child == paned->child1)
1411 temp_list = g_list_append (temp_list, ancestor);
1412 temp_list = g_list_append (temp_list, paned->last_child2_focus);
1413 temp_list = g_list_append (temp_list, paned->child2);
1415 else if (container->focus_child == paned->child2)
1417 temp_list = g_list_append (temp_list, paned->last_child1_focus);
1418 temp_list = g_list_append (temp_list, paned->child1);
1419 temp_list = g_list_append (temp_list, ancestor);
1423 temp_list = g_list_append (temp_list, paned->last_child2_focus);
1424 temp_list = g_list_append (temp_list, paned->child2);
1425 temp_list = g_list_append (temp_list, paned->last_child1_focus);
1426 temp_list = g_list_append (temp_list, paned->child1);
1427 temp_list = g_list_append (temp_list, ancestor);
1431 /* Walk the list and expand all the paned widgets. */
1432 for (list = temp_list; list != NULL; list = list->next)
1434 GtkWidget *widget = list->data;
1438 if (GTK_IS_PANED (widget))
1440 paned->in_recursion = TRUE;
1441 gtk_paned_get_cycle_chain (GTK_PANED (widget), direction, widgets);
1442 paned->in_recursion = FALSE;
1446 *widgets = g_list_append (*widgets, widget);
1451 g_list_free (temp_list);
1455 gtk_paned_cycle_child_focus (GtkPaned *paned,
1458 GList *cycle_chain = NULL;
1461 GtkDirectionType direction = reversed? GTK_DIR_TAB_BACKWARD : GTK_DIR_TAB_FORWARD;
1463 /* ignore f6 if the handle is focused */
1464 if (gtk_widget_is_focus (GTK_WIDGET (paned)))
1467 /* we can't just let the event propagate up the hierarchy,
1468 * because the paned will want to cycle focus _unless_ an
1469 * ancestor paned handles the event
1471 gtk_paned_get_cycle_chain (paned, direction, &cycle_chain);
1473 for (list = cycle_chain; list != NULL; list = list->next)
1474 if (gtk_widget_child_focus (GTK_WIDGET (list->data), direction))
1477 g_list_free (cycle_chain);
1483 get_child_panes (GtkWidget *widget,
1486 if (GTK_IS_PANED (widget))
1488 GtkPaned *paned = GTK_PANED (widget);
1490 get_child_panes (paned->child1, panes);
1491 *panes = g_list_prepend (*panes, widget);
1492 get_child_panes (paned->child2, panes);
1494 else if (GTK_IS_CONTAINER (widget))
1496 gtk_container_foreach (GTK_CONTAINER (widget),
1497 (GtkCallback)get_child_panes, panes);
1502 get_all_panes (GtkPaned *paned)
1504 GtkPaned *topmost = NULL;
1505 GList *result = NULL;
1508 for (w = GTK_WIDGET (paned); w != NULL; w = w->parent)
1510 if (GTK_IS_PANED (w))
1511 topmost = GTK_PANED (w);
1516 get_child_panes (GTK_WIDGET (topmost), &result);
1518 return g_list_reverse (result);
1522 gtk_paned_find_neighbours (GtkPaned *paned,
1529 all_panes = get_all_panes (paned);
1530 g_assert (all_panes);
1532 this_link = g_list_find (all_panes, paned);
1534 g_assert (this_link);
1536 if (this_link->next)
1537 *next = this_link->next->data;
1539 *next = all_panes->data;
1541 if (this_link->prev)
1542 *prev = this_link->prev->data;
1544 *prev = g_list_last (all_panes)->data;
1546 g_list_free (all_panes);
1550 gtk_paned_move_handle (GtkPaned *paned,
1551 GtkScrollType scroll)
1553 if (gtk_widget_is_focus (GTK_WIDGET (paned)))
1560 SINGLE_STEP_SIZE = 1,
1564 new_position = old_position = gtk_paned_get_position (paned);
1569 case GTK_SCROLL_STEP_LEFT:
1570 case GTK_SCROLL_STEP_UP:
1571 case GTK_SCROLL_STEP_BACKWARD:
1572 increment = - SINGLE_STEP_SIZE;
1575 case GTK_SCROLL_STEP_RIGHT:
1576 case GTK_SCROLL_STEP_DOWN:
1577 case GTK_SCROLL_STEP_FORWARD:
1578 increment = SINGLE_STEP_SIZE;
1581 case GTK_SCROLL_PAGE_LEFT:
1582 case GTK_SCROLL_PAGE_UP:
1583 case GTK_SCROLL_PAGE_BACKWARD:
1584 increment = - PAGE_STEP_SIZE;
1587 case GTK_SCROLL_PAGE_RIGHT:
1588 case GTK_SCROLL_PAGE_DOWN:
1589 case GTK_SCROLL_PAGE_FORWARD:
1590 increment = PAGE_STEP_SIZE;
1593 case GTK_SCROLL_START:
1594 new_position = paned->min_position;
1597 case GTK_SCROLL_END:
1598 new_position = paned->max_position;
1608 increment = -increment;
1610 new_position = old_position + increment;
1613 new_position = CLAMP (new_position, paned->min_position, paned->max_position);
1615 if (old_position != new_position)
1616 gtk_paned_set_position (paned, new_position);
1625 gtk_paned_restore_focus (GtkPaned *paned)
1627 if (gtk_widget_is_focus (GTK_WIDGET (paned)))
1629 if (paned->priv->saved_focus &&
1630 GTK_WIDGET_SENSITIVE (paned->priv->saved_focus))
1632 gtk_widget_grab_focus (paned->priv->saved_focus);
1636 /* the saved focus is somehow not available for focusing,
1638 * 1) tabbing into the paned widget
1639 * if that didn't work,
1640 * 2) unset focus for the window if there is one
1643 if (!gtk_widget_child_focus (GTK_WIDGET (paned), GTK_DIR_TAB_FORWARD))
1645 GtkWidget *toplevel = gtk_widget_get_toplevel (GTK_WIDGET (paned));
1647 if (GTK_IS_WINDOW (toplevel))
1648 gtk_window_set_focus (GTK_WINDOW (toplevel), NULL);
1652 gtk_paned_set_saved_focus (paned, NULL);
1653 gtk_paned_set_first_paned (paned, NULL);
1658 gtk_paned_accept_position (GtkPaned *paned)
1660 if (gtk_widget_is_focus (GTK_WIDGET (paned)))
1662 paned->original_position = -1;
1663 gtk_paned_restore_focus (paned);
1673 gtk_paned_cancel_position (GtkPaned *paned)
1675 if (gtk_widget_is_focus (GTK_WIDGET (paned)))
1677 if (paned->original_position != -1)
1679 gtk_paned_set_position (paned, paned->original_position);
1680 paned->original_position = -1;
1683 gtk_paned_restore_focus (paned);
1691 gtk_paned_cycle_handle_focus (GtkPaned *paned,
1694 GtkPaned *next, *prev;
1696 if (gtk_widget_is_focus (GTK_WIDGET (paned)))
1698 GtkPaned *focus = NULL;
1700 if (!paned->priv->first_paned)
1702 /* The first_pane has disappeared. As an ad-hoc solution,
1703 * we make the currently focused paned the first_paned. To the
1704 * user this will seem like the paned cycling has been reset.
1707 gtk_paned_set_first_paned (paned, paned);
1710 gtk_paned_find_neighbours (paned, &next, &prev);
1712 if (reversed && prev &&
1713 prev != paned && paned != paned->priv->first_paned)
1717 else if (!reversed && next &&
1718 next != paned && next != paned->priv->first_paned)
1724 gtk_paned_accept_position (paned);
1730 gtk_paned_set_saved_focus (focus, paned->priv->saved_focus);
1731 gtk_paned_set_first_paned (focus, paned->priv->first_paned);
1733 gtk_paned_set_saved_focus (paned, NULL);
1734 gtk_paned_set_first_paned (paned, NULL);
1736 gtk_widget_grab_focus (GTK_WIDGET (focus));
1738 if (!gtk_widget_is_focus (GTK_WIDGET (paned)))
1740 paned->original_position = -1;
1741 focus->original_position = gtk_paned_get_position (focus);
1746 GtkContainer *container = GTK_CONTAINER (paned);
1749 GtkPaned *prev, *next;
1750 GtkWidget *toplevel;
1752 gtk_paned_find_neighbours (paned, &next, &prev);
1754 if (container->focus_child == paned->child1)
1767 else if (container->focus_child == paned->child2)
1782 /* Focus is not inside this paned, and we don't have focus.
1783 * Presumably this happened because the application wants us
1784 * to start keyboard navigating.
1794 toplevel = gtk_widget_get_toplevel (GTK_WIDGET (paned));
1796 if (GTK_IS_WINDOW (toplevel))
1797 gtk_paned_set_saved_focus (focus, GTK_WINDOW (toplevel)->focus_widget);
1798 gtk_paned_set_first_paned (focus, first);
1799 focus->original_position = gtk_paned_get_position (focus);
1801 gtk_widget_grab_focus (GTK_WIDGET (focus));
1808 gtk_paned_toggle_handle_focus (GtkPaned *paned)
1810 /* This function/signal has the wrong name. It is called when you
1811 * press Tab or Shift-Tab and what we do is act as if
1812 * the user pressed Return and then Tab or Shift-Tab
1814 if (gtk_widget_is_focus (GTK_WIDGET (paned)))
1815 gtk_paned_accept_position (paned);
1820 #define __GTK_PANED_C__
1821 #include "gtkaliasdef.c"