From d185a84140552a999735d31ee0ce0756b2401f69 Mon Sep 17 00:00:00 2001 From: Tomas Frydrych Date: Thu, 16 Oct 2008 12:16:08 +0100 Subject: [PATCH] Api to set specific input region on stage from plugins. --- .../clutter/clutter-plugins/moblin.c | 38 ++++++++++++++++--- .../compositor-clutter-plugin-manager.c | 23 +++++++++++ src/compositor/clutter/compositor-clutter.c | 9 +---- src/include/compositor-clutter-plugin.h | 4 ++ 4 files changed, 60 insertions(+), 14 deletions(-) diff --git a/src/compositor/clutter/clutter-plugins/moblin.c b/src/compositor/clutter/clutter-plugins/moblin.c index 993ff707e..0b7da1817 100644 --- a/src/compositor/clutter/clutter-plugins/moblin.c +++ b/src/compositor/clutter/clutter-plugins/moblin.c @@ -97,7 +97,6 @@ MetaCompositorClutterPlugin META_COMPOSITOR_CLUTTER_PLUGIN_STRUCT = .maximize = maximize, .unmaximize = unmaximize, .switch_workspace = switch_workspace, - .xevent_filter = xevent_filter, .kill_effect = kill_effect, /* The reload handler */ @@ -614,7 +613,11 @@ on_panel_effect_complete (ClutterActor *panel, gpointer data) gboolean reactive = GPOINTER_TO_INT (data); MetaCompositorClutterPlugin *plugin = get_plugin (); - meta_comp_clutter_plugin_set_stage_reactive (plugin, reactive); + if (reactive) + meta_comp_clutter_plugin_set_stage_reactive (plugin, reactive); + else + meta_comp_clutter_plugin_set_stage_input_area (plugin, 0, 0, + plugin->screen_width, 1); } static gboolean @@ -626,14 +629,17 @@ xevent_filter (XEvent *xev) if (xev->type != MotionNotify) return FALSE; - printf ("got xevent type %d\n", xev->type); + printf ("got xevent type %d on 0x%x @ y %d\n", + xev->type, + (gint) xev->xmotion.window, + xev->xmotion.y_root); if (priv->panel_out) { guint height = clutter_actor_get_height (priv->panel); gint x = clutter_actor_get_x (priv->panel); - if (xev->xmotion.y > (gint)height) + if (xev->xmotion.y_root > (gint)height) { clutter_effect_move (priv->panel_slide_effect, priv->panel, x, -height, @@ -641,9 +647,11 @@ xevent_filter (XEvent *xev) GINT_TO_POINTER (FALSE)); } + priv->panel_out = FALSE; + return TRUE; } - else if (xev->xmotion.y < PANEL_SLIDE_THRESHOLD) + else if (xev->xmotion.y_root < PANEL_SLIDE_THRESHOLD) { gint x = clutter_actor_get_x (priv->panel); @@ -652,6 +660,8 @@ xevent_filter (XEvent *xev) on_panel_effect_complete, GINT_TO_POINTER (TRUE )); + priv->panel_out = TRUE; + return TRUE; } @@ -736,12 +746,16 @@ g_module_check_init (GModule *module) static gboolean stage_input_cb (ClutterActor *stage, ClutterEvent *event, gpointer data) { + printf ("Got event, type %d\n", event->type); + if (event->type == CLUTTER_MOTION) { ClutterMotionEvent *mev = (ClutterMotionEvent *) event; MetaCompositorClutterPlugin *plugin = get_plugin (); PluginPrivate *priv = plugin->plugin_private; + printf ("got stage motion event at y %d\n", mev->y); + if (priv->panel_out) { guint height = clutter_actor_get_height (priv->panel); @@ -755,6 +769,8 @@ stage_input_cb (ClutterActor *stage, ClutterEvent *event, gpointer data) GINT_TO_POINTER (FALSE)); } + priv->panel_out = FALSE; + return TRUE; } else if (mev->y < PANEL_SLIDE_THRESHOLD) @@ -766,6 +782,8 @@ stage_input_cb (ClutterActor *stage, ClutterEvent *event, gpointer data) on_panel_effect_complete, GINT_TO_POINTER (TRUE )); + priv->panel_out = TRUE; + return TRUE; } @@ -900,7 +918,15 @@ do_init () -clutter_actor_get_height (background)); g_signal_connect (meta_comp_clutter_plugin_get_stage (plugin), - "key-release-event", G_CALLBACK (stage_input_cb), NULL); + "motion-event", G_CALLBACK (stage_input_cb), NULL); + + g_signal_connect (meta_comp_clutter_plugin_get_stage (plugin), + "button-press-event", G_CALLBACK (stage_input_cb), NULL); + + meta_comp_clutter_plugin_set_stage_input_area (plugin, 0, 0, + plugin->screen_width, 60); + + clutter_set_motion_events_enabled (TRUE); return TRUE; } diff --git a/src/compositor/clutter/compositor-clutter-plugin-manager.c b/src/compositor/clutter/compositor-clutter-plugin-manager.c index f20a7eb4e..d4b0fd06b 100644 --- a/src/compositor/clutter/compositor-clutter-plugin-manager.c +++ b/src/compositor/clutter/compositor-clutter-plugin-manager.c @@ -743,3 +743,26 @@ meta_comp_clutter_plugin_set_stage_reactive (MetaCompositorClutterPlugin *plugin } } +void +meta_comp_clutter_plugin_set_stage_input_area (MetaCompositorClutterPlugin *plugin, + gint x, gint y, gint width, gint height) +{ + MetaCompositorClutterPluginPrivate *priv = plugin->manager_private; + MetaCompositorClutterPluginManager *mgr = priv->self; + MetaDisplay *display = meta_screen_get_display (mgr->screen); + Display *xdpy = meta_display_get_xdisplay (display); + Window overlay; + XRectangle rect; + XserverRegion region; + + overlay = meta_compositor_clutter_get_overlay_window (mgr->screen); + + rect.x = x; + rect.y = y; + rect.width = width; + rect.height = height; + + region = XFixesCreateRegion (xdpy, &rect, 1); + + XFixesSetWindowShapeRegion (xdpy, overlay, ShapeInput, 0, 0, region); +} diff --git a/src/compositor/clutter/compositor-clutter.c b/src/compositor/clutter/compositor-clutter.c index 3ee6c73ff..3f83a695b 100644 --- a/src/compositor/clutter/compositor-clutter.c +++ b/src/compositor/clutter/compositor-clutter.c @@ -1668,14 +1668,7 @@ get_output_window (MetaScreen *screen) xroot = meta_screen_get_xroot (screen); output = XCompositeGetOverlayWindow (xdisplay, xroot); - XSelectInput (xdisplay, output, - FocusChangeMask | - ExposureMask | - PointerMotionMask | - KeyPressMask | - KeyReleaseMask | - ButtonPressMask | - ButtonReleaseMask); + XSelectInput (xdisplay, output, ExposureMask); return output; } diff --git a/src/include/compositor-clutter-plugin.h b/src/include/compositor-clutter-plugin.h index 21f6f49f2..46dd62e04 100644 --- a/src/include/compositor-clutter-plugin.h +++ b/src/include/compositor-clutter-plugin.h @@ -248,4 +248,8 @@ void meta_comp_clutter_plugin_set_stage_reactive (MetaCompositorClutterPlugin *plugin, gboolean reactive); +void +meta_comp_clutter_plugin_set_stage_input_area (MetaCompositorClutterPlugin *plugin, + gint x, gint y, gint width, gint height); + #endif