]> Pileus Git - ~andy/gtk/blobdiff - gdk/linux-fb/gdkprivate-fb.h
More proper vt switch handling
[~andy/gtk] / gdk / linux-fb / gdkprivate-fb.h
index 3eaa816732328c0d22dd22e868ba6a2f701b9a6d..ff40699f990924414acd3981c4bcc6f19b8e377a 100644 (file)
@@ -32,6 +32,7 @@
 #define __GDK_PRIVATE_FB_H__
 
 #include <gdk/gdkprivate.h>
+#include <gdk/gdkinternals.h>
 #include <gdk/gdk.h>
 #include "gdkfb.h"
 #include "gdkregion-generic.h"
 #include <stdio.h>
 #include <freetype/freetype.h>
 
-#define GDK_DRAWABLE_IMPL_FBDATA(win) ((GdkDrawableFBData *)((GdkWindowPrivate *)(win))->impl)
-#define GDK_DRAWABLE_IMPL(win) ((GdkDrawable *)((GdkWindowPrivate *)(win))->impl)
-#define GDK_WINDOW_IMPL_FBDATA(win) ((GdkWindowFBData *)((GdkWindowPrivate *)(win))->impl)
-#define GDK_PIXMAP_IMPL_FBDATA(win) ((GdkPixmapFBData *)((GdkWindowPrivate *)(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))
-
+#define GDK_TYPE_DRAWABLE_IMPL_FBDATA (gdk_drawable_impl_fb_get_type ())
+#define GDK_DRAWABLE_IMPL_FBDATA(win) ((GdkDrawableFBData *)((GdkWindowObject *)(win))->impl)
+#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))
+
+#define CHECK_IMPL_AND_INTF
+
+#ifdef CHECK_IMPL_AND_INTF
 #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) \
- g_assert(G_OBJECT_TYPE(drawable) == gdk_window_get_type() || G_OBJECT_TYPE(drawable) == gdk_pixmap_get_type())
-
+ g_assert(G_OBJECT_TYPE(drawable) == gdk_window_object_get_type() || G_OBJECT_TYPE(drawable) == gdk_pixmap_get_type())
+#else
+#define GDK_CHECK_IMPL(drawable) 
+#define GDK_CHECK_INTF(drawable)
+#endif
 typedef struct _GdkDrawableFBData GdkDrawableFBData;
 typedef struct _GdkWindowFBData GdkWindowFBData;
 typedef struct _GdkPixmapFBData GdkPixmapFBData;
-typedef GdkWindowObject GdkWindowPrivate;
+typedef struct _GdkFBDrawingContext GdkFBDrawingContext;
+
 #define GDK_DRAWABLE_PIXMAP (GDK_WINDOW_FOREIGN+1)
 
 struct _GdkDrawableFBData
@@ -83,8 +93,6 @@ typedef struct {
   GdkDrawableClass base_class;
 } GdkDrawableFBClass;
 
-#define GDK_DRAWABLE_P(x) ((GdkDrawableFBData *)(x))
-
 struct _GdkPixmapFBData
 {
   GdkDrawableFBData drawable_data;
@@ -109,8 +117,8 @@ struct _GdkWindowFBData
   GdkCursor *cursor;
   GHashTable *properties;
 
-  GdkEventMask event_mask;
-  gint level;
+  GdkRegion *shape; /* Can also be GDK_FB_USE_CHILD_SHAPE */
+  
   gboolean realized : 1;
 };
 
