📄 hxstatuspositionslider.cpp
字号:
#ifdef HELIX_FEATURE_EMBEDDED_PLAYER hxembedded_window_start_seeking(position_status->embedded_window);#endif } else { hx_player_start_seeking(HX_PLAYER(status->player)); }}static voidhxstatus_display_position_slider_seek_stop(HXStatusDisplayPositionSlider* position_status){ guint pos; HXStatusDisplay* status; status = HX_STATUS_DISPLAY(position_status); pos = (guint)gtk_range_get_value(GTK_RANGE(position_status->position_scale)); if(position_status->embedded_window) {#ifdef HELIX_FEATURE_EMBEDDED_PLAYER hxembedded_window_stop_seeking(position_status->embedded_window, pos);#endif } else { hx_player_stop_seeking(HX_PLAYER(status->player)); } hxstatus_display_start_timer(status); }/* Function to hook up status display to player: * ============================================ */voidhxstatus_display_position_slider_set_player(HXStatusDisplay* status, HXPlayer* player){ guint i; guint signal; HXStatusDisplayPositionSlider* status_position_slider = HX_STATUS_DISPLAY_POSITION_SLIDER(status); static const struct { const gchar* name; GCallback callback; } signal_map[] = { { "play", G_CALLBACK(hsdp_play) }, { "pause", G_CALLBACK(hsdp_pause) }, { "stop", G_CALLBACK(hsdp_stop) }, { "seek", G_CALLBACK(hsdp_seek) }, { "length_changed", G_CALLBACK(hsdp_length_changed) } }; /* Disconnect from the old player, if any */ if(status->player) { for(i = 0; i < status_position_slider->player_signal_handlers_array_len; i++) { signal = g_array_index(status_position_slider->player_signal_handlers_array, gint, i); g_signal_handler_disconnect(G_OBJECT(status->player), signal); } } status_position_slider->player_signal_handlers_array_len = 0; if(player) { /* Connect the new player */ for(i = 0; i < sizeof(signal_map) / sizeof(*signal_map); i++) { /* Hook up to the new player */ signal = g_signal_connect_swapped(G_OBJECT(player), signal_map[i].name, signal_map[i].callback, status); g_array_insert_val(status_position_slider->player_signal_handlers_array, status_position_slider->player_signal_handlers_array_len, signal); status_position_slider->player_signal_handlers_array_len++; } } HX_STATUS_DISPLAY_CLASS(g_parent_class)->set_player(status, player); if(player) { guint interval; interval = hxstatus_display_position_slider_get_update_interval(status_position_slider); hxstatus_display_set_timer(status, interval, hxstatus_display_position_slider_update, status, TRUE, TRUE); }}static gbooleanhsdp_button_press(HXStatusDisplayPositionSlider* position_status, GdkEvent *event){ GdkEventButton* button_event = &event->button; if(button_event->button == 1) { position_status->button_1_is_pressed = TRUE; /* propagate this to the slider as a button 2 press, as that is the behavior we want to emulate. */ GdkEvent fake_button_press = *event; fake_button_press.button.button = 2; GtkHScaleClass* klass; klass = GTK_HSCALE_GET_CLASS(position_status->position_scale); GTK_WIDGET_CLASS(klass)->button_press_event(position_status->position_scale, &fake_button_press.button); return TRUE; } else if(button_event->button == 2) { return TRUE; // block button 2 presses } return FALSE; // propagate}static gbooleanhsdp_button_release(HXStatusDisplayPositionSlider* position_status, GdkEvent *event){ GdkEventButton* button_event = &event->button; if(button_event->button == 1) { GdkEvent fake_button_press = *event; fake_button_press.button.button = 2; /* Propagate as a button 2 release to match above */ GtkHScaleClass* klass; klass = GTK_HSCALE_GET_CLASS(position_status->position_scale); GTK_WIDGET_CLASS(klass)->button_release_event(position_status->position_scale, &fake_button_press.button); return TRUE; } else if(button_event->button == 2) { return TRUE; // block button 2 releases } return FALSE; // propagate}static voidhsdp_event_after(HXStatusDisplayPositionSlider* position_status, GdkEvent *event){ if(event->type == GDK_BUTTON_RELEASE) { GdkEventButton* button_event; button_event = (GdkEventButton*)event; if(button_event->button == 1) { position_status->button_1_is_pressed = FALSE; if(position_status->seek_started) { hxstatus_display_position_slider_seek_stop(position_status); position_status->seek_started = FALSE; } } }}static voidhsdp_value_changed(HXStatusDisplayPositionSlider* position_status){ HXStatusDisplay* status = HX_STATUS_DISPLAY(position_status); if(position_status->button_1_is_pressed && !position_status->seek_started) { hxstatus_display_position_slider_seek_start(position_status); position_status->seek_started = TRUE; } if(position_status->seek_started) { guint pos; pos = (guint)gtk_range_get_value(GTK_RANGE(position_status->position_scale)); hx_player_set_position(HX_PLAYER(status->player), pos); }}static voidhsdp_play(HXStatusDisplayPositionSlider* position_status){ HXStatusDisplay* status; gboolean is_live_or_infinite; status = HX_STATUS_DISPLAY(position_status); is_live_or_infinite = hx_player_is_live(status->player) || hx_player_is_indefinite_duration(status->player); gtk_widget_set_sensitive(position_status->position_scale, !is_live_or_infinite);}static voidhsdp_pause(HXStatusDisplayPositionSlider* position_status){ HXStatusDisplay* status; gboolean is_live_or_infinite; status = HX_STATUS_DISPLAY(position_status); is_live_or_infinite = hx_player_is_live(status->player) || hx_player_is_indefinite_duration(status->player); gtk_widget_set_sensitive(position_status->position_scale, !is_live_or_infinite);}static voidhsdp_stop(HXStatusDisplayPositionSlider* position_status){ HXStatusDisplay* status; status = HX_STATUS_DISPLAY(position_status); gtk_widget_set_sensitive(position_status->position_scale, FALSE);}static voidhsdp_seek(HXStatusDisplayPositionSlider* status, guint pos){ gtk_range_set_value(GTK_RANGE(status->position_scale), (gdouble)pos);}voidhsdp_length_changed(HXStatusDisplayPositionSlider* status, guint /*len*/){ /* Update the timer interval */ guint interval; interval = hxstatus_display_position_slider_get_update_interval(status); hxstatus_display_change_timer_interval(HX_STATUS_DISPLAY(status), interval);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -