gboolean meta_switcher_show(MetaSwitcher* self) { MetaSwitcherPrivate* priv = self->priv; int screen_width, screen_height; MetaScreen* screen = meta_plugin_get_screen(priv->plugin); priv->workspace = meta_screen_get_active_workspace(screen); meta_screen_get_size(screen, &screen_width, &screen_height); meta_switcher_present_list(self); if (priv->apps == NULL || priv->apps->len == 0) goto _end; _capture_desktop(self); clutter_content_invalidate(clutter_actor_get_content(priv->top)); ClutterActor* stage = meta_get_stage_for_screen(screen); clutter_actor_insert_child_above(stage, priv->top, NULL); clutter_actor_show(priv->top); if (!meta_plugin_begin_modal(priv->plugin, 0, clutter_get_current_event_time())) { if (!meta_plugin_begin_modal(priv->plugin, META_MODAL_POINTER_ALREADY_GRABBED, clutter_get_current_event_time())) { g_warning("can not be modal"); goto _end; } } meta_disable_unredirect_for_screen(screen); priv->modaled = TRUE; priv->previous_focused = clutter_stage_get_key_focus(CLUTTER_STAGE(stage)); if (priv->previous_focused == stage) priv->previous_focused = NULL; clutter_stage_set_key_focus(CLUTTER_STAGE(stage), priv->top); clutter_actor_grab_key_focus(priv->top); return TRUE; _end: clutter_actor_hide(priv->top); return FALSE; }
void moses_overview_show(MosesOverview* self, gboolean all_windows) { MosesOverviewPrivate* priv = self->priv; MetaRectangle geom; MetaScreen* screen = meta_plugin_get_screen(priv->plugin); int focused_monitor = meta_screen_get_current_monitor(screen); meta_screen_get_monitor_geometry(screen, focused_monitor, &geom); // FIXME: overview is as big as the current monitor, // need to take care multiple monitors ClutterActor* stage = meta_get_stage_for_screen(screen); ClutterActor* top = CLUTTER_ACTOR(self); clutter_actor_set_size(top, geom.width, geom.height); clutter_actor_insert_child_above(stage, top, NULL); moses_overview_setup(self); priv->previous_focused = clutter_stage_get_key_focus(CLUTTER_STAGE(stage)); if (!meta_plugin_begin_modal(priv->plugin, 0, clutter_get_current_event_time())) { g_warning("can not be modal"); goto _end; } meta_disable_unredirect_for_screen(screen); clutter_actor_show(top); clutter_stage_set_key_focus(CLUTTER_STAGE(stage), top); clutter_actor_grab_key_focus(top); priv->modaled = TRUE; g_idle_add((GSourceFunc)on_idle, self); return; _end: clutter_actor_destroy(CLUTTER_ACTOR(self)); }
/** * shell_recorder_record: * @recorder: the #ShellRecorder * @filename_used: (out) (optional): actual filename used for recording * * Starts recording, Starting the recording may fail if the output file * cannot be opened, or if the output stream cannot be created * for other reasons. In that case a warning is printed to * stderr. There is no way currently to get details on how * recording failed to start. * * An extra reference count is added to the recorder if recording * is succesfully started; the recording object will not be freed * until recording is stopped even if the creator no longer holds * a reference. Recording is automatically stopped if the stage * is destroyed. * * Return value: %TRUE if recording was succesfully started */ gboolean shell_recorder_record (ShellRecorder *recorder, char **filename_used) { g_return_val_if_fail (SHELL_IS_RECORDER (recorder), FALSE); g_return_val_if_fail (recorder->stage != NULL, FALSE); g_return_val_if_fail (recorder->state != RECORDER_STATE_RECORDING, FALSE); if (!recorder_open_pipeline (recorder)) return FALSE; if (filename_used) *filename_used = g_strdup (recorder->current_pipeline->filename); recorder_connect_stage_callbacks (recorder); recorder->last_frame_time = GST_CLOCK_TIME_NONE; recorder->state = RECORDER_STATE_RECORDING; recorder_update_pointer (recorder); recorder_add_update_pointer_timeout (recorder); /* Disable unredirection while we are recoring */ meta_disable_unredirect_for_screen (shell_global_get_screen (shell_global_get ())); /* Set up repaint hook */ recorder->repaint_hook_id = clutter_threads_add_repaint_func(recorder_repaint_hook, recorder->stage, NULL); /* Record an initial frame and also redraw with the indicator */ clutter_actor_queue_redraw (CLUTTER_ACTOR (recorder->stage)); /* We keep a ref while recording to let a caller start a recording then * drop their reference to the recorder */ g_object_ref (recorder); return TRUE; }