diff options
author | Elliot Lee <sopwith@src.gnome.org> | 2000-07-31 17:18:36 +0000 |
---|---|---|
committer | Elliot Lee <sopwith@src.gnome.org> | 2000-07-31 17:18:36 +0000 |
commit | d9e05d700940cd6ce3df81a7ec91111ba9df2d29 (patch) | |
tree | 2de866cc051b1f60c44a558f7b34d0c962ebb9a8 /gdk/linux-fb | |
parent | 621639b754db0c545970a353d59803855040ee4f (diff) | |
download | gtk+-d9e05d700940cd6ce3df81a7ec91111ba9df2d29.tar.gz |
We really do need to include gdkfb.h in order to get the GDK_PARENT_ROOT()
* 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.
Diffstat (limited to 'gdk/linux-fb')
-rw-r--r-- | gdk/linux-fb/Makefile.am | 7 | ||||
-rw-r--r-- | gdk/linux-fb/gdkdrawable-fb2.c | 22 | ||||
-rw-r--r-- | gdk/linux-fb/gdkglobals-fb.c | 2 | ||||
-rw-r--r-- | gdk/linux-fb/gdkinput-ps2.c | 38 | ||||
-rw-r--r-- | gdk/linux-fb/gdkmain-fb.c | 64 | ||||
-rw-r--r-- | gdk/linux-fb/gdkprivate-fb.h | 14 | ||||
-rw-r--r-- | gdk/linux-fb/gdkwindow-fb.c | 14 |
7 files changed, 123 insertions, 38 deletions
diff --git a/gdk/linux-fb/Makefile.am b/gdk/linux-fb/Makefile.am index dc9546238b..43a3758f72 100644 --- a/gdk/linux-fb/Makefile.am +++ b/gdk/linux-fb/Makefile.am @@ -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 \ diff --git a/gdk/linux-fb/gdkdrawable-fb2.c b/gdk/linux-fb/gdkdrawable-fb2.c index 04428f6664..8867826872 100644 --- a/gdk/linux-fb/gdkdrawable-fb2.c +++ b/gdk/linux-fb/gdkdrawable-fb2.c @@ -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) diff --git a/gdk/linux-fb/gdkglobals-fb.c b/gdk/linux-fb/gdkglobals-fb.c index b591e4ebd9..58ba010264 100644 --- a/gdk/linux-fb/gdkglobals-fb.c +++ b/gdk/linux-fb/gdkglobals-fb.c @@ -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; diff --git a/gdk/linux-fb/gdkinput-ps2.c b/gdk/linux-fb/gdkinput-ps2.c index ecfb890f75..c9649f4fb5 100644 --- a/gdk/linux-fb/gdkinput-ps2.c +++ b/gdk/linux-fb/gdkinput-ps2.c @@ -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; diff --git a/gdk/linux-fb/gdkmain-fb.c b/gdk/linux-fb/gdkmain-fb.c index 22e8951fc2..e2b48c473d 100644 --- a/gdk/linux-fb/gdkmain-fb.c +++ b/gdk/linux-fb/gdkmain-fb.c @@ -163,15 +163,41 @@ gdk_pointer_grab (GdkWindow * window, 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; } @@ -201,11 +229,19 @@ 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; diff --git a/gdk/linux-fb/gdkprivate-fb.h b/gdk/linux-fb/gdkprivate-fb.h index 8f30cfe568..db86713008 100644 --- a/gdk/linux-fb/gdkprivate-fb.h +++ b/gdk/linux-fb/gdkprivate-fb.h @@ -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)) diff --git a/gdk/linux-fb/gdkwindow-fb.c b/gdk/linux-fb/gdkwindow-fb.c index feb07d1b15..8f7f544db3 100644 --- a/gdk/linux-fb/gdkwindow-fb.c +++ b/gdk/linux-fb/gdkwindow-fb.c @@ -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(); |