diff options
author | waker <wakeroid@gmail.com> | 2009-08-11 21:15:29 +0200 |
---|---|---|
committer | waker <wakeroid@gmail.com> | 2009-08-11 21:15:29 +0200 |
commit | cde6b46df8e0e8d462e1f361a1b929ebe295a1f7 (patch) | |
tree | cc37417edede97bd808f985aaf8ca0fbbbb3a047 | |
parent | eab6142e7233f7c79287fe62de41d3f91cc57b9f (diff) |
new volumebar widget
-rw-r--r-- | callbacks.c | 96 | ||||
-rw-r--r-- | callbacks.h | 25 | ||||
-rw-r--r-- | deadbeef.glade | 32 | ||||
-rw-r--r-- | interface.c | 37 | ||||
-rw-r--r-- | palsa.c | 5 | ||||
-rw-r--r-- | palsa.h | 3 | ||||
-rw-r--r-- | playback.h | 1 |
7 files changed, 160 insertions, 39 deletions
diff --git a/callbacks.c b/callbacks.c index f96aaff0..4299bdcc 100644 --- a/callbacks.c +++ b/callbacks.c @@ -933,3 +933,99 @@ on_seekbar_button_release_event (GtkWidget *widget, } + + +gboolean +on_volumebar_configure_event (GtkWidget *widget, + GdkEventConfigure *event, + gpointer user_data) +{ + + return FALSE; +} + + +void +volumebar_draw (GtkWidget *widget) { + if (!widget) { + return; + } + cairo_t *cr; + cr = gdk_cairo_create (widget->window); + if (!cr) { + return; + } + + int n = widget->allocation.width / 4; + int vol = p_get_volume () * n; + int h = 16; + for (int i = 0; i < n; i++) { + if (i <= vol) { + cairo_set_source_rgb (cr, 0xf4/255.f, 0x7e/255.f, 0x46/255.f); + } + else { + cairo_set_source_rgb (cr, 0x21/255.f, 0x23/255.f, 0x1f/255.f); + } + cairo_rectangle (cr, i * 4, (widget->allocation.height/2-h/2) + h - 1 - (h* i / n), 3, h * i / n); + cairo_fill (cr); + } + + cairo_destroy (cr); +} + +gboolean +on_volumebar_expose_event (GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data) +{ + volumebar_draw (widget); + return FALSE; +} + + +gboolean +on_volumebar_motion_notify_event (GtkWidget *widget, + GdkEventMotion *event, + gpointer user_data) +{ + if (event->state & GDK_BUTTON1_MASK) { + float volume = event->x / widget->allocation.width; + if (volume < 0) { + volume = 0; + } + if (volume > 1) { + volume = 1; + } + p_set_volume (volume); + volumebar_draw (widget); + } + return FALSE; +} + +gboolean +on_volumebar_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data) +{ + float volume = event->x / widget->allocation.width; + if (volume < 0) { + volume = 0; + } + if (volume > 1) { + volume = 1; + } + p_set_volume (volume); + volumebar_draw (widget); + return FALSE; +} + + +gboolean +on_volumebar_button_release_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data) +{ + + return FALSE; +} + diff --git a/callbacks.h b/callbacks.h index 476cb800..441d6cd5 100644 --- a/callbacks.h +++ b/callbacks.h @@ -428,3 +428,28 @@ gboolean on_seekbar_motion_notify_event (GtkWidget *widget, GdkEventMotion *event, gpointer user_data); + +gboolean +on_volumebar_button_press_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data); + +gboolean +on_volumebar_button_release_event (GtkWidget *widget, + GdkEventButton *event, + gpointer user_data); + +gboolean +on_volumebar_configure_event (GtkWidget *widget, + GdkEventConfigure *event, + gpointer user_data); + +gboolean +on_volumebar_expose_event (GtkWidget *widget, + GdkEventExpose *event, + gpointer user_data); + +gboolean +on_volumebar_motion_notify_event (GtkWidget *widget, + GdkEventMotion *event, + gpointer user_data); diff --git a/deadbeef.glade b/deadbeef.glade index 60502f6a..7c723f24 100644 --- a/deadbeef.glade +++ b/deadbeef.glade @@ -493,32 +493,18 @@ </child> <child> - <widget class="GtkVBox" id="vbox2"> + <widget class="GtkDrawingArea" id="volumebar"> + <property name="width_request">70</property> <property name="visible">True</property> - <property name="homogeneous">False</property> - <property name="spacing">0</property> - - <child> - <widget class="GtkHScale" id="volume"> - <property name="width_request">80</property> - <property name="visible">True</property> - <property name="draw_value">False</property> - <property name="value_pos">GTK_POS_TOP</property> - <property name="digits">1</property> - <property name="update_policy">GTK_UPDATE_CONTINUOUS</property> - <property name="inverted">False</property> - <property name="adjustment">100 0 100 0 0 0</property> - <signal name="value_changed" handler="on_volume_value_changed" last_modification_time="Fri, 03 Jul 2009 23:43:47 GMT"/> - </widget> - <packing> - <property name="padding">0</property> - <property name="expand">True</property> - <property name="fill">True</property> - </packing> - </child> + <property name="events">GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK</property> + <signal name="button_press_event" handler="on_volumebar_button_press_event" last_modification_time="Tue, 11 Aug 2009 18:57:49 GMT"/> + <signal name="button_release_event" handler="on_volumebar_button_release_event" last_modification_time="Tue, 11 Aug 2009 18:57:51 GMT"/> + <signal name="configure_event" handler="on_volumebar_configure_event" last_modification_time="Tue, 11 Aug 2009 18:57:55 GMT"/> + <signal name="expose_event" handler="on_volumebar_expose_event" last_modification_time="Tue, 11 Aug 2009 18:58:00 GMT"/> + <signal name="motion_notify_event" handler="on_volumebar_motion_notify_event" last_modification_time="Tue, 11 Aug 2009 18:58:05 GMT"/> </widget> <packing> - <property name="padding">0</property> + <property name="padding">2</property> <property name="expand">False</property> <property name="fill">True</property> </packing> diff --git a/interface.c b/interface.c index db273a02..afad4404 100644 --- a/interface.c +++ b/interface.c @@ -84,8 +84,7 @@ create_mainwin (void) GtkWidget *image5; GtkWidget *playrand; GtkWidget *image6; - GtkWidget *vbox2; - GtkWidget *volume; + GtkWidget *volumebar; GtkWidget *seekbar; GtkWidget *_; GtkWidget *vbox3; @@ -327,16 +326,11 @@ create_mainwin (void) gtk_widget_show (image6); gtk_container_add (GTK_CONTAINER (playrand), image6); - vbox2 = gtk_vbox_new (FALSE, 0); - gtk_widget_show (vbox2); - gtk_box_pack_start (GTK_BOX (hbox2), vbox2, FALSE, TRUE, 0); - - volume = gtk_hscale_new (GTK_ADJUSTMENT (gtk_adjustment_new (100, 0, 100, 0, 0, 0))); - gtk_widget_show (volume); - gtk_box_pack_start (GTK_BOX (vbox2), volume, TRUE, TRUE, 0); - gtk_widget_set_size_request (volume, 80, -1); - GTK_WIDGET_UNSET_FLAGS (volume, GTK_CAN_FOCUS); - gtk_scale_set_draw_value (GTK_SCALE (volume), FALSE); + volumebar = gtk_drawing_area_new (); + gtk_widget_show (volumebar); + gtk_box_pack_start (GTK_BOX (hbox2), volumebar, FALSE, TRUE, 2); + gtk_widget_set_size_request (volumebar, 70, -1); + gtk_widget_set_events (volumebar, GDK_EXPOSURE_MASK | GDK_POINTER_MOTION_MASK | GDK_BUTTON_PRESS_MASK | GDK_BUTTON_RELEASE_MASK); seekbar = gtk_drawing_area_new (); gtk_widget_show (seekbar); @@ -450,8 +444,20 @@ create_mainwin (void) g_signal_connect ((gpointer) playrand, "clicked", G_CALLBACK (on_playrand_clicked), NULL); - g_signal_connect ((gpointer) volume, "value_changed", - G_CALLBACK (on_volume_value_changed), + g_signal_connect ((gpointer) volumebar, "button_press_event", + G_CALLBACK (on_volumebar_button_press_event), + NULL); + g_signal_connect ((gpointer) volumebar, "button_release_event", + G_CALLBACK (on_volumebar_button_release_event), + NULL); + g_signal_connect ((gpointer) volumebar, "configure_event", + G_CALLBACK (on_volumebar_configure_event), + NULL); + g_signal_connect ((gpointer) volumebar, "expose_event", + G_CALLBACK (on_volumebar_expose_event), + NULL); + g_signal_connect ((gpointer) volumebar, "motion_notify_event", + G_CALLBACK (on_volumebar_motion_notify_event), NULL); g_signal_connect ((gpointer) seekbar, "button_press_event", G_CALLBACK (on_seekbar_button_press_event), @@ -591,8 +597,7 @@ create_mainwin (void) GLADE_HOOKUP_OBJECT (mainwin, image5, "image5"); GLADE_HOOKUP_OBJECT (mainwin, playrand, "playrand"); GLADE_HOOKUP_OBJECT (mainwin, image6, "image6"); - GLADE_HOOKUP_OBJECT (mainwin, vbox2, "vbox2"); - GLADE_HOOKUP_OBJECT (mainwin, volume, "volume"); + GLADE_HOOKUP_OBJECT (mainwin, volumebar, "volumebar"); GLADE_HOOKUP_OBJECT (mainwin, seekbar, "seekbar"); GLADE_HOOKUP_OBJECT (mainwin, _, "_"); GLADE_HOOKUP_OBJECT (mainwin, vbox3, "vbox3"); @@ -251,6 +251,11 @@ palsa_set_volume (float vol) { volume = vol; } +float +palsa_get_volume (void) { + return volume; +} + int palsa_get_rate (void) { return alsa_rate; @@ -45,6 +45,9 @@ palsa_unpause (void); void palsa_set_volume (float vol); +float +palsa_get_volume (void); + int palsa_get_rate (void); @@ -39,6 +39,7 @@ #define p_pause palsa_pause #define p_unpause palsa_unpause #define p_set_volume palsa_set_volume +#define p_get_volume palsa_get_volume #define p_get_rate palsa_get_rate #define p_isstopped palsa_isstopped #endif |