summaryrefslogtreecommitdiff
path: root/scrollarea.h
blob: 205a667c40d0e74c6e5b34693c5fa36cce053345 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
#ifndef SCROLL_AREA_H
#define SCROLL_AREA_H

#include <cairo/cairo.h>
#include <gtk/gtk.h>

#define FOO_TYPE_SCROLL_AREA            (foo_scroll_area_get_type ())
#define FOO_SCROLL_AREA(obj)            (G_TYPE_CHECK_INSTANCE_CAST ((obj), FOO_TYPE_SCROLL_AREA, FooScrollArea))
#define FOO_SCROLL_AREA_CLASS(klass)    (G_TYPE_CHECK_CLASS_CAST ((klass),  FOO_TYPE_SCROLL_AREA, FooScrollAreaClass))
#define FOO_IS_SCROLL_AREA(obj)         (G_TYPE_CHECK_INSTANCE_TYPE ((obj), FOO_TYPE_SCROLL_AREA))
#define FOO_IS_SCROLL_AREA_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass),  FOO_TYPE_SCROLL_AREA))
#define FOO_SCROLL_AREA_GET_CLASS(obj)  (G_TYPE_INSTANCE_GET_CLASS ((obj),  FOO_TYPE_SCROLL_AREA, FooScrollAreaClass))

typedef struct FooScrollArea FooScrollArea;
typedef struct FooScrollAreaClass FooScrollAreaClass;
typedef struct FooScrollAreaPrivate FooScrollAreaPrivate;
typedef struct FooScrollAreaEvent FooScrollAreaEvent;

typedef enum
{
    FOO_NONE,
    FOO_BUTTON_PRESS,
    FOO_BUTTON_RELEASE,
    FOO_ENTER,
    FOO_LEAVE,
    FOO_MOTION
} FooScrollAreaEventType;

struct FooScrollAreaEvent
{
    FooScrollAreaEventType	type;
    int				x;
    int				y;
    int				button;
};

typedef void (* FooScrollAreaEventFunc) (FooScrollArea      *area,
					 FooScrollAreaEvent *event,
					 gpointer            data);

struct FooScrollArea
{
    GtkContainer parent_instance;

    FooScrollAreaPrivate *priv;
};

struct FooScrollAreaClass
{
    GtkContainerClass parent_class;

    void (*set_scroll_adjustments) (FooScrollArea *scroll_area,
				    GtkAdjustment *hadjustment,
				    GtkAdjustment *vadjustment);

    void (*viewport_changed) (FooScrollArea *scroll_area,
			      GdkRectangle  *viewport,
			      GdkRectangle  *old_viewport);

    void (*viewport_size_changed) (FooScrollArea *scroll_area,
				   GdkRectangle  *viewport,
				   GdkRectangle  *old_viewport);

    void (*paint) (FooScrollArea *scroll_area,
		   cairo_t       *cr,
		   GdkRectangle  *extents,
		   GdkRegion     *region);
};

GType          foo_scroll_area_get_type              (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);

/* 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);

/* 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);


/* Debug */
void	       foo_scroll_area_set_paint_updates     (FooScrollArea          *scroll_area,
						      gboolean                paint_upd);


#endif