summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar waker <wakeroid@gmail.com>2009-08-11 21:15:29 +0200
committerGravatar waker <wakeroid@gmail.com>2009-08-11 21:15:29 +0200
commitcde6b46df8e0e8d462e1f361a1b929ebe295a1f7 (patch)
treecc37417edede97bd808f985aaf8ca0fbbbb3a047
parenteab6142e7233f7c79287fe62de41d3f91cc57b9f (diff)
new volumebar widget
-rw-r--r--callbacks.c96
-rw-r--r--callbacks.h25
-rw-r--r--deadbeef.glade32
-rw-r--r--interface.c37
-rw-r--r--palsa.c5
-rw-r--r--palsa.h3
-rw-r--r--playback.h1
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");
diff --git a/palsa.c b/palsa.c
index 5026d9ec..171d01ac 100644
--- a/palsa.c
+++ b/palsa.c
@@ -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;
diff --git a/palsa.h b/palsa.h
index 009d01af..a226979e 100644
--- a/palsa.h
+++ b/palsa.h
@@ -45,6 +45,9 @@ palsa_unpause (void);
void
palsa_set_volume (float vol);
+float
+palsa_get_volume (void);
+
int
palsa_get_rate (void);
diff --git a/playback.h b/playback.h
index dc4dd960..dbeba5cf 100644
--- a/playback.h
+++ b/playback.h
@@ -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