BEAST/BSE - Better Audio System and Sound Engine
0.8.2
|
00001 // Licensed GNU LGPL v2.1 or later: http://www.gnu.org/licenses/lgpl.html 00002 #ifndef __GXK_SCROLL_CANVAS_H__ 00003 #define __GXK_SCROLL_CANVAS_H__ 00004 00005 #include <gxk/gxkutils.hh> 00006 00007 G_BEGIN_DECLS 00008 00009 /* --- type macros --- */ 00010 #define GXK_TYPE_SCROLL_CANVAS (gxk_scroll_canvas_get_type ()) 00011 #define GXK_SCROLL_CANVAS(object) (G_TYPE_CHECK_INSTANCE_CAST ((object), GXK_TYPE_SCROLL_CANVAS, GxkScrollCanvas)) 00012 #define GXK_SCROLL_CANVAS_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), GXK_TYPE_SCROLL_CANVAS, GxkScrollCanvasClass)) 00013 #define GXK_IS_SCROLL_CANVAS(object) (G_TYPE_CHECK_INSTANCE_TYPE ((object), GXK_TYPE_SCROLL_CANVAS)) 00014 #define GXK_IS_SCROLL_CANVAS_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), GXK_TYPE_SCROLL_CANVAS)) 00015 #define GXK_SCROLL_CANVAS_GET_CLASS(object) (G_TYPE_INSTANCE_GET_CLASS ((object), GXK_TYPE_SCROLL_CANVAS, GxkScrollCanvasClass)) 00016 00017 00018 /* --- typedefs, enums & structures --- */ 00019 typedef enum /*< skip >*/ 00020 { 00021 GXK_DRAG_AREA_RESIZE = 1 << 0, 00022 GXK_DRAG_AREA_ENRICH = 1 << 1, 00023 GXK_DRAG_AREA_REDUCE = 1 << 2, 00024 GXK_DRAG_AREA_XOR = 1 << 3, 00025 GXK_DRAG_RATIO_FIXED = 1 << 8, 00026 GXK_DRAG_OFFSET_CENTERED = 1 << 9, 00027 } GxkDragMode; 00028 GxkDragMode gxk_drag_modifier_start (GdkModifierType key_mods); 00029 GxkDragMode gxk_drag_modifier_next (GdkModifierType key_mods, 00030 GxkDragMode last_drag_mods); 00031 typedef enum /*< skip >*/ 00032 { 00033 /* drag emission state */ 00034 GXK_DRAG_START, /* initial drag event */ 00035 GXK_DRAG_MOTION, /* drag motion, pointer moved */ 00036 GXK_DRAG_DONE, /* final drag motion */ 00037 GXK_DRAG_ABORT, /* drag abortion requested */ 00038 /* drag-action requests */ 00039 GXK_DRAG_UNHANDLED = GXK_DRAG_START, /* continue with button-press or similar */ 00040 GXK_DRAG_CONTINUE = GXK_DRAG_MOTION, /* request drag-motion emissions */ 00041 GXK_DRAG_HANDLED = GXK_DRAG_DONE, /* no further emissions */ 00042 GXK_DRAG_ERROR = GXK_DRAG_ABORT /* request abortion */ 00043 } GxkDragStatus; 00044 typedef struct _GxkScrollCanvas GxkScrollCanvas; 00045 typedef struct { 00046 #define GXK_SCROLL_CANVAS_DRAG_FIELDS \ 00047 GtkWidget *widget; \ 00048 GdkWindow *drawable; \ 00049 /* modifier & config determined mode */ \ 00050 GxkDragMode mode : 16; \ 00051 /* mouse button */ \ 00052 guint button : 16; \ 00053 /* emission type: start/motion/done/abort */ \ 00054 GxkDragStatus type : 16; \ 00055 guint window_drag : 1; \ 00056 guint canvas_drag : 1; \ 00057 guint top_panel_drag : 1; \ 00058 guint left_panel_drag : 1; \ 00059 guint right_panel_drag : 1; \ 00060 guint bottom_panel_drag : 1; \ 00061 guint ___dummy1 : 2; \ 00062 /* whether start_x/start_y are in window */ \ 00063 guint start_confined : 1; \ 00064 /* whether current_x/current_y are in window */ \ 00065 guint current_confined : 1; \ 00066 gint start_x, start_y; \ 00067 gint current_x, current_y; \ 00068 /* user data: unhandled/continue/handled/error */ \ 00069 GxkDragStatus state : 16; \ 00070 guint ___dummy2 : 16; 00071 /* the fields are expanded here via a macro, to allow 00072 * "derived" structures with exactly the same field 00073 * layout without field prefixes. 00074 */ 00075 GXK_SCROLL_CANVAS_DRAG_FIELDS; 00076 } GxkScrollCanvasDrag; 00077 typedef struct { 00078 guint index; 00079 guint mtype; 00080 GdkRectangle extends; 00081 GdkWindow **windowp; 00082 GdkDrawable *pixmap; /* backing store */ 00083 GdkRectangle coords; /* user coordinates */ 00084 gpointer user_data; 00085 } GxkScrollMarker; 00086 typedef struct { 00087 gint top_panel_height; 00088 gint left_panel_width; 00089 gint right_panel_width; 00090 gint bottom_panel_height; 00091 gint canvas_width, max_canvas_width; 00092 gint canvas_height, max_canvas_height; 00093 } GxkScrollCanvasLayout; 00094 struct _GxkScrollCanvas 00095 { 00096 GtkContainer parent_instance; 00097 GxkScrollCanvasLayout layout; 00098 GdkWindow *canvas, *top_panel, *left_panel, *right_panel, *bottom_panel; 00099 GdkPixmap *canvas_pixmap; 00100 GdkGC **color_gc; /* array of size class->n_colors */ 00101 guint n_pango_layouts; 00102 PangoLayout **pango_layouts; 00103 guint n_markers; 00104 GxkScrollMarker *markers; 00105 /* scroll offset */ 00106 gint x_offset, y_offset; 00107 GtkAdjustment *hadjustment, *vadjustment; 00108 guint scroll_timer; 00109 }; 00110 typedef struct 00111 { 00112 GtkContainerClass parent_class; 00113 /* widget config */ 00114 GdkEventMask canvas_events, top_panel_events, left_panel_events, right_panel_events, bottom_panel_events; 00115 guint double_buffer_window : 1, double_buffer_canvas : 1; 00116 guint double_buffer_top_panel : 1, double_buffer_left_panel : 1; 00117 guint double_buffer_right_panel : 1, double_buffer_bottom_panel : 1; 00118 guint auto_clear : 1; /* automatically clear non-double-buffered areas */ 00119 guint grab_focus : 1; /* automatically grab focus on button-press */ 00120 guint hscrollable : 1; 00121 guint vscrollable : 1; 00122 /* skin config */ 00123 guint n_colors; /* must be const across skin changes */ 00124 const GdkColor *colors; 00125 gchar *image_file_name; 00126 GdkColor image_tint; 00127 gdouble image_saturation; 00128 GSList *realized_widgets; 00129 /* virtual methods */ 00130 void (*get_layout) (GxkScrollCanvas *self, 00131 GxkScrollCanvasLayout *layout); 00132 void (*set_scroll_adjustments) (GxkScrollCanvas *self, 00133 GtkAdjustment *hadjustment, 00134 GtkAdjustment *vadjustment); 00135 void (*update_adjustments) (GxkScrollCanvas *self, 00136 gboolean hadj, 00137 gboolean vadj); 00138 void (*adjustment_changed) (GxkScrollCanvas *self, 00139 GtkAdjustment *adj); 00140 void (*reallocate_contents) (GxkScrollCanvas *self, 00141 gint xdiff, 00142 gint ydiff); 00143 void (*draw_window) (GxkScrollCanvas *self, 00144 GdkWindow *drawable, 00145 GdkRectangle *area); 00146 void (*draw_canvas) (GxkScrollCanvas *self, 00147 GdkWindow *drawable, 00148 GdkRectangle *area); 00149 void (*draw_top_panel) (GxkScrollCanvas *self, 00150 GdkWindow *drawable, 00151 GdkRectangle *area); 00152 void (*draw_left_panel) (GxkScrollCanvas *self, 00153 GdkWindow *drawable, 00154 GdkRectangle *area); 00155 void (*draw_right_panel) (GxkScrollCanvas *self, 00156 GdkWindow *drawable, 00157 GdkRectangle *area); 00158 void (*draw_bottom_panel) (GxkScrollCanvas *self, 00159 GdkWindow *drawable, 00160 GdkRectangle *area); 00161 void (*draw_marker) (GxkScrollCanvas *self, 00162 GdkWindow *drawable, 00163 GdkRectangle *area, 00164 GxkScrollMarker *marker); 00165 void (*handle_drag) (GxkScrollCanvas *self, 00166 GxkScrollCanvasDrag *drag, 00167 GdkEvent *event); 00168 } GxkScrollCanvasClass; 00169 00170 00171 /* --- prototypes --- */ 00172 GType gxk_scroll_canvas_get_type (void); 00173 void gxk_scroll_canvas_get_layout (GxkScrollCanvas *self, 00174 GxkScrollCanvasLayout *layout); 00175 void gxk_scroll_canvas_get_canvas_size (GxkScrollCanvas *self, 00176 gint *width, 00177 gint *height); 00178 void gxk_scroll_canvas_set_hadjustment (GxkScrollCanvas *self, 00179 GtkAdjustment *adjustment); 00180 void gxk_scroll_canvas_set_vadjustment (GxkScrollCanvas *self, 00181 GtkAdjustment *adjustment); 00182 void gxk_scroll_canvas_update_adjustments (GxkScrollCanvas *self, 00183 gboolean hadj, 00184 gboolean vadj); 00185 void gxk_scroll_canvas_scroll_to (GxkScrollCanvas *self, 00186 gint scroll_area_x, 00187 gint scroll_area_y); 00188 void gxk_scroll_canvas_make_visible (GxkScrollCanvas *self, 00189 gint scroll_area_x, 00190 gint scroll_area_y, 00191 gint scroll_area_width, 00192 gint scroll_area_height); 00193 void gxk_scroll_canvas_reset_pango_layouts (GxkScrollCanvas *self); 00194 void gxk_scroll_canvas_reallocate (GxkScrollCanvas *self); 00195 gboolean gxk_scroll_canvas_dragging (GxkScrollCanvas *self); 00196 void gxk_scroll_canvas_drag_abort (GxkScrollCanvas *self); 00197 void gxk_scroll_canvas_set_window_cursor (GxkScrollCanvas *self, 00198 GdkCursorType cursor); 00199 void gxk_scroll_canvas_set_canvas_cursor (GxkScrollCanvas *self, 00200 GdkCursorType cursor); 00201 void gxk_scroll_canvas_set_top_panel_cursor (GxkScrollCanvas *self, 00202 GdkCursorType cursor); 00203 void gxk_scroll_canvas_set_left_panel_cursor (GxkScrollCanvas *self, 00204 GdkCursorType cursor); 00205 void gxk_scroll_canvas_set_right_panel_cursor (GxkScrollCanvas *self, 00206 GdkCursorType cursor); 00207 void gxk_scroll_canvas_set_bottom_panel_cursor (GxkScrollCanvas *self, 00208 GdkCursorType cursor); 00209 PangoLayout* gxk_scroll_canvas_get_pango_layout (GxkScrollCanvas *self, 00210 guint nth); 00211 PangoLayout* gxk_scroll_canvas_peek_pango_layout (GxkScrollCanvas *self, 00212 guint nth); 00213 GxkScrollMarker* gxk_scroll_canvas_lookup_marker (GxkScrollCanvas *self, 00214 guint index, 00215 guint *count); 00216 GxkScrollMarker* gxk_scroll_canvas_add_marker (GxkScrollCanvas *self, 00217 guint index); 00218 void gxk_scroll_canvas_remove_marker (GxkScrollCanvas *self, 00219 GxkScrollMarker *marker); 00220 void gxk_scroll_canvas_setup_marker (GxkScrollCanvas *self, 00221 GxkScrollMarker *marker, 00222 GdkWindow **windowp, 00223 guint x, 00224 guint y, 00225 guint width, 00226 guint height); 00227 void gxk_scroll_canvas_move_marker (GxkScrollCanvas *self, 00228 GxkScrollMarker *marker, 00229 guint x, 00230 guint y); 00231 void gxk_scroll_canvas_class_skin_changed (GxkScrollCanvasClass*); 00232 00233 G_END_DECLS 00234 00235 #endif /* __GXK_SCROLL_CANVAS_H__ */