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.
This commit is contained in:
parent
d0f73034cf
commit
ab1deac87f
11
ChangeLog
11
ChangeLog
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
||||
2000-02-14 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* gdk/gdkdraw.c (gdk_draw_segments): Move the test for no segments
|
||||
|
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
||||
2000-02-14 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* gdk/gdkdraw.c (gdk_draw_segments): Move the test for no segments
|
||||
|
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
||||
2000-02-14 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* gdk/gdkdraw.c (gdk_draw_segments): Move the test for no segments
|
||||
|
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
||||
2000-02-14 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* gdk/gdkdraw.c (gdk_draw_segments): Move the test for no segments
|
||||
|
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
||||
2000-02-14 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* gdk/gdkdraw.c (gdk_draw_segments): Move the test for no segments
|
||||
|
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
||||
2000-02-14 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* gdk/gdkdraw.c (gdk_draw_segments): Move the test for no segments
|
||||
|
@ -1,3 +1,14 @@
|
||||
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.
|
||||
|
||||
2000-02-14 Tor Lillqvist <tml@iki.fi>
|
||||
|
||||
* gdk/gdkdraw.c (gdk_draw_segments): Move the test for no segments
|
||||
|
@ -9,3 +9,7 @@ Incompatible Changes from GTK+-1.2 to GTK+-1.4:
|
||||
match what we do for glib, and other similar cases.
|
||||
|
||||
- The detail arguments in the GtkStyleClass structure are now 'const gchar *'.
|
||||
|
||||
- gtk_paned_set_gutter_size() has been removed, since the small handle tab
|
||||
has been changed to include the entire area previously occupied by
|
||||
the gutter.
|
||||
|
235
gtk/gtkhpaned.c
235
gtk/gtkhpaned.c
@ -1,3 +1,4 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
@ -25,8 +26,6 @@
|
||||
*/
|
||||
|
||||
#include "gtkhpaned.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtksignal.h"
|
||||
|
||||
static void gtk_hpaned_class_init (GtkHPanedClass *klass);
|
||||
static void gtk_hpaned_init (GtkHPaned *hpaned);
|
||||
@ -37,11 +36,11 @@ static void gtk_hpaned_size_allocate (GtkWidget *widget,
|
||||
static void gtk_hpaned_draw (GtkWidget *widget,
|
||||
GdkRectangle *area);
|
||||
static void gtk_hpaned_xor_line (GtkPaned *paned);
|
||||
static gint gtk_hpaned_button_press (GtkWidget *widget,
|
||||
static gboolean gtk_hpaned_button_press (GtkWidget *widget,
|
||||
GdkEventButton *event);
|
||||
static gint gtk_hpaned_button_release (GtkWidget *widget,
|
||||
static gboolean gtk_hpaned_button_release (GtkWidget *widget,
|
||||
GdkEventButton *event);
|
||||
static gint gtk_hpaned_motion (GtkWidget *widget,
|
||||
static gboolean gtk_hpaned_motion (GtkWidget *widget,
|
||||
GdkEventMotion *event);
|
||||
|
||||
GtkType
|
||||
@ -74,7 +73,7 @@ gtk_hpaned_class_init (GtkHPanedClass *class)
|
||||
{
|
||||
GtkWidgetClass *widget_class;
|
||||
|
||||
widget_class = (GtkWidgetClass*) class;
|
||||
widget_class = (GtkWidgetClass *) class;
|
||||
|
||||
widget_class->size_request = gtk_hpaned_size_request;
|
||||
widget_class->size_allocate = gtk_hpaned_size_allocate;
|
||||
@ -87,9 +86,17 @@ gtk_hpaned_class_init (GtkHPanedClass *class)
|
||||
static void
|
||||
gtk_hpaned_init (GtkHPaned *hpaned)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
|
||||
g_return_if_fail (hpaned != NULL);
|
||||
g_return_if_fail (GTK_IS_PANED (hpaned));
|
||||
|
||||
paned = GTK_PANED (hpaned);
|
||||
|
||||
paned->cursor_type = GDK_SB_H_DOUBLE_ARROW;
|
||||
}
|
||||
|
||||
GtkWidget*
|
||||
GtkWidget *
|
||||
gtk_hpaned_new (void)
|
||||
{
|
||||
GtkHPaned *hpaned;
|
||||
@ -130,7 +137,7 @@ gtk_hpaned_size_request (GtkWidget *widget,
|
||||
requisition->width += child_requisition.width;
|
||||
}
|
||||
|
||||
requisition->width += GTK_CONTAINER (paned)->border_width * 2 + paned->gutter_size;
|
||||
requisition->width += GTK_CONTAINER (paned)->border_width * 2 + paned->handle_size;
|
||||
requisition->height += GTK_CONTAINER (paned)->border_width * 2;
|
||||
}
|
||||
|
||||
@ -143,7 +150,6 @@ gtk_hpaned_size_allocate (GtkWidget *widget,
|
||||
GtkRequisition child2_requisition;
|
||||
GtkAllocation child1_allocation;
|
||||
GtkAllocation child2_allocation;
|
||||
GdkRectangle old_groove_rectangle;
|
||||
guint16 border_width;
|
||||
|
||||
g_return_if_fail (widget != NULL);
|
||||
@ -167,63 +173,43 @@ gtk_hpaned_size_allocate (GtkWidget *widget,
|
||||
|
||||
gtk_paned_compute_position (paned,
|
||||
widget->allocation.width
|
||||
- paned->gutter_size
|
||||
- paned->handle_size
|
||||
- 2 * border_width,
|
||||
child1_requisition.width,
|
||||
child2_requisition.width);
|
||||
|
||||
/* Move the handle before the children so we don't get extra expose events */
|
||||
|
||||
paned->handle_xpos = paned->child1_size + border_width + paned->gutter_size / 2 - paned->handle_size / 2;
|
||||
paned->handle_ypos = allocation->height - border_width - 2*paned->handle_size;
|
||||
paned->handle_xpos = paned->child1_size + border_width;
|
||||
paned->handle_ypos = 0;
|
||||
paned->handle_width = paned->handle_size;
|
||||
paned->handle_height = widget->allocation.height;
|
||||
|
||||
if (GTK_WIDGET_REALIZED (widget))
|
||||
{
|
||||
gdk_window_move_resize (widget->window,
|
||||
allocation->x, allocation->y,
|
||||
allocation->width, allocation->height);
|
||||
allocation->width,
|
||||
allocation->height);
|
||||
|
||||
gdk_window_move (paned->handle, paned->handle_xpos, paned->handle_ypos);
|
||||
gdk_window_move_resize (paned->handle,
|
||||
paned->handle_xpos,
|
||||
paned->handle_ypos,
|
||||
paned->handle_size,
|
||||
paned->handle_height);
|
||||
}
|
||||
|
||||
child1_allocation.height = child2_allocation.height = MAX (1, (gint)allocation->height - border_width * 2);
|
||||
child1_allocation.height = child2_allocation.height = MAX (1, (gint) allocation->height - border_width * 2);
|
||||
child1_allocation.width = paned->child1_size;
|
||||
child1_allocation.x = border_width;
|
||||
child1_allocation.y = child2_allocation.y = border_width;
|
||||
|
||||
old_groove_rectangle = paned->groove_rectangle;
|
||||
|
||||
paned->groove_rectangle.x = child1_allocation.x
|
||||
+ child1_allocation.width + paned->gutter_size / 2 - 1;
|
||||
paned->groove_rectangle.y = 0;
|
||||
paned->groove_rectangle.width = 2;
|
||||
paned->groove_rectangle.height = allocation->height;
|
||||
|
||||
if (GTK_WIDGET_DRAWABLE (widget) &&
|
||||
((paned->groove_rectangle.x != old_groove_rectangle.x) ||
|
||||
(paned->groove_rectangle.y != old_groove_rectangle.y) ||
|
||||
(paned->groove_rectangle.width != old_groove_rectangle.width) ||
|
||||
(paned->groove_rectangle.height != old_groove_rectangle.height)))
|
||||
{
|
||||
gtk_widget_queue_clear_area (widget,
|
||||
old_groove_rectangle.x,
|
||||
old_groove_rectangle.y,
|
||||
old_groove_rectangle.width,
|
||||
old_groove_rectangle.height);
|
||||
gtk_widget_queue_draw_area (widget,
|
||||
paned->groove_rectangle.x,
|
||||
paned->groove_rectangle.y,
|
||||
paned->groove_rectangle.width,
|
||||
paned->groove_rectangle.height);
|
||||
}
|
||||
|
||||
child2_allocation.x = paned->groove_rectangle.x + paned->gutter_size / 2 + 1;
|
||||
child2_allocation.width = MAX (1, (gint)allocation->width
|
||||
- child2_allocation.x - border_width);
|
||||
child2_allocation.x = child1_allocation.x + child1_allocation.width + paned->handle_width;
|
||||
child2_allocation.width = MAX (1, (gint) allocation->width - child2_allocation.x - border_width);
|
||||
|
||||
/* Now allocate the childen, making sure, when resizing not to
|
||||
* overlap the windows */
|
||||
if (GTK_WIDGET_MAPPED(widget) &&
|
||||
if (GTK_WIDGET_MAPPED (widget) &&
|
||||
paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) &&
|
||||
paned->child1->allocation.width < child1_allocation.width)
|
||||
{
|
||||
@ -253,50 +239,95 @@ gtk_hpaned_draw (GtkWidget *widget,
|
||||
|
||||
if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget))
|
||||
{
|
||||
gint width, height;
|
||||
|
||||
paned = GTK_PANED (widget);
|
||||
border_width = GTK_CONTAINER (paned)->border_width;
|
||||
|
||||
gdk_window_clear_area (widget->window,
|
||||
area->x, area->y, area->width, area->height);
|
||||
|
||||
/* Redraw the handle
|
||||
*/
|
||||
gdk_window_get_size (paned->handle, &width, &height);
|
||||
area->x, area->y, area->width,
|
||||
area->height);
|
||||
|
||||
handle_area.x = paned->handle_xpos;
|
||||
handle_area.y = paned->handle_ypos;
|
||||
handle_area.width = width;
|
||||
handle_area.height = height;
|
||||
handle_area.width = paned->handle_size;
|
||||
handle_area.height = paned->handle_height;
|
||||
|
||||
if (gdk_rectangle_intersect (&handle_area, area, &child_area))
|
||||
{
|
||||
child_area.x -= handle_area.x;
|
||||
child_area.y -= handle_area.y;
|
||||
gtk_paint_box (widget->style, paned->handle,
|
||||
GTK_WIDGET_STATE(widget),
|
||||
GTK_SHADOW_OUT,
|
||||
&child_area, widget, "paned",
|
||||
0, 0,
|
||||
width, height);
|
||||
if (widget->allocation.height > 2)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_size/2,
|
||||
paned->handle_height/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_size/2 - 1,
|
||||
paned->handle_height/2 - 1);
|
||||
}
|
||||
if (widget->allocation.height > 11)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_size/2,
|
||||
paned->handle_height/2 + 5);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_size/2 - 1,
|
||||
paned->handle_height/2 + 4);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_size/2,
|
||||
paned->handle_height/2 - 5);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_size/2 - 1,
|
||||
paned->handle_height/2 - 6);
|
||||
}
|
||||
if (widget->allocation.height > 20)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_size/2,
|
||||
paned->handle_height/2 - 10);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_size/2 - 1,
|
||||
paned->handle_height/2 - 11);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_size/2,
|
||||
paned->handle_height/2 + 10);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_size/2 - 1,
|
||||
paned->handle_height/2 + 9);
|
||||
}
|
||||
if (widget->allocation.height > 30)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_size/2,
|
||||
paned->handle_height/2 - 15);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_size/2 - 1,
|
||||
paned->handle_height/2 - 16);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_size/2,
|
||||
paned->handle_height/2 + 15);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_size/2 - 1,
|
||||
paned->handle_height/2 + 14);
|
||||
}
|
||||
}
|
||||
|
||||
/* Redraw the groove
|
||||
*/
|
||||
gtk_paint_vline(widget->style, widget->window, GTK_STATE_NORMAL,
|
||||
area, widget, "hpaned",
|
||||
0, widget->allocation.height - 1,
|
||||
border_width + paned->child1_size + paned->gutter_size / 2 - 1);
|
||||
/* Redraw the children
|
||||
*/
|
||||
if (paned->child1 &&
|
||||
gtk_widget_intersect (paned->child1, area, &child_area))
|
||||
gtk_widget_draw (paned->child1, &child_area);
|
||||
if (paned->child2 &&
|
||||
gtk_widget_intersect (paned->child2, area, &child_area))
|
||||
gtk_widget_draw (paned->child2, &child_area);
|
||||
|
||||
if (paned->child1 && gtk_widget_intersect (paned->child1, area, &child_area))
|
||||
gtk_widget_draw(paned->child1, &child_area);
|
||||
if (paned->child2 && gtk_widget_intersect(paned->child2, area, &child_area))
|
||||
gtk_widget_draw(paned->child2, &child_area);
|
||||
}
|
||||
}
|
||||
|
||||
@ -315,12 +346,14 @@ gtk_hpaned_xor_line (GtkPaned *paned)
|
||||
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
|
||||
paned->xor_gc = gdk_gc_new_with_values (widget->window,
|
||||
&values,
|
||||
GDK_GC_FUNCTION |
|
||||
GDK_GC_SUBWINDOW);
|
||||
GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
|
||||
}
|
||||
|
||||
gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID,
|
||||
GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL);
|
||||
|
||||
xpos = paned->child1_size
|
||||
+ GTK_CONTAINER (paned)->border_width + paned->gutter_size / 2;
|
||||
+ GTK_CONTAINER (paned)->border_width + paned->handle_size / 2;
|
||||
|
||||
gdk_draw_line (widget->window, paned->xor_gc,
|
||||
xpos,
|
||||
@ -329,44 +362,49 @@ gtk_hpaned_xor_line (GtkPaned *paned)
|
||||
widget->allocation.height - 1);
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_hpaned_button_press (GtkWidget *widget, GdkEventButton *event)
|
||||
static gboolean
|
||||
gtk_hpaned_button_press (GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
|
||||
g_return_val_if_fail (widget != NULL,FALSE);
|
||||
g_return_val_if_fail (GTK_IS_PANED (widget),FALSE);
|
||||
g_return_val_if_fail (widget != NULL, FALSE);
|
||||
g_return_val_if_fail (GTK_IS_PANED (widget), FALSE);
|
||||
|
||||
paned = GTK_PANED (widget);
|
||||
|
||||
if (!paned->in_drag &&
|
||||
(event->window == paned->handle) && (event->button == 1))
|
||||
event->window == paned->handle && event->button == 1)
|
||||
{
|
||||
paned->in_drag = 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 */
|
||||
gdk_pointer_grab (paned->handle, FALSE,
|
||||
gdk_pointer_grab(paned->handle, FALSE,
|
||||
GDK_POINTER_MOTION_HINT_MASK
|
||||
| GDK_BUTTON1_MOTION_MASK
|
||||
| GDK_BUTTON_RELEASE_MASK,
|
||||
NULL, NULL, event->time);
|
||||
paned->child1_size += event->x - paned->handle_size / 2;
|
||||
paned->child1_size = CLAMP (paned->child1_size, 0,
|
||||
widget->allocation.width - paned->gutter_size
|
||||
widget->allocation.width
|
||||
- paned->handle_size
|
||||
- 2 * GTK_CONTAINER (paned)->border_width);
|
||||
gtk_hpaned_xor_line (paned);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_hpaned_button_release (GtkWidget *widget, GdkEventButton *event)
|
||||
static gboolean
|
||||
gtk_hpaned_button_release (GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
|
||||
g_return_val_if_fail (widget != NULL,FALSE);
|
||||
g_return_val_if_fail (GTK_IS_PANED (widget),FALSE);
|
||||
g_return_val_if_fail (widget != NULL, FALSE);
|
||||
g_return_val_if_fail (GTK_IS_PANED (widget), FALSE);
|
||||
|
||||
paned = GTK_PANED (widget);
|
||||
|
||||
@ -377,13 +415,16 @@ gtk_hpaned_button_release (GtkWidget *widget, GdkEventButton *event)
|
||||
paned->position_set = TRUE;
|
||||
gdk_pointer_ungrab (event->time);
|
||||
gtk_widget_queue_resize (GTK_WIDGET (paned));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_hpaned_motion (GtkWidget *widget, GdkEventMotion *event)
|
||||
static gboolean
|
||||
gtk_hpaned_motion (GtkWidget *widget,
|
||||
GdkEventMotion *event)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
gint x;
|
||||
@ -400,12 +441,10 @@ gtk_hpaned_motion (GtkWidget *widget, GdkEventMotion *event)
|
||||
|
||||
if (paned->in_drag)
|
||||
{
|
||||
gint size = x - GTK_CONTAINER (paned)->border_width - paned->gutter_size/2;
|
||||
gint size = x - GTK_CONTAINER (paned)->border_width - paned->handle_size / 2;
|
||||
|
||||
gtk_hpaned_xor_line (paned);
|
||||
paned->child1_size = CLAMP (size,
|
||||
paned->min_position,
|
||||
paned->max_position);
|
||||
paned->child1_size = CLAMP (size, paned->min_position, paned->max_position);
|
||||
gtk_hpaned_xor_line (paned);
|
||||
}
|
||||
|
||||
|
@ -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/.
|
||||
@ -27,16 +27,12 @@
|
||||
#ifndef __GTK_HPANED_H__
|
||||
#define __GTK_HPANED_H__
|
||||
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gtk/gtkpaned.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#define GTK_TYPE_HPANED (gtk_hpaned_get_type ())
|
||||
#define GTK_HPANED(obj) (GTK_CHECK_CAST ((obj), GTK_TYPE_HPANED, GtkHPaned))
|
||||
#define GTK_HPANED_CLASS(klass) (GTK_CHECK_CLASS_CAST ((klass), GTK_TYPE_HPANED, GtkHPanedClass))
|
||||
@ -58,14 +54,11 @@ struct _GtkHPanedClass
|
||||
GtkPanedClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
GtkType gtk_hpaned_get_type (void);
|
||||
GtkWidget* gtk_hpaned_new (void);
|
||||
|
||||
GtkWidget *gtk_hpaned_new (void);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif /* __GTK_HPANED_H__ */
|
||||
|
@ -251,6 +251,8 @@ gtk_option_menu_get_history (GtkOptionMenu *option_menu)
|
||||
|
||||
g_return_val_if_fail (GTK_IS_OPTION_MENU (option_menu), -1);
|
||||
|
||||
if (option_menu->menu)
|
||||
{
|
||||
active_widget = gtk_menu_get_active (GTK_MENU (option_menu->menu));
|
||||
|
||||
if (active_widget)
|
||||
@ -258,6 +260,9 @@ gtk_option_menu_get_history (GtkOptionMenu *option_menu)
|
||||
active_widget);
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
static void
|
||||
|
106
gtk/gtkpaned.c
106
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,8 +28,7 @@
|
||||
|
||||
enum {
|
||||
ARG_0,
|
||||
ARG_HANDLE_SIZE,
|
||||
ARG_GUTTER_SIZE
|
||||
ARG_HANDLE_SIZE
|
||||
};
|
||||
|
||||
static void gtk_paned_class_init (GtkPanedClass *klass);
|
||||
@ -56,7 +55,6 @@ static void gtk_paned_forall (GtkContainer *container,
|
||||
gpointer callback_data);
|
||||
static GtkType gtk_paned_child_type (GtkContainer *container);
|
||||
|
||||
|
||||
static GtkContainerClass *parent_class = NULL;
|
||||
|
||||
|
||||
@ -92,9 +90,9 @@ gtk_paned_class_init (GtkPanedClass *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);
|
||||
|
||||
@ -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_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);
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -177,9 +174,6 @@ gtk_paned_get_arg (GtkObject *object,
|
||||
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;
|
||||
@ -210,15 +204,15 @@ gtk_paned_realize (GtkWidget *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 |
|
||||
@ -316,15 +310,12 @@ gtk_paned_expose (GtkWidget *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,20 +323,15 @@ 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);
|
||||
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);
|
||||
}
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
@ -425,6 +411,7 @@ gtk_paned_pack2 (GtkPaned *paned,
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
gtk_paned_add (GtkContainer *container,
|
||||
GtkWidget *widget)
|
||||
@ -438,9 +425,9 @@ gtk_paned_add (GtkContainer *container,
|
||||
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
|
||||
@ -492,9 +479,9 @@ gtk_paned_forall (GtkContainer *container,
|
||||
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
|
||||
@ -516,7 +503,9 @@ gtk_paned_set_position (GtkPaned *paned,
|
||||
paned->position_set = TRUE;
|
||||
}
|
||||
else
|
||||
{
|
||||
paned->position_set = FALSE;
|
||||
}
|
||||
|
||||
gtk_widget_queue_resize (GTK_WIDGET (paned));
|
||||
}
|
||||
@ -525,37 +514,16 @@ 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);
|
||||
}
|
||||
gtk_widget_queue_resize (GTK_WIDGET (paned));
|
||||
|
||||
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));
|
||||
|
||||
paned->gutter_size = size;
|
||||
|
||||
if (GTK_WIDGET_VISIBLE (GTK_WIDGET (paned)))
|
||||
gtk_widget_queue_resize (GTK_WIDGET (paned));
|
||||
}
|
||||
|
||||
void
|
||||
gtk_paned_compute_position (GtkPaned *paned,
|
||||
gtk_paned_compute_position(GtkPaned *paned,
|
||||
gint allocation,
|
||||
gint child1_req,
|
||||
gint child2_req)
|
||||
@ -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;
|
||||
|
||||
}
|
||||
|
@ -1,3 +1,4 @@
|
||||
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */
|
||||
/* GTK - The GIMP Toolkit
|
||||
* Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
|
||||
*
|
||||
@ -18,7 +19,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/.
|
||||
@ -27,11 +28,8 @@
|
||||
#ifndef __GTK_PANED_H__
|
||||
#define __GTK_PANED_H__
|
||||
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gtk/gtkcontainer.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
@ -56,14 +54,16 @@ struct _GtkPaned
|
||||
GtkWidget *child2;
|
||||
|
||||
GdkWindow *handle;
|
||||
GdkRectangle groove_rectangle;
|
||||
GdkGC *xor_gc;
|
||||
GdkCursorType cursor_type;
|
||||
|
||||
/*< public >*/
|
||||
guint16 handle_size;
|
||||
guint16 gutter_size;
|
||||
|
||||
/*< private >*/
|
||||
guint16 handle_width;
|
||||
guint16 handle_height;
|
||||
|
||||
gint child1_size;
|
||||
gint last_allocation;
|
||||
gint min_position;
|
||||
@ -103,18 +103,14 @@ void gtk_paned_set_position (GtkPaned *paned,
|
||||
gint position);
|
||||
void gtk_paned_set_handle_size (GtkPaned *paned,
|
||||
guint16 size);
|
||||
void gtk_paned_set_gutter_size (GtkPaned *paned,
|
||||
guint16 size);
|
||||
|
||||
/* Internal function */
|
||||
void gtk_paned_compute_position (GtkPaned *paned,
|
||||
gint allocation,
|
||||
gint child1_req,
|
||||
gint child2_req);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif /* __GTK_PANED_H__ */
|
||||
|
251
gtk/gtkvpaned.c
251
gtk/gtkvpaned.c
@ -25,8 +25,6 @@
|
||||
*/
|
||||
|
||||
#include "gtkvpaned.h"
|
||||
#include "gtkmain.h"
|
||||
#include "gtksignal.h"
|
||||
|
||||
static void gtk_vpaned_class_init (GtkVPanedClass *klass);
|
||||
static void gtk_vpaned_init (GtkVPaned *vpaned);
|
||||
@ -37,11 +35,11 @@ static void gtk_vpaned_size_allocate (GtkWidget *widget,
|
||||
static void gtk_vpaned_draw (GtkWidget *widget,
|
||||
GdkRectangle *area);
|
||||
static void gtk_vpaned_xor_line (GtkPaned *paned);
|
||||
static gint gtk_vpaned_button_press (GtkWidget *widget,
|
||||
static gboolean gtk_vpaned_button_press (GtkWidget *widget,
|
||||
GdkEventButton *event);
|
||||
static gint gtk_vpaned_button_release (GtkWidget *widget,
|
||||
static gboolean gtk_vpaned_button_release (GtkWidget *widget,
|
||||
GdkEventButton *event);
|
||||
static gint gtk_vpaned_motion (GtkWidget *widget,
|
||||
static gboolean gtk_vpaned_motion (GtkWidget *widget,
|
||||
GdkEventMotion *event);
|
||||
|
||||
GtkType
|
||||
@ -63,7 +61,7 @@ gtk_vpaned_get_type (void)
|
||||
(GtkClassInitFunc) NULL,
|
||||
};
|
||||
|
||||
vpaned_type = gtk_type_unique (GTK_TYPE_PANED, &vpaned_info);
|
||||
vpaned_type = gtk_type_unique(gtk_paned_get_type(), &vpaned_info);
|
||||
}
|
||||
|
||||
return vpaned_type;
|
||||
@ -74,7 +72,7 @@ gtk_vpaned_class_init (GtkVPanedClass *class)
|
||||
{
|
||||
GtkWidgetClass *widget_class;
|
||||
|
||||
widget_class = (GtkWidgetClass*) class;
|
||||
widget_class = (GtkWidgetClass *) class;
|
||||
|
||||
widget_class->size_request = gtk_vpaned_size_request;
|
||||
widget_class->size_allocate = gtk_vpaned_size_allocate;
|
||||
@ -87,9 +85,17 @@ gtk_vpaned_class_init (GtkVPanedClass *class)
|
||||
static void
|
||||
gtk_vpaned_init (GtkVPaned *vpaned)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
|
||||
g_return_if_fail (vpaned != NULL);
|
||||
g_return_if_fail (GTK_IS_PANED (vpaned));
|
||||
|
||||
paned = GTK_PANED (vpaned);
|
||||
|
||||
paned->cursor_type = GDK_SB_V_DOUBLE_ARROW;
|
||||
}
|
||||
|
||||
GtkWidget*
|
||||
GtkWidget *
|
||||
gtk_vpaned_new (void)
|
||||
{
|
||||
GtkVPaned *vpaned;
|
||||
@ -130,7 +136,7 @@ gtk_vpaned_size_request (GtkWidget *widget,
|
||||
requisition->height += child_requisition.height;
|
||||
}
|
||||
|
||||
requisition->height += GTK_CONTAINER (paned)->border_width * 2 + paned->gutter_size;
|
||||
requisition->height += GTK_CONTAINER (paned)->border_width * 2 + paned->handle_size;
|
||||
requisition->width += GTK_CONTAINER (paned)->border_width * 2;
|
||||
}
|
||||
|
||||
@ -143,7 +149,6 @@ gtk_vpaned_size_allocate (GtkWidget *widget,
|
||||
GtkRequisition child2_requisition;
|
||||
GtkAllocation child1_allocation;
|
||||
GtkAllocation child2_allocation;
|
||||
GdkRectangle old_groove_rectangle;
|
||||
guint16 border_width;
|
||||
|
||||
g_return_if_fail (widget != NULL);
|
||||
@ -165,78 +170,58 @@ gtk_vpaned_size_allocate (GtkWidget *widget,
|
||||
else
|
||||
child2_requisition.height = 0;
|
||||
|
||||
gtk_paned_compute_position (paned,
|
||||
gtk_paned_compute_position(paned,
|
||||
widget->allocation.height
|
||||
- paned->gutter_size
|
||||
- paned->handle_size
|
||||
- 2 * border_width,
|
||||
child1_requisition.height,
|
||||
child2_requisition.height);
|
||||
|
||||
/* Move the handle before the children so we don't get extra expose events */
|
||||
|
||||
paned->handle_xpos = allocation->width - border_width - 2 * paned->handle_size;
|
||||
paned->handle_ypos = paned->child1_size + border_width + paned->gutter_size / 2 - paned->handle_size / 2;
|
||||
paned->handle_xpos = 0;
|
||||
paned->handle_ypos = paned->child1_size + border_width;
|
||||
paned->handle_width = widget->allocation.width;
|
||||
paned->handle_height = paned->handle_size;
|
||||
|
||||
if (GTK_WIDGET_REALIZED (widget))
|
||||
if (GTK_WIDGET_REALIZED(widget))
|
||||
{
|
||||
gdk_window_move_resize (widget->window,
|
||||
allocation->x, allocation->y,
|
||||
allocation->width, allocation->height);
|
||||
allocation->width,
|
||||
allocation->height);
|
||||
|
||||
gdk_window_move (paned->handle, paned->handle_xpos, paned->handle_ypos);
|
||||
gdk_window_move_resize (paned->handle,
|
||||
paned->handle_xpos,
|
||||
paned->handle_ypos,
|
||||
paned->handle_width,
|
||||
paned->handle_size);
|
||||
}
|
||||
|
||||
child1_allocation.width = child2_allocation.width = MAX (1, (gint)allocation->width - border_width * 2);
|
||||
child1_allocation.width = child2_allocation.width = MAX(1, (gint) allocation->width - border_width * 2);
|
||||
child1_allocation.height = paned->child1_size;
|
||||
child1_allocation.x = child2_allocation.x = border_width;
|
||||
child1_allocation.y = border_width;
|
||||
|
||||
old_groove_rectangle = paned->groove_rectangle;
|
||||
|
||||
paned->groove_rectangle.y = child1_allocation.y
|
||||
+ child1_allocation.height + paned->gutter_size / 2 - 1;
|
||||
paned->groove_rectangle.x = 0;
|
||||
paned->groove_rectangle.height = 2;
|
||||
paned->groove_rectangle.width = allocation->width;
|
||||
|
||||
if (GTK_WIDGET_DRAWABLE (widget) &&
|
||||
((paned->groove_rectangle.x != old_groove_rectangle.x) ||
|
||||
(paned->groove_rectangle.y != old_groove_rectangle.y) ||
|
||||
(paned->groove_rectangle.width != old_groove_rectangle.width) ||
|
||||
(paned->groove_rectangle.height != old_groove_rectangle.height)))
|
||||
{
|
||||
gtk_widget_queue_clear_area (widget,
|
||||
old_groove_rectangle.x,
|
||||
old_groove_rectangle.y,
|
||||
old_groove_rectangle.width,
|
||||
old_groove_rectangle.height);
|
||||
gtk_widget_queue_draw_area (widget,
|
||||
paned->groove_rectangle.x,
|
||||
paned->groove_rectangle.y,
|
||||
paned->groove_rectangle.width,
|
||||
paned->groove_rectangle.height);
|
||||
}
|
||||
|
||||
child2_allocation.y = paned->groove_rectangle.y + paned->gutter_size / 2 + 1;
|
||||
child2_allocation.height = MAX (1, (gint)allocation->height
|
||||
- child2_allocation.y - border_width);
|
||||
child2_allocation.y = child1_allocation.y + child1_allocation.height + paned->handle_height;
|
||||
child2_allocation.height = MAX(1, (gint) allocation->height - child2_allocation.y - border_width);
|
||||
|
||||
/* Now allocate the childen, making sure, when resizing not to
|
||||
* overlap the windows */
|
||||
if (GTK_WIDGET_MAPPED(widget) &&
|
||||
if (GTK_WIDGET_MAPPED (widget) &&
|
||||
paned->child1 && GTK_WIDGET_VISIBLE (paned->child1) &&
|
||||
paned->child1->allocation.height < child1_allocation.height)
|
||||
{
|
||||
if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
|
||||
gtk_widget_size_allocate (paned->child2, &child2_allocation);
|
||||
gtk_widget_size_allocate (paned->child1, &child1_allocation);
|
||||
gtk_widget_size_allocate(paned->child2, &child2_allocation);
|
||||
gtk_widget_size_allocate(paned->child1, &child1_allocation);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (paned->child1 && GTK_WIDGET_VISIBLE (paned->child1))
|
||||
gtk_widget_size_allocate (paned->child1, &child1_allocation);
|
||||
gtk_widget_size_allocate(paned->child1, &child1_allocation);
|
||||
if (paned->child2 && GTK_WIDGET_VISIBLE (paned->child2))
|
||||
gtk_widget_size_allocate (paned->child2, &child2_allocation);
|
||||
gtk_widget_size_allocate(paned->child2, &child2_allocation);
|
||||
}
|
||||
}
|
||||
|
||||
@ -253,51 +238,95 @@ gtk_vpaned_draw (GtkWidget *widget,
|
||||
|
||||
if (GTK_WIDGET_VISIBLE (widget) && GTK_WIDGET_MAPPED (widget))
|
||||
{
|
||||
gint width, height;
|
||||
|
||||
paned = GTK_PANED (widget);
|
||||
border_width = GTK_CONTAINER (paned)->border_width;
|
||||
|
||||
gdk_window_clear_area (widget->window,
|
||||
area->x, area->y, area->width, area->height);
|
||||
|
||||
/* Redraw the handle
|
||||
*/
|
||||
gdk_window_get_size (paned->handle, &width, &height);
|
||||
area->x, area->y, area->width,
|
||||
area->height);
|
||||
|
||||
handle_area.x = paned->handle_xpos;
|
||||
handle_area.y = paned->handle_ypos;
|
||||
handle_area.width = width;
|
||||
handle_area.height = height;
|
||||
handle_area.width = paned->handle_height;
|
||||
handle_area.height = paned->handle_size;
|
||||
|
||||
if (gdk_rectangle_intersect (&handle_area, area, &child_area))
|
||||
{
|
||||
child_area.x -= handle_area.x;
|
||||
child_area.y -= handle_area.y;
|
||||
gtk_paint_box (widget->style, paned->handle,
|
||||
GTK_WIDGET_STATE(widget),
|
||||
GTK_SHADOW_OUT,
|
||||
&child_area, widget, "paned",
|
||||
0, 0,
|
||||
width, height);
|
||||
if (widget->allocation.height > 2)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_width/2,
|
||||
paned->handle_size/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_width/2 - 1,
|
||||
paned->handle_size/2 - 1);
|
||||
}
|
||||
if (widget->allocation.height > 11)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_width/2 + 5,
|
||||
paned->handle_size/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_width/2 + 4,
|
||||
paned->handle_size/2 - 1);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_width/2 - 5,
|
||||
paned->handle_size/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_width/2 - 6,
|
||||
paned->handle_size/2 - 1);
|
||||
}
|
||||
if (widget->allocation.height > 20)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_width/2 - 10,
|
||||
paned->handle_size/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_width/2 - 11,
|
||||
paned->handle_size/2 - 1);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_width/2 + 10,
|
||||
paned->handle_size/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_width/2 + 9,
|
||||
paned->handle_size/2 - 1);
|
||||
}
|
||||
if (widget->allocation.height > 30)
|
||||
{
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_width/2 - 15,
|
||||
paned->handle_size/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_width/2 - 16,
|
||||
paned->handle_size/2 - 1);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->fg_gc[GTK_STATE_NORMAL],
|
||||
paned->handle_width/2 + 15,
|
||||
paned->handle_size/2);
|
||||
gdk_draw_point (paned->handle,
|
||||
widget->style->bg_gc[GTK_STATE_PRELIGHT],
|
||||
paned->handle_width/2 + 14,
|
||||
paned->handle_size/2 - 1);
|
||||
}
|
||||
}
|
||||
|
||||
/* Redraw the groove
|
||||
*/
|
||||
gtk_paint_hline(widget->style, widget->window, GTK_STATE_NORMAL,
|
||||
area, widget, "vpaned",
|
||||
0, widget->allocation.width - 1,
|
||||
border_width + paned->child1_size + paned->gutter_size / 2 - 1);
|
||||
|
||||
/* Redraw the children
|
||||
*/
|
||||
if (paned->child1 &&
|
||||
gtk_widget_intersect (paned->child1, area, &child_area))
|
||||
if (paned->child1 && gtk_widget_intersect (paned->child1, area, &child_area))
|
||||
gtk_widget_draw (paned->child1, &child_area);
|
||||
if (paned->child2 &&
|
||||
gtk_widget_intersect (paned->child2, area, &child_area))
|
||||
if (paned->child2 && gtk_widget_intersect (paned->child2, area, &child_area))
|
||||
gtk_widget_draw (paned->child2, &child_area);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@ -308,7 +337,7 @@ gtk_vpaned_xor_line (GtkPaned *paned)
|
||||
GdkGCValues values;
|
||||
guint16 ypos;
|
||||
|
||||
widget = GTK_WIDGET(paned);
|
||||
widget = GTK_WIDGET (paned);
|
||||
|
||||
if (!paned->xor_gc)
|
||||
{
|
||||
@ -316,12 +345,14 @@ gtk_vpaned_xor_line (GtkPaned *paned)
|
||||
values.subwindow_mode = GDK_INCLUDE_INFERIORS;
|
||||
paned->xor_gc = gdk_gc_new_with_values (widget->window,
|
||||
&values,
|
||||
GDK_GC_FUNCTION |
|
||||
GDK_GC_SUBWINDOW);
|
||||
GDK_GC_FUNCTION | GDK_GC_SUBWINDOW);
|
||||
}
|
||||
|
||||
gdk_gc_set_line_attributes (paned->xor_gc, 2, GDK_LINE_SOLID,
|
||||
GDK_CAP_NOT_LAST, GDK_JOIN_BEVEL);
|
||||
|
||||
ypos = paned->child1_size
|
||||
+ GTK_CONTAINER (paned)->border_width + paned->gutter_size / 2;
|
||||
+ GTK_CONTAINER (paned)->border_width + paned->handle_size / 2;
|
||||
|
||||
gdk_draw_line (widget->window, paned->xor_gc,
|
||||
0,
|
||||
@ -330,13 +361,14 @@ gtk_vpaned_xor_line (GtkPaned *paned)
|
||||
ypos);
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_vpaned_button_press (GtkWidget *widget, GdkEventButton *event)
|
||||
static gboolean
|
||||
gtk_vpaned_button_press (GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
|
||||
g_return_val_if_fail (widget != NULL,FALSE);
|
||||
g_return_val_if_fail (GTK_IS_PANED (widget),FALSE);
|
||||
g_return_val_if_fail (widget != NULL, FALSE);
|
||||
g_return_val_if_fail (GTK_IS_PANED (widget), FALSE);
|
||||
|
||||
paned = GTK_PANED (widget);
|
||||
|
||||
@ -349,20 +381,24 @@ gtk_vpaned_button_press (GtkWidget *widget, GdkEventButton *event)
|
||||
gdk_pointer_grab (paned->handle, FALSE,
|
||||
GDK_POINTER_MOTION_HINT_MASK
|
||||
| GDK_BUTTON1_MOTION_MASK
|
||||
| GDK_BUTTON_RELEASE_MASK,
|
||||
NULL, NULL, event->time);
|
||||
| GDK_BUTTON_RELEASE_MASK, NULL, NULL,
|
||||
event->time);
|
||||
paned->child1_size += event->y - paned->handle_size / 2;
|
||||
paned->child1_size = CLAMP (paned->child1_size, 0,
|
||||
widget->allocation.height - paned->gutter_size
|
||||
- 2 * GTK_CONTAINER (paned)->border_width);
|
||||
gtk_vpaned_xor_line (paned);
|
||||
}
|
||||
widget->allocation.height -
|
||||
paned->handle_size -
|
||||
2 * GTK_CONTAINER (paned)->border_width);
|
||||
gtk_vpaned_xor_line(paned);
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_vpaned_button_release (GtkWidget *widget, GdkEventButton *event)
|
||||
static gboolean
|
||||
gtk_vpaned_button_release (GtkWidget *widget,
|
||||
GdkEventButton *event)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
|
||||
@ -378,13 +414,16 @@ gtk_vpaned_button_release (GtkWidget *widget, GdkEventButton *event)
|
||||
paned->position_set = TRUE;
|
||||
gdk_pointer_ungrab (event->time);
|
||||
gtk_widget_queue_resize (GTK_WIDGET (paned));
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
static gint
|
||||
gtk_vpaned_motion (GtkWidget *widget, GdkEventMotion *event)
|
||||
static gboolean
|
||||
gtk_vpaned_motion (GtkWidget *widget,
|
||||
GdkEventMotion *event)
|
||||
{
|
||||
GtkPaned *paned;
|
||||
gint y;
|
||||
@ -393,7 +432,7 @@ gtk_vpaned_motion (GtkWidget *widget, GdkEventMotion *event)
|
||||
g_return_val_if_fail (GTK_IS_PANED (widget), FALSE);
|
||||
|
||||
if (event->is_hint || event->window != widget->window)
|
||||
gtk_widget_get_pointer(widget, NULL, &y);
|
||||
gtk_widget_get_pointer (widget, NULL, &y);
|
||||
else
|
||||
y = event->y;
|
||||
|
||||
@ -401,13 +440,11 @@ gtk_vpaned_motion (GtkWidget *widget, GdkEventMotion *event)
|
||||
|
||||
if (paned->in_drag)
|
||||
{
|
||||
gint size = y - GTK_CONTAINER (paned)->border_width - paned->gutter_size/2;
|
||||
gint size = y - GTK_CONTAINER(paned)->border_width - paned->handle_size / 2;
|
||||
|
||||
gtk_vpaned_xor_line (paned);
|
||||
paned->child1_size = CLAMP (size,
|
||||
paned->min_position,
|
||||
paned->max_position);
|
||||
gtk_vpaned_xor_line (paned);
|
||||
paned->child1_size = CLAMP (size, paned->min_position, paned->max_position);
|
||||
gtk_vpaned_xor_line(paned);
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
|
@ -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/.
|
||||
@ -27,11 +27,8 @@
|
||||
#ifndef __GTK_VPANED_H__
|
||||
#define __GTK_VPANED_H__
|
||||
|
||||
|
||||
#include <gdk/gdk.h>
|
||||
#include <gtk/gtkpaned.h>
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif /* __cplusplus */
|
||||
@ -58,14 +55,12 @@ struct _GtkVPanedClass
|
||||
GtkPanedClass parent_class;
|
||||
};
|
||||
|
||||
|
||||
GtkType gtk_vpaned_get_type (void);
|
||||
GtkWidget* gtk_vpaned_new (void);
|
||||
GtkWidget *gtk_vpaned_new (void);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif /* __cplusplus */
|
||||
|
||||
|
||||
#endif /* __GTK_VPANED_H__ */
|
||||
|
Loading…
Reference in New Issue
Block a user