static void ntf_wm_display_window_demands_attention_cb (MetaDisplay *display, MetaWindow *mw, MetaPlugin *plugin) { MetaWindow *mcw; MetaWindowType type; mcw = (MetaWindow*)meta_window_get_compositor_private (mw); g_return_if_fail (mcw); /* * Only use notifications for normal windows and dialogues. */ type = meta_window_get_window_type (mcw); if (!(type == META_WINDOW_NORMAL || type == META_WINDOW_MODAL_DIALOG || type == META_WINDOW_DIALOG)) { return; } if (mw != meta_display_get_focus_window (display)) ntf_wm_handle_demands_attention (mw); }
/** * shell_global_get_focus_monitor: * @global: the #ShellGlobal * * Gets the bounding box of the monitor containing the window that * currently contains the keyboard focus. * * Return value: the bounding box of the focus monitor */ GdkRectangle * shell_global_get_focus_monitor (ShellGlobal *global) { MetaScreen *screen = shell_global_get_screen (global); MetaDisplay *display = meta_screen_get_display (screen); MetaWindow *focus = meta_display_get_focus_window (display); MetaRectangle rect, wrect; int nmonitors, i; if (focus) { meta_window_get_outer_rect (focus, &wrect); nmonitors = meta_screen_get_n_monitors (screen); /* Find the monitor that the top-left corner of @focus is on. */ for (i = 0; i < nmonitors; i++) { meta_screen_get_monitor_geometry (screen, i, &rect); if (rect.x <= wrect.x && rect.y <= wrect.y && rect.x + rect.width > wrect.x && rect.y + rect.height > wrect.y) return g_boxed_copy (GDK_TYPE_RECTANGLE, &rect); } } meta_screen_get_monitor_geometry (screen, 0, &rect); return g_boxed_copy (GDK_TYPE_RECTANGLE, &rect); }
static void update_focus_app (ShellWindowTracker *self) { MetaWindow *new_focus_win; ShellApp *new_focus_app; new_focus_win = meta_display_get_focus_window (shell_global_get_display (shell_global_get ())); /* we only consider an app focused if the focus window can be clearly * associated with a running app; this is the case if the focus window * or one of its parents is visible in the taskbar, e.g. * - 'nautilus' should appear focused when its about dialog has focus * - 'nautilus' should not appear focused when the DESKTOP has focus */ while (new_focus_win && meta_window_is_skip_taskbar (new_focus_win)) new_focus_win = meta_window_get_transient_for (new_focus_win); new_focus_app = new_focus_win ? shell_window_tracker_get_window_app (self, new_focus_win) : NULL; if (new_focus_app) { shell_app_update_window_actions (new_focus_app, new_focus_win); shell_app_update_app_menu (new_focus_app, new_focus_win); } set_focus_app (self, new_focus_app); }
static void ntf_wm_display_focus_window_notify_cb (MetaDisplay *display, GParamSpec *spec, MetaPlugin *plugin) { MetaWindow *mw = meta_display_get_focus_window (display); if (mw) ntf_wm_demands_attention_clear (mw); }
static void update_focus_app (ShellWindowTracker *self) { MetaWindow *new_focus_win; ShellApp *new_focus_app; new_focus_win = meta_display_get_focus_window (meta_screen_get_display (shell_global_get_screen (shell_global_get ()))); new_focus_app = new_focus_win ? shell_window_tracker_get_window_app (self, new_focus_win) : NULL; set_focus_app (self, new_focus_app); }
static void update_focus_app (CinnamonWindowTracker *self) { MetaWindow *new_focus_win; CinnamonApp *new_focus_app; new_focus_win = meta_display_get_focus_window (cinnamon_global_get_display (cinnamon_global_get ())); new_focus_app = new_focus_win ? cinnamon_window_tracker_get_window_app (self, new_focus_win) : NULL; set_focus_app (self, new_focus_app); }
static void on_focus_window_changed (MetaDisplay *display, GParamSpec *spec, ShellWindowTracker *tracker) { MetaScreen *screen; MetaWindow *new_focus_win; ShellApp *new_focus_app; screen = shell_global_get_screen (shell_global_get ()); new_focus_win = meta_display_get_focus_window (display); new_focus_app = new_focus_win ? g_hash_table_lookup (tracker->window_to_app, new_focus_win) : NULL; set_focus_app (tracker, new_focus_app); }
static void update_focus_app (ShellWindowTracker *self) { MetaWindow *new_focus_win; ShellApp *new_focus_app; new_focus_win = meta_display_get_focus_window (shell_global_get_display (shell_global_get ())); new_focus_app = new_focus_win ? shell_window_tracker_get_window_app (self, new_focus_win) : NULL; if (new_focus_app) { shell_app_update_window_actions (new_focus_app, new_focus_win); shell_app_update_app_menu (new_focus_app, new_focus_win); } set_focus_app (self, new_focus_app); }
/** * shell_screenshot_screenshot_window: * @screenshot: the #ShellScreenshot * @include_frame: Whether to include the frame or not * @include_cursor: Whether to include the cursor or not * @filename: The filename for the screenshot * @callback: (scope async): function to call returning success or failure * of the async grabbing * * Takes a screenshot of the focused window (optionally omitting the frame) * in @filename as png image. * */ void shell_screenshot_screenshot_window (ShellScreenshot *screenshot, gboolean include_frame, gboolean include_cursor, const char *filename, ShellScreenshotCallback callback) { GSimpleAsyncResult *result; GSettings *settings; _screenshot_data *screenshot_data = g_new0 (_screenshot_data, 1); MetaScreen *screen = shell_global_get_screen (screenshot->global); MetaCursorTracker *tracker; MetaDisplay *display = meta_screen_get_display (screen); MetaWindow *window = meta_display_get_focus_window (display); ClutterActor *window_actor; gfloat actor_x, actor_y; MetaShapedTexture *stex; MetaRectangle rect; cairo_rectangle_int_t clip; screenshot_data->screenshot = g_object_ref (screenshot); screenshot_data->filename = g_strdup (filename); screenshot_data->callback = callback; if (!window) { screenshot_data->filename_used = g_strdup (""); result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, shell_screenshot_screenshot_window); g_simple_async_result_set_op_res_gboolean (result, FALSE); g_simple_async_result_complete (result); g_object_unref (result); return; } window_actor = CLUTTER_ACTOR (meta_window_get_compositor_private (window)); clutter_actor_get_position (window_actor, &actor_x, &actor_y); if (include_frame || !meta_window_get_frame (window)) { meta_window_get_outer_rect (window, &rect); screenshot_data->screenshot_area.x = rect.x; screenshot_data->screenshot_area.y = rect.y; clip.x = rect.x - (gint) actor_x; clip.y = rect.y - (gint) actor_y; } else { rect = *meta_window_get_rect (window); screenshot_data->screenshot_area.x = (gint) actor_x + rect.x; screenshot_data->screenshot_area.y = (gint) actor_y + rect.y; clip.x = rect.x; clip.y = rect.y; } clip.width = screenshot_data->screenshot_area.width = rect.width; clip.height = screenshot_data->screenshot_area.height = rect.height; stex = META_SHAPED_TEXTURE (meta_window_actor_get_texture (META_WINDOW_ACTOR (window_actor))); screenshot_data->image = meta_shaped_texture_get_image (stex, &clip); settings = g_settings_new (A11Y_APPS_SCHEMA); if (include_cursor && !g_settings_get_boolean (settings, MAGNIFIER_ACTIVE_KEY)) { tracker = meta_cursor_tracker_get_for_screen (screen); _draw_cursor_image (tracker, screenshot_data->image, screenshot_data->screenshot_area); } g_object_unref (settings); result = g_simple_async_result_new (NULL, on_screenshot_written, (gpointer)screenshot_data, shell_screenshot_screenshot_window); g_simple_async_result_run_in_thread (result, write_screenshot_thread, G_PRIORITY_DEFAULT, NULL); g_object_unref (result); }