summaryrefslogtreecommitdiff
path: root/gdk/linux-fb
diff options
context:
space:
mode:
authorElliot Lee <sopwith@src.gnome.org>2000-07-31 17:18:36 +0000
committerElliot Lee <sopwith@src.gnome.org>2000-07-31 17:18:36 +0000
commitd9e05d700940cd6ce3df81a7ec91111ba9df2d29 (patch)
tree2de866cc051b1f60c44a558f7b34d0c962ebb9a8 /gdk/linux-fb
parent621639b754db0c545970a353d59803855040ee4f (diff)
downloadgtk+-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.am7
-rw-r--r--gdk/linux-fb/gdkdrawable-fb2.c22
-rw-r--r--gdk/linux-fb/gdkglobals-fb.c2
-rw-r--r--gdk/linux-fb/gdkinput-ps2.c38
-rw-r--r--gdk/linux-fb/gdkmain-fb.c64
-rw-r--r--gdk/linux-fb/gdkprivate-fb.h14
-rw-r--r--gdk/linux-fb/gdkwindow-fb.c14
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();