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