static gboolean event_cb (ClutterStage * stage, ClutterEvent * event, UserInterface * ui) { gboolean handled = FALSE; switch (event->type) { case CLUTTER_KEY_PRESS: { /* Clutter key codes based on */ /* http://cgit.freedesktop.org/xorg/proto/x11proto/plain/keysymdef.h */ ClutterVertex center = { 0, }; ClutterAnimation *animation = NULL; center.x - clutter_actor_get_width (ui->texture) / 2; guint keyval = clutter_event_get_key_symbol (event); switch (keyval) { case CLUTTER_q: case CLUTTER_Escape: { clutter_main_quit (); handled = TRUE; break; } case CLUTTER_f: { // Fullscreen button toggle_fullscreen (ui); handled = TRUE; break; } case CLUTTER_space: { // Spacebar toggle_playing (ui); handled = TRUE; break; } case CLUTTER_l: { ui->engine->loop = !ui->engine->loop; handled = TRUE; break; } case CLUTTER_8: { // Mute button gdouble volume; gboolean muteval; g_object_get (G_OBJECT (ui->engine->player), "mute", &muteval, NULL); g_object_set (G_OBJECT (ui->engine->player), "mute", !muteval, NULL); update_volume (ui, volume); handled = TRUE; break; } case CLUTTER_9: case CLUTTER_0: { gdouble volume; g_object_get (G_OBJECT (ui->engine->player), "volume", &volume, NULL); // Volume Down if (keyval == CLUTTER_9 && volume > 0.0) { volume -= 0.05; if (volume < 0.01) volume = 0; g_object_set (G_OBJECT (ui->engine->player), "volume", volume, NULL); // Volume Up } else if (keyval == CLUTTER_0 && volume < 1.0) { volume += 0.05; if (volume > 1) volume = 1; g_object_set (G_OBJECT (ui->engine->player), "volume", volume, NULL); } update_volume (ui, volume); handled = TRUE; break; } case CLUTTER_Up: case CLUTTER_Down: case CLUTTER_Left: case CLUTTER_Right: case CLUTTER_Page_Up: case CLUTTER_Page_Down: { gint64 pos, second; gfloat progress; pos = query_position (ui->engine); second = ui->engine->second; if (keyval == CLUTTER_Up) { // Seek 1 minute foward pos += 60 * second; } else if (keyval == CLUTTER_Down) { // Seek 1 minute back pos -= 60 * second; } else if (keyval == CLUTTER_Right) { // Seek 10 seconds foward pos += 10 * second; } else if (keyval == CLUTTER_Left) { // Seek 10 seconds back pos -= 10 * second; } else if (keyval == CLUTTER_Page_Up) { // Seek 10 minutes foward pos += 600 * second; } else if (keyval == CLUTTER_Page_Down) { // Seek 10 minutes back pos -= 600 * second; } /* clamp the timestamp to be within the media */ pos = CLAMP (pos, 0, ui->engine->media_duration); engine_seek (ui->engine, pos, TRUE); progress = (float) pos / ui->engine->media_duration; clutter_actor_set_size (ui->control_seekbar, progress * ui->seek_width, ui->seek_height); progress_update_text (ui); handled = TRUE; break; } case CLUTTER_i: { // set in point for segment gint64 in_point; in_point = query_position (ui->engine); ui->engine->in_point = in_point; engine_seek (ui->engine, in_point, TRUE); handled = TRUE; break; } case CLUTTER_o: { // set out point for segment gint64 out_point; out_point = query_position (ui->engine); ui->engine->out_point = out_point; engine_seek (ui->engine, out_point, FALSE); handled = TRUE; break; } case CLUTTER_r: { // rotate texture 90 degrees. rotate_video (ui); handled = TRUE; break; } case CLUTTER_c: { // show or hide controls penalty_box (ui); ui->keep_showing_controls = !ui->controls_showing; show_controls (ui, !ui->controls_showing); handled = TRUE; break; } case CLUTTER_period: { frame_stepping (ui->engine, TRUE); handled = TRUE; break; } case CLUTTER_comma: { frame_stepping (ui->engine, FALSE); handled = TRUE; break; } default: { handled = FALSE; break; } } break; } case CLUTTER_BUTTON_PRESS: { if (ui->controls_showing) { ClutterActor *actor; ClutterButtonEvent *bev = (ClutterButtonEvent *) event; actor = clutter_stage_get_actor_at_pos (stage, CLUTTER_PICK_ALL, bev->x, bev->y); if (actor == ui->control_play_toggle) { toggle_playing (ui); } else if (actor == ui->control_seek1 || actor == ui->control_seek2 || actor == ui->control_seekbar) { gfloat x, y, dist; gint64 progress; clutter_actor_get_transformed_position (ui->control_seekbar, &x, &y); dist = bev->x - x; dist = CLAMP (dist, 0, ui->seek_width); if (ui->engine->media_duration == -1) { update_media_duration (ui->engine); } progress = ui->engine->media_duration * (dist / ui->seek_width); engine_seek (ui->engine, progress, TRUE); clutter_actor_set_size (ui->control_seekbar, dist, ui->seek_height); progress_update_text (ui); } else if (actor == ui->vol_int || actor == ui->vol_int_bg) { gfloat x, y, dist; gdouble volume; clutter_actor_get_transformed_position (ui->vol_int_bg, &x, &y); dist = bev->x - x; dist = CLAMP (dist, 0, ui->volume_width); volume = dist / ui->volume_width; g_object_set (G_OBJECT (ui->engine->player), "volume", volume, NULL); clutter_actor_set_size (ui->vol_int, dist, ui->volume_height); } else if (actor == ui->control_bg || actor == ui->control_title || actor == ui->control_pos) { ui->keep_showing_controls = !ui->keep_showing_controls; if (ui->keep_showing_controls) { clutter_stage_hide_cursor (CLUTTER_STAGE (ui->stage)); } else { penalty_box (ui); show_controls (ui, FALSE); } } else if (actor == ui->texture || actor == ui->stage) { if (!ui->penalty_box_active) { penalty_box (ui); show_controls (ui, FALSE); } } } handled = TRUE; break; } case CLUTTER_MOTION: { if (!ui->penalty_box_active) show_controls (ui, TRUE); handled = TRUE; break; } } return handled; }
void handle_method_call (GDBusConnection * connection, const gchar * sender, const gchar * object_path, const gchar * interface_name, const gchar * method_name, GVariant * parameters, GDBusMethodInvocation * invocation, SnappyMP * myobj) { gboolean ret = TRUE; GError *error = NULL; if (g_strcmp0 (object_path, MPRIS_OBJECT_NAME) != 0 || g_strcmp0 (interface_name, MPRIS_PLAYER_INTERFACE) != 0) { g_dbus_method_invocation_return_error (invocation, G_DBUS_ERROR, G_DBUS_ERROR_NOT_SUPPORTED, "Method %s.%s not supported", interface_name, method_name); return; } if (g_strcmp0 (method_name, "OpenUri") == 0) { gchar *uri; // g_print ("openUri.. uri: %s\n", uri); g_variant_get (parameters, "(s)", &uri); my_object_change_uri (myobj, uri); g_dbus_method_invocation_return_value (invocation, NULL); } else if (g_strcmp0 (method_name, "Next") == 0) { /// ToDo: next track call handle_result (invocation, ret, error); } else if (g_strcmp0 (method_name, "Play") == 0) { engine_play (myobj->engine); handle_result (invocation, ret, error); } else if (g_strcmp0 (method_name, "Pause") == 0) { change_state (myobj->engine, "Paused"); handle_result (invocation, ret, error); } else if (g_strcmp0 (method_name, "Stop") == 0) { engine_stop (myobj->engine); handle_result (invocation, ret, error); } else if (g_strcmp0 (method_name, "Seek") == 0) { gint64 offset, position; gfloat relative; g_variant_get (parameters, "(x)", &offset); relative = offset / 100000000.0; position = myobj->engine->media_duration * relative; // g_print ("offset: %ld relative: %f", offset, relative); engine_seek (myobj->engine, position, FALSE); handle_result (invocation, ret, error); } }