@@ -121,55 +129,102 @@ typedef struct {
 
 struct _GdkFBDisplay
 {
-  int fd;
-  guchar *fbmem;
+  int tty_fd;
+  int console_fd;
+  int vt, start_vt;
+
+  /* Used by rendering code: */
+  guchar *fb_mem;
+  gint fb_width; /* In pixels */
+  gint fb_height; /* In pixels */
+  gint fb_stride; /* In bytes */
+
+  int fb_fd;
+  guchar *fb_mmap;
   gpointer active_cmap;
   gulong mem_len;
   struct fb_fix_screeninfo sinfo;
   struct fb_var_screeninfo modeinfo;
+  struct fb_var_screeninfo orig_modeinfo;
   int red_byte, green_byte, blue_byte; /* For truecolor */
+
+  /* fb manager */
+  int manager_fd;
+  int manager_tag;
+  int manager_blocked;
 };
 
-typedef struct {
-  GdkVisual base;
-} GdkVisualPrivateFB;
+struct _GdkVisualClass
+{
+  GObjectClass parent_class;
+};
 
-typedef struct {
-  GdkColormap base;
 
+typedef struct {
   GHashTable *hash;
   GdkColorInfo *info;
   guint sync_tag;
 } GdkColormapPrivateFB;
 
-typedef struct {
-  GdkColormapClass base_class;
-} GdkColormapFBClass;
-
 typedef struct {
   GdkCursor base;
   GdkPixmap *cursor, *mask;
   int hot_x, hot_y;
-  int mask_off_x, mask_off_y;
 } GdkCursorPrivateFB;
 
+/* Define this to emulate slow emulation of
+   GdkFonts using PangoFont */
+#define EMULATE_GDKFONT
+
 typedef struct {
   GdkFontPrivate base;
-
-  FT_Face face;
-  double size;
+#ifdef EMULATE_GDKFONT
+  /* For PangoFont emulation: */
+  char *name;
+  PangoFont *pango_font;
+#else
+  /* For bogus GdkFonts: */
+  int size;
+#endif
 } GdkFontPrivateFB;
 
-void gdk_fb_font_init(void);
-void gdk_fb_font_fini(void);
-
 typedef struct {
-  GdkImage base;
+  /* Empty */
 } GdkImagePrivateFB;
 
 #define GDK_GC_FBDATA(x) ((GdkGCFBData *)(x))
 #define GDK_GC_P(x) ((GdkGC *)(x))
 
+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);
+
 typedef struct {
   GdkGC parent_instance;
 
@@ -179,48 +234,99 @@ typedef struct {
   GdkGCValues values;
   gint dash_offset;
   gushort dash_list_len;
-  guchar depth, alu;
+  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. 
+   */
+  void (*set_pixel)        (GdkDrawable    *drawable,
+                           GdkGC          *gc,
+                           int             x,
+                           int             y,
+                           gulong          pixel);
+
+  GetPixelRet (*get_color) (GdkDrawable      *drawable,
+                           GdkGC            *gc,
+                           int               x,
+                           int               y,
+                           GdkColor         *color);
+  
+  void (*fill_span)        (GdkDrawable  *drawable,
+                           GdkGC        *gc,
+                           GdkSpan      *span,
+                           GdkColor     *color);
+
+  void (*fill_rectangle)   (GdkDrawable  *drawable,
+                           GdkGC        *gc,
+                           GdkRectangle *rect,
+                           GdkColor     *color);
+  
+  gdk_fb_draw_drawable_func *draw_drawable[GDK_NUM_FB_SRCBPP];
 } GdkGCFBData;
 
 typedef struct {
   GdkGCClass parent_class;
 } GdkGCFBClass;
 
-GType gdk_gc_fb_get_type (void) G_GNUC_CONST;
 
-/* Routines from gdkgeometry-fb.c */
-
-void _gdk_window_init_position     (GdkWindow    *window);
-void _gdk_window_move_resize_child (GdkWindow    *window,
-                                   gint          x,
-                                   gint          y,
-                                   gint          width,
-                                   gint          height);
-void _gdk_window_process_expose    (GdkWindow    *window,
-                                   gulong        serial,
-                                   GdkRectangle *area);
-void gdk_window_invalidate_region_clear(GdkWindow *window, GdkRegion *region);
-void gdk_window_invalidate_rect_clear(GdkWindow *window, GdkRectangle *rect);
-GdkGC *_gdk_fb_gc_new(GdkDrawable *drawable, GdkGCValues *values, GdkGCValuesMask values_mask);
-
-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);
+extern GdkGC *_gdk_fb_screen_gc;
 
-typedef struct {
+GType gdk_gc_fb_get_type (void) G_GNUC_CONST;
+
+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       *src,
+                                              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);
+GdkRegion *gdk_fb_window_get_abs_shape        (GdkDrawable     *window);
+GdkRegion *gdk_fb_window_peek_shape           (GdkDrawable     *window,
+                                              gint            *dx,
+                                              gint            *dy);
+GdkGC *   _gdk_fb_gc_new                      (GdkDrawable     *drawable,
+                                              GdkGCValues     *values,
+                                              GdkGCValuesMask  values_mask);
+
+#define _GDK_FB_GC_DEPTH (1<<31)
+void      _gdk_fb_gc_calc_state              (GdkGC           *gc,
+                                             GdkGCValuesMask  changed);
+
+GdkImage *_gdk_fb_copy_to_image              (GdkDrawable    *drawable,
+                                             GdkImage       *image,
+                                             gint            src_x,
+                                             gint            src_y,
+                                             gint            dest_x,
+                                             gint            dest_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 {
   GdkWindow *bg_relto;
   GdkPixmap *bgpm;
 
@@ -235,62 +341,104 @@ typedef struct {
   gboolean draw_bg : 1;
   gboolean copy_region : 1;
   gboolean handle_cursor : 1;
-} GdkFBDrawingContext;
-
-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, GdkRectangle *rects, int nrects);
-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);
-void gdk_fb_pointer_ungrab (guint32 time, gboolean implicit_grab);
-
-extern GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine;
-extern GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
+};
+
+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,
+                                           gboolean             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,
+                                           gboolean             full_shapes);
+
+
+GdkGrabStatus gdk_fb_pointer_grab          (GdkWindow           *window,
+                                           gint                 owner_events,
+                                           GdkEventMask         event_mask,
+                                           GdkWindow           *confine_to,
+                                           GdkCursor           *cursor,
+                                           guint32              time,
+                                           gboolean             implicit_grab);
+void       gdk_fb_pointer_ungrab           (guint32 time,
+                                           gboolean implicit_grab);
+
+guint32    gdk_fb_get_time                 (void);
+
+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 GdkAtom _gdk_selection_property;
+
+extern GdkFBAngle _gdk_fb_screen_angle;
+
+/* Pointer grab info */
+extern GdkWindow *_gdk_fb_pointer_grab_window;
+extern gboolean _gdk_fb_pointer_grab_owner_events;
+extern GdkWindow *_gdk_fb_pointer_grab_confine;
+extern GdkEventMask _gdk_fb_pointer_grab_events;
 extern GdkCursor *_gdk_fb_pointer_grab_cursor;
