Index: panel-plugin/mixer-slider-tiny.gob =================================================================== --- panel-plugin/mixer-slider-tiny.gob (revision 25860) +++ panel-plugin/mixer-slider-tiny.gob (working copy) @@ -15,6 +15,7 @@ protected GtkProgressBar *progress = NULL; /*protected GtkBox *hbox = NULL;*/ public GtkEventBox *eb = NULL; + protected int pressed = 0; protected void set_vval (self, gint vval) { @@ -63,6 +64,7 @@ g_signal_connect_swapped (self->eb, "scroll-event", G_CALLBACK(self_scroll_cb), self); g_signal_connect_swapped (self->eb, "button-press-event", G_CALLBACK(self_button_cb), self); g_signal_connect_swapped (self->eb, "button-release-event", G_CALLBACK(self_button_cb), self); + g_signal_connect_swapped (self->eb, "motion-notify-event", G_CALLBACK(self_motion_cb), self); } public gboolean scroll_cb (self, GdkEventScroll *event, GtkWidget *w) @@ -88,37 +90,61 @@ protected gboolean button_cb (self, GdkEventButton *b, GtkWidget *widget) { - int y; /* pos */ - int sy; /* size */ + int y = (int) b->y; /* pos */ - y = (int)b->y; - if (b->button == 3 || b->button == 2) { if (b->type == GDK_BUTTON_PRESS) { + /* mute */ y = 0; } else { return TRUE; } } else if (b->button == 1) { - sy = widget->allocation.height; - if (sy != 0) { - /* this is a hack 'cause I dont know how to get the height - * of the border of the progressbar yet ;) - */ - y = (sy + 2 - y) * 100 / sy; - if (y <= 0) y = 0; - } else y = 0; + if (b->type == GDK_BUTTON_PRESS) { + y = self_figure_out_volume(self, widget, y); + self->pressed = 1; + } else if (b->type == GDK_BUTTON_RELEASE){ + y = self_figure_out_volume(self, widget, y); + self->pressed = 0; + } else { + return TRUE; + } } else { - return FALSE; + return FALSE; } - - if (y < 0) { y = 0; } - if (y > 100) { y = 100; } self_set_vval (self, y); return TRUE; } + protected int figure_out_volume(self, GtkWidget *widget, int y) { + int sy = widget->allocation.height; /* size */ + if (sy > 4) { + sy -= 4; + /* this is a hack 'cause I dont know how to get the height + * of the border of the progressbar yet ;) + */ + y = (sy + 2 - y) * 100 / sy; + if (y <= 0) y = 0; + } else { + y = 0; + } + if (y < 0) { + y = 0; + } else if (y > 100) { + y = 100; + } + return y; + } + + protected gboolean motion_cb (self, GdkEventMotion *m, GtkWidget *widget) + { + int y = (int) m->y; /* pos */ + y = self_figure_out_volume(self, widget, y); + self_set_vval (self, y); + return TRUE; + } + public XfceMixerControl *new(void) { return XFCE_MIXER_CONTROL(GET_NEW);