summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSøren Sandmann <sandmann@redhat.com>2008-06-07 17:48:04 -0400
committerSøren Sandmann <sandmann@redhat.com>2008-06-07 17:48:04 -0400
commit7b9a2aa438c2eed48c81846750a02ba8be5cd1db (patch)
treec904c627ff6038daac4ff096695b9b68f502abfd
parent7f433ba31d6ec006fa4f7af81de3b6ac89c6355f (diff)
Move more stuff to deck.[ch]
-rw-r--r--backingstore.c2
-rwxr-xr-xbuild.sh3
-rw-r--r--deck.c91
-rw-r--r--deck.h27
-rw-r--r--main.c63
-rw-r--r--scrollarea.c28
-rw-r--r--scrollarea.h5
7 files changed, 159 insertions, 60 deletions
diff --git a/backingstore.c b/backingstore.c
index 5e040c4..e52377b 100644
--- a/backingstore.c
+++ b/backingstore.c
@@ -81,6 +81,7 @@ backing_store_scroll (BackingStore *store,
gdk_region_union_with_rect (store->update_region, &rect);
}
+#if 0
static void
print_region (const char *header, GdkRegion *region)
{
@@ -100,6 +101,7 @@ print_region (const char *header, GdkRegion *region)
g_free (rects);
}
+#endif
void
backing_store_invalidate_rect (BackingStore *store,
diff --git a/build.sh b/build.sh
index b6662d6..834c21a 100755
--- a/build.sh
+++ b/build.sh
@@ -5,4 +5,5 @@ gcc -Wall -g \
scrollarea.c \
foo-marshal.c \
main.c \
- backingstore.c \ No newline at end of file
+ backingstore.c \
+ deck.c
diff --git a/deck.c b/deck.c
new file mode 100644
index 0000000..c2d462f
--- /dev/null
+++ b/deck.c
@@ -0,0 +1,91 @@
+#include "deck.h"
+
+#define MARGIN 20
+#define RATIO 1.414
+#define N_SLIDES 10
+
+struct Deck
+{
+ DeckChangeNotify notify; /* Called on slide add/delete/reorder */
+ gpointer data;
+};
+
+Deck *
+deck_new (DeckChangeNotify notify,
+ gpointer data)
+{
+ Deck *deck = g_new0 (Deck, 1);
+
+ deck->notify = notify;
+ deck->data = data;
+
+ return deck;
+}
+
+static int
+get_slide_height (Deck *deck,
+ GdkRectangle *viewport)
+{
+ return (viewport->width - 2 * MARGIN) / RATIO;
+}
+
+void
+deck_paint (Deck *deck,
+ FooScrollArea *area,
+ cairo_t *cr)
+{
+ int height;
+ int i;
+ GdkRectangle viewport;
+
+ foo_scroll_area_get_viewport (area, &viewport);
+
+ height = get_slide_height (deck, &viewport);
+
+ cairo_move_to (cr, MARGIN, MARGIN);
+
+ for (i = 0; i < N_SLIDES; ++i)
+ {
+ cairo_move_to (cr, MARGIN, MARGIN + i * (MARGIN + height));
+
+ cairo_set_source_rgba (cr, 1, 1, 1, 1);
+
+ cairo_rel_line_to (cr, viewport.width - 2 * MARGIN, 0);
+ cairo_rel_line_to (cr, 0, height);
+ cairo_rel_line_to (cr, -(viewport.width - 2 * MARGIN), 0);
+ cairo_close_path (cr);
+
+ cairo_fill_preserve (cr);
+
+ cairo_set_source_rgba (cr, 0, 0, 0, 0.5);
+ cairo_set_line_width (cr, 2);
+ cairo_stroke (cr);
+
+ }
+}
+
+/* Returns the slide the user is likely looking
+ * at, given the viewport.
+ */
+int
+deck_get_view_slide (Deck *deck,
+ GdkRectangle *viewport)
+{
+ int slide_height = get_slide_height (deck, viewport);
+
+ /* Compute the y-coordinate of the first visible top edge of a slide */
+ return (viewport->y - MARGIN) / (MARGIN + slide_height) + 1;
+}
+
+/* Returns the y coordinate of the nth slide given
+ * the viewport
+ */
+int
+deck_get_slide_location (Deck *deck,
+ GdkRectangle *viewport,
+ int nth_slide)
+{
+ int slide_height = get_slide_height (deck, viewport);
+
+ return nth_slide * (MARGIN + slide_height) + MARGIN;
+}
diff --git a/deck.h b/deck.h
index 3d6b299..b13eb89 100644
--- a/deck.h
+++ b/deck.h
@@ -3,10 +3,23 @@
typedef struct Deck Deck;
typedef struct Slide Slide;
-Deck *deck_new (void);
-int deck_get_height (Deck *deck,
- int width);
-void deck_paint (Deck *deck,
- FooScrollArea *area,
- cairo_t *cr,
- int width);
+typedef void (* DeckChangeNotify) (gpointer data);
+
+Deck *deck_new (DeckChangeNotify notify,
+ gpointer data);
+void deck_paint (Deck *deck,
+ FooScrollArea *area,
+ cairo_t *cr);
+/* Returns the slide the user is likely looking
+ * at, given the viewport.
+ */
+int
+deck_get_view_slide (Deck *deck,
+ GdkRectangle *viewport);
+/* Returns the y coordinate of the nth slide given
+ * the width of the viewport
+ */
+int
+deck_get_slide_location (Deck *deck,
+ GdkRectangle *viewport,
+ int nth_slide);
diff --git a/main.c b/main.c
index 3f00fc2..15739cd 100644
--- a/main.c
+++ b/main.c
@@ -5,12 +5,14 @@
#include <string.h>
#include <math.h>
#include "scrollarea.h"
+#include "deck.h"
typedef struct
{
GladeXML * xml;
GtkWidget * main_area;
GtkWidget * thumbnails;
+ Deck * deck;
} App;
static void *
@@ -31,9 +33,17 @@ on_thumbs_paint (FooScrollArea *scroll_area,
GdkRegion *region,
gpointer data)
{
+
g_print ("paint thumbs\n");
}
-
+
+static void
+on_thumbs_viewport_size_changed (FooScrollArea *scroll_area,
+ GdkRectangle *viewport,
+ GdkRectangle *old_viewport)
+{
+ g_print ("thumbs viewport changed size\n");
+}
#define MARGIN 20
#define RATIO 1.414
@@ -49,32 +59,13 @@ on_main_paint (FooScrollArea *scroll_area,
GdkRegion *region,
gpointer data)
{
- int i;
-
- cairo_move_to (cr, MARGIN, MARGIN);
+ App *app = data;
- for (i = 0; i < N_SLIDES; ++i)
- {
- cairo_move_to (cr, MARGIN, MARGIN + i * (MARGIN + slide_height));
-
- cairo_set_source_rgba (cr, 1, 1, 1, 1);
-
- cairo_rel_line_to (cr, slide_width, 0);
- cairo_rel_line_to (cr, 0, slide_height);
- cairo_rel_line_to (cr, -slide_width, 0);
- cairo_close_path (cr);
-
- cairo_fill_preserve (cr);
-
- cairo_set_source_rgba (cr, 0, 0, 0, 0.5);
- cairo_set_line_width (cr, 2);
- cairo_stroke (cr);
-
- }
+ deck_paint (app->deck, scroll_area, cr);
}
static void
-on_viewport_size_changed (FooScrollArea *scroll_area,
+on_main_viewport_size_changed (FooScrollArea *scroll_area,
GdkRectangle *viewport,
GdkRectangle *old_viewport)
{
@@ -84,7 +75,6 @@ on_viewport_size_changed (FooScrollArea *scroll_area,
double new_y;
/* Compute the y-coordinate of the first visible top edge of a slide */
-
nth_slide =
(old_viewport->y - MARGIN) / (MARGIN + (double)slide_height) + 1;
@@ -112,6 +102,14 @@ on_viewport_changed (FooScrollArea *scroll_area,
}
static void
+on_deck_changed (gpointer data)
+{
+ App *app = data;
+
+
+}
+
+static void
set_size (GtkWindow *window)
{
GdkScreen *screen;
@@ -141,9 +139,11 @@ main (int argc, char **argv)
app = g_new0 (App, 1);
app->xml = glade_xml_new (GLADE_FILE, NULL, NULL);
- app->main_area = (FooScrollArea *)foo_scroll_area_new();
- app->thumbnails = (FooScrollArea *)foo_scroll_area_new();
+ app->main_area = (GtkWidget *)foo_scroll_area_new();
+ app->thumbnails = (GtkWidget *)foo_scroll_area_new();
+ app->deck = deck_new (on_deck_changed, app);
+
gtk_container_add (
GTK_CONTAINER (get_widget (app, "main_area_scrolled_window")),
app->main_area);
@@ -152,20 +152,25 @@ main (int argc, char **argv)
GTK_CONTAINER (get_widget (app, "thumbnails_scrolled_window")),
app->thumbnails);
- foo_scroll_area_set_min_size (app->thumbnails, 200, -1);
+ foo_scroll_area_set_min_size (FOO_SCROLL_AREA (app->thumbnails), 200, -1);
g_signal_connect (app->main_area, "paint",
G_CALLBACK (on_main_paint), app);
+ g_signal_connect (app->main_area, "viewport_size_changed",
+ G_CALLBACK (on_main_viewport_size_changed), app);
g_signal_connect (app->main_area, "viewport_changed",
G_CALLBACK (on_viewport_changed), app);
- g_signal_connect (app->main_area, "viewport_size_changed",
- G_CALLBACK (on_viewport_size_changed), app);
g_signal_connect (app->thumbnails, "paint",
G_CALLBACK (on_thumbs_paint), app);
+ g_signal_connect (app->thumbnails, "viewport_size_changed",
+ G_CALLBACK (on_thumbs_viewport_size_changed), app);
+
set_size (get_widget (app, "main_window"));
gtk_widget_show_all (get_widget (app, "main_window"));
gtk_main ();
+
+ return 0;
}
diff --git a/scrollarea.c b/scrollarea.c
index f626308..d5514cd 100644
--- a/scrollarea.c
+++ b/scrollarea.c
@@ -118,26 +118,12 @@ static gboolean foo_scroll_area_crossing (GtkWidget *widget
static void
foo_scroll_area_map (GtkWidget *widget)
{
- FooScrollArea *area = FOO_SCROLL_AREA (widget);
-
GTK_WIDGET_CLASS (parent_class)->map (widget);
-
-#if 0
- if (area->priv->input_window)
- gdk_window_show (area->priv->input_window);
-#endif
}
static void
foo_scroll_area_unmap (GtkWidget *widget)
{
- FooScrollArea *area = FOO_SCROLL_AREA (widget);
-
-#if 0
- if (area->priv->input_window)
- gdk_window_hide (area->priv->input_window);
-#endif
-
GTK_WIDGET_CLASS (parent_class)->unmap (widget);
}
@@ -476,8 +462,6 @@ static void
canvas_to_window (FooScrollArea *area,
GdkRegion *region)
{
- GtkWidget *widget = GTK_WIDGET (area);
-
gdk_region_offset (region,
-area->priv->x_offset,
-area->priv->y_offset);
@@ -487,8 +471,6 @@ static void
window_to_canvas (FooScrollArea *area,
GdkRegion *region)
{
- GtkWidget *widget = GTK_WIDGET (area);
-
gdk_region_offset (region,
area->priv->x_offset,
area->priv->y_offset);
@@ -578,6 +560,9 @@ do_exposes (cairo_t *cr,
r = gdk_region_rectangle (&rect);
gdk_region_intersect (region, r);
gdk_region_destroy (r);
+
+ cairo_rectangle (cr, rect.x, rect.y, rect.width, rect.height);
+ cairo_clip (cr);
if (!gdk_region_empty (region))
{
@@ -773,13 +758,14 @@ foo_scroll_area_unrealize (GtkWidget *widget)
GTK_WIDGET_CLASS (parent_class)->unrealize (widget);
}
+#if 0
static void
allocation_to_canvas_region (FooScrollArea *area,
GdkRegion *region)
{
gdk_region_offset (region, area->priv->x_offset, area->priv->y_offset);
}
-
+#endif
static void
foo_scroll_area_size_allocate (GtkWidget *widget,
@@ -788,8 +774,6 @@ foo_scroll_area_size_allocate (GtkWidget *widget,
FooScrollArea *scroll_area = FOO_SCROLL_AREA (widget);
GdkRectangle new_viewport;
GdkRectangle old_viewport;
- GdkRegion *old_allocation;
- GdkRegion *invalid;
get_viewport (scroll_area, &old_viewport);
@@ -1373,8 +1357,6 @@ add_path (FooScrollArea *area,
#if 0
}
#endif
-
- return path;
}
/* FIXME: we probably really want a
diff --git a/scrollarea.h b/scrollarea.h
index 5a5236f..1ce1528 100644
--- a/scrollarea.h
+++ b/scrollarea.h
@@ -1,3 +1,6 @@
+#ifndef SCROLL_AREA_H
+#define SCROLL_AREA_H
+
#include <cairo/cairo.h>
#include <gtk/gtk.h>
@@ -110,3 +113,5 @@ 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