]> Pileus Git - ~andy/gtk/commitdiff
We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT()
authorElliot Lee <sopwith@src.gnome.org>
Mon, 31 Jul 2000 17:18:36 +0000 (17:18 +0000)
committerElliot Lee <sopwith@src.gnome.org>
Mon, 31 Jul 2000 17:18:36 +0000 (17:18 +0000)
* gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT()
macro to work.
* gtk/gtkmarshal.list: Add NONE:STRING,POINTER
* gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
* gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.

18 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
gdk/gdkwindow.c
gdk/linux-fb/Makefile.am
gdk/linux-fb/gdkdrawable-fb2.c
gdk/linux-fb/gdkglobals-fb.c
gdk/linux-fb/gdkinput-ps2.c
gdk/linux-fb/gdkmain-fb.c
gdk/linux-fb/gdkprivate-fb.h
gdk/linux-fb/gdkwindow-fb.c
gtk/gtkcolorsel.c
gtk/gtkmarshal.list
gtk/gtkmarshalers.list

index 9adcd7c4c84e18b01cdb8806e8233e390f958ec1..20d28c74119d9cd27ef8d2022b90ab16afdb84b2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2000-07-31  Elliot Lee  <sopwith@redhat.com>
+
+       * gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT() macro to work.
+       * gtk/gtkmarshal.list: Add NONE:STRING,POINTER
+       * gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
+       * gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.
+
 Mon Jul 31 13:53:16 BST 2000  Tony Gale <gale@gtk.org>
 
         * docs/gtkfaq.sgml docs/gtk-faq.sgml:
index 9adcd7c4c84e18b01cdb8806e8233e390f958ec1..20d28c74119d9cd27ef8d2022b90ab16afdb84b2 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-31  Elliot Lee  <sopwith@redhat.com>
+
+       * gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT() macro to work.
+       * gtk/gtkmarshal.list: Add NONE:STRING,POINTER
+       * gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
+       * gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.
+
 Mon Jul 31 13:53:16 BST 2000  Tony Gale <gale@gtk.org>
 
         * docs/gtkfaq.sgml docs/gtk-faq.sgml:
index 9adcd7c4c84e18b01cdb8806e8233e390f958ec1..20d28c74119d9cd27ef8d2022b90ab16afdb84b2 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-31  Elliot Lee  <sopwith@redhat.com>
+
+       * gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT() macro to work.
+       * gtk/gtkmarshal.list: Add NONE:STRING,POINTER
+       * gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
+       * gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.
+
 Mon Jul 31 13:53:16 BST 2000  Tony Gale <gale@gtk.org>
 
         * docs/gtkfaq.sgml docs/gtk-faq.sgml:
index 9adcd7c4c84e18b01cdb8806e8233e390f958ec1..20d28c74119d9cd27ef8d2022b90ab16afdb84b2 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-31  Elliot Lee  <sopwith@redhat.com>
+
+       * gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT() macro to work.
+       * gtk/gtkmarshal.list: Add NONE:STRING,POINTER
+       * gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
+       * gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.
+
 Mon Jul 31 13:53:16 BST 2000  Tony Gale <gale@gtk.org>
 
         * docs/gtkfaq.sgml docs/gtk-faq.sgml:
index 9adcd7c4c84e18b01cdb8806e8233e390f958ec1..20d28c74119d9cd27ef8d2022b90ab16afdb84b2 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-31  Elliot Lee  <sopwith@redhat.com>
+
+       * gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT() macro to work.
+       * gtk/gtkmarshal.list: Add NONE:STRING,POINTER
+       * gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
+       * gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.
+
 Mon Jul 31 13:53:16 BST 2000  Tony Gale <gale@gtk.org>
 
         * docs/gtkfaq.sgml docs/gtk-faq.sgml:
