BEAST/BSE - Better Audio System and Sound Engine  0.8.2
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
gxkscrollcanvas.hh
Go to the documentation of this file.
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__ */
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines