X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fgtk-contrib%2Fgtkxpaned.c;h=19dea4554b91fb52aa7a738bf55c5c5bc10c88d5;hb=e83d90847323b194bdb04267f9b0eb557fb139d4;hp=8bd5253deae0f8c75db34c273b51d87b61931fcb;hpb=7bf0c4d57ce0da1ad3fe082a01716808eaef09a5;p=pspp diff --git a/lib/gtk-contrib/gtkxpaned.c b/lib/gtk-contrib/gtkxpaned.c index 8bd5253dea..19dea4554b 100644 --- a/lib/gtk-contrib/gtkxpaned.c +++ b/lib/gtk-contrib/gtkxpaned.c @@ -54,7 +54,9 @@ enum ChildProperties { CHILD_PROP_0, CHILD_PROP_RESIZE, - CHILD_PROP_SHRINK + CHILD_PROP_SHRINK, + CHILD_PROP_LEFT_ATTACH, + CHILD_PROP_TOP_ATTACH }; enum WidgetSignals @@ -526,6 +528,29 @@ gtk_xpaned_class_init (GtkXPanedClass * class) G_MAXINT, G_PARAM_READABLE)); + + gtk_container_class_install_child_property (container_class, + CHILD_PROP_LEFT_ATTACH, + g_param_spec_int ("left-attach", + "Left Attach", + "The column number to which the left side of the widget should be attached", + 0, 1, + 0, + G_PARAM_READWRITE)); + + + + gtk_container_class_install_child_property (container_class, + CHILD_PROP_TOP_ATTACH, + g_param_spec_int ("top-attach", + "Top Attach", + "The row number to which the top side of the widget should be attached", + 0, 1, + 0, + G_PARAM_READWRITE)); + + + /** * GtkPaned:resize: * @@ -812,6 +837,12 @@ gtk_xpaned_size_allocate (GtkWidget * widget, GtkAllocation * allocation) GtkRequisition bottom_right_child_requisition; gint handle_size; + g_print ("Allocate %p %p %p %p\n", + xpaned->top_left_child, + xpaned->top_right_child, + xpaned->bottom_left_child, + xpaned->bottom_right_child); + /* determine size of handle(s) */ gtk_widget_style_get (widget, "handle-size", &handle_size, NULL); @@ -1046,73 +1077,109 @@ gtk_xpaned_set_child_property (GtkContainer * container, const GValue * value, GParamSpec * pspec) { GtkXPaned *xpaned = GTK_XPANED (container); - gboolean old_value = FALSE; - gboolean new_value = FALSE; g_assert (child == xpaned->top_left_child || child == xpaned->top_right_child || child == xpaned->bottom_left_child || child == xpaned->bottom_right_child); - new_value = g_value_get_boolean (value); - + gint attach = g_value_get_int (value); switch (property_id) { + case CHILD_PROP_LEFT_ATTACH: + g_object_ref (child); + gtk_widget_unparent (child); + if (attach == 0) + { + if (child == xpaned->top_right_child) + xpaned->top_left_child = child; + else if (child == xpaned->bottom_right_child) + xpaned->bottom_left_child = child; + } + else + { + if (child == xpaned->top_left_child) + xpaned->top_right_child = child; + else if (child == xpaned->bottom_left_child) + xpaned->bottom_right_child = child; + } + gtk_widget_set_parent (child, GTK_WIDGET (xpaned)); + g_object_unref (child); + break; + case CHILD_PROP_TOP_ATTACH: + g_object_ref (child); + gtk_widget_unparent (child); + if (attach == 0) + { + if (child == xpaned->bottom_right_child) + xpaned->top_right_child = child; + else if (child == xpaned->bottom_left_child) + xpaned->top_left_child = child; + } + else + { + if (child == xpaned->top_left_child) + xpaned->bottom_left_child = child; + else if (child == xpaned->top_right_child) + xpaned->bottom_right_child = child; + } + gtk_widget_set_parent (child, GTK_WIDGET (xpaned)); + g_object_unref (child); + break; case CHILD_PROP_RESIZE: - if (child == xpaned->top_left_child) - { - old_value = xpaned->top_left_child_resize; - xpaned->top_left_child_resize = new_value; - } - else if (child == xpaned->top_right_child) - { - old_value = xpaned->top_right_child_resize; - xpaned->top_right_child_resize = new_value; - } - else if (child == xpaned->bottom_left_child) - { - old_value = xpaned->bottom_left_child_resize; - xpaned->bottom_left_child_resize = new_value; - } - else if (child == xpaned->bottom_right_child) - { - old_value = xpaned->bottom_right_child_resize; - xpaned->bottom_right_child_resize = new_value; - } + { + gboolean new_value = TRUE; + + if (child == xpaned->top_left_child) + { + xpaned->top_left_child_resize = new_value; + } + else if (child == xpaned->top_right_child) + { + xpaned->top_right_child_resize = new_value; + } + else if (child == xpaned->bottom_left_child) + { + xpaned->bottom_left_child_resize = new_value; + } + else if (child == xpaned->bottom_right_child) + { + xpaned->bottom_right_child_resize = new_value; + } + } break; - + case CHILD_PROP_SHRINK: - if (child == xpaned->top_left_child) - { - old_value = xpaned->top_left_child_shrink; - xpaned->top_left_child_shrink = new_value; - } - else if (child == xpaned->top_right_child) - { - old_value = xpaned->top_right_child_shrink; - xpaned->top_right_child_shrink = new_value; - } - else if (child == xpaned->bottom_left_child) - { - old_value = xpaned->bottom_left_child_shrink; - xpaned->bottom_left_child_shrink = new_value; - } - else if (child == xpaned->bottom_right_child) - { - old_value = xpaned->bottom_right_child_shrink; - xpaned->bottom_right_child_shrink = new_value; - } + { + gboolean new_value = FALSE; + + if (child == xpaned->top_left_child) + { + xpaned->top_left_child_shrink = new_value; + } + else if (child == xpaned->top_right_child) + { + xpaned->top_right_child_shrink = new_value; + } + else if (child == xpaned->bottom_left_child) + { + xpaned->bottom_left_child_shrink = new_value; + } + else if (child == xpaned->bottom_right_child) + { + xpaned->bottom_right_child_shrink = new_value; + } + } break; default: GTK_CONTAINER_WARN_INVALID_CHILD_PROPERTY_ID (container, property_id, pspec); - old_value = -1; /* quiet gcc */ break; } - if (old_value != new_value) - gtk_widget_queue_resize (GTK_WIDGET (container)); + gtk_widget_queue_resize (GTK_WIDGET (container)); + gtk_widget_queue_draw (GTK_WIDGET (container)); } static void @@ -1130,6 +1197,26 @@ gtk_xpaned_get_child_property (GtkContainer * container, switch (property_id) { + case CHILD_PROP_TOP_ATTACH: + if (child == xpaned->top_left_child) + g_value_set_int (value, 0); + if (child == xpaned->top_right_child) + g_value_set_int (value, 0); + if (child == xpaned->bottom_left_child) + g_value_set_int (value, 1); + if (child == xpaned->bottom_right_child) + g_value_set_int (value, 1); + break; + case CHILD_PROP_LEFT_ATTACH: + if (child == xpaned->top_left_child) + g_value_set_int (value, 0); + if (child == xpaned->bottom_left_child) + g_value_set_int (value, 0); + if (child == xpaned->top_right_child) + g_value_set_int (value, 1); + if (child == xpaned->bottom_right_child) + g_value_set_int (value, 1); + break; case CHILD_PROP_RESIZE: if (child == xpaned->top_left_child) g_value_set_boolean (value, xpaned->top_left_child_resize); @@ -1480,6 +1567,11 @@ update_drag (GtkXPaned * xpaned) gdk_display_get_device_manager ( gtk_widget_get_display (widget))), &pos.x, &pos.y, NULL); + if (!gtk_widget_get_has_window (widget)) + { + pos.x -= allocation.x; + pos.y -= allocation.y; + } if (xpaned->in_drag_vert) { @@ -1671,6 +1763,22 @@ gtk_xpaned_focus (GtkWidget * widget, GtkDirectionType direction) return retval; } +static void +gtk_xpaned_button_press_grab (GdkWindow *handle, GdkEventButton *event) +{ + /* We need a server grab here, not gtk_grab_add(), since + * we don't want to pass events on to the widget's children */ + gdk_device_grab (event->device, handle, + GDK_OWNERSHIP_NONE, + FALSE, + (GDK_POINTER_MOTION_HINT_MASK + | GDK_BUTTON1_MOTION_MASK + | GDK_BUTTON_RELEASE_MASK + | GDK_ENTER_NOTIFY_MASK + | GDK_LEAVE_NOTIFY_MASK), + NULL, event->time); +} + static gboolean gtk_xpaned_button_press (GtkWidget * widget, GdkEventButton * event) { @@ -1692,20 +1800,7 @@ gtk_xpaned_button_press (GtkWidget * widget, GdkEventButton * event) event->window == xpaned->handle_middle && event->button == 1) { xpaned->in_drag_vert_and_horiz = TRUE; - - /* We need a server grab here, not gtk_grab_add(), since - * we don't want to pass events on to the widget's children */ - if (gdk_pointer_grab (xpaned->handle_middle, - FALSE, - GDK_POINTER_MOTION_HINT_MASK - | GDK_BUTTON1_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK, - NULL, NULL, event->time) == GDK_GRAB_SUCCESS) - { - } - + gtk_xpaned_button_press_grab (xpaned->handle_middle, event); xpaned->drag_pos.x = event->x; xpaned->drag_pos.y = event->y; @@ -1719,20 +1814,7 @@ gtk_xpaned_button_press (GtkWidget * widget, GdkEventButton * event) event->window != xpaned->handle_middle && event->button == 1) { xpaned->in_drag_vert = TRUE; - - /* We need a server grab here, not gtk_grab_add(), since - * we don't want to pass events on to the widget's children */ - if (gdk_pointer_grab (xpaned->handle_east, - FALSE, - GDK_POINTER_MOTION_HINT_MASK - | GDK_BUTTON1_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK, - NULL, NULL, event->time) == GDK_GRAB_SUCCESS) - { - } - + gtk_xpaned_button_press_grab (xpaned->handle_east, event); xpaned->drag_pos.y = event->y; return TRUE; @@ -1745,20 +1827,7 @@ gtk_xpaned_button_press (GtkWidget * widget, GdkEventButton * event) event->window != xpaned->handle_middle && event->button == 1) { xpaned->in_drag_vert = TRUE; - - /* We need a server grab here, not gtk_grab_add(), since - * we don't want to pass events on to the widget's children */ - if (gdk_pointer_grab (xpaned->handle_west, - FALSE, - GDK_POINTER_MOTION_HINT_MASK - | GDK_BUTTON1_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK, - NULL, NULL, event->time) == GDK_GRAB_SUCCESS) - { - } - + gtk_xpaned_button_press_grab (xpaned->handle_west, event); xpaned->drag_pos.y = event->y; return TRUE; @@ -1771,20 +1840,7 @@ gtk_xpaned_button_press (GtkWidget * widget, GdkEventButton * event) event->window != xpaned->handle_middle && event->button == 1) { xpaned->in_drag_horiz = TRUE; - - /* We need a server grab here, not gtk_grab_add(), since - * we don't want to pass events on to the widget's children */ - if (gdk_pointer_grab (xpaned->handle_north, - FALSE, - GDK_POINTER_MOTION_HINT_MASK - | GDK_BUTTON1_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK, - NULL, NULL, event->time) == GDK_GRAB_SUCCESS) - { - } - + gtk_xpaned_button_press_grab (xpaned->handle_north, event); xpaned->drag_pos.x = event->x; return TRUE; @@ -1797,20 +1853,7 @@ gtk_xpaned_button_press (GtkWidget * widget, GdkEventButton * event) event->window != xpaned->handle_middle && event->button == 1) { xpaned->in_drag_horiz = TRUE; - - /* We need a server grab here, not gtk_grab_add(), since - * we don't want to pass events on to the widget's children */ - if (gdk_pointer_grab (xpaned->handle_south, - FALSE, - GDK_POINTER_MOTION_HINT_MASK - | GDK_BUTTON1_MOTION_MASK - | GDK_BUTTON_RELEASE_MASK - | GDK_ENTER_NOTIFY_MASK - | GDK_LEAVE_NOTIFY_MASK, - NULL, NULL, event->time) == GDK_GRAB_SUCCESS) - { - } - + gtk_xpaned_button_press_grab (xpaned->handle_south, event); xpaned->drag_pos.x = event->x; return TRUE; @@ -1828,8 +1871,7 @@ gtk_xpaned_button_release (GtkWidget * widget, GdkEventButton * event) xpaned->in_drag_vert = FALSE; xpaned->drag_pos.y = -1; xpaned->position_set = TRUE; - gdk_display_pointer_ungrab (gtk_widget_get_display (widget), - event->time); + gdk_device_ungrab (event->device, event->time); return TRUE; } else if (xpaned->in_drag_horiz && (event->button == 1)) @@ -1837,8 +1879,7 @@ gtk_xpaned_button_release (GtkWidget * widget, GdkEventButton * event) xpaned->in_drag_horiz = FALSE; xpaned->drag_pos.x = -1; xpaned->position_set = TRUE; - gdk_display_pointer_ungrab (gtk_widget_get_display (widget), - event->time); + gdk_device_ungrab (event->device, event->time); return TRUE; } else if (xpaned->in_drag_vert_and_horiz && (event->button == 1)) @@ -1847,8 +1888,7 @@ gtk_xpaned_button_release (GtkWidget * widget, GdkEventButton * event) xpaned->drag_pos.x = -1; xpaned->drag_pos.y = -1; xpaned->position_set = TRUE; - gdk_display_pointer_ungrab (gtk_widget_get_display (widget), - event->time); + gdk_device_ungrab (event->device, event->time); return TRUE; }