diff options
author | Søren Sandmann <sandmann@redhat.com> | 2008-06-07 22:13:29 -0400 |
---|---|---|
committer | Søren Sandmann <sandmann@redhat.com> | 2008-06-07 22:13:29 -0400 |
commit | 8b2329b89ad8730e2c5825523c1569958964d22b (patch) | |
tree | 773b573606447e8eec62ffb1c94a26c2e330e3eb | |
parent | 548310edfa010e0a457eb1734fa0dad98ba2a267 (diff) |
Better resizing
-rw-r--r-- | main.c | 13 | ||||
-rw-r--r-- | scrollarea.c | 15 | ||||
-rw-r--r-- | scrollarea.h | 109 |
3 files changed, 90 insertions, 47 deletions
@@ -13,6 +13,7 @@ typedef struct GtkWidget * main_area; GtkWidget * thumbnails; Deck * deck; + int nth_slide; } App; static void * @@ -79,7 +80,7 @@ on_main_viewport_size_changed (FooScrollArea *scroll_area, if (old_viewport) { - int nth_slide = deck_get_view_slide (app->deck, old_viewport); + int nth_slide = app->nth_slide; /* deck_get_view_slide (app->deck, old_viewport); */ int old_location = deck_get_slide_location (app->deck, old_viewport, nth_slide); int new_location = deck_get_slide_location (app->deck, new_viewport, nth_slide); foo_scroll_area_set_size_fixed_y (scroll_area, new_viewport->width, @@ -98,8 +99,16 @@ on_main_viewport_size_changed (FooScrollArea *scroll_area, static void on_viewport_changed (FooScrollArea *scroll_area, GdkRectangle *viewport, - GdkRectangle *old_viewport) + GdkRectangle *old_viewport, + gpointer data) { + if (!foo_scroll_area_is_resizing (scroll_area)) + { + App *app = data; + + app->nth_slide = deck_get_view_slide (app->deck, viewport); + g_print ("nth: %d\n", app->nth_slide); + } } static void diff --git a/scrollarea.c b/scrollarea.c index d5514cd..2c14070 100644 --- a/scrollarea.c +++ b/scrollarea.c @@ -6,6 +6,7 @@ #include "backingstore.h" + G_DEFINE_TYPE (FooScrollArea, foo_scroll_area, GTK_TYPE_CONTAINER); static GtkWidgetClass *parent_class; @@ -79,6 +80,8 @@ struct FooScrollAreaPrivate BackingStore *store; guint32 motion_notify_time; + + gboolean in_size_allocate; }; enum @@ -775,6 +778,8 @@ foo_scroll_area_size_allocate (GtkWidget *widget, GdkRectangle new_viewport; GdkRectangle old_viewport; + scroll_area->priv->in_size_allocate = TRUE; + get_viewport (scroll_area, &old_viewport); widget->allocation = *allocation; @@ -797,10 +802,18 @@ foo_scroll_area_size_allocate (GtkWidget *widget, } set_adjustment_values (scroll_area); - + get_viewport (scroll_area, &new_viewport); emit_viewport_signals (scroll_area, &new_viewport, &old_viewport); + + scroll_area->priv->in_size_allocate = FALSE; +} + +gboolean +foo_scroll_area_is_resizing (FooScrollArea *area) +{ + return area->priv->in_size_allocate; } static void diff --git a/scrollarea.h b/scrollarea.h index 1ce1528..623c02b 100644 --- a/scrollarea.h +++ b/scrollarea.h @@ -64,54 +64,75 @@ struct FooScrollAreaClass GdkRegion *region); }; -GType foo_scroll_area_get_type (void); +GType foo_scroll_area_get_type (void); +FooScrollArea *foo_scroll_area_new (void); -FooScrollArea *foo_scroll_area_new (void); +/* Resizing + */ /* Set the requisition for the widget. */ -void foo_scroll_area_set_min_size (FooScrollArea *scroll_area, - int min_width, - int min_height); +void foo_scroll_area_set_min_size (FooScrollArea *scroll_area, + int min_width, + int min_height); /* Set how much of the canvas can be scrolled into view */ -void foo_scroll_area_set_size (FooScrollArea *scroll_area, - int width, - int height); -void foo_scroll_area_set_size_fixed_y (FooScrollArea *scroll_area, - int width, - int height, - int old_y, - int new_y); -void foo_scroll_area_set_viewport_pos (FooScrollArea *scroll_area, - int x, - int y); -void foo_scroll_area_get_viewport (FooScrollArea *scroll_area, - GdkRectangle *viewport); -void foo_scroll_area_add_input_from_stroke (FooScrollArea *scroll_area, - cairo_t *cr, - FooScrollAreaEventFunc func, - gpointer data); -void foo_scroll_area_add_input_from_fill (FooScrollArea *scroll_area, - cairo_t *cr, - FooScrollAreaEventFunc func, - gpointer data); -void foo_scroll_area_invalidate_region (FooScrollArea *area, - GdkRegion *region); -void foo_scroll_area_invalidate (FooScrollArea *scroll_area); -void foo_scroll_area_invalidate_rect (FooScrollArea *scroll_area, - int x, - int y, - int width, - int height); -void foo_scroll_area_begin_grab (FooScrollArea *scroll_area, - FooScrollAreaEventFunc func, - gpointer input_data); -void foo_scroll_area_end_grab (FooScrollArea *scroll_area); -gboolean foo_scroll_area_is_grabbed (FooScrollArea *scroll_area); - -void foo_scroll_area_begin_auto_scroll (FooScrollArea *scroll_area); -void foo_scroll_area_auto_scroll (FooScrollArea *scroll_area, - FooScrollAreaEvent *event); -void foo_scroll_area_end_auto_scroll (FooScrollArea *scroll_area); +void foo_scroll_area_set_size (FooScrollArea *scroll_area, + int width, + int height); +void foo_scroll_area_set_size_fixed_y (FooScrollArea *scroll_area, + int width, + int height, + int old_y, + int new_y); +void foo_scroll_area_set_viewport_pos (FooScrollArea *scroll_area, + int x, + int y); +void foo_scroll_area_get_viewport (FooScrollArea *scroll_area, + GdkRectangle *viewport); + +/* When the viewport_{size}_changed signals are emitted, this can be + * called to determine if the viewport change happened as a result of + * a resize. (Looking at the old and new size is insufficient because + * resizing may cause more than one viewport change. + */ +gboolean foo_scroll_area_is_resizing (FooScrollArea *scroll_area); + +/* Input + */ +void foo_scroll_area_add_input_from_stroke (FooScrollArea *scroll_area, + cairo_t *cr, + FooScrollAreaEventFunc func, + gpointer data); +void foo_scroll_area_add_input_from_fill (FooScrollArea *scroll_area, + cairo_t *cr, + FooScrollAreaEventFunc func, + gpointer data); + +/* Invalidate + */ +void foo_scroll_area_invalidate_region (FooScrollArea *area, + GdkRegion *region); +void foo_scroll_area_invalidate (FooScrollArea *scroll_area); +void foo_scroll_area_invalidate_rect (FooScrollArea *scroll_area, + int x, + int y, + int width, + int height); + +/* Grabbing + */ +void foo_scroll_area_begin_grab (FooScrollArea *scroll_area, + FooScrollAreaEventFunc func, + gpointer input_data); +void foo_scroll_area_end_grab (FooScrollArea *scroll_area); +gboolean foo_scroll_area_is_grabbed (FooScrollArea *scroll_area); + +/* Auto scroll + */ +void foo_scroll_area_begin_auto_scroll (FooScrollArea *scroll_area); +void foo_scroll_area_auto_scroll (FooScrollArea *scroll_area, + FooScrollAreaEvent *event); +void foo_scroll_area_end_auto_scroll (FooScrollArea *scroll_area); + #endif |