void deepin_workspace_overview_handle_event(DeepinWorkspaceOverview* self, XIDeviceEvent* event, KeySym keysym, MetaKeyBindingAction action) { DeepinWorkspaceOverviewPrivate* priv = self->priv; if (!priv->ready) return; gboolean backward = FALSE; if (keysym == XK_Tab || action == META_KEYBINDING_ACTION_SWITCH_APPLICATIONS || action == META_KEYBINDING_ACTION_SWITCH_APPLICATIONS_BACKWARD) { meta_verbose("tabbing inside expose windows\n"); if (keysym == XK_Tab) backward = event->mods.base & ShiftMask; else backward = action == META_KEYBINDING_ACTION_SWITCH_APPLICATIONS_BACKWARD; deepin_workspace_overview_focus_next(self, backward); } else if (keysym == XK_Return) { MetaDeepinClonedWidget* clone = deepin_workspace_overview_get_focused(self); if (!clone) { meta_workspace_focus_default_window(priv->workspace, NULL, event->time); } else { MetaWindow* mw = meta_deepin_cloned_widget_get_window(clone); g_assert(mw != NULL); if (mw->workspace && mw->workspace != priv->workspace) { meta_workspace_activate(mw->workspace, event->time); } meta_window_activate(mw, event->time); } g_idle_add((GSourceFunc)on_idle_end_grab, event->time); } }
static gboolean on_deepin_cloned_widget_released(MetaDeepinClonedWidget* cloned, GdkEvent* event, gpointer data) { DeepinWorkspaceOverview* self = (DeepinWorkspaceOverview*)data; meta_verbose("%s\n", __func__); if (!self->priv->ready) return FALSE; MetaWindow* mw = meta_deepin_cloned_widget_get_window(cloned); if (mw->workspace && mw->workspace != mw->screen->active_workspace) { meta_workspace_activate(mw->workspace, gdk_event_get_time(event)); } meta_window_activate(mw, gdk_event_get_time(event)); g_idle_add((GSourceFunc)on_idle_end_grab, gdk_event_get_time(event)); return TRUE; }
static void moses_overview_dispose(GObject *object) { MosesOverview *overview = MOSES_OVERVIEW(object); MosesOverviewPrivate* priv = overview->priv; if (priv->disposed) return; priv->disposed = TRUE; g_clear_pointer(&priv->ov_head, g_object_unref); MetaScreen* screen = meta_plugin_get_screen(priv->plugin); ClutterActor* stage = meta_get_stage_for_screen(screen); ClutterActor* to_focus = NULL; if (priv->selected_actor) { to_focus = clutter_clone_get_source(CLUTTER_CLONE(priv->selected_actor)); } for (int i = 0; priv->clones && i < priv->clones->len; i++) { ClutterActor* clone = g_ptr_array_index(priv->clones, i); ClutterActor* orig = clutter_clone_get_source(CLUTTER_CLONE(clone)); clutter_actor_show(orig); // FIXME: maybe some actors had not been shown. clutter_actor_destroy(clone); } for (int i = 0; priv->badges && i < priv->badges->len; i++) { clutter_actor_destroy(CLUTTER_ACTOR(g_ptr_array_index(priv->badges, i))); } if (priv->background_actor) { clutter_actor_show(clutter_clone_get_source(CLUTTER_CLONE(priv->background_actor))); g_clear_pointer(&priv->background_actor, clutter_actor_destroy); } if (priv->modaled) { meta_plugin_end_modal(priv->plugin, clutter_get_current_event_time()); meta_enable_unredirect_for_screen(screen); if (priv->selected_workspace) { meta_workspace_activate(priv->selected_workspace, CLUTTER_CURRENT_TIME); MetaDisplay* display = meta_screen_get_display(screen); meta_compositor_switch_workspace(meta_display_get_compositor(display), meta_screen_get_active_workspace(screen), priv->selected_workspace, META_MOTION_DOWN); } else if (to_focus) { clutter_stage_set_key_focus(CLUTTER_STAGE(stage), to_focus); MetaWindowActor* actor = META_WINDOW_ACTOR(to_focus); MetaWindow* win = meta_window_actor_get_meta_window(actor); meta_window_raise(win); meta_window_focus(win, CLUTTER_CURRENT_TIME); } else if (priv->previous_focused) { if (!CLUTTER_IS_STAGE(priv->previous_focused)) { clutter_stage_set_key_focus(CLUTTER_STAGE(stage), priv->previous_focused); } } } G_OBJECT_CLASS(moses_overview_parent_class)->dispose(object); }