/** * 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)); }
/* A scroll event occured in workspace selector (e.g. by mouse-wheel) */ static gboolean _xfdashboard_workspace_selector_on_scroll_event(ClutterActor *inActor, ClutterEvent *inEvent, gpointer inUserData) { XfdashboardWorkspaceSelector *self; XfdashboardWorkspaceSelectorPrivate *priv; gint direction; gint currentWorkspace; gint maxWorkspace; XfdashboardWindowTrackerWorkspace *workspace; g_return_val_if_fail(XFDASHBOARD_IS_WORKSPACE_SELECTOR(inActor), CLUTTER_EVENT_PROPAGATE); g_return_val_if_fail(inEvent, CLUTTER_EVENT_PROPAGATE); self=XFDASHBOARD_WORKSPACE_SELECTOR(inActor); priv=self->priv; /* Get direction of scroll event */ switch(clutter_event_get_scroll_direction(inEvent)) { case CLUTTER_SCROLL_UP: case CLUTTER_SCROLL_LEFT: direction=-1; break; case CLUTTER_SCROLL_DOWN: case CLUTTER_SCROLL_RIGHT: direction=1; break; /* Unhandled directions */ default: g_debug("Cannot handle scroll direction %d in %s", clutter_event_get_scroll_direction(inEvent), G_OBJECT_TYPE_NAME(self)); return(CLUTTER_EVENT_PROPAGATE); } /* Get next workspace in scroll direction */ currentWorkspace=xfdashboard_window_tracker_workspace_get_number(priv->activeWorkspace); maxWorkspace=xfdashboard_window_tracker_get_workspaces_count(priv->windowTracker); currentWorkspace+=direction; if(currentWorkspace<0 || currentWorkspace>=maxWorkspace) return(CLUTTER_EVENT_STOP); /* Activate new workspace */ workspace=xfdashboard_window_tracker_get_workspace_by_number(priv->windowTracker, currentWorkspace); xfdashboard_window_tracker_workspace_activate(workspace); return(CLUTTER_EVENT_STOP); }
/* 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); }