summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2008-06-07 22:13:29 -0400
committerSøren Sandmann <sandmann@redhat.com>2008-06-07 22:13:29 -0400
commit8b2329b89ad8730e2c5825523c1569958964d22b (patch)
tree773b573606447e8eec62ffb1c94a26c2e330e3eb
parent548310edfa010e0a457eb1734fa0dad98ba2a267 (diff)
Better resizing
-rw-r--r--main.c13
-rw-r--r--scrollarea.c15
-rw-r--r--scrollarea.h109
3 files changed, 90 insertions, 47 deletions
diff --git a/main.c b/main.c
index 893f567..80aa2c4 100644
--- a/main.c
+++ b/main.c
@@ -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