/* Window stacking has changed */ static void _xfdashboard_live_workspace_on_window_stacking_changed(XfdashboardLiveWorkspace *self, gpointer inUserData) { XfdashboardLiveWorkspacePrivate *priv=XFDASHBOARD_LIVE_WORKSPACE(self)->priv; GList *windows; XfdashboardWindowTrackerWindow *window; ClutterActor *actor; g_return_if_fail(XFDASHBOARD_IS_LIVE_WORKSPACE(self)); priv=self->priv; /* Get stacked order of windows */ windows=xfdashboard_window_tracker_get_windows_stacked(priv->windowTracker); /* Iterate through list of stacked window from beginning to end * and reinsert each window found to bottom of this actor */ for( ; windows; windows=g_list_next(windows)) { /* Get window and find corresponding actor */ window=XFDASHBOARD_WINDOW_TRACKER_WINDOW(windows->data); if(!window) continue; actor=_xfdashboard_live_workspace_find_by_window(self, window); if(!actor) continue; /* If we get here the window actor was found so move to bottom */ g_object_ref(actor); clutter_actor_remove_child(CLUTTER_ACTOR(self), actor); clutter_actor_insert_child_above(CLUTTER_ACTOR(self), actor, NULL); g_object_unref(actor); } }
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)); }
//FIXME: ClutterClone seems to have problem rendering children, so badges are stay in grandpar static void create_window_badge(MosesOverview* self, ClutterActor* parent, int order) { ClutterActor* badge = clutter_actor_new(); clutter_actor_insert_child_above(clutter_actor_get_parent(parent), badge, NULL); gfloat tw, th; clutter_actor_get_transformed_size(parent, &tw, &th); gfloat w = 60.0, h = 60.0, x = (tw - w) / 2.0 + clutter_actor_get_x(parent), y = (th - h) / 2.0 + clutter_actor_get_y(parent); clutter_actor_set_position(badge, x, y); clutter_actor_set_size(badge, w, h); g_object_set_qdata(G_OBJECT(badge), moses_overview_window_clone_order(), GINT_TO_POINTER(order)); g_object_set_qdata(G_OBJECT(parent), moses_overview_window_clone_order(), GINT_TO_POINTER(order)); ClutterContent* canvas = clutter_canvas_new(); clutter_canvas_set_size(CLUTTER_CANVAS(canvas), w, h); clutter_actor_set_content(badge, canvas); g_object_unref(canvas); g_signal_connect(canvas, "draw", G_CALLBACK(on_badge_draw), badge); clutter_content_invalidate(canvas); clutter_actor_set_scale(badge, 0.0, 0.0); //do animated show clutter_actor_save_easing_state(badge); clutter_actor_set_easing_mode(badge, CLUTTER_EASE_OUT_BACK); clutter_actor_set_easing_duration(badge, 350); clutter_actor_set_pivot_point(badge, 0.5, 0.5); clutter_actor_set_scale(badge, 1.0, 1.0); clutter_actor_restore_easing_state(badge); g_ptr_array_add(self->priv->badges, badge); }
void xfdashboard_live_workspace_set_workspace(XfdashboardLiveWorkspace *self, XfdashboardWindowTrackerWorkspace *inWorkspace) { XfdashboardLiveWorkspacePrivate *priv; ClutterContent *content; XfdashboardWindowTrackerWindow *window; ClutterActor *child; ClutterActorIter iter; GList *windows; ClutterActor *actor; g_return_if_fail(XFDASHBOARD_IS_LIVE_WORKSPACE(self)); g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace)); priv=self->priv; /* Only set value if it changes */ if(inWorkspace==priv->workspace) return; /* Release old value */ if(priv->workspace) { g_signal_handlers_disconnect_by_data(priv->workspace, self); priv->workspace=NULL; } /* Set new value * Window tracker objects should never be refed or unrefed, so just set new value */ priv->workspace=inWorkspace; /* Destroy all window actors */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(clutter_actor_iter_next(&iter, &child)) { /* Get window actor */ if(!CLUTTER_IS_ACTOR(child)) continue; /* Check if it is really a window actor by retrieving associated window */ content=clutter_actor_get_content(child); if(!content || !XFDASHBOARD_IS_WINDOW_CONTENT(content)) continue; /* Destroy window actor */ clutter_actor_destroy(child); } /* Create windows for new workspace in stacked order */ windows=xfdashboard_window_tracker_get_windows_stacked(priv->windowTracker); for( ; windows; windows=g_list_next(windows)) { /* Get window */ window=XFDASHBOARD_WINDOW_TRACKER_WINDOW(windows->data); if(!window) continue; /* Create window actor if window is visible */ if(!_xfdashboard_live_workspace_is_visible_window(self, window)) continue; actor=clutter_actor_new(); content=xfdashboard_window_content_new_for_window(window); clutter_actor_set_content(actor, content); g_object_unref(content); /* Insert new actor at bottom */ clutter_actor_insert_child_above(CLUTTER_ACTOR(self), actor, NULL); } /* Notify about property change */ g_object_notify_by_pspec(G_OBJECT(self), XfdashboardLiveWorkspaceProperties[PROP_WORKSPACE]); }
/* Create actor for window but respect window stacking when adding */ static ClutterActor* _xfdashboard_live_workspace_create_and_add_window_actor(XfdashboardLiveWorkspace *self, XfdashboardWindowTrackerWindow *inWindow) { XfdashboardLiveWorkspacePrivate *priv; ClutterActor *actor; ClutterContent *content; GList *windows; ClutterActor *lastWindowActor; XfdashboardWindowTrackerWindow *window; g_return_val_if_fail(XFDASHBOARD_IS_LIVE_WORKSPACE(self), NULL); g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WINDOW(inWindow), NULL); priv=self->priv; /* We cannot assume that each window newly opened or moved to this workspace * will be on top of all other windows. We need to respect window stacking. * Therefore we iterate through list of windows in stacking order and find * the last window we have an actor for before we the window requested. */ lastWindowActor=NULL; windows=xfdashboard_window_tracker_get_windows_stacked(priv->windowTracker); for( ; windows; windows=g_list_next(windows)) { /* Get window from list */ window=XFDASHBOARD_WINDOW_TRACKER_WINDOW(windows->data); if(!window) continue; /* We do not need to check if window would be visible on this workspace * as it should not have been created if it is not visible. */ lastWindowActor=_xfdashboard_live_workspace_find_by_window(self, window); if(lastWindowActor) break; } /* Check if we have to "move" an existing window actor or if we have to create * a new actor for window */ actor=_xfdashboard_live_workspace_find_by_window(self, inWindow); if(actor) { /* Move existing window actor to new stacking position */ g_object_ref(actor); clutter_actor_remove_child(CLUTTER_ACTOR(self), actor); clutter_actor_insert_child_above(CLUTTER_ACTOR(self), actor, lastWindowActor); g_object_unref(actor); } else { /* Create actor */ actor=clutter_actor_new(); content=xfdashboard_window_content_new_for_window(inWindow); clutter_actor_set_content(actor, content); g_object_unref(content); /* Add new actor at right stacking position */ clutter_actor_insert_child_above(CLUTTER_ACTOR(self), actor, lastWindowActor); } return(actor); }