]> Pileus Git - ~andy/gtk/blob - gdk/linux-fb/gdkprivate-fb.h
Added --enable-fbmanager. This is some experimental code that lets several
[~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 typedef struct {
159   GdkVisual base;
160 } GdkVisualPrivateFB;
161
162 typedef struct {
163   GHashTable *hash;
164   GdkColorInfo *info;
165   guint sync_tag;
166 } GdkColormapPrivateFB;
167
168 typedef struct {
169   GdkCursor base;
170   GdkPixmap *cursor, *mask;
171   int hot_x, hot_y;
172 } GdkCursorPrivateFB;
173
174 /* Define this to emulate slow emulation of
175    GdkFonts using PangoFont */
176 #define EMULATE_GDKFONT
177
178 typedef struct {
179   GdkFontPrivate base;
180 #ifdef EMULATE_GDKFONT
181   /* For PangoFont emulation: */
182   char *name;
183   PangoFont *pango_font;
184 #else
185   /* For bogus GdkFonts: */
186   int size;
187 #endif
188 } GdkFontPrivateFB;
189
190 typedef struct {
191   /* Empty */
192 } GdkImagePrivateFB;
193
194 #define GDK_GC_FBDATA(x) ((GdkGCFBData *)(x))
195 #define GDK_GC_P(x) ((GdkGC *)(x))
196
197 typedef enum {
198   GPR_USED_BG,
199   GPR_AA_GRAYVAL,
200   GPR_NONE,
201   GPR_ERR_BOUNDS
202 } GetPixelRet;
203
204 typedef enum {
205   GDK_FB_SRC_BPP_1,
206   GDK_FB_SRC_BPP_8,
207   GDK_FB_SRC_BPP_16,
208   GDK_FB_SRC_BPP_24,
209   GDK_FB_SRC_BPP_32,
210   GDK_FB_SRC_BPP_7_AA_GRAYVAL,
211   GDK_FB_SRC_BPP_8_AA_GRAYVAL,
212   GDK_NUM_FB_SRCBPP
213 } GdkFbSrcBPP;
214
215 typedef void gdk_fb_draw_drawable_func (GdkDrawable *drawable,
216                                         GdkGC       *gc,
217                                         GdkPixmap   *src,
218                                         GdkFBDrawingContext *dc,
219                                         gint         start_y,
220                                         gint         end_y,
221                                         gint         start_x,
222                                         gint         end_x,
223                                         gint         src_x_off,
224                                         gint         src_y_off,
225                                         gint         draw_direction);
226
227 typedef struct {
228   GdkGC parent_instance;
229
230   GdkRegion *clip_region;
231   gchar *dash_list;
232   GdkGCValuesMask values_mask;
233   GdkGCValues values;
234   gint dash_offset;
235   gushort dash_list_len;
236   guchar alu;
237
238   /* The GC can only be used with target drawables of
239    * the same depth as the initial drawable
240    * specified in gd_gc_new().
241    */
242   guchar depth;
243   
244   /* Calculated state: */
245   /* These functions can only be called for drawables
246    * that have the same depth as the gc. 
247    */
248   void (*set_pixel)        (GdkDrawable    *drawable,
249                             GdkGC          *gc,
250                             int             x,
251                             int             y,
252                             gulong          pixel);
253
254   GetPixelRet (*get_color) (GdkDrawable      *drawable,
255                             GdkGC            *gc,
256                             int               x,
257                             int               y,
258                             GdkColor         *color);
259   
260   void (*fill_span)        (GdkDrawable  *drawable,
261                             GdkGC        *gc,
262                             GdkSpan      *span,
263                             GdkColor     *color);
264
265   void (*fill_rectangle)   (GdkDrawable  *drawable,
266                             GdkGC        *gc,
267                             GdkRectangle *rect,
268                             GdkColor     *color);
269   
270   gdk_fb_draw_drawable_func *draw_drawable[GDK_NUM_FB_SRCBPP];
271 } GdkGCFBData;
272
273 typedef struct {
274   GdkGCClass parent_class;
275 } GdkGCFBClass;
276
277
278 extern GdkGC *_gdk_fb_screen_gc;
279
280 GType gdk_gc_fb_get_type (void) G_GNUC_CONST;
281
282 void       _gdk_selection_window_destroyed    (GdkWindow       *window);
283 void       gdk_window_invalidate_region_clear (GdkWindow       *window,
284                                                GdkRegion       *region);
285 void       gdk_window_invalidate_rect_clear   (GdkWindow       *window,
286                                                GdkRectangle    *rect);
287 void       gdk_fb_window_send_crossing_events (GdkWindow       *src,
288                                                GdkWindow       *dest,
289                                                GdkCrossingMode  mode);
290 void       gdk_fb_window_move_resize          (GdkWindow       *window,
291                                                gint             x,
292                                                gint             y,
293                                                gint             width,
294                                                gint             height,
295                                                gboolean         send_expose_events);
296 GdkWindow *gdk_fb_window_find_focus           (void);
297 GdkRegion *gdk_fb_window_get_abs_shape        (GdkDrawable     *window);
298 GdkRegion *gdk_fb_window_peek_shape           (GdkDrawable     *window,
299                                                gint            *dx,
300                                                gint            *dy);
301 GdkGC *   _gdk_fb_gc_new                      (GdkDrawable     *drawable,
302                                                GdkGCValues     *values,
303                                                GdkGCValuesMask  values_mask);
304
305 #define _GDK_FB_GC_DEPTH (1<<31)
306 void      _gdk_fb_gc_calc_state              (GdkGC           *gc,
307                                               GdkGCValuesMask  changed);
308
309 GdkImage *_gdk_fb_get_image                  (GdkDrawable     *drawable,
310                                               gint             x,
311                                               gint             y,
312                                               gint             width,
313                                               gint             height);
314 void      gdk_fb_drawable_clear              (GdkDrawable     *drawable);
315 void      gdk_fb_draw_drawable               (GdkDrawable     *drawable,
316                                               GdkGC           *gc,
317                                               GdkPixmap       *src,
318                                               gint             xsrc,
319                                               gint             ysrc,
320                                               gint             xdest,
321                                               gint             ydest,
322                                               gint             width,
323                                               gint             height);
324
325 struct _GdkFBDrawingContext {
326   GdkWindow *bg_relto;
327   GdkPixmap *bgpm;
328
329   GdkRegion *real_clip_region;
330
331   guchar *mem, *clipmem;
332   gpointer cursor_dc;
333
334   guint rowstride, clip_rowstride;
335   int clipxoff, clipyoff;
336
337   gboolean draw_bg : 1;
338   gboolean copy_region : 1;
339   gboolean handle_cursor : 1;
340 };
341
342 void       gdk_fb_drawing_context_init     (GdkFBDrawingContext *dc,
343                                             GdkDrawable         *drawable,
344                                             GdkGC               *gc,
345                                             gboolean             draw_bg,
346                                             gboolean             do_clipping);
347 void       gdk_fb_drawing_context_finalize (GdkFBDrawingContext *dc);
348 void       gdk_fb_draw_drawable_3          (GdkDrawable         *drawable,
349                                             GdkGC               *gc,
350                                             GdkPixmap           *src,
351                                             GdkFBDrawingContext *dc,
352                                             gint                 xsrc,
353                                             gint                 ysrc,
354                                             gint                 xdest,
355                                             gint                 ydest,
356                                             gint                 width,
357                                             gint                 height);
358 void       gdk_fb_draw_drawable_2          (GdkDrawable         *drawable,
359                                             GdkGC               *gc,
360                                             GdkPixmap           *src,
361                                             gint                 xsrc,
362                                             gint                 ysrc,
363                                             gint                 xdest,
364                                             gint                 ydest,
365                                             gint                 width,
366                                             gint                 height,
367                                             gboolean             draw_bg,
368                                             gboolean             do_clipping);
369 void       gdk_fb_draw_rectangle           (GdkDrawable         *drawable,
370                                             GdkGC               *gc,
371                                             gint                 filled,
372                                             gint                 x,
373                                             gint                 y,
374                                             gint                 width,
375                                             gint                 height);
376 void       gdk_fb_fill_spans               (GdkDrawable         *real_drawable,
377                                             GdkGC               *gc,
378                                             GdkSpan             *spans,
379                                             int                  nspans,
380                                             gboolean             sorted);
381 GdkRegion *gdk_fb_clip_region              (GdkDrawable         *drawable,
382                                             GdkGC               *gc,
383                                             gboolean             do_clipping,
384                                             gboolean             do_children,
385                                             gboolean             full_shapes);
386
387
388 GdkGrabStatus gdk_fb_pointer_grab          (GdkWindow           *window,
389                                             gint                 owner_events,
390                                             GdkEventMask         event_mask,
391                                             GdkWindow           *confine_to,
392                                             GdkCursor           *cursor,
393                                             guint32              time,
394                                             gboolean             implicit_grab);
395 void       gdk_fb_pointer_ungrab           (guint32 time,
396                                             gboolean implicit_grab);
397
398 guint32    gdk_fb_get_time                 (void);
399
400 void       gdk_shadow_fb_update            (gint                 minx,
401                                             gint                 miny,
402                                             gint                 maxx,
403                                             gint                 maxy);
404 void       gdk_shadow_fb_init              (void);
405 void       gdk_shadow_fb_stop_updates      (void);
406 void       gdk_fb_recompute_all            (void);
407
408 extern GdkFBAngle _gdk_fb_screen_angle;
409
410 /* Pointer grab info */
411 extern GdkWindow *_gdk_fb_pointer_grab_window;
412 extern gboolean _gdk_fb_pointer_grab_owner_events;
413 extern GdkWindow *_gdk_fb_pointer_grab_confine;
414 extern GdkEventMask _gdk_fb_pointer_grab_events;
415 extern GdkCursor *_gdk_fb_pointer_grab_cursor;
416 /* Keyboard grab info */
417 extern GdkWindow *_gdk_fb_keyboard_grab_window;
418 extern GdkEventMask _gdk_fb_keyboard_grab_events;
419 extern gboolean _gdk_fb_keyboard_grab_owner_events;
420
421 extern GdkFBDisplay *gdk_display;
422 extern FILE *debug_out;
423 GdkEvent *gdk_event_make(GdkWindow *window,
424                          GdkEventType type,
425                          gboolean append_to_queue);
426 GdkWindow * gdk_fb_pointer_event_window (GdkWindow *window,
427                                          GdkEventType type);
428 GdkWindow *gdk_fb_keyboard_event_window (GdkWindow *window,
429                                          GdkEventType type);
430 GdkWindow *gdk_fb_other_event_window (GdkWindow *window,
431                                       GdkEventType type);
432
433 void gdk_fb_get_cursor_rect(GdkRectangle *rect);
434 gboolean gdk_fb_cursor_need_hide(GdkRectangle *rect);
435 gboolean gdk_fb_cursor_region_need_hide(GdkRegion *region);
436 void gdk_fb_cursor_unhide(void);
437 void gdk_fb_cursor_reset(void);
438 void gdk_fb_cursor_hide(void);
439 void gdk_fb_redraw_all(void);
440 void gdk_fb_cursor_move (gint x, gint y, GdkWindow *in_window);
441
442 guint gdk_fb_keyboard_modifiers (void);
443 gboolean gdk_fb_keyboard_init  (gboolean open_dev);
444 gboolean gdk_fb_keyboard_open  (void);
445 void     gdk_fb_keyboard_close (void);
446 gboolean gdk_fb_mouse_init     (gboolean open_dev);
447 gboolean gdk_fb_mouse_open     (void);
448 void     gdk_fb_mouse_close    (void);
449 void     gdk_fb_mouse_get_info (gint            *x,
450                                 gint            *y,
451                                 GdkModifierType *mask);
452
453 #endif /* __GDK_PRIVATE_FB_H__ */