index 9adcd7c4c84e18b01cdb8806e8233e390f958ec1..20d28c74119d9cd27ef8d2022b90ab16afdb84b2 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-31  Elliot Lee  <sopwith@redhat.com>
+
+       * gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT() macro to work.
+       * gtk/gtkmarshal.list: Add NONE:STRING,POINTER
+       * gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
+       * gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.
+
 Mon Jul 31 13:53:16 BST 2000  Tony Gale <gale@gtk.org>
 
         * docs/gtkfaq.sgml docs/gtk-faq.sgml:
index 9adcd7c4c84e18b01cdb8806e8233e390f958ec1..20d28c74119d9cd27ef8d2022b90ab16afdb84b2 100644 (file)
@@ -1,3 +1,10 @@
+2000-07-31  Elliot Lee  <sopwith@redhat.com>
+
+       * gtk/gtkcolorsel.c: We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT() macro to work.
+       * gtk/gtkmarshal.list: Add NONE:STRING,POINTER
+       * gdk/gdkwindow.c: Don't send expose events, or invalidate pieces of, windows that aren't shown.
+       * gdk/linux-fb: Redraw-when-menu-hidden solved, plus a bunch of pointer grab stuff.
+
 Mon Jul 31 13:53:16 BST 2000  Tony Gale <gale@gtk.org>
 
         * docs/gtkfaq.sgml docs/gtk-faq.sgml:
