diff options
author | Owen Taylor <otaylor@redhat.com> | 2000-02-17 22:12:25 +0000 |
---|---|---|
committer | Owen Taylor <otaylor@src.gnome.org> | 2000-02-17 22:12:25 +0000 |
commit | ab1deac87fa395332b73daf8e2e4c893e23be3e4 (patch) | |
tree | 6ecac4c8b00d557df9d0a0a4ee8a9f9c0a80e7dc /gtk/gtkpaned.c | |
parent | d0f73034cf5e6c5b7f52ce7d31bd3b3d8cca0d4c (diff) | |
download | gtk+-ab1deac87fa395332b73daf8e2e4c893e23be3e4.tar.gz |
Add patch from Jonathan Blandford and Anders Carlsson to change the Paned
Thu Feb 17 17:10:12 2000 Owen Taylor <otaylor@redhat.com>
* gtk/gt{h,k,}vpaned.[ch]: Add patch from Jonathan Blandford
and Anders Carlsson to change the Paned widgets so that they
can be dragged from anywhere along the length. Also change
the way that this is drawn to make this apparent.
* gtk/gtkoptionmenu.c (gtk_option_menu_get_history): Apply patch
from George Lebl to check that option_menu->menu is present
before getting history.
Diffstat (limited to 'gtk/gtkpaned.c')
-rw-r--r-- | gtk/gtkpaned.c | 272 |
1 files changed, 120 insertions, 152 deletions
diff --git a/gtk/gtkpaned.c b/gtk/gtkpaned.c index 3a6929fc0b..e3b262d177 100644 --- a/gtk/gtkpaned.c +++ b/gtk/gtkpaned.c @@ -18,7 +18,7 @@ */ /* - * Modified by the GTK+ Team and others 1997-1999. See the AUTHORS + * Modified by the GTK+ Team and others 1997-2000. See the AUTHORS * file for a list of people on the GTK+ Team. See the ChangeLog * files for a list of changes. These files are distributed with * GTK+ at ftp://ftp.gtk.org/pub/gtk/. @@ -28,34 +28,32 @@ enum { ARG_0, - ARG_HANDLE_SIZE, - ARG_GUTTER_SIZE + ARG_HANDLE_SIZE }; -static void gtk_paned_class_init (GtkPanedClass *klass); -static void gtk_paned_init (GtkPaned *paned); -static void gtk_paned_set_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_paned_get_arg (GtkObject *object, - GtkArg *arg, - guint arg_id); -static void gtk_paned_realize (GtkWidget *widget); -static void gtk_paned_map (GtkWidget *widget); -static void gtk_paned_unmap (GtkWidget *widget); -static void gtk_paned_unrealize (GtkWidget *widget); -static gint gtk_paned_expose (GtkWidget *widget, - GdkEventExpose *event); -static void gtk_paned_add (GtkContainer *container, - GtkWidget *widget); -static void gtk_paned_remove (GtkContainer *container, - GtkWidget *widget); -static void gtk_paned_forall (GtkContainer *container, - gboolean include_internals, - GtkCallback callback, - gpointer callback_data); -static GtkType gtk_paned_child_type (GtkContainer *container); - +static void gtk_paned_class_init (GtkPanedClass *klass); +static void gtk_paned_init (GtkPaned *paned); +static void gtk_paned_set_arg (GtkObject *object, + GtkArg *arg, + guint arg_id); +static void gtk_paned_get_arg (GtkObject *object, + GtkArg *arg, + guint arg_id); +static void gtk_paned_realize (GtkWidget *widget); +static void gtk_paned_map (GtkWidget *widget); +static void gtk_paned_unmap (GtkWidget *widget); +static void gtk_paned_unrealize (GtkWidget *widget); +static gint gtk_paned_expose (GtkWidget *widget, + GdkEventExpose *event); +static void gtk_paned_add (GtkContainer *container, + GtkWidget *widget); +static void gtk_paned_remove (GtkContainer *container, + GtkWidget *widget); +static void gtk_paned_forall (GtkContainer *container, + gboolean include_internals, + GtkCallback callback, + gpointer callback_data); +static GtkType gtk_paned_child_type (GtkContainer *container); static GtkContainerClass *parent_class = NULL; @@ -76,9 +74,9 @@ gtk_paned_get_type (void) (GtkObjectInitFunc) gtk_paned_init, /* reserved_1 */ NULL, /* reserved_2 */ NULL, - (GtkClassInitFunc) NULL, + (GtkClassInitFunc) NULL, }; - + paned_type = gtk_type_unique (GTK_TYPE_CONTAINER, &paned_info); } @@ -91,13 +89,13 @@ gtk_paned_class_init (GtkPanedClass *class) GtkObjectClass *object_class; GtkWidgetClass *widget_class; GtkContainerClass *container_class; - - object_class = (GtkObjectClass*) class; - widget_class = (GtkWidgetClass*) class; - container_class = (GtkContainerClass*) class; - + + object_class = (GtkObjectClass *) class; + widget_class = (GtkWidgetClass *) class; + container_class = (GtkContainerClass *) class; + parent_class = gtk_type_class (GTK_TYPE_CONTAINER); - + object_class->set_arg = gtk_paned_set_arg; object_class->get_arg = gtk_paned_get_arg; @@ -112,10 +110,8 @@ gtk_paned_class_init (GtkPanedClass *class) container_class->forall = gtk_paned_forall; container_class->child_type = gtk_paned_child_type; - gtk_object_add_arg_type ("GtkPaned::handle_size", GTK_TYPE_UINT, - GTK_ARG_READWRITE, ARG_HANDLE_SIZE); - gtk_object_add_arg_type ("GtkPaned::gutter_size", GTK_TYPE_UINT, - GTK_ARG_READWRITE, ARG_GUTTER_SIZE); + gtk_object_add_arg_type("GtkPaned::handle_size", GTK_TYPE_UINT, + GTK_ARG_READWRITE, ARG_HANDLE_SIZE); } static GtkType @@ -136,9 +132,11 @@ gtk_paned_init (GtkPaned *paned) paned->child2 = NULL; paned->handle = NULL; paned->xor_gc = NULL; + paned->cursor_type = GDK_CROSS; - paned->handle_size = 10; - paned->gutter_size = 6; + paned->handle_width = 5; + paned->handle_height = 5; + paned->handle_size = 5; paned->position_set = FALSE; paned->last_allocation = -1; paned->in_drag = FALSE; @@ -159,8 +157,7 @@ gtk_paned_set_arg (GtkObject *object, case ARG_HANDLE_SIZE: gtk_paned_set_handle_size (paned, GTK_VALUE_UINT (*arg)); break; - case ARG_GUTTER_SIZE: - gtk_paned_set_gutter_size (paned, GTK_VALUE_UINT (*arg)); + default: break; } } @@ -171,15 +168,12 @@ gtk_paned_get_arg (GtkObject *object, guint arg_id) { GtkPaned *paned = GTK_PANED (object); - + switch (arg_id) { case ARG_HANDLE_SIZE: GTK_VALUE_UINT (*arg) = paned->handle_size; break; - case ARG_GUTTER_SIZE: - GTK_VALUE_UINT (*arg) = paned->gutter_size; - break; default: arg->type = GTK_TYPE_INVALID; break; @@ -192,13 +186,13 @@ gtk_paned_realize (GtkWidget *widget) GtkPaned *paned; GdkWindowAttr attributes; gint attributes_mask; - + g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_PANED (widget)); - + GTK_WIDGET_SET_FLAGS (widget, GTK_REALIZED); paned = GTK_PANED (widget); - + attributes.x = widget->allocation.x; attributes.y = widget->allocation.y; attributes.width = widget->allocation.width; @@ -209,34 +203,34 @@ gtk_paned_realize (GtkWidget *widget) attributes.colormap = gtk_widget_get_colormap (widget); attributes.event_mask = gtk_widget_get_events (widget) | GDK_EXPOSURE_MASK; attributes_mask = GDK_WA_X | GDK_WA_Y | GDK_WA_VISUAL | GDK_WA_COLORMAP; - - widget->window = gdk_window_new (gtk_widget_get_parent_window (widget), + + widget->window = gdk_window_new (gtk_widget_get_parent_window(widget), &attributes, attributes_mask); gdk_window_set_user_data (widget->window, paned); - + attributes.x = paned->handle_xpos; attributes.y = paned->handle_ypos; - attributes.width = paned->handle_size; - attributes.height = paned->handle_size; - attributes.cursor = gdk_cursor_new (GDK_CROSS); + attributes.width = paned->handle_width; + attributes.height = paned->handle_height; + attributes.cursor = gdk_cursor_new (paned->cursor_type); attributes.event_mask |= (GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK | GDK_POINTER_MOTION_MASK | GDK_POINTER_MOTION_HINT_MASK); attributes_mask |= GDK_WA_CURSOR; - + paned->handle = gdk_window_new (widget->window, &attributes, attributes_mask); gdk_window_set_user_data (paned->handle, paned); gdk_cursor_destroy (attributes.cursor); - + widget->style = gtk_style_attach (widget->style, widget->window); - + gtk_style_set_background (widget->style, widget->window, GTK_STATE_NORMAL); gtk_style_set_background (widget->style, paned->handle, GTK_STATE_NORMAL); gdk_window_set_back_pixmap (widget->window, NULL, TRUE); - + gdk_window_show (paned->handle); } @@ -244,13 +238,13 @@ static void gtk_paned_map (GtkWidget *widget) { GtkPaned *paned; - + g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_PANED (widget)); - + GTK_WIDGET_SET_FLAGS (widget, GTK_MAPPED); paned = GTK_PANED (widget); - + if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) && !GTK_WIDGET_MAPPED (paned->child1)) @@ -268,9 +262,9 @@ gtk_paned_unmap (GtkWidget *widget) { g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_PANED (widget)); - + GTK_WIDGET_UNSET_FLAGS (widget, GTK_MAPPED); - + gdk_window_hide (widget->window); } @@ -278,25 +272,25 @@ static void gtk_paned_unrealize (GtkWidget *widget) { GtkPaned *paned; - + g_return_if_fail (widget != NULL); g_return_if_fail (GTK_IS_PANED (widget)); - + paned = GTK_PANED (widget); - + if (paned->xor_gc) { gdk_gc_destroy (paned->xor_gc); paned->xor_gc = NULL; } - + if (paned->handle) { gdk_window_set_user_data (paned->handle, NULL); gdk_window_destroy (paned->handle); paned->handle = NULL; } - + if (GTK_WIDGET_CLASS (parent_class)->unrealize) (* GTK_WIDGET_CLASS (parent_class)->unrealize) (widget); } @@ -307,24 +301,21 @@ gtk_paned_expose (GtkWidget *widget, { GtkPaned *paned; GdkEventExpose child_event; - + g_return_val_if_fail (widget != NULL, FALSE); g_return_val_if_fail (GTK_IS_PANED (widget), FALSE); g_return_val_if_fail (event != NULL, FALSE); - + if (GTK_WIDGET_DRAWABLE (widget)) { paned = GTK_PANED (widget); - - /* An expose event for the handle */ + if (event->window == paned->handle) { - gtk_paint_box (widget->style, paned->handle, - GTK_WIDGET_STATE(widget), - GTK_SHADOW_OUT, - &event->area, widget, "paned", - 0, 0, - paned->handle_size, paned->handle_size); + child_event = *event; + event->area.x += paned->handle_xpos; + event->area.y += paned->handle_ypos; + gtk_widget_draw (widget, &event->area); } else { @@ -332,26 +323,21 @@ gtk_paned_expose (GtkWidget *widget, if (paned->child1 && GTK_WIDGET_NO_WINDOW (paned->child1) && gtk_widget_intersect (paned->child1, &event->area, &child_event.area)) - gtk_widget_event (paned->child1, (GdkEvent*) &child_event); - + gtk_widget_event (paned->child1, (GdkEvent *) &child_event); + if (paned->child2 && GTK_WIDGET_NO_WINDOW (paned->child2) && gtk_widget_intersect (paned->child2, &event->area, &child_event.area)) - gtk_widget_event (paned->child2, (GdkEvent*) &child_event); - - /* redraw the groove if necessary */ - if (gdk_rectangle_intersect (&paned->groove_rectangle, - &event->area, - &child_event.area)) - gtk_widget_draw (widget, &child_event.area); + gtk_widget_event (paned->child2, (GdkEvent *) &child_event); } } + return FALSE; } void -gtk_paned_add1 (GtkPaned *paned, - GtkWidget *widget) +gtk_paned_add1 (GtkPaned *paned, + GtkWidget *widget) { gtk_paned_pack1 (paned, widget, FALSE, TRUE); } @@ -364,15 +350,15 @@ gtk_paned_add2 (GtkPaned *paned, } void -gtk_paned_pack1 (GtkPaned *paned, - GtkWidget *child, - gboolean resize, - gboolean shrink) +gtk_paned_pack1 (GtkPaned *paned, + GtkWidget *child, + gboolean resize, + gboolean shrink) { g_return_if_fail (paned != NULL); g_return_if_fail (GTK_IS_PANED (paned)); g_return_if_fail (GTK_IS_WIDGET (child)); - + if (!paned->child1) { paned->child1 = child; @@ -403,13 +389,13 @@ gtk_paned_pack2 (GtkPaned *paned, g_return_if_fail (paned != NULL); g_return_if_fail (GTK_IS_PANED (paned)); g_return_if_fail (GTK_IS_WIDGET (child)); - + if (!paned->child2) { paned->child2 = child; paned->child2_resize = resize; paned->child2_shrink = shrink; - + gtk_widget_set_parent (child, GTK_WIDGET (paned)); if (GTK_WIDGET_REALIZED (child->parent)) @@ -425,22 +411,23 @@ gtk_paned_pack2 (GtkPaned *paned, } } + static void gtk_paned_add (GtkContainer *container, GtkWidget *widget) { GtkPaned *paned; - + g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_PANED (container)); g_return_if_fail (widget != NULL); - + paned = GTK_PANED (container); - + if (!paned->child1) - gtk_paned_add1 (GTK_PANED (container),widget); + gtk_paned_add1 (GTK_PANED (container), widget); else if (!paned->child2) - gtk_paned_add2 (GTK_PANED (container),widget); + gtk_paned_add2 (GTK_PANED (container), widget); } static void @@ -449,57 +436,57 @@ gtk_paned_remove (GtkContainer *container, { GtkPaned *paned; gboolean was_visible; - + g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_PANED (container)); g_return_if_fail (widget != NULL); - + paned = GTK_PANED (container); was_visible = GTK_WIDGET_VISIBLE (widget); - + if (paned->child1 == widget) { gtk_widget_unparent (widget); - + paned->child1 = NULL; - + if (was_visible && GTK_WIDGET_VISIBLE (container)) - gtk_widget_queue_resize (GTK_WIDGET (container)); + gtk_widget_queue_resize (GTK_WIDGET (container)); } else if (paned->child2 == widget) { gtk_widget_unparent (widget); - + paned->child2 = NULL; - + if (was_visible && GTK_WIDGET_VISIBLE (container)) - gtk_widget_queue_resize (GTK_WIDGET (container)); + gtk_widget_queue_resize (GTK_WIDGET (container)); } } static void gtk_paned_forall (GtkContainer *container, - gboolean include_internals, + gboolean include_internals, GtkCallback callback, gpointer callback_data) { GtkPaned *paned; - + g_return_if_fail (container != NULL); g_return_if_fail (GTK_IS_PANED (container)); g_return_if_fail (callback != NULL); - + paned = GTK_PANED (container); - + if (paned->child1) - (* callback) (paned->child1, callback_data); + (*callback) (paned->child1, callback_data); if (paned->child2) - (* callback) (paned->child2, callback_data); + (*callback) (paned->child2, callback_data); } void -gtk_paned_set_position (GtkPaned *paned, - gint position) +gtk_paned_set_position (GtkPaned *paned, + gint position) { g_return_if_fail (paned != NULL); g_return_if_fail (GTK_IS_PANED (paned)); @@ -516,7 +503,9 @@ gtk_paned_set_position (GtkPaned *paned, paned->position_set = TRUE; } else - paned->position_set = FALSE; + { + paned->position_set = FALSE; + } gtk_widget_queue_resize (GTK_WIDGET (paned)); } @@ -525,40 +514,19 @@ void gtk_paned_set_handle_size (GtkPaned *paned, guint16 size) { - gint x,y; - g_return_if_fail (paned != NULL); g_return_if_fail (GTK_IS_PANED (paned)); - if (paned->handle) - { - gdk_window_get_geometry (paned->handle, &x, &y, NULL, NULL, NULL); - gdk_window_move_resize (paned->handle, - x + paned->handle_size / 2 - size / 2, - y + paned->handle_size / 2 - size / 2, - size, size); - } - paned->handle_size = size; -} - -void -gtk_paned_set_gutter_size (GtkPaned *paned, - guint16 size) -{ - g_return_if_fail (paned != NULL); - g_return_if_fail (GTK_IS_PANED (paned)); + gtk_widget_queue_resize (GTK_WIDGET (paned)); - paned->gutter_size = size; - - if (GTK_WIDGET_VISIBLE (GTK_WIDGET (paned))) - gtk_widget_queue_resize (GTK_WIDGET (paned)); + paned->handle_size = size; } void -gtk_paned_compute_position (GtkPaned *paned, - gint allocation, - gint child1_req, - gint child2_req) +gtk_paned_compute_position(GtkPaned *paned, + gint allocation, + gint child1_req, + gint child2_req) { g_return_if_fail (paned != NULL); g_return_if_fail (GTK_IS_PANED (paned)); @@ -576,7 +544,8 @@ gtk_paned_compute_position (GtkPaned *paned, else if (!paned->child1_resize && paned->child2_resize) paned->child1_size = child1_req; else - paned->child1_size = allocation * ((gdouble)child1_req / (child1_req + child2_req)); + paned->child1_size = allocation * ((gdouble) child1_req / + (child1_req + child2_req)); } else { @@ -586,9 +555,9 @@ gtk_paned_compute_position (GtkPaned *paned, if (paned->last_allocation >= 0) { if (paned->child1_resize && !paned->child2_resize) - paned->child1_size += (allocation - paned->last_allocation); + paned->child1_size += allocation - paned->last_allocation; else if (!(!paned->child1_resize && paned->child2_resize)) - paned->child1_size = allocation * ((gdouble)paned->child1_size / (paned->last_allocation)); + paned->child1_size = allocation * ((gdouble) paned->child1_size / (paned->last_allocation)); } } @@ -597,5 +566,4 @@ gtk_paned_compute_position (GtkPaned *paned, paned->max_position); paned->last_allocation = allocation; - } |