static void ppg_restart_task_channel_stopped (GObject *object, GAsyncResult *result, gpointer user_data) { PpgRestartTaskPrivate *priv; PkConnection *conn = (PkConnection *)object; PpgRestartTask *restart = (PpgRestartTask *)user_data; PpgTask *task = (PpgTask *)user_data; GError *error = NULL; gint channel; g_return_if_fail(PK_IS_CONNECTION(conn)); g_return_if_fail(PPG_IS_RESTART_TASK(restart)); g_return_if_fail(PPG_IS_TASK(task)); priv = restart->priv; if (!pk_connection_channel_stop_finish(conn, result, &error)) { ppg_task_fail(task, error); g_error_free(error); return; } g_object_get(priv->session, "channel", &channel, NULL); pk_connection_channel_start_async(conn, channel, NULL, ppg_restart_task_channel_started, task); }
static void ppg_restart_task_channel_started (GObject *object, GAsyncResult *result, gpointer user_data) { PkConnection *conn = (PkConnection *)object; PpgTask *task = (PpgTask *)user_data; GError *error = NULL; g_return_if_fail(PK_IS_CONNECTION(conn)); g_return_if_fail(PPG_IS_TASK(task)); if (!pk_connection_channel_start_finish(conn, result, &error)) { ppg_task_finish_with_error(task, error); g_error_free(error); return; } ppg_task_finish(task); }
static void ppg_restart_task_channel_started (GObject *object, GAsyncResult *result, gpointer user_data) { PkConnection *conn = (PkConnection *)object; PpgTask *task = (PpgTask *)user_data; GError *error = NULL; GTimeVal tv = { 0 }; g_return_if_fail(PK_IS_CONNECTION(conn)); g_return_if_fail(PPG_IS_TASK(task)); if (!pk_connection_channel_start_finish(conn, result, &tv, &error)) { /* * TODO: Notify session of new start time? */ ppg_task_fail(task, error); g_error_free(error); return; } ppg_task_finish(task); }
/** * ppg_visualizer_task_notify_state: * @visualizer: (in): A #PpgVisualizer. * @pspec: (in): A #GParamSpec. * @task: (in): A #PpgTask. * * Handle the "notify::state" signal from @task. Update the visualizer * pattern if necessary. * * Returns: None. * Side effects: None. */ static void ppg_visualizer_task_notify_state (PpgVisualizer *visualizer, GParamSpec *pspec, PpgTask *task) { PpgVisualizerPrivate *priv; cairo_surface_t *surface; PpgTaskState state; cairo_t *cr; gdouble begin_time; gdouble height; gdouble total_width; gdouble span; gdouble width; gdouble x; gdouble y; g_return_if_fail(PPG_IS_VISUALIZER(visualizer)); g_return_if_fail(PPG_IS_TASK(task)); g_return_if_fail(visualizer->priv->surface); priv = visualizer->priv; /* * We don't own the reference, so safe to just drop our pointer. Using * GObjects weak pointers here would be a lot of maintenance pain. */ if (priv->task == task) { priv->task = NULL; } g_object_get(task, "state", &state, "surface", &surface, NULL); if (state == PPG_TASK_SUCCESS) { g_object_get(task, "begin-time", &begin_time, "height", &height, "width", &width, "x", &x, "y", &y, NULL); span = priv->end_time - priv->begin_time; g_object_get(visualizer, "width", &total_width, NULL); x = (begin_time - priv->begin_time) / span * total_width; /* * Only draw what we can do on integer aligned offsets. * * TODO: We need to make sure we render extra area to prevent * a striping effect. */ width -= ceil(x) - x; x = ceil(x); cr = cairo_create(priv->surface); cairo_set_source_surface(cr, surface, x, y); if (cairo_status(cr) != 0) { cairo_destroy(cr); GOTO(failure); } /* * Clip the range of the draw. */ cairo_rectangle(cr, x, y, width, height); cairo_clip_preserve(cr); /* * Clear the draw area. */ cairo_save(cr); cairo_set_operator(cr, CAIRO_OPERATOR_CLEAR); cairo_fill_preserve(cr); cairo_restore(cr); /* * Fill in the rendered image. */ cairo_fill(cr); cairo_destroy(cr); goo_canvas_item_request_update(GOO_CANVAS_ITEM(visualizer)); } failure: /* * Release our surface that was allocated for the draw request. */ if ((state & PPG_TASK_FINISHED_MASK) != 0) { cairo_surface_destroy(surface); } }