index ce925de0a5e14ad7f660d38434a1dadb30bf395f..fd3b068ae5625fb5a0e67175a4614437ef53da4f 100644 (file)
@@ -1413,9 +1413,15 @@ static guint update_idle = 0;
 static void
 gdk_window_process_updates_internal (GdkWindow *window)
 {
-  GdkWindowObject *private = (GdkWindowObject *)window;
+  GdkWindowObject *private = (GdkWindowObject *)window, *cur;
   gboolean save_region = FALSE;
 
+  for(cur = private; cur; cur = cur->parent)
+    {
+      if(!cur->mapped)
+       return;
+    }
+
   /* If an update got queued during update processing, we can get a
    * window in the update queue that has an empty update_area.
    * just ignore it.
@@ -1529,6 +1535,9 @@ gdk_window_invalidate_rect   (GdkWindow    *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
   
+  if (private->input_only || !private->mapped)
+    return;
+
   if (!rect)
     {
       window_rect.x = 0;
@@ -1602,7 +1611,7 @@ gdk_window_invalidate_region (GdkWindow *window,
   if (GDK_WINDOW_DESTROYED (window))
     return;
   
-  if (private->input_only)
+  if (private->input_only || !private->mapped)
     return;
   
   if (private->update_area)
index dc9546238b9d1a94e51bbcf907f95ff59caac5bf..43a3758f7227df93215722b8f54556741a6d30bb 100644 (file)
@@ -1,5 +1,8 @@
 ## Process this file with automake to produce Makefile.in
 
+libgdkincludedir = $(includedir)/gtk-2.0/gdk
+libgdkfbincludedir = $(includedir)/gtk-2.0/gdk/linux-fb
+
 INCLUDES = @STRIP_BEGIN@       \
        -DG_LOG_DOMAIN=\"Gdk\"  \
        -I$(top_srcdir)         \
@@ -21,12 +24,14 @@ LDFLAGS = @STRIP_BEGIN@ \
 
 noinst_LTLIBRARIES = libgdk-linux-fb.la
 
+libgdkinclude_HEADERS= \
+       gdkfb.h
+
 libgdk_linux_fb_la_SOURCES =           \
        gdkcolor-fb.c           \
        gdkcursor-fb.c          \
        gdkdnd-fb.c             \
        gdkdrawable-fb2.c       \
-       gdkfb.h                 \
        gdkfont-fb.c            \
        gdkgc-fb.c              \
        gdkgeometry-fb.c        \
index 04428f6664dea6be3be926cf1f5ba50e89049908..886782687268501278c2775df5eb97aee2abe104 100644 (file)
@@ -189,15 +189,25 @@ gdk_fb_clip_region(GdkDrawable *drawable, GdkGC *gc, gboolean do_clipping, gbool
 {
   GdkRectangle draw_rect;
   GdkRegion *real_clip_region, *tmpreg;
-  gboolean watchit = FALSE;
+  gboolean watchit = FALSE, skipit = FALSE;
 
   g_assert(!GDK_IS_WINDOW(GDK_DRAWABLE_P(drawable)->wrapper) || !GDK_WINDOW_P(GDK_DRAWABLE_P(drawable)->wrapper)->input_only);
 
   draw_rect.x = GDK_DRAWABLE_FBDATA(drawable)->llim_x;
   draw_rect.y = GDK_DRAWABLE_FBDATA(drawable)->llim_y;
-  draw_rect.width = GDK_DRAWABLE_FBDATA(drawable)->lim_x - draw_rect.x;
-  draw_rect.height = GDK_DRAWABLE_FBDATA(drawable)->lim_y - draw_rect.y;
+  if(!GDK_IS_WINDOW(GDK_DRAWABLE_FBDATA(drawable)) || GDK_WINDOW_P(GDK_DRAWABLE_P(drawable)->wrapper)->mapped)
+    {
+      draw_rect.width = GDK_DRAWABLE_FBDATA(drawable)->lim_x - draw_rect.x;
+      draw_rect.height = GDK_DRAWABLE_FBDATA(drawable)->lim_y - draw_rect.y;
+    }
+  else
+    {
+      draw_rect.width = draw_rect.height = 0;
+      skipit = TRUE;
+    }
   real_clip_region = gdk_region_rectangle(&draw_rect);
+  if(skipit)
+    return real_clip_region;
 
   if(do_clipping && GDK_IS_WINDOW(GDK_DRAWABLE_FBDATA(drawable)->wrapper) && GDK_WINDOW_P(GDK_DRAWABLE_P(drawable)->wrapper)->mapped && !GDK_WINDOW_P(GDK_DRAWABLE_FBDATA(drawable)->wrapper)->input_only)
     {
@@ -547,8 +557,6 @@ gdk_fb_fill_spans(GdkDrawable *real_drawable,
 
   drawable = real_drawable;
 
-  GDK_CHECK_IMPL(drawable);
-
   if(GDK_IS_WINDOW(GDK_DRAWABLE_P(drawable)->wrapper) && !GDK_WINDOW_P(GDK_DRAWABLE_P(drawable)->wrapper)->mapped)
     return;
   if(GDK_IS_WINDOW(GDK_DRAWABLE_P(drawable)->wrapper) && GDK_WINDOW_P(GDK_DRAWABLE_P(drawable)->wrapper)->input_only)
@@ -795,8 +803,6 @@ gdk_fb_drawing_context_init(GdkFBDrawingContext *dc,
   dc->bg_relto = GDK_DRAWABLE_P(drawable)->wrapper;
   dc->draw_bg = draw_bg;
 
-  GDK_CHECK_IMPL(drawable);
-
   if(GDK_IS_WINDOW(GDK_DRAWABLE_P(drawable)->wrapper))
     {
       dc->bgpm = GDK_WINDOW_P(GDK_DRAWABLE_P(drawable)->wrapper)->bg_pixmap;
@@ -885,8 +891,6 @@ gdk_fb_draw_drawable_3 (GdkDrawable *drawable,
   int draw_direction = 1;
   gboolean do_quick_draw;
 
-  GDK_CHECK_IMPL(drawable);
-
   if(GDK_IS_WINDOW(GDK_DRAWABLE_P(drawable)->wrapper))
     {
       if(!GDK_WINDOW_P(GDK_DRAWABLE_P(drawable)->wrapper)->mapped)
index b591e4ebd99ba89ec9691fe6d060bdd29feac34f..58ba0102647d750970cf6fcbe01735f1bc114600 100644 (file)
@@ -33,7 +33,7 @@
 const gchar            *gdk_progclass = "none";
 gboolean          gdk_null_window_warnings = TRUE;
 
-GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL;
+GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_pointer_grab_window_events, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine = NULL;
 GdkEventMask _gdk_fb_pointer_grab_events, _gdk_fb_keyboard_grab_events;
 
 GdkFBWindow *gdk_root_window = NULL;
index ecfb890f75609f418c1d70b56b7e6250bf2782d3..c9649f4fb52e8fd189a0c2bdc7ec05e39d324be4 100644 (file)
@@ -97,8 +97,8 @@ send_button_event(PS2Mouse *mouse, guint button, gboolean press_event, time_t th
   GdkWindow *window;
   int nbuttons = 0;
 
-  if(_gdk_fb_pointer_grab_window)
-    window = _gdk_fb_pointer_grab_window;
+  if(_gdk_fb_pointer_grab_window_events)
+    window = _gdk_fb_pointer_grab_window_events;
   else
     window = gdk_window_get_pointer(NULL, NULL, NULL, NULL);
 
@@ -159,14 +159,14 @@ send_button_event(PS2Mouse *mouse, guint button, gboolean press_event, time_t th
   if(mouse->button3_pressed)
     nbuttons++;
 
-  if(press_event && nbuttons == 1 && !_gdk_fb_pointer_grab_window)
+  if(press_event && nbuttons == 1)
     {
-      gdk_pointer_grab(window, FALSE, gdk_window_get_events(window), NULL, NULL, GDK_CURRENT_TIME);
+      gdk_fb_pointer_grab(window, FALSE, gdk_window_get_events(window), NULL, NULL, GDK_CURRENT_TIME, TRUE);
       mouse->click_grab = TRUE;
     }
   else if(!press_event && nbuttons == 0 && mouse->click_grab)
     {
-      gdk_pointer_ungrab(GDK_CURRENT_TIME);
+      gdk_fb_pointer_ungrab(GDK_CURRENT_TIME, TRUE);
       mouse->click_grab = FALSE;
     }
 
@@ -368,7 +368,7 @@ move_pointer(PS2Mouse *mouse, GdkWindow *in_window)
 
   gdk_fb_cursor_hide();
 
-  if(_gdk_fb_pointer_grab_cursor)
+  if(_gdk_fb_pointer_grab_window && _gdk_fb_pointer_grab_cursor)
     the_cursor = _gdk_fb_pointer_grab_cursor;
   else
     {
@@ -397,17 +397,19 @@ gdk_fb_cursor_reset(void)
   move_pointer(gdk_fb_ps2mouse, win);
 }
 
-void gdk_fb_window_visibility_crossing(GdkWindow *window, gboolean is_show)
+void gdk_fb_window_visibility_crossing(GdkWindow *window, gboolean is_show, gboolean is_grab)
 {
   gint winx, winy;
   GdkModifierType my_mask;
 
   gdk_input_ps2_get_mouseinfo(&winx, &winy, &my_mask);
 
-  if(winx >= GDK_DRAWABLE_IMPL_FBDATA(window)->llim_x
-     && winx < GDK_DRAWABLE_IMPL_FBDATA(window)->lim_x
-     && winy >= GDK_DRAWABLE_IMPL_FBDATA(window)->llim_y
-     && winy < GDK_DRAWABLE_IMPL_FBDATA(window)->lim_y)
+  if(is_grab
+     || (winx >= GDK_DRAWABLE_IMPL_FBDATA(window)->llim_x
+        && winx < GDK_DRAWABLE_IMPL_FBDATA(window)->lim_x
+        && winy >= GDK_DRAWABLE_IMPL_FBDATA(window)->llim_y
+        && winy < GDK_DRAWABLE_IMPL_FBDATA(window)->lim_y)
+     )
     {
       GdkWindow *oldwin, *newwin, *curwin;
       GdkEvent *event;
@@ -437,7 +439,15 @@ void gdk_fb_window_visibility_crossing(GdkWindow *window, gboolean is_show)
          event->crossing.y = winy - y_int;
          event->crossing.x_root = winx;
          event->crossing.y_root = winy;
-         event->crossing.mode = GDK_CROSSING_NORMAL;
+         if(is_grab)
+           {
+             if(is_show)
+               event->crossing.mode = GDK_CROSSING_GRAB;
+             else
+               event->crossing.mode = GDK_CROSSING_UNGRAB;
+           }
+         else
+           event->crossing.mode = GDK_CROSSING_NORMAL;
          event->crossing.detail = GDK_NOTIFY_UNKNOWN;
          event->crossing.focus = FALSE;
          event->crossing.state = my_mask;
@@ -553,8 +563,8 @@ handle_input(GIOChannel *gioc, GIOCondition cond, gpointer data)
 
     win = gdk_window_get_pointer(NULL, NULL, NULL, NULL);
     move_pointer(mouse, win);
-    if(_gdk_fb_pointer_grab_window)
-      win = _gdk_fb_pointer_grab_window;
+    if(_gdk_fb_pointer_grab_window_events)
+      win = _gdk_fb_pointer_grab_window_events;
 
     gdk_window_get_origin(win, &x, &y);
     x = mouse->x - x;
index 22e8951fc286d5385b5ab17f171c01ecb73e95fd..e2b48c473dbedf8b84974111000f7a8f66a974f4 100644 (file)
@@ -162,16 +162,42 @@ gdk_pointer_grab (GdkWindow *       window,
                  GdkWindow *     confine_to,
                  GdkCursor *     cursor,
                  guint32         time)
+{
+  return gdk_fb_pointer_grab (window,
+                             owner_events,
+                             event_mask,
+                             confine_to,
+                             cursor,
+                             time, FALSE);
+}
+
+static gboolean _gdk_fb_pointer_implicit_grab = FALSE;
+
+GdkGrabStatus
+gdk_fb_pointer_grab (GdkWindow *         window,
+                    gint                 owner_events,
+                    GdkEventMask         event_mask,
+                    GdkWindow *          confine_to,
+                    GdkCursor *          cursor,
+                    guint32      time,
+                    gboolean implicit_grab)
 {
   g_return_val_if_fail (window != NULL, 0);
   g_return_val_if_fail (GDK_IS_WINDOW (window), 0);
   g_return_val_if_fail (confine_to == NULL || GDK_IS_WINDOW (confine_to), 0);
 
   if(_gdk_fb_pointer_grab_window)
-    gdk_pointer_ungrab(time);
+    {
+      if(implicit_grab && !_gdk_fb_pointer_implicit_grab)
+       return GDK_GRAB_ALREADY_GRABBED;
 
-  if(!owner_events)
-    _gdk_fb_pointer_grab_window = gdk_window_ref(window);
+      gdk_pointer_ungrab(time);
+    }
+
+  _gdk_fb_pointer_implicit_grab = implicit_grab;
+
+  _gdk_fb_pointer_grab_window = gdk_window_ref(window);
+  _gdk_fb_pointer_grab_window_events = owner_events?NULL:_gdk_fb_pointer_grab_window;
 
   _gdk_fb_pointer_grab_confine = confine_to?gdk_window_ref(confine_to):NULL;
   _gdk_fb_pointer_grab_events = event_mask;
@@ -179,6 +205,8 @@ gdk_pointer_grab (GdkWindow *         window,
 
   if(cursor)
     gdk_fb_cursor_reset();
+
+  gdk_fb_window_visibility_crossing(window, TRUE, TRUE);
   
   return GDK_GRAB_SUCCESS;
 }
@@ -200,12 +228,20 @@ gdk_pointer_grab (GdkWindow *       window,
 
 void
 gdk_pointer_ungrab (guint32 time)
+{
+  gdk_fb_pointer_ungrab(time, FALSE);
+}
+
+void
+gdk_fb_pointer_ungrab (guint32 time, gboolean implicit_grab)
 {
   gboolean have_grab_cursor = _gdk_fb_pointer_grab_cursor && 1;
 
-  if(_gdk_fb_pointer_grab_window)
-    gdk_window_unref(_gdk_fb_pointer_grab_window);
-  _gdk_fb_pointer_grab_window = NULL;
+  if(!_gdk_fb_pointer_grab_window)
+    return;
+
+  if(implicit_grab && !_gdk_fb_pointer_implicit_grab)
+    return;
 
   if(_gdk_fb_pointer_grab_confine)
     gdk_window_unref(_gdk_fb_pointer_grab_confine);
@@ -217,6 +253,15 @@ gdk_pointer_ungrab (guint32 time)
 
   if(have_grab_cursor)
     gdk_fb_cursor_reset();
+
+  gdk_fb_window_visibility_crossing(_gdk_fb_pointer_grab_window, FALSE, TRUE);
+  
+  if(_gdk_fb_pointer_grab_window)
+    gdk_window_unref(_gdk_fb_pointer_grab_window);
+  _gdk_fb_pointer_grab_window = NULL;
+  _gdk_fb_pointer_grab_window_events = NULL;
+
+  _gdk_fb_pointer_implicit_grab = FALSE;
 }
 
 /*
@@ -496,8 +541,15 @@ gdk_event_make(GdkWindow *window, GdkEventType type, gboolean append_to_queue)
     GDK_SCROLL_MASK /* GDK_SCROLL            = 31 */
   };
   guint evmask;
+
   evmask = GDK_WINDOW_IMPL_FBDATA(window)->event_mask;
 
+  /* Bad hack to make sure that things work semi-properly with owner_events */
+  if(_gdk_fb_pointer_grab_window)
+    evmask |= _gdk_fb_pointer_grab_events;
+  if(_gdk_fb_keyboard_grab_window)
+    evmask |= _gdk_fb_keyboard_grab_events;
+
   if(evmask & GDK_BUTTON_MOTION_MASK)
     {
       evmask |= GDK_BUTTON1_MOTION_MASK|GDK_BUTTON2_MOTION_MASK|GDK_BUTTON3_MOTION_MASK;
index 8f30cfe5681fbfd471b0529c059ee2b29df3a20b..db867130089086a5e7c97410384d52baa6debf05 100644 (file)
@@ -271,7 +271,17 @@ void gdk_fb_draw_rectangle (GdkDrawable    *drawable,
 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);
 
-extern GdkWindow *_gdk_fb_pointer_grab_window, *_gdk_fb_keyboard_grab_window, *_gdk_fb_pointer_grab_confine;
+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;
 extern GdkCursor *_gdk_fb_pointer_grab_cursor;
 extern GdkFBDisplay *gdk_display;
@@ -289,7 +299,7 @@ void gdk_fb_cursor_hide(void);
 void gdk_fb_redraw_all(void);
 
 void gdk_input_ps2_get_mouseinfo(gint *x, gint *y, GdkModifierType *mask);
-void gdk_fb_window_visibility_crossing(GdkWindow *window, gboolean is_show);
+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))
index feb07d1b15891f1cdd39b9d3c8605377bfa0a5d4..8f7f544db3c5ad9d7ecba97226582e5a547165ee 100644 (file)
@@ -457,7 +457,7 @@ gdk_window_invalidate_region_clear(GdkWindow *window, GdkRegion *region)
   int i;
   GdkWindowPrivate *private = GDK_WINDOW_P(window);
 
-  if (private->input_only)
+  if (private->input_only || !private->mapped)
     return;
 
   if(private->bg_pixmap != GDK_NO_BG)
@@ -513,7 +513,7 @@ gdk_window_invalidate_rect_clear(GdkWindow *window, GdkRectangle *rect)
 {
   GdkWindowPrivate *private = GDK_WINDOW_P(window);
 
-  if (private->input_only)
+  if (private->input_only || !private->mapped)
     return;
 
   if(GDK_WINDOW_P(window)->bg_pixmap != GDK_NO_BG)
@@ -562,7 +562,7 @@ gdk_fb_redraw_all(void)
   r.x = r.y = 0;
   r.width = GDK_DRAWABLE_IMPL_FBDATA(gdk_parent_root)->width;
   r.height = GDK_DRAWABLE_IMPL_FBDATA(gdk_parent_root)->height;
-  gdk_window_invalidate_rect(gdk_parent_root, &r, TRUE);
+  gdk_window_invalidate_rect_clear(gdk_parent_root, &r);
   gdk_window_process_all_updates();
 }
 
@@ -588,7 +588,7 @@ gdk_window_show (GdkWindow *window)
          send_map_events(private, TRUE);
 
          private->mapped = FALSE; /* a hack, ayup, to make gdk_window_get_pointer get the other window */
-         gdk_fb_window_visibility_crossing(window, TRUE);
+         gdk_fb_window_visibility_crossing(window, TRUE, FALSE);
          private->mapped = TRUE;
 
          if(private->input_only)
@@ -631,12 +631,16 @@ gdk_window_hide (GdkWindow *window)
        gdk_fb_drawable_clear(gdk_parent_root);
 
       if(all_parents_shown((GdkWindowPrivate *)private->parent))
-       gdk_fb_window_visibility_crossing(window, FALSE);
+       gdk_fb_window_visibility_crossing(window, FALSE, FALSE);
 
       do_hide = gdk_fb_cursor_need_hide(&r);
 
       if(do_hide)
        gdk_fb_cursor_hide();
+      if(window == _gdk_fb_pointer_grab_window)
+       gdk_pointer_ungrab(GDK_CURRENT_TIME);
+      if(window == _gdk_fb_keyboard_grab_window)
+       gdk_keyboard_ungrab(GDK_CURRENT_TIME);
       gdk_window_invalidate_rect_clear(gdk_parent_root, &r);
       if(do_hide)
        gdk_fb_cursor_unhide();
index 724971ad3bec2798ef4e0febe3bc26c6fa0cf595..c39b85407e668f63405ce7c50489e9331111b80c 100644 (file)
@@ -31,6 +31,8 @@
 #include "x11/gdkx.h"
 #elif defined (GDK_WINDOWING_WIN32)
 #include "win32/gdkwin32.h"
+#elif defined (GDK_WINDOWING_FB)
+#include "linux-fb/gdkfb.h"
 #endif
 
 #include "gdk/gdkkeysyms.h"
index 7f3b8646470fb493156de1fbb9f543be0a4dfe75..4b3c0bea1b8862fab909e01ca344380c1afda8e8 100644 (file)
@@ -32,6 +32,7 @@ NONE:POINTER,UINT,UINT
 NONE:POINTER,UINT,UINT
 NONE:STRING
 NONE:STRING,INT,POINTER
+NONE:STRING,POINTER
 NONE:UINT
 NONE:UINT,POINTER,UINT,ENUM,ENUM,POINTER
 NONE:UINT,POINTER,UINT,UINT,ENUM
index 7f3b8646470fb493156de1fbb9f543be0a4dfe75..4b3c0bea1b8862fab909e01ca344380c1afda8e8 100644 (file)
@@ -32,6 +32,7 @@ NONE:POINTER,UINT,UINT
 NONE:POINTER,UINT,UINT
 NONE:STRING
 NONE:STRING,INT,POINTER
+NONE:STRING,POINTER
 NONE:UINT
 NONE:UINT,POINTER,UINT,ENUM,ENUM,POINTER
 NONE:UINT,POINTER,UINT,UINT,ENUM