+/* Keyboard grab info */
+extern GdkWindow *_gdk_fb_keyboard_grab_window;
+extern GdkEventMask _gdk_fb_keyboard_grab_events;
+extern gboolean _gdk_fb_keyboard_grab_owner_events;
+
 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);
-GdkEvent *gdk_event_make_2(GdkWindow *window, GdkEventType type, gboolean append_to_queue, gint button_press_num);
+extern GdkDisplay *_gdk_display;
+extern GdkScreen *_gdk_screen;
+
+extern volatile gboolean _gdk_fb_is_active_vt;
+
+GdkEvent *gdk_event_make(GdkWindow *window,
+                        GdkEventType type,
+                        gboolean append_to_queue);
+GdkWindow * gdk_fb_pointer_event_window (GdkWindow *window,
+                                        GdkEventType type);
+GdkWindow *gdk_fb_keyboard_event_window (GdkWindow *window,
+                                        GdkEventType type);
+GdkWindow *gdk_fb_other_event_window (GdkWindow *window,
+                                     GdkEventType type);
 
 void gdk_fb_get_cursor_rect(GdkRectangle *rect);
 gboolean gdk_fb_cursor_need_hide(GdkRectangle *rect);
@@ -299,41 +447,25 @@ void gdk_fb_cursor_unhide(void);
 void gdk_fb_cursor_reset(void);
 void gdk_fb_cursor_hide(void);
 void gdk_fb_redraw_all(void);
-
-void gdk_input_get_mouseinfo(gint *x, gint *y, GdkModifierType *mask);
-void gdk_fb_window_visibility_crossing(GdkWindow *window, gboolean is_show, gboolean is_grab);
-
-#define PANGO_TYPE_FB_FONT              (pango_fb_font_get_type ())
-#define PANGO_FB_FONT(object)           (G_TYPE_CHECK_INSTANCE_CAST ((object), PANGO_TYPE_FB_FONT, PangoFBFont))
-typedef struct _PangoFBFont        PangoFBFont;
-struct _PangoFBFont
-{
-  PangoFont parent;
-
-  FT_Face ftf;
-  PangoFontDescription desc;
-  PangoCoverage *coverage;
-  GHashTable *glyph_info;
-};
-typedef struct {
-  PangoRectangle extents[2];
-  GdkPixmapFBData fbd;
-  int hbearing;
-} PangoFBGlyphInfo;
-
-GType pango_fb_font_get_type (void) G_GNUC_CONST;
-gboolean pango_fb_has_glyph(PangoFont *font, PangoGlyph glyph);
-PangoGlyph pango_fb_get_unknown_glyph(PangoFont *font);
-PangoFBGlyphInfo *pango_fb_font_get_glyph_info(PangoFont *font, PangoGlyph glyph);
-
-void gdk_fb_window_move_resize (GdkWindow *window,
-                               gint       x,
-                               gint       y,
-                               gint       width,
-                               gint       height,
-                               gboolean   send_expose_events);
-
-extern void CM(void); /* Check for general mem corruption */
-extern void RP(GdkDrawable *drawable); /* Same, for pixmaps */
+void gdk_fb_cursor_move (gint x, gint y, GdkWindow *in_window);
+
+guint gdk_fb_keyboard_modifiers (void);
+gboolean gdk_fb_keyboard_init  (gboolean open_dev);
+gboolean gdk_fb_keyboard_open  (void);
+void     gdk_fb_keyboard_close (void);
+gboolean gdk_fb_mouse_init     (gboolean open_dev);
+gboolean gdk_fb_mouse_open     (void);
+void     gdk_fb_mouse_close    (void);
+void     gdk_fb_mouse_get_info (gint            *x,
+                               gint            *y,
+                               GdkModifierType *mask);
+
+/* Initialization */
+void _gdk_windowing_window_init (void);
+void _gdk_visual_init (void);
+void _gdk_dnd_init    (void);
+void _gdk_windowing_image_init  (void);
+void _gdk_events_init (void);
+void _gdk_input_init (void);
 
 #endif /* __GDK_PRIVATE_FB_H__ */