/* Find live workspace actor for native workspace */ static XfdashboardLiveWorkspace* _xfdashboard_workspace_selector_find_actor_for_workspace(XfdashboardWorkspaceSelector *self, XfdashboardWindowTrackerWorkspace *inWorkspace) { ClutterActorIter iter; ClutterActor *child; XfdashboardLiveWorkspace *liveWorkspace; g_return_val_if_fail(XFDASHBOARD_IS_WORKSPACE_SELECTOR(self), NULL); g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace), NULL); /* Iterate through workspace actor and lookup the one handling requesting workspace */ clutter_actor_iter_init(&iter, CLUTTER_ACTOR(self)); while(clutter_actor_iter_next(&iter, &child)) { if(XFDASHBOARD_IS_LIVE_WORKSPACE(child)) { liveWorkspace=XFDASHBOARD_LIVE_WORKSPACE(child); if(xfdashboard_live_workspace_get_workspace(liveWorkspace)==inWorkspace) { return(liveWorkspace); } } } return(NULL); }
/** * xfdashboard_create_app_context: * @inWorkspace: The workspace where to place application windows on or %NULL * * Returns a #GAppLaunchContext suitable for launching applications on the * given display and workspace by GIO. * * If @inWorkspace is specified it sets workspace on which applications will * be launched when using this context when running under a window manager * that supports multiple workspaces. * * When the workspace is not specified it is up to the window manager to pick * one, typically it will be the current workspace. * * Return value: (transfer full): the newly created #GAppLaunchContext or %NULL * in case of an error. Use g_object_unref() to free return value. */ GAppLaunchContext* xfdashboard_create_app_context(XfdashboardWindowTrackerWorkspace *inWorkspace) { GdkAppLaunchContext *context; const ClutterEvent *event; XfdashboardWindowTracker *tracker; g_return_val_if_fail(inWorkspace==NULL || XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace), NULL); /* Get last event for timestamp */ event=clutter_get_current_event(); /* Get active workspace if not specified */ if(!inWorkspace) { tracker=xfdashboard_window_tracker_get_default(); inWorkspace=xfdashboard_window_tracker_get_active_workspace(tracker); g_object_unref(tracker); } /* Create and set up application context to use either the workspace specified * or otherwise current active workspace. We will even set the current active * explicitly to launch the application on current workspace even if user changes * workspace in the time between launching application and showing first window. */ context=gdk_display_get_app_launch_context(gdk_display_get_default()); if(event) gdk_app_launch_context_set_timestamp(context, clutter_event_get_time(event)); gdk_app_launch_context_set_desktop(context, xfdashboard_window_tracker_workspace_get_number(inWorkspace)); /* Return application context */ return(G_APP_LAUNCH_CONTEXT(context)); }
ClutterActor* xfdashboard_live_workspace_new_for_workspace(XfdashboardWindowTrackerWorkspace *inWorkspace) { g_return_val_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace), NULL); return(CLUTTER_ACTOR(g_object_new(XFDASHBOARD_TYPE_LIVE_WORKSPACE, "workspace", inWorkspace, NULL))); }
/* A workspace was destroyed */ static void _xfdashboard_workspace_selector_on_workspace_removed(XfdashboardWorkspaceSelector *self, XfdashboardWindowTrackerWorkspace *inWorkspace, gpointer inUserData) { XfdashboardLiveWorkspace *liveWorkspace; g_return_if_fail(XFDASHBOARD_IS_WORKSPACE_SELECTOR(self)); g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace)); /* Iterate through children and find workspace to destroy */ liveWorkspace=_xfdashboard_workspace_selector_find_actor_for_workspace(self, inWorkspace); if(liveWorkspace) clutter_actor_destroy(CLUTTER_ACTOR(liveWorkspace)); }
/* A workspace was created */ static void _xfdashboard_workspace_selector_on_workspace_added(XfdashboardWorkspaceSelector *self, XfdashboardWindowTrackerWorkspace *inWorkspace, gpointer inUserData) { ClutterActor *actor; gint index; ClutterAction *action; g_return_if_fail(XFDASHBOARD_IS_WORKSPACE_SELECTOR(self)); g_return_if_fail(XFDASHBOARD_IS_WINDOW_TRACKER_WORKSPACE(inWorkspace)); /* Get index of workspace for insertion */ index=xfdashboard_window_tracker_workspace_get_number(inWorkspace); /* Create new live workspace actor and insert at index */ actor=xfdashboard_live_workspace_new_for_workspace(inWorkspace); g_signal_connect_swapped(actor, "clicked", G_CALLBACK(_xfdashboard_workspace_selector_on_workspace_clicked), self); clutter_actor_insert_child_at_index(CLUTTER_ACTOR(self), actor, index); action=xfdashboard_drop_action_new(); clutter_actor_add_action(actor, action); g_signal_connect_swapped(action, "begin", G_CALLBACK(_xfdashboard_workspace_selector_on_drop_begin), actor); g_signal_connect_swapped(action, "drop", G_CALLBACK(_xfdashboard_workspace_selector_on_drop_drop), actor); }
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]); }