]> Pileus Git - ~andy/gtk/blob - gdk/linux-fb/gdkprivate-fb.h
Convert GdkDevice to a GObject.
[~andy/gtk] / gdk / linux-fb / gdkprivate-fb.h
1 /* GDK - The GIMP Drawing Kit
2  * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
3  *
4  * This library is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU Lesser General Public
6  * License as published by the Free Software Foundation; either
7  * version 2 of the License, or (at your option) any later version.
8  *
9  * This library is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12  * Lesser General Public License for more details.
13  *
14  * You should have received a copy of the GNU Lesser General Public
15  * License along with this library; if not, write to the
16  * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
17  * Boston, MA 02111-1307, USA.
18  */
19
20 /*
21  * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
22  * file for a list of people on the GTK+ Team.  See the ChangeLog
23  * files for a list of changes.  These files are distributed with
24  * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
25  */
26
27 /*
28  * Private uninstalled header defining things local to X windowing code
29  */
30
31 #ifndef __GDK_PRIVATE_FB_H__
32 #define __GDK_PRIVATE_FB_H__
33
34 #include <gdk/gdkprivate.h>
35 #include <gdk/gdkinternals.h>
36 #include <gdk/gdk.h>
37 #include "gdkfb.h"
38 #include "gdkregion-generic.h"
39 #include <linux/fb.h>
40 #include <stdio.h>
41 #include <freetype/freetype.h>
42
43 #define GDK_TYPE_DRAWABLE_IMPL_FBDATA (gdk_drawable_impl_fb_get_type ())
44 #define GDK_DRAWABLE_IMPL_FBDATA(win) ((GdkDrawableFBData *)((GdkWindowObject *)(win))->impl)
45 #define GDK_IS_DRAWABLE_IMPL_FBDATA(object)     (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_DRAWABLE_IMPL_FBDATA))
46 #define GDK_DRAWABLE_IMPL(win)        ((GdkDrawable *)((GdkWindowObject *)(win))->impl)
47 #define GDK_WINDOW_IMPL_FBDATA(win)   ((GdkWindowFBData *)((GdkWindowObject *)(win))->impl)
48 #define GDK_PIXMAP_IMPL_FBDATA(win)   ((GdkPixmapFBData *)((GdkWindowObject *)(win))->impl)
49 #define GDK_DRAWABLE_FBDATA(win)      ((GdkDrawableFBData *)(win))
50 #define GDK_PIXMAP_FBDATA(win)        ((GdkPixmapFBData *)(win))
51 #define GDK_WINDOW_FBDATA(win)        ((GdkWindowFBData *)(win))
52 #define GDK_FONT_FB(f)                ((GdkFontPrivateFB *)(f))
53 #define GDK_CURSOR_FB(c)              ((GdkCursorPrivateFB *)(c))
54
55 #define CHECK_IMPL_AND_INTF
56
57 #ifdef CHECK_IMPL_AND_INTF
58 #define GDK_CHECK_IMPL(drawable) \
59  g_assert(G_OBJECT_TYPE(drawable) == _gdk_window_impl_get_type() || G_OBJECT_TYPE(drawable) == _gdk_pixmap_impl_get_type())
60 #define GDK_CHECK_INTF(drawable) \
61  g_assert(G_OBJECT_TYPE(drawable) == gdk_window_object_get_type() || G_OBJECT_TYPE(drawable) == gdk_pixmap_get_type())
62 #else
63 #define GDK_CHECK_IMPL(drawable) 
64 #define GDK_CHECK_INTF(drawable)
65 #endif
66 typedef struct _GdkDrawableFBData GdkDrawableFBData;
67 typedef struct _GdkWindowFBData GdkWindowFBData;
68 typedef struct _GdkPixmapFBData GdkPixmapFBData;
69 typedef struct _GdkFBDrawingContext GdkFBDrawingContext;
70
71 #define GDK_DRAWABLE_PIXMAP (GDK_WINDOW_FOREIGN+1)
72
73 struct _GdkDrawableFBData
74 {
75   GdkDrawable parent_object;
76
77   GdkDrawable *wrapper;
78
79   guchar *mem;
80
81   gint abs_x, abs_y, lim_x, lim_y, llim_x, llim_y; /* computed values */
82
83   guint rowstride;
84
85   /* Due to excursions in gdk, this stuff has to be stored here
86      instead of in GdkDrawable where it belongs */
87   gint width, height, depth;
88   GdkColormap *colormap;
89   GdkWindowType window_type;
90 };
91
92 typedef struct {
93   GdkDrawableClass base_class;
94 } GdkDrawableFBClass;
95
96 struct _GdkPixmapFBData
97 {
98   GdkDrawableFBData drawable_data;
99 };
100
101 typedef struct {
102   GdkDrawableFBClass klass;
103 } GdkPixmapFBClass;
104
105 GType gdk_drawable_impl_fb_get_type (void) G_GNUC_CONST;
106
107 typedef struct {
108   gulong length;
109   GdkAtom type;
110   gint format;
111   guchar data[1];
112 } GdkWindowProperty;
113
114 struct _GdkWindowFBData
115 {
116   GdkDrawableFBData drawable_data;
117   GdkCursor *cursor;
118   GHashTable *properties;
119
120   GdkRegion *shape; /* Can also be GDK_FB_USE_CHILD_SHAPE */
121   
122   GdkEventMask event_mask;
123   gboolean realized : 1;
124 };
125
126 typedef struct {
127   GdkDrawableFBClass base_class;
128 } GdkWindowFBClass;
129 #define GDK_WINDOW_P(x) ((GdkWindowObject *)(x))
130
131 struct _GdkFBDisplay
132 {
133   int tty_fd;
134   int console_fd;
135   int vt, start_vt;
136
137   /* Used by rendering code: */
138   guchar *fb_mem;
139   gint fb_width; /* In pixels */
140   gint fb_height; /* In pixels */
141   gint fb_stride; /* In bytes */
142
143   int fb_fd;
144   guchar *fb_mmap;
145   gpointer active_cmap;
146   gulong mem_len;
147   struct fb_fix_screeninfo sinfo;
148   struct fb_var_screeninfo modeinfo;
149   struct fb_var_screeninfo orig_modeinfo;
150   int red_byte, green_byte, blue_byte; /* For truecolor */
151
152   /* fb manager */
153   int manager_fd;
154   int manager_tag;
155   int manager_blocked;
156 };
157
158 struct _GdkVisualClass
159 {
160   GObjectClass parent_class;
161 };
162
163
164 typedef struct {
165   GHashTable *hash;
166   GdkColorInfo *info;
167   guint sync_tag;
168 } GdkColormapPrivateFB;
169
170 typedef struct {
171   GdkCursor base;
172   GdkPixmap *cursor, *mask;
173   int hot_x, hot_y;
174 } GdkCursorPrivateFB;
175
176 /* Define this to emulate slow emulation of
177    GdkFonts using PangoFont */
178 #define EMULATE_GDKFONT
179
180 typedef struct {
181   GdkFontPrivate base;
182 #ifdef EMULATE_GDKFONT
183   /* For PangoFont emulation: */
184   char *name;
185   PangoFont *pango_font;
186 #else
187   /* For bogus GdkFonts: */
188   int size;
189 #endif
190 } GdkFontPrivateFB;
191
192 typedef struct {
193   /* Empty */
194 } GdkImagePrivateFB;
195
196 #define GDK_GC_FBDATA(x) ((GdkGCFBData *)(x))
197 #define GDK_GC_P(x) ((GdkGC *)(x))
198
199 typedef enum {
200   GPR_USED_BG,
201   GPR_AA_GRAYVAL,
202   GPR_NONE,
203   GPR_ERR_BOUNDS
204 } GetPixelRet;
205
206 typedef enum {
207   GDK_FB_SRC_BPP_1,
208   GDK_FB_SRC_BPP_8,
209   GDK_FB_SRC_BPP_16,
210   GDK_FB_SRC_BPP_24,
211   GDK_FB_SRC_BPP_32,
212   GDK_FB_SRC_BPP_7_AA_GRAYVAL,
213   GDK_FB_SRC_BPP_8_AA_GRAYVAL,
214   GDK_NUM_FB_SRCBPP
215 } GdkFbSrcBPP;
216
217 typedef void gdk_fb_draw_drawable_func (GdkDrawable *drawable,
218                                         GdkGC       *gc,
219                                         GdkPixmap   *src,
220                                         GdkFBDrawingContext *dc,
221                                         gint         start_y,
222                                         gint         end_y,
223                                         gint         start_x,
224                                         gint         end_x,
225                                         gint         src_x_off,
226                                         gint         src_y_off,
227                                         gint         draw_direction);
228
229 typedef struct {
230   GdkGC parent_instance;
231
232   GdkRegion *clip_region;
233   gchar *dash_list;
234   GdkGCValuesMask values_mask;
235   GdkGCValues values;
236   gint dash_offset;
237   gushort dash_list_len;
238   guchar alu;
239
240   /* The GC can only be used with target drawables of
241    * the same depth as the initial drawable
242    * specified in gd_gc_new().
243    */
244   guchar depth;
245   
246   /* Calculated state: */
247   /* These functions can only be called for drawables
248    * that have the same depth as the gc. 
249    */
250   void (*set_pixel)        (GdkDrawable    *drawable,
251                             GdkGC          *gc,
252                             int             x,
253                             int             y,
254                             gulong          pixel);
255
256   GetPixelRet (*get_color) (GdkDrawable      *drawable,
257                             GdkGC            *gc,
258                             int               x,
259                             int               y,
260                             GdkColor         *color);
261   
262   void (*fill_span)        (GdkDrawable  *drawable,
263                             GdkGC        *gc,
264                             GdkSpan      *span,
265                             GdkColor     *color);
266
267   void (*fill_rectangle)   (GdkDrawable  *drawable,
268                             GdkGC        *gc,
269                             GdkRectangle *rect,
270                             GdkColor     *color);
271   
272   gdk_fb_draw_drawable_func *draw_drawable[GDK_NUM_FB_SRCBPP];
273 } GdkGCFBData;
274
275 typedef struct {
276   GdkGCClass parent_class;
277 } GdkGCFBClass;
278
279
280 extern GdkGC *_gdk_fb_screen_gc;
281
282 GType gdk_gc_fb_get_type (void) G_GNUC_CONST;
283
284 void       _gdk_selection_window_destroyed    (GdkWindow       *window);
285 void       gdk_window_invalidate_region_clear (GdkWindow       *window,
286                                                GdkRegion       *region);
287 void       gdk_window_invalidate_rect_clear   (GdkWindow       *window,
288                                                GdkRectangle    *rect);
289 void       gdk_fb_window_send_crossing_events (GdkWindow       *src,
290                                                GdkWindow       *dest,
291                                                GdkCrossingMode  mode);
292 void       gdk_fb_window_move_resize          (GdkWindow       *window,
293                                                gint             x,
294                                                gint             y,
295                                                gint             width,
296                                                gint             height,
297                                                gboolean         send_expose_events);
298 GdkWindow *gdk_fb_window_find_focus           (void);
299 GdkRegion *gdk_fb_window_get_abs_shape        (GdkDrawable     *window);
300 GdkRegion *gdk_fb_window_peek_shape           (GdkDrawable     *window,
301                                                gint            *dx,
302                                                gint            *dy);
303 GdkGC *   _gdk_fb_gc_new                      (GdkDrawable     *drawable,
304                                                GdkGCValues     *values,
305                                                GdkGCValuesMask  values_mask);
306
307 #define _GDK_FB_GC_DEPTH (1<<31)
308 void      _gdk_fb_gc_calc_state              (GdkGC           *gc,
309                                               GdkGCValuesMask  changed);
310
311 GdkImage *_gdk_fb_get_image                  (GdkDrawable     *drawable,
312                                               gint             x,
313                                               gint             y,
314                                               gint             width,
315                                               gint             height);
316 void      gdk_fb_drawable_clear              (GdkDrawable     *drawable);
317 void      gdk_fb_draw_drawable               (GdkDrawable     *drawable,
318                                               GdkGC           *gc,
319                                               GdkPixmap       *src,
320                                               gint             xsrc,
321                                               gint             ysrc,
322                                               gint             xdest,
323                                               gint             ydest,
324                                               gint             width,
325                                               gint             height);
326
327 struct _GdkFBDrawingContext {
328   GdkWindow *bg_relto;
329   GdkPixmap *bgpm;
330
331   GdkRegion *real_clip_region;
332
333   guchar *mem, *clipmem;
334   gpointer cursor_dc;
335
336   guint rowstride, clip_rowstride;
337   int clipxoff, clipyoff;
338
339   gboolean draw_bg : 1;
340   gboolean copy_region : 1;
341   gboolean handle_cursor : 1;
342 };
343
344 void       gdk_fb_drawing_context_init     (GdkFBDrawingContext *dc,
345                                             GdkDrawable         *drawable,
346                                             GdkGC               *gc,
347                                             gboolean             draw_bg,
348                                             gboolean             do_clipping);
349 void       gdk_fb_drawing_context_finalize (GdkFBDrawingContext *dc);
350 void       gdk_fb_draw_drawable_3          (GdkDrawable         *drawable,
351                                             GdkGC               *gc,
352                                             GdkPixmap           *src,
353                                             GdkFBDrawingContext *dc,
354                                             gint                 xsrc,
355                                             gint                 ysrc,
356                                             gint                 xdest,
357                                             gint                 ydest,
358                                             gint                 width,
359                                             gint                 height);
360 void       gdk_fb_draw_drawable_2          (GdkDrawable         *drawable,
361                                             GdkGC               *gc,
362                                             GdkPixmap           *src,
363                                             gint                 xsrc,
364                                             gint                 ysrc,
365                                             gint                 xdest,
366                                             gint                 ydest,
367                                             gint                 width,
368                                             gint                 height,
369                                             gboolean             draw_bg,
370                                             gboolean             do_clipping);
371 void       gdk_fb_draw_rectangle           (GdkDrawable         *drawable,
372                                             GdkGC               *gc,
373                                             gint                 filled,
374                                             gint                 x,
375                                             gint                 y,
376                                             gint                 width,
377                                             gint                 height);
378 void       gdk_fb_fill_spans               (GdkDrawable         *real_drawable,
379                                             GdkGC               *gc,
380                                             GdkSpan             *spans,
381                                             int                  nspans,
382                                             gboolean             sorted);
383 GdkRegion *gdk_fb_clip_region              (GdkDrawable         *drawable,
384                                             GdkGC               *gc,
385                                             gboolean             do_clipping,
386                                             gboolean             do_children,
387                                             gboolean             full_shapes);
388
389
390 GdkGrabStatus gdk_fb_pointer_grab          (GdkWindow           *window,
391                                             gint                 owner_events,
392                                             GdkEventMask         event_mask,
393                                             GdkWindow           *confine_to,
394                                             GdkCursor           *cursor,
395                                             guint32              time,
396                                             gboolean             implicit_grab);
397 void       gdk_fb_pointer_ungrab           (guint32 time,
398                                             gboolean implicit_grab);
399
400 guint32    gdk_fb_get_time                 (void);
401
402 void       gdk_shadow_fb_update            (gint                 minx,
403                                             gint                 miny,
404                                             gint                 maxx,
405                                             gint                 maxy);
406 void       gdk_shadow_fb_init              (void);
407 void       gdk_shadow_fb_stop_updates      (void);
408 void       gdk_fb_recompute_all            (void);
409
410 extern GdkFBAngle _gdk_fb_screen_angle;
411
412 /* Pointer grab info */
413 extern GdkWindow *_gdk_fb_pointer_grab_window;
414 extern gboolean _gdk_fb_pointer_grab_owner_events;
415 extern GdkWindow *_gdk_fb_pointer_grab_confine;
416 extern GdkEventMask _gdk_fb_pointer_grab_events;
417 extern GdkCursor *_gdk_fb_pointer_grab_cursor;
418 /* Keyboard grab info */
419 extern GdkWindow *_gdk_fb_keyboard_grab_window;
420 extern GdkEventMask _gdk_fb_keyboard_grab_events;
421 extern gboolean _gdk_fb_keyboard_grab_owner_events;
422
423 extern GdkFBDisplay *gdk_display;
424 extern FILE *debug_out;
425 GdkEvent *gdk_event_make(GdkWindow *window,
426                          GdkEventType type,
427                          gboolean append_to_queue);
428 GdkWindow * gdk_fb_pointer_event_window (GdkWindow *window,
429                                          GdkEventType type);
430 GdkWindow *gdk_fb_keyboard_event_window (GdkWindow *window,
431                                          GdkEventType type);
432 GdkWindow *gdk_fb_other_event_window (GdkWindow *window,
433                                       GdkEventType type);
434
435 void gdk_fb_get_cursor_rect(GdkRectangle *rect);
436 gboolean gdk_fb_cursor_need_hide(GdkRectangle *rect);
437 gboolean gdk_fb_cursor_region_need_hide(GdkRegion *region);
438 void gdk_fb_cursor_unhide(void);
439 void gdk_fb_cursor_reset(void);
440 void gdk_fb_cursor_hide(void);
441 void gdk_fb_redraw_all(void);
442 void gdk_fb_cursor_move (gint x, gint y, GdkWindow *in_window);
443
444 guint gdk_fb_keyboard_modifiers (void);
445 gboolean gdk_fb_keyboard_init  (gboolean open_dev);
446 gboolean gdk_fb_keyboard_open  (void);
447 void     gdk_fb_keyboard_close (void);
448 gboolean gdk_fb_mouse_init     (gboolean open_dev);
449 gboolean gdk_fb_mouse_open     (void);
450 void     gdk_fb_mouse_close    (void);
451 void     gdk_fb_mouse_get_info (gint            *x,
452                                 gint            *y,
453                                 GdkModifierType *mask);
454
455 #endif /* __GDK_PRIVATE_FB_H__ */