Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}
Esempio n. 3
0
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);
}
Esempio n. 4
0
/**
 * 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);
	}
}