From 27a0b8f87a1b1188cb09f832ba7723124cb63a33 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Florian=20M=C3=BCllner?= Date: Thu, 12 Dec 2013 09:09:44 +0100 Subject: [PATCH] Revert "Make tile preview a compositor plugin effect" This reverts commit 21e94ed1094a31b90007089eca5174205d4861c9. --- src/Makefile.am | 2 + src/compositor/compositor.c | 28 ---- src/compositor/meta-plugin-manager.c | 41 ------ src/compositor/meta-plugin-manager.h | 5 - src/compositor/plugins/default.c | 95 ------------- src/core/keybindings.c | 2 +- src/core/screen-private.h | 5 +- src/core/screen.c | 39 ++++-- src/core/window-private.h | 1 - src/core/window.c | 28 ++-- src/meta/compositor.h | 8 -- src/meta/meta-plugin.h | 5 - src/ui/tile-preview.c | 198 +++++++++++++++++++++++++++ src/ui/tile-preview.h | 38 +++++ src/ui/ui.h | 1 + 15 files changed, 280 insertions(+), 216 deletions(-) create mode 100644 src/ui/tile-preview.c create mode 100644 src/ui/tile-preview.h diff --git a/src/Makefile.am b/src/Makefile.am index 1baf76422..ba4122e9d 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -163,6 +163,8 @@ libmutter_la_SOURCES = \ ui/resizepopup.h \ ui/tabpopup.c \ ui/tabpopup.h \ + ui/tile-preview.c \ + ui/tile-preview.h \ ui/theme-parser.c \ ui/theme.c \ meta/theme.h \ diff --git a/src/compositor/compositor.c b/src/compositor/compositor.c index 580b0b887..ef1318824 100644 --- a/src/compositor/compositor.c +++ b/src/compositor/compositor.c @@ -1647,31 +1647,3 @@ meta_compositor_monotonic_time_to_server_time (MetaDisplay *display, else return monotonic_time + compositor->server_time_offset; } - -void -meta_compositor_show_tile_preview (MetaCompositor *compositor, - MetaScreen *screen, - MetaWindow *window, - MetaRectangle *tile_rect, - int tile_monitor_number) -{ - MetaCompScreen *info = meta_screen_get_compositor_data (screen); - - if (!info->plugin_mgr) - return; - - meta_plugin_manager_show_tile_preview (info->plugin_mgr, - window, tile_rect, tile_monitor_number); -} - -void -meta_compositor_hide_tile_preview (MetaCompositor *compositor, - MetaScreen *screen) -{ - MetaCompScreen *info = meta_screen_get_compositor_data (screen); - - if (!info->plugin_mgr) - return; - - meta_plugin_manager_hide_tile_preview (info->plugin_mgr); -} diff --git a/src/compositor/meta-plugin-manager.c b/src/compositor/meta-plugin-manager.c index 899dcfef6..dee1b0801 100644 --- a/src/compositor/meta-plugin-manager.c +++ b/src/compositor/meta-plugin-manager.c @@ -326,44 +326,3 @@ meta_plugin_manager_confirm_display_change (MetaPluginManager *plugin_mgr) else return meta_plugin_complete_display_change (plugin, TRUE); } - -gboolean -meta_plugin_manager_show_tile_preview (MetaPluginManager *plugin_mgr, - MetaWindow *window, - MetaRectangle *tile_rect, - int tile_monitor_number) -{ - MetaPlugin *plugin = plugin_mgr->plugin; - MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); - MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen); - - if (display->display_opening) - return FALSE; - - if (klass->show_tile_preview) - { - klass->show_tile_preview (plugin, window, tile_rect, tile_monitor_number); - return TRUE; - } - - return FALSE; -} - -gboolean -meta_plugin_manager_hide_tile_preview (MetaPluginManager *plugin_mgr) -{ - MetaPlugin *plugin = plugin_mgr->plugin; - MetaPluginClass *klass = META_PLUGIN_GET_CLASS (plugin); - MetaDisplay *display = meta_screen_get_display (plugin_mgr->screen); - - if (display->display_opening) - return FALSE; - - if (klass->hide_tile_preview) - { - klass->hide_tile_preview (plugin); - return TRUE; - } - - return FALSE; -} diff --git a/src/compositor/meta-plugin-manager.h b/src/compositor/meta-plugin-manager.h index 0b94459dc..f39f5cada 100644 --- a/src/compositor/meta-plugin-manager.h +++ b/src/compositor/meta-plugin-manager.h @@ -77,9 +77,4 @@ gboolean _meta_plugin_xevent_filter (MetaPlugin *plugin, void meta_plugin_manager_confirm_display_change (MetaPluginManager *mgr); -gboolean meta_plugin_manager_show_tile_preview (MetaPluginManager *mgr, - MetaWindow *window, - MetaRectangle *tile_rect, - int tile_monitor_number); -gboolean meta_plugin_manager_hide_tile_preview (MetaPluginManager *mgr); #endif diff --git a/src/compositor/plugins/default.c b/src/compositor/plugins/default.c index 3ea1b5366..404302c8b 100644 --- a/src/compositor/plugins/default.c +++ b/src/compositor/plugins/default.c @@ -42,7 +42,6 @@ #define SWITCH_TIMEOUT 500 #define ACTOR_DATA_KEY "MCCP-Default-actor-data" -#define SCREEN_TILE_PREVIEW_DATA_KEY "MCCP-Default-screen-tile-preview-data" #define META_TYPE_DEFAULT_PLUGIN (meta_default_plugin_get_type ()) #define META_DEFAULT_PLUGIN(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), META_TYPE_DEFAULT_PLUGIN, MetaDefaultPlugin)) @@ -71,7 +70,6 @@ struct _MetaDefaultPluginClass }; static GQuark actor_data_quark = 0; -static GQuark screen_tile_preview_data_quark = 0; static void start (MetaPlugin *plugin); static void minimize (MetaPlugin *plugin, @@ -102,12 +100,6 @@ static void kill_window_effects (MetaPlugin *plugin, MetaWindowActor *actor); static void kill_switch_workspace (MetaPlugin *plugin); -static void show_tile_preview (MetaPlugin *plugin, - MetaWindow *window, - MetaRectangle *tile_rect, - int tile_monitor_number); -static void hide_tile_preview (MetaPlugin *plugin); - static void confirm_display_change (MetaPlugin *plugin); static const MetaPluginInfo * plugin_info (MetaPlugin *plugin); @@ -154,15 +146,6 @@ typedef struct } EffectCompleteData; -typedef struct _ScreenTilePreview -{ - ClutterActor *actor; - - GdkRGBA *preview_color; - - MetaRectangle tile_rect; -} ScreenTilePreview; - static void meta_default_plugin_dispose (GObject *object) { @@ -223,8 +206,6 @@ meta_default_plugin_class_init (MetaDefaultPluginClass *klass) plugin_class->unmaximize = unmaximize; plugin_class->destroy = destroy; plugin_class->switch_workspace = switch_workspace; - plugin_class->show_tile_preview = show_tile_preview; - plugin_class->hide_tile_preview = hide_tile_preview; plugin_class->plugin_info = plugin_info; plugin_class->kill_window_effects = kill_window_effects; plugin_class->kill_switch_workspace = kill_switch_workspace; @@ -804,82 +785,6 @@ destroy (MetaPlugin *plugin, MetaWindowActor *window_actor) meta_plugin_destroy_completed (plugin, window_actor); } -/* - * Tile preview private data accessor - */ -static void -free_screen_tile_preview (gpointer data) -{ - ScreenTilePreview *preview = data; - - if (G_LIKELY (preview != NULL)) { - clutter_actor_destroy (preview->actor); - g_slice_free (ScreenTilePreview, preview); - } -} - -static ScreenTilePreview * -get_screen_tile_preview (MetaScreen *screen) -{ - ScreenTilePreview *preview = g_object_get_qdata (G_OBJECT (screen), screen_tile_preview_data_quark); - - if (G_UNLIKELY (screen_tile_preview_data_quark == 0)) - screen_tile_preview_data_quark = g_quark_from_static_string (SCREEN_TILE_PREVIEW_DATA_KEY); - - if (G_UNLIKELY (!preview)) - { - preview = g_slice_new0 (ScreenTilePreview); - - preview->actor = clutter_actor_new (); - clutter_actor_set_background_color (preview->actor, CLUTTER_COLOR_Blue); - clutter_actor_set_opacity (preview->actor, 100); - - clutter_actor_add_child (meta_get_window_group_for_screen (screen), preview->actor); - g_object_set_qdata_full (G_OBJECT (screen), - screen_tile_preview_data_quark, preview, - free_screen_tile_preview); - } - - return preview; -} - -static void -show_tile_preview (MetaPlugin *plugin, - MetaWindow *window, - MetaRectangle *tile_rect, - int tile_monitor_number) -{ - MetaScreen *screen = meta_plugin_get_screen (plugin); - ScreenTilePreview *preview = get_screen_tile_preview (screen); - ClutterActor *window_actor; - - if (CLUTTER_ACTOR_IS_VISIBLE (preview->actor) - && preview->tile_rect.x == tile_rect->x - && preview->tile_rect.y == tile_rect->y - && preview->tile_rect.width == tile_rect->width - && preview->tile_rect.height == tile_rect->height) - return; /* nothing to do */ - - clutter_actor_set_position (preview->actor, tile_rect->x, tile_rect->y); - clutter_actor_set_size (preview->actor, tile_rect->width, tile_rect->height); - - clutter_actor_show (preview->actor); - - window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window)); - clutter_actor_lower (preview->actor, window_actor); - - preview->tile_rect = *tile_rect; -} - -static void -hide_tile_preview (MetaPlugin *plugin) -{ - MetaScreen *screen = meta_plugin_get_screen (plugin); - ScreenTilePreview *preview = get_screen_tile_preview (screen); - - clutter_actor_hide (preview->actor); -} - static void kill_switch_workspace (MetaPlugin *plugin) { diff --git a/src/core/keybindings.c b/src/core/keybindings.c index 3effe090c..bd557baa3 100644 --- a/src/core/keybindings.c +++ b/src/core/keybindings.c @@ -2209,7 +2209,7 @@ process_mouse_move_resize_grab (MetaDisplay *display, { /* Hide the tiling preview if necessary */ if (window->tile_mode != META_TILE_NONE) - meta_screen_hide_tile_preview (screen); + meta_screen_tile_preview_hide (screen); /* Restore the original tile mode */ window->tile_mode = display->grab_tile_mode; diff --git a/src/core/screen-private.h b/src/core/screen-private.h index 1aa0d2489..426f561ff 100644 --- a/src/core/screen-private.h +++ b/src/core/screen-private.h @@ -67,6 +67,7 @@ struct _MetaScreen MetaRectangle rect; /* Size of screen; rect.x & rect.y are always 0 */ MetaUI *ui; MetaTabPopup *tab_popup, *ws_popup; + MetaTilePreview *tile_preview; guint tile_preview_timeout_id; @@ -168,9 +169,9 @@ void meta_screen_workspace_popup_select (MetaScreen *screen, MetaWorkspace*meta_screen_workspace_popup_get_selected (MetaScreen *screen); void meta_screen_workspace_popup_destroy (MetaScreen *screen); -void meta_screen_update_tile_preview (MetaScreen *screen, +void meta_screen_tile_preview_update (MetaScreen *screen, gboolean delay); -void meta_screen_hide_tile_preview (MetaScreen *screen); +void meta_screen_tile_preview_hide (MetaScreen *screen); MetaWindow* meta_screen_get_mouse_window (MetaScreen *screen, MetaWindow *not_this_one); diff --git a/src/core/screen.c b/src/core/screen.c index b1b264d8c..fc0c3ae19 100644 --- a/src/core/screen.c +++ b/src/core/screen.c @@ -763,6 +763,7 @@ meta_screen_new (MetaDisplay *display, screen->tab_popup = NULL; screen->ws_popup = NULL; + screen->tile_preview = NULL; screen->tile_preview_timeout_id = 0; @@ -868,6 +869,9 @@ meta_screen_free (MetaScreen *screen, if (screen->tile_preview_timeout_id) g_source_remove (screen->tile_preview_timeout_id); + if (screen->tile_preview) + meta_tile_preview_free (screen->tile_preview); + g_free (screen->screen_name); g_object_unref (screen); @@ -1726,7 +1730,7 @@ meta_screen_workspace_popup_destroy (MetaScreen *screen) } static gboolean -meta_screen_update_tile_preview_timeout (gpointer data) +meta_screen_tile_preview_update_timeout (gpointer data) { MetaScreen *screen = data; MetaWindow *window = screen->display->grab_window; @@ -1734,6 +1738,19 @@ meta_screen_update_tile_preview_timeout (gpointer data) screen->tile_preview_timeout_id = 0; + if (!screen->tile_preview) + { + Window xwindow; + gulong create_serial; + + screen->tile_preview = meta_tile_preview_new (screen->number); + xwindow = meta_tile_preview_get_xwindow (screen->tile_preview, + &create_serial); + meta_stack_tracker_record_add (screen->stack_tracker, + xwindow, + create_serial); + } + if (window) { switch (window->tile_mode) @@ -1758,16 +1775,12 @@ meta_screen_update_tile_preview_timeout (gpointer data) if (needs_preview) { MetaRectangle tile_rect; - int monitor; - monitor = meta_window_get_current_tile_monitor_number (window); meta_window_get_current_tile_area (window, &tile_rect); - meta_compositor_show_tile_preview (screen->display->compositor, - screen, window, &tile_rect, monitor); + meta_tile_preview_show (screen->tile_preview, &tile_rect); } else - meta_compositor_hide_tile_preview (screen->display->compositor, - screen); + meta_tile_preview_hide (screen->tile_preview); return FALSE; } @@ -1775,7 +1788,7 @@ meta_screen_update_tile_preview_timeout (gpointer data) #define TILE_PREVIEW_TIMEOUT_MS 200 void -meta_screen_update_tile_preview (MetaScreen *screen, +meta_screen_tile_preview_update (MetaScreen *screen, gboolean delay) { if (delay) @@ -1785,7 +1798,7 @@ meta_screen_update_tile_preview (MetaScreen *screen, screen->tile_preview_timeout_id = g_timeout_add (TILE_PREVIEW_TIMEOUT_MS, - meta_screen_update_tile_preview_timeout, + meta_screen_tile_preview_update_timeout, screen); } else @@ -1793,18 +1806,18 @@ meta_screen_update_tile_preview (MetaScreen *screen, if (screen->tile_preview_timeout_id > 0) g_source_remove (screen->tile_preview_timeout_id); - meta_screen_update_tile_preview_timeout ((gpointer)screen); + meta_screen_tile_preview_update_timeout ((gpointer)screen); } } void -meta_screen_hide_tile_preview (MetaScreen *screen) +meta_screen_tile_preview_hide (MetaScreen *screen) { if (screen->tile_preview_timeout_id > 0) g_source_remove (screen->tile_preview_timeout_id); - meta_compositor_hide_tile_preview (screen->display->compositor, - screen); + if (screen->tile_preview) + meta_tile_preview_hide (screen->tile_preview); } MetaWindow* diff --git a/src/core/window-private.h b/src/core/window-private.h index 90afce8c0..774b6abb5 100644 --- a/src/core/window-private.h +++ b/src/core/window-private.h @@ -629,7 +629,6 @@ void meta_window_handle_mouse_grab_op_event (MetaWindow *window, GList* meta_window_get_workspaces (MetaWindow *window); -int meta_window_get_current_tile_monitor_number (MetaWindow *window); void meta_window_get_current_tile_area (MetaWindow *window, MetaRectangle *tile_area); diff --git a/src/core/window.c b/src/core/window.c index 1c54b2217..a3ba38575 100644 --- a/src/core/window.c +++ b/src/core/window.c @@ -1404,6 +1404,9 @@ meta_window_new_with_attrs (MetaDisplay *display, if (!window->override_redirect) meta_stack_add (window->screen->stack, window); + else if (window->screen->tile_preview != NULL && + meta_tile_preview_get_xwindow (window->screen->tile_preview, NULL) == xwindow) + window->layer = META_LAYER_NORMAL; else window->layer = META_LAYER_OVERRIDE_REDIRECT; /* otherwise set by MetaStack */ @@ -3781,7 +3784,7 @@ meta_window_tile (MetaWindow *window) directions = META_MAXIMIZE_VERTICAL; meta_window_maximize_internal (window, directions, NULL); - meta_screen_update_tile_preview (window->screen, FALSE); + meta_screen_tile_preview_update (window->screen, FALSE); if (window->display->compositor) { @@ -9349,7 +9352,7 @@ update_move (MetaWindow *window, * trigger it unwittingly, e.g. when shaking loose the window or moving * it to another monitor. */ - meta_screen_update_tile_preview (window->screen, + meta_screen_tile_preview_update (window->screen, window->tile_mode != META_TILE_NONE); meta_window_get_client_root_coords (window, &old); @@ -10105,20 +10108,6 @@ meta_window_get_work_area_all_monitors (MetaWindow *window, window->desc, area->x, area->y, area->width, area->height); } -int -meta_window_get_current_tile_monitor_number (MetaWindow *window) -{ - int tile_monitor_number = window->tile_monitor_number; - - if (tile_monitor_number < 0) - { - meta_warning ("%s called with an invalid monitor number; using 0 instead\n", G_STRFUNC); - tile_monitor_number = 0; - } - - return tile_monitor_number; -} - void meta_window_get_current_tile_area (MetaWindow *window, MetaRectangle *tile_area) @@ -10127,7 +10116,12 @@ meta_window_get_current_tile_area (MetaWindow *window, g_return_if_fail (window->tile_mode != META_TILE_NONE); - tile_monitor_number = meta_window_get_current_tile_monitor_number (window); + tile_monitor_number = window->tile_monitor_number; + if (tile_monitor_number < 0) + { + meta_warning ("%s called with an invalid monitor number; using 0 instead\n", G_STRFUNC); + tile_monitor_number = 0; + } meta_window_get_work_area_for_monitor (window, tile_monitor_number, tile_area); diff --git a/src/meta/compositor.h b/src/meta/compositor.h index adf1654f5..b0e54550d 100644 --- a/src/meta/compositor.h +++ b/src/meta/compositor.h @@ -128,12 +128,4 @@ void meta_compositor_sync_screen_size (MetaCompositor *compositor, void meta_compositor_flash_screen (MetaCompositor *compositor, MetaScreen *screen); -void meta_compositor_show_tile_preview (MetaCompositor *compositor, - MetaScreen *screen, - MetaWindow *window, - MetaRectangle *tile_rect, - int tile_monitor_number); -void meta_compositor_hide_tile_preview (MetaCompositor *compositor, - MetaScreen *screen); - #endif /* META_COMPOSITOR_H */ diff --git a/src/meta/meta-plugin.h b/src/meta/meta-plugin.h index e03daa189..0587551c8 100644 --- a/src/meta/meta-plugin.h +++ b/src/meta/meta-plugin.h @@ -160,11 +160,6 @@ struct _MetaPluginClass gint to, MetaMotionDirection direction); - void (*show_tile_preview) (MetaPlugin *plugin, - MetaWindow *window, - MetaRectangle *tile_rect, - int tile_monitor_number); - void (*hide_tile_preview) (MetaPlugin *plugin); /** * MetaPluginClass::kill_window_effects: diff --git a/src/ui/tile-preview.c b/src/ui/tile-preview.c new file mode 100644 index 000000000..61a438578 --- /dev/null +++ b/src/ui/tile-preview.c @@ -0,0 +1,198 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* Mutter tile-preview marks the area a window will *ehm* snap to */ + +/* + * Copyright (C) 2010 Florian Müllner + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ + +#include + +#include +#include + +#include "tile-preview.h" +#include "core.h" + +#define OUTLINE_WIDTH 5 /* frame width in non-composite case */ + + +struct _MetaTilePreview { + GtkWidget *preview_window; + gulong create_serial; + + GdkRGBA *preview_color; + + MetaRectangle tile_rect; +}; + +static gboolean +meta_tile_preview_draw (GtkWidget *widget, + cairo_t *cr, + gpointer user_data) +{ + MetaTilePreview *preview = user_data; + + cairo_set_line_width (cr, 1.0); + + /* Fill the preview area with a transparent color */ + gdk_cairo_set_source_rgba (cr, preview->preview_color); + + cairo_set_operator (cr, CAIRO_OPERATOR_SOURCE); + cairo_paint (cr); + + /* Use the opaque color for the border */ + cairo_set_source_rgb (cr, + preview->preview_color->red, + preview->preview_color->green, + preview->preview_color->blue); + + cairo_rectangle (cr, + 0.5, 0.5, + preview->tile_rect.width - 1, + preview->tile_rect.height - 1); + cairo_stroke (cr); + + return FALSE; +} + +MetaTilePreview * +meta_tile_preview_new (int screen_number) +{ + MetaTilePreview *preview; + GdkScreen *screen; + GtkStyleContext *context; + GtkWidgetPath *path; + guchar selection_alpha = 0xFF; + + screen = gdk_display_get_screen (gdk_display_get_default (), screen_number); + + preview = g_new (MetaTilePreview, 1); + + preview->preview_window = gtk_window_new (GTK_WINDOW_POPUP); + + gtk_window_set_screen (GTK_WINDOW (preview->preview_window), screen); + gtk_widget_set_app_paintable (preview->preview_window, TRUE); + + preview->preview_color = NULL; + + preview->tile_rect.x = preview->tile_rect.y = 0; + preview->tile_rect.width = preview->tile_rect.height = 0; + + gtk_widget_set_visual (preview->preview_window, + gdk_screen_get_rgba_visual (screen)); + + path = gtk_widget_path_new (); + gtk_widget_path_append_type (path, GTK_TYPE_ICON_VIEW); + + context = gtk_style_context_new (); + gtk_style_context_set_path (context, path); + gtk_style_context_add_class (context, + GTK_STYLE_CLASS_RUBBERBAND); + + gtk_widget_path_free (path); + + gtk_style_context_get (context, GTK_STATE_FLAG_SELECTED, + "background-color", &preview->preview_color, + NULL); + + /* The background-color for the .rubberband class should probably + * contain the correct alpha value - unfortunately, at least for now + * it doesn't. Hopefully the following workaround can be removed + * when GtkIconView gets ported to GtkStyleContext. + */ + gtk_style_context_get_style (context, + "selection-box-alpha", &selection_alpha, + NULL); + preview->preview_color->alpha = (double)selection_alpha / 0xFF; + + g_object_unref (context); + + /* We make an assumption that XCreateWindow will be the first operation + * when calling gtk_widget_realize() (via gdk_window_new()), or that it + * is at least "close enough". + */ + preview->create_serial = XNextRequest (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ())); + gtk_widget_realize (preview->preview_window); + g_signal_connect (preview->preview_window, "draw", + G_CALLBACK (meta_tile_preview_draw), preview); + + return preview; +} + +void +meta_tile_preview_free (MetaTilePreview *preview) +{ + gtk_widget_destroy (preview->preview_window); + + if (preview->preview_color) + gdk_rgba_free (preview->preview_color); + + g_free (preview); +} + +void +meta_tile_preview_show (MetaTilePreview *preview, + MetaRectangle *tile_rect) +{ + GdkWindow *window; + GdkRectangle old_rect; + + if (gtk_widget_get_visible (preview->preview_window) + && preview->tile_rect.x == tile_rect->x + && preview->tile_rect.y == tile_rect->y + && preview->tile_rect.width == tile_rect->width + && preview->tile_rect.height == tile_rect->height) + return; /* nothing to do */ + + gtk_widget_show (preview->preview_window); + window = gtk_widget_get_window (preview->preview_window); + meta_core_lower_beneath_grab_window (GDK_DISPLAY_XDISPLAY (gdk_display_get_default ()), + GDK_WINDOW_XID (window), + gtk_get_current_event_time ()); + + old_rect.x = old_rect.y = 0; + old_rect.width = preview->tile_rect.width; + old_rect.height = preview->tile_rect.height; + + gdk_window_invalidate_rect (window, &old_rect, FALSE); + + preview->tile_rect = *tile_rect; + + gdk_window_move_resize (window, + preview->tile_rect.x, preview->tile_rect.y, + preview->tile_rect.width, preview->tile_rect.height); +} + +void +meta_tile_preview_hide (MetaTilePreview *preview) +{ + gtk_widget_hide (preview->preview_window); +} + +Window +meta_tile_preview_get_xwindow (MetaTilePreview *preview, + gulong *create_serial) +{ + GdkWindow *window = gtk_widget_get_window (preview->preview_window); + + if (create_serial) + *create_serial = preview->create_serial; + + return GDK_WINDOW_XID (window); +} diff --git a/src/ui/tile-preview.h b/src/ui/tile-preview.h new file mode 100644 index 000000000..8152a60ee --- /dev/null +++ b/src/ui/tile-preview.h @@ -0,0 +1,38 @@ +/* -*- mode: C; c-file-style: "gnu"; indent-tabs-mode: nil; -*- */ + +/* Meta tile preview */ + +/* + * Copyright (C) 2010 Florian Müllner + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + * 02111-1307, USA. + */ +#ifndef META_TILE_PREVIEW_H +#define META_TILE_PREVIEW_H + +#include + +typedef struct _MetaTilePreview MetaTilePreview; + +MetaTilePreview *meta_tile_preview_new (int screen_number); +void meta_tile_preview_free (MetaTilePreview *preview); +void meta_tile_preview_show (MetaTilePreview *preview, + MetaRectangle *rect); +void meta_tile_preview_hide (MetaTilePreview *preview); +Window meta_tile_preview_get_xwindow (MetaTilePreview *preview, + gulong *create_serial); + +#endif /* META_TILE_PREVIEW_H */ diff --git a/src/ui/ui.h b/src/ui/ui.h index ac33d40da..e397c43d0 100644 --- a/src/ui/ui.h +++ b/src/ui/ui.h @@ -181,5 +181,6 @@ int meta_ui_get_drag_threshold (MetaUI *ui); MetaUIDirection meta_ui_get_direction (void); #include "tabpopup.h" +#include "tile-preview.h" #endif