⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hxstatuspositionslider.cpp

📁 linux下的一款播放器
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#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 + -