gdkprivate-fb.h 12.6 KB
Newer Older
Elliot Lee's avatar
Elliot Lee committed
1 2 3 4
/* GDK - The GIMP Drawing Kit
 * Copyright (C) 1995-1997 Peter Mattis, Spencer Kimball and Josh MacDonald
 *
 * This library is free software; you can redistribute it and/or
5
 * modify it under the terms of the GNU Lesser General Public
Elliot Lee's avatar
Elliot Lee committed
6 7 8 9 10 11
 * License as published by the Free Software Foundation; either
 * version 2 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12
 * Lesser General Public License for more details.
Elliot Lee's avatar
Elliot Lee committed
13
 *
14
 * You should have received a copy of the GNU Lesser General Public
Elliot Lee's avatar
Elliot Lee committed
15 16 17 18 19 20
 * License along with this library; if not, write to the
 * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
 * Boston, MA 02111-1307, USA.
 */

/*
21
 * Modified by the GTK+ Team and others 1997-2000.  See the AUTHORS
Elliot Lee's avatar
Elliot Lee committed
22 23 24 25 26 27 28 29 30 31 32 33 34
 * file for a list of people on the GTK+ Team.  See the ChangeLog
 * files for a list of changes.  These files are distributed with
 * GTK+ at ftp://ftp.gtk.org/pub/gtk/. 
 */

/*
 * Private uninstalled header defining things local to X windowing code
 */

#ifndef __GDK_PRIVATE_FB_H__
#define __GDK_PRIVATE_FB_H__

#include <gdk/gdkprivate.h>
Alexander Larsson's avatar
Alexander Larsson committed
35
#include <gdk/gdkinternals.h>
Elliot Lee's avatar
Elliot Lee committed
36 37 38 39 40
#include <gdk/gdk.h>
#include "gdkfb.h"
#include "gdkregion-generic.h"
#include <linux/fb.h>
#include <stdio.h>
Elliot Lee's avatar
Elliot Lee committed
41
#include <freetype/freetype.h>
Elliot Lee's avatar
Elliot Lee committed
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 46 47 48 49 50 51 52 53
#define GDK_IS_DRAWABLE_IMPL_FBDATA(object)     (G_TYPE_CHECK_INSTANCE_TYPE ((object), GDK_TYPE_DRAWABLE_IMPL_FBDATA))
#define GDK_DRAWABLE_IMPL(win)        ((GdkDrawable *)((GdkWindowObject *)(win))->impl)
#define GDK_WINDOW_IMPL_FBDATA(win)   ((GdkWindowFBData *)((GdkWindowObject *)(win))->impl)
#define GDK_PIXMAP_IMPL_FBDATA(win)   ((GdkPixmapFBData *)((GdkWindowObject *)(win))->impl)
#define GDK_DRAWABLE_FBDATA(win)      ((GdkDrawableFBData *)(win))
#define GDK_PIXMAP_FBDATA(win)        ((GdkPixmapFBData *)(win))
#define GDK_WINDOW_FBDATA(win)        ((GdkWindowFBData *)(win))
#define GDK_FONT_FB(f)                ((GdkFontPrivateFB *)(f))
#define GDK_CURSOR_FB(c)              ((GdkCursorPrivateFB *)(c))
Elliot Lee's avatar
Elliot Lee committed
54

55 56 57
#define GDK_CHECK_IMPL(drawable) \
 g_assert(G_OBJECT_TYPE(drawable) == _gdk_window_impl_get_type() || G_OBJECT_TYPE(drawable) == _gdk_pixmap_impl_get_type())
#define GDK_CHECK_INTF(drawable) \
Alexander Larsson's avatar
Alexander Larsson committed
58
 g_assert(G_OBJECT_TYPE(drawable) == gdk_window_object_get_type() || G_OBJECT_TYPE(drawable) == gdk_pixmap_get_type())
59

Elliot Lee's avatar
Elliot Lee committed
60 61
typedef struct _GdkDrawableFBData GdkDrawableFBData;
typedef struct _GdkWindowFBData GdkWindowFBData;
Elliot Lee's avatar
Elliot Lee committed
62
typedef struct _GdkPixmapFBData GdkPixmapFBData;
63 64
typedef struct _GdkFBDrawingContext GdkFBDrawingContext;

65
#define GDK_DRAWABLE_PIXMAP (GDK_WINDOW_FOREIGN+1)
Elliot Lee's avatar
Elliot Lee committed
66 67 68

struct _GdkDrawableFBData
{
69 70 71 72
  GdkDrawable parent_object;

  GdkDrawable *wrapper;

Elliot Lee's avatar
Elliot Lee committed
73 74 75 76 77
  guchar *mem;

  gint abs_x, abs_y, lim_x, lim_y, llim_x, llim_y; /* computed values */

  guint rowstride;
78

79 80
  /* Due to excursions in gdk, this stuff has to be stored here
     instead of in GdkDrawable where it belongs */
81 82 83
  gint width, height, depth;
  GdkColormap *colormap;
  GdkWindowType window_type;
Elliot Lee's avatar
Elliot Lee committed
84 85
};

86 87 88 89
typedef struct {
  GdkDrawableClass base_class;
} GdkDrawableFBClass;

Elliot Lee's avatar
Elliot Lee committed
90 91 92 93 94
struct _GdkPixmapFBData
{
  GdkDrawableFBData drawable_data;
};

95 96 97 98
typedef struct {
  GdkDrawableFBClass klass;
} GdkPixmapFBClass;

Elliot Lee's avatar
Elliot Lee committed
99
GType gdk_drawable_impl_fb_get_type (void) G_GNUC_CONST;
100

Elliot Lee's avatar
Elliot Lee committed
101 102 103 104 105 106 107 108 109 110 111 112 113
typedef struct {
  gulong length;
  GdkAtom type;
  gint format;
  guchar data[1];
} GdkWindowProperty;

struct _GdkWindowFBData
{
  GdkDrawableFBData drawable_data;
  GdkCursor *cursor;
  GHashTable *properties;

114 115
  GdkRegion *shape; /* Can also be GDK_FB_USE_CHILD_SHAPE */
  
Elliot Lee's avatar
Elliot Lee committed
116 117 118 119
  GdkEventMask event_mask;
  gboolean realized : 1;
};

120 121 122 123 124
typedef struct {
  GdkDrawableFBClass base_class;
} GdkWindowFBClass;
#define GDK_WINDOW_P(x) ((GdkWindowObject *)(x))

Elliot Lee's avatar
Elliot Lee committed
125 126
struct _GdkFBDisplay
{
127 128 129
  int tty_fd;
  int console_fd;
  int vt, start_vt;
Alexander Larsson's avatar
Alexander Larsson committed
130 131 132 133 134 135 136

  /* Used by rendering code: */
  guchar *fb_mem;
  gint fb_width; /* In pixels */
  gint fb_height; /* In pixels */
  gint fb_stride; /* In bytes */

137
  int fb_fd;
Alexander Larsson's avatar
Alexander Larsson committed
138
  guchar *fb_mmap;
Elliot Lee's avatar
Elliot Lee committed
139 140 141 142
  gpointer active_cmap;
  gulong mem_len;
  struct fb_fix_screeninfo sinfo;
  struct fb_var_screeninfo modeinfo;
143
  struct fb_var_screeninfo orig_modeinfo;
Elliot Lee's avatar
Elliot Lee committed
144
  int red_byte, green_byte, blue_byte; /* For truecolor */
Elliot Lee's avatar
Elliot Lee committed
145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
};

typedef struct {
  GdkVisual base;
} GdkVisualPrivateFB;

typedef struct {
  GHashTable *hash;
  GdkColorInfo *info;
  guint sync_tag;
} GdkColormapPrivateFB;

typedef struct {
  GdkCursor base;
  GdkPixmap *cursor, *mask;
Elliot Lee's avatar
Elliot Lee committed
160
  int hot_x, hot_y;
Elliot Lee's avatar
Elliot Lee committed
161 162 163 164
} GdkCursorPrivateFB;

typedef struct {
  GdkFontPrivate base;
165
  int size;
Elliot Lee's avatar
Elliot Lee committed
166 167 168
} GdkFontPrivateFB;

typedef struct {
169
  /* Empty */
Elliot Lee's avatar
Elliot Lee committed
170 171
} GdkImagePrivateFB;

172 173 174
#define GDK_GC_FBDATA(x) ((GdkGCFBData *)(x))
#define GDK_GC_P(x) ((GdkGC *)(x))

175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204
typedef enum {
  GPR_USED_BG,
  GPR_AA_GRAYVAL,
  GPR_NONE,
  GPR_ERR_BOUNDS
} GetPixelRet;

typedef enum {
  GDK_FB_SRC_BPP_1,
  GDK_FB_SRC_BPP_8,
  GDK_FB_SRC_BPP_16,
  GDK_FB_SRC_BPP_24,
  GDK_FB_SRC_BPP_32,
  GDK_FB_SRC_BPP_7_AA_GRAYVAL,
  GDK_FB_SRC_BPP_8_AA_GRAYVAL,
  GDK_NUM_FB_SRCBPP
} GdkFbSrcBPP;

typedef void gdk_fb_draw_drawable_func (GdkDrawable *drawable,
					GdkGC       *gc,
					GdkPixmap   *src,
					GdkFBDrawingContext *dc,
					gint         start_y,
					gint         end_y,
					gint         start_x,
					gint         end_x,
					gint         src_x_off,
					gint         src_y_off,
					gint         draw_direction);

Elliot Lee's avatar
Elliot Lee committed
205
typedef struct {
206 207
  GdkGC parent_instance;

Elliot Lee's avatar
Elliot Lee committed
208 209 210 211 212 213
  GdkRegion *clip_region;
  gchar *dash_list;
  GdkGCValuesMask values_mask;
  GdkGCValues values;
  gint dash_offset;
  gushort dash_list_len;
214 215 216 217 218 219 220 221 222 223 224 225
  guchar alu;

  /* The GC can only be used with target drawables of
   * the same depth as the initial drawable
   * specified in gd_gc_new().
   */
  guchar depth;
  
  /* Calculated state: */
  /* These functions can only be called for drawables
   * that have the same depth as the gc. 
   */
226
  void (*set_pixel)        (GdkDrawable    *drawable,
227 228 229 230 231 232 233 234 235 236 237
			    GdkGC          *gc,
			    int             x,
			    int             y,
			    gulong          pixel);

  GetPixelRet (*get_color) (GdkDrawable      *drawable,
			    GdkGC            *gc,
			    int               x,
			    int               y,
			    GdkColor         *color);
  
238 239 240 241 242 243 244 245 246 247
  void (*fill_span)        (GdkDrawable  *drawable,
			    GdkGC        *gc,
			    GdkSpan      *span,
			    GdkColor     *color);

  void (*fill_rectangle)   (GdkDrawable  *drawable,
			    GdkGC	 *gc,
			    GdkRectangle *rect,
			    GdkColor     *color);
  
248
  gdk_fb_draw_drawable_func *draw_drawable[GDK_NUM_FB_SRCBPP];
Elliot Lee's avatar
Elliot Lee committed
249 250
} GdkGCFBData;

251 252 253 254
typedef struct {
  GdkGCClass parent_class;
} GdkGCFBClass;

255 256 257

extern GdkGC *_gdk_fb_screen_gc;

Elliot Lee's avatar
Elliot Lee committed
258
GType gdk_gc_fb_get_type (void) G_GNUC_CONST;
Elliot Lee's avatar
Elliot Lee committed
259

260 261 262 263 264 265 266 267 268 269 270 271 272 273
void       _gdk_selection_window_destroyed    (GdkWindow       *window);
void       gdk_window_invalidate_region_clear (GdkWindow       *window,
					       GdkRegion       *region);
void       gdk_window_invalidate_rect_clear   (GdkWindow       *window,
					       GdkRectangle    *rect);
void       gdk_fb_window_send_crossing_events (GdkWindow       *dest,
					       GdkCrossingMode  mode);
void       gdk_fb_window_move_resize          (GdkWindow       *window,
					       gint             x,
					       gint             y,
					       gint             width,
					       gint             height,
					       gboolean         send_expose_events);
GdkWindow *gdk_fb_window_find_focus           (void);
274
GdkRegion *gdk_fb_window_get_abs_shape        (GdkDrawable *window);
275 276 277
GdkGC *   _gdk_fb_gc_new                      (GdkDrawable     *drawable,
					       GdkGCValues     *values,
					       GdkGCValuesMask  values_mask);
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299

#define _GDK_FB_GC_DEPTH (1<<31)
void      _gdk_fb_gc_calc_state              (GdkGC           *gc,
					      GdkGCValuesMask  changed);

GdkImage *_gdk_fb_get_image                  (GdkDrawable     *drawable,
					      gint             x,
					      gint             y,
					      gint             width,
					      gint             height);
void      gdk_fb_drawable_clear              (GdkDrawable     *drawable);
void      gdk_fb_draw_drawable               (GdkDrawable     *drawable,
					      GdkGC           *gc,
					      GdkPixmap       *src,
					      gint             xsrc,
					      gint             ysrc,
					      gint             xdest,
					      gint             ydest,
					      gint             width,
					      gint             height);

struct _GdkFBDrawingContext {
Elliot Lee's avatar
Elliot Lee committed
300 301 302 303 304 305 306 307 308 309 310 311 312 313
  GdkWindow *bg_relto;
  GdkPixmap *bgpm;

  GdkRegion *real_clip_region;

  guchar *mem, *clipmem;
  gpointer cursor_dc;

  guint rowstride, clip_rowstride;
  int clipxoff, clipyoff;

  gboolean draw_bg : 1;
  gboolean copy_region : 1;
  gboolean handle_cursor : 1;
314
};
Elliot Lee's avatar
Elliot Lee committed
315

316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367
void       gdk_fb_drawing_context_init     (GdkFBDrawingContext *dc,
					    GdkDrawable         *drawable,
					    GdkGC               *gc,
					    gboolean             draw_bg,
					    gboolean             do_clipping);
void       gdk_fb_drawing_context_finalize (GdkFBDrawingContext *dc);
void       gdk_fb_draw_drawable_3          (GdkDrawable         *drawable,
					    GdkGC               *gc,
					    GdkPixmap           *src,
					    GdkFBDrawingContext *dc,
					    gint                 xsrc,
					    gint                 ysrc,
					    gint                 xdest,
					    gint                 ydest,
					    gint                 width,
					    gint                 height);
void       gdk_fb_draw_drawable_2          (GdkDrawable         *drawable,
					    GdkGC               *gc,
					    GdkPixmap           *src,
					    gint                 xsrc,
					    gint                 ysrc,
					    gint                 xdest,
					    gint                 ydest,
					    gint                 width,
					    gint                 height,
					    gboolean             draw_bg,
					    gboolean             do_clipping);
void       gdk_fb_draw_rectangle           (GdkDrawable         *drawable,
					    GdkGC               *gc,
					    gint                 filled,
					    gint                 x,
					    gint                 y,
					    gint                 width,
					    gint                 height);
void       gdk_fb_fill_spans               (GdkDrawable         *real_drawable,
					    GdkGC               *gc,
					    GdkSpan             *spans,
					    int                  nspans,
					    gboolean             sorted);
GdkRegion *gdk_fb_clip_region              (GdkDrawable         *drawable,
					    GdkGC               *gc,
					    gboolean             do_clipping,
					    gboolean             do_children);


GdkGrabStatus gdk_fb_pointer_grab          (GdkWindow           *window,
					    gint		 owner_events,
					    GdkEventMask	 event_mask,
					    GdkWindow           *confine_to,
					    GdkCursor           *cursor,
					    guint32              time,
					    gboolean             implicit_grab);
Alexander Larsson's avatar
Alexander Larsson committed
368
void       gdk_fb_pointer_ungrab           (guint32 time,
369 370
					    gboolean implicit_grab);

Alexander Larsson's avatar
Alexander Larsson committed
371
guint32    gdk_fb_get_time                 (void);
372

Alexander Larsson's avatar
Alexander Larsson committed
373 374 375 376 377 378 379 380 381
void       gdk_shadow_fb_update            (gint                 minx,
					    gint                 miny,
					    gint                 maxx,
					    gint                 maxy);
void       gdk_shadow_fb_init              (void);
void       gdk_shadow_fb_stop_updates      (void);
void       gdk_fb_recompute_all            (void);

extern GdkFBAngle _gdk_fb_screen_angle;
382 383

extern GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine;
Elliot Lee's avatar
Elliot Lee committed
384 385 386 387 388 389
extern GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
extern GdkCursor *_gdk_fb_pointer_grab_cursor;
extern GdkFBDisplay *gdk_display;
extern GdkDrawableClass _gdk_fb_drawable_class;
extern FILE *debug_out;
GdkEvent *gdk_event_make(GdkWindow *window, GdkEventType type, gboolean append_to_queue);
390
GdkEvent *gdk_event_make_2(GdkWindow *window, GdkEventType type, gboolean append_to_queue, gint button_press_num);
Elliot Lee's avatar
Elliot Lee committed
391 392

void gdk_fb_get_cursor_rect(GdkRectangle *rect);
393 394
gboolean gdk_fb_cursor_need_hide(GdkRectangle *rect);
gboolean gdk_fb_cursor_region_need_hide(GdkRegion *region);
Elliot Lee's avatar
Elliot Lee committed
395
void gdk_fb_cursor_unhide(void);
396
void gdk_fb_cursor_reset(void);
Elliot Lee's avatar
Elliot Lee committed
397 398
void gdk_fb_cursor_hide(void);
void gdk_fb_redraw_all(void);
Alexander Larsson's avatar
Alexander Larsson committed
399
void gdk_fb_cursor_move (gint x, gint y, GdkWindow *in_window);
Elliot Lee's avatar
Elliot Lee committed
400

401 402 403 404 405 406 407 408
guint gdk_fb_keyboard_modifiers (void);
gboolean gdk_fb_keyboard_open  (void);
void     gdk_fb_keyboard_close (void);
gboolean gdk_fb_mouse_open     (void);
void     gdk_fb_mouse_close    (void);
void     gdk_fb_mouse_get_info (gint            *x,
				gint            *y,
				GdkModifierType *mask);
Alexander Larsson's avatar
Alexander Larsson committed
409

Elliot Lee's avatar
Elliot Lee committed
410
#endif /* __GDK_PRIVATE_FB_H__ */