summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-02-12 21:28:30 +0100
committerGravatar Alexey Yakovenko <waker@users.sourceforge.net>2014-02-12 21:28:30 +0100
commit4db09a9c8c98d9c3f0ac975fcb4789b954a52325 (patch)
treedb0cfef469814a3e5be94133c085c21638239776
parent039fe06416e982577e7631ddcf8539e29e2e1c5e (diff)
gtkui: ported seekbar to widget system
-rw-r--r--plugins/gtkui/ddbseekbar.c53
-rw-r--r--plugins/gtkui/ddbseekbar.h10
-rw-r--r--plugins/gtkui/gtkui.c29
-rw-r--r--plugins/gtkui/gtkui.h6
-rw-r--r--plugins/gtkui/prefwin.c1
-rw-r--r--plugins/gtkui/widgets.c89
-rw-r--r--plugins/gtkui/widgets.h3
7 files changed, 159 insertions, 32 deletions
diff --git a/plugins/gtkui/ddbseekbar.c b/plugins/gtkui/ddbseekbar.c
index 31740a29..104ad811 100644
--- a/plugins/gtkui/ddbseekbar.c
+++ b/plugins/gtkui/ddbseekbar.c
@@ -52,7 +52,6 @@ static gboolean ddb_seekbar_real_button_press_event (GtkWidget* base, GdkEventBu
static gboolean ddb_seekbar_real_button_release_event (GtkWidget* base, GdkEventButton* event);
static gboolean ddb_seekbar_real_motion_notify_event (GtkWidget* base, GdkEventMotion* event);
static gboolean ddb_seekbar_real_configure_event (GtkWidget* base, GdkEventConfigure* event);
-DdbSeekbar* ddb_seekbar_new (void);
DdbSeekbar* ddb_seekbar_construct (GType object_type);
static GObject * ddb_seekbar_constructor (GType type, guint n_construct_properties, GObjectConstructParam * construct_properties);
@@ -158,8 +157,8 @@ DdbSeekbar* ddb_seekbar_construct (GType object_type) {
}
-DdbSeekbar* ddb_seekbar_new (void) {
- return ddb_seekbar_construct (DDB_TYPE_SEEKBAR);
+GtkWidget* ddb_seekbar_new (void) {
+ return GTK_WIDGET (ddb_seekbar_construct (DDB_TYPE_SEEKBAR));
}
@@ -452,10 +451,50 @@ on_seekbar_button_release_event (GtkWidget *widget,
return FALSE;
}
-void
-seekbar_redraw (void) {
- GtkWidget *widget = lookup_widget (mainwin, "seekbar");
- gtk_widget_queue_draw (widget);
+static gboolean
+on_evbox_button_press_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ return gtk_widget_event (GTK_WIDGET (user_data), (GdkEvent *)event);
+}
+
+gboolean
+on_evbox_button_release_event (GtkWidget *widget,
+ GdkEventButton *event,
+ gpointer user_data)
+{
+ return gtk_widget_event (GTK_WIDGET (user_data), (GdkEvent *)event);
}
+static gboolean
+on_evbox_motion_notify_event (GtkWidget *widget,
+ GdkEventMotion *event,
+ gpointer user_data)
+{
+ return gtk_widget_event (GTK_WIDGET (user_data), (GdkEvent *)event);
+}
+
+static gboolean
+on_evbox_scroll_event (GtkWidget *widget,
+ GdkEvent *event,
+ gpointer user_data) {
+ return gtk_widget_event (GTK_WIDGET (user_data), (GdkEvent *)event);
+}
+
+void
+ddb_seekbar_init_signals (DdbSeekbar *sb, GtkWidget *evbox) {
+ g_signal_connect ((gpointer) evbox, "button_press_event",
+ G_CALLBACK (on_evbox_button_press_event),
+ sb);
+ g_signal_connect ((gpointer) evbox, "button_release_event",
+ G_CALLBACK (on_evbox_button_release_event),
+ sb);
+ g_signal_connect ((gpointer) evbox, "scroll_event",
+ G_CALLBACK (on_evbox_scroll_event),
+ sb);
+ g_signal_connect ((gpointer) evbox, "motion_notify_event",
+ G_CALLBACK (on_evbox_motion_notify_event),
+ sb);
+}
diff --git a/plugins/gtkui/ddbseekbar.h b/plugins/gtkui/ddbseekbar.h
index 7ce90052..b4e470bc 100644
--- a/plugins/gtkui/ddbseekbar.h
+++ b/plugins/gtkui/ddbseekbar.h
@@ -34,10 +34,14 @@ struct _DdbSeekbarClass {
};
-GType ddb_seekbar_get_type (void);
-DdbSeekbar* ddb_seekbar_new (void);
-DdbSeekbar* ddb_seekbar_construct (GType object_type);
+GType
+ddb_seekbar_get_type (void);
+GtkWidget*
+ddb_seekbar_new (void);
+
+void
+ddb_seekbar_init_signals (DdbSeekbar *sb, GtkWidget *evbox);
G_END_DECLS
diff --git a/plugins/gtkui/gtkui.c b/plugins/gtkui/gtkui.c
index bb89b17d..3e245901 100644
--- a/plugins/gtkui/gtkui.c
+++ b/plugins/gtkui/gtkui.c
@@ -149,7 +149,6 @@ update_songinfo (gpointer ctx) {
}
DB_output_t *output = deadbeef->get_output ();
char sbtext_new[512] = "-";
- float songpos = last_songpos;
float pl_totaltime = deadbeef->pl_get_totaltime ();
int daystotal = (int)pl_totaltime / (3600*24);
@@ -175,7 +174,6 @@ update_songinfo (gpointer ctx) {
if (!output || (output->state () == OUTPUT_STATE_STOPPED || !track || !c)) {
snprintf (sbtext_new, sizeof (sbtext_new), _("Stopped | %d tracks | %s total playtime"), deadbeef->pl_getcount (PL_MAIN), totaltime_str);
- songpos = 0;
}
else {
float playpos = deadbeef->streamer_get_playpos ();
@@ -195,7 +193,6 @@ update_songinfo (gpointer ctx) {
}
int samplerate = c->fmt.samplerate;
int bitspersample = c->fmt.bps;
- songpos = playpos;
// codec_unlock ();
char t[100];
@@ -240,18 +237,6 @@ update_songinfo (gpointer ctx) {
gtk_statusbar_push (sb, sb_context_id, sb_text);
}
- if (mainwin) {
- GtkWidget *widget = lookup_widget (mainwin, "seekbar");
- // translate volume to seekbar pixels
- songpos /= duration;
- GtkAllocation a;
- gtk_widget_get_allocation (widget, &a);
- songpos *= a.width;
- if (fabs (songpos - last_songpos) > 0.01) {
- gtk_widget_queue_draw (widget);
- last_songpos = songpos;
- }
- }
if (track) {
deadbeef->pl_item_unref (track);
}
@@ -692,12 +677,15 @@ update_win_title_idle (gpointer data) {
static gboolean
redraw_seekbar_cb (gpointer nothing) {
+ return FALSE;
+#if 0
int iconified = gdk_window_get_state(gtk_widget_get_window(mainwin)) & GDK_WINDOW_STATE_ICONIFIED;
if (!gtk_widget_get_visible (mainwin) || iconified) {
return FALSE;
}
seekbar_redraw ();
return FALSE;
+#endif
}
int
@@ -746,8 +734,8 @@ volumebar_redraw (void) {
static gint refresh_timeout = 0;
-void
-gtkui_setup_gui_refresh (void) {
+int
+gtkui_get_gui_refresh_rate () {
int fps = deadbeef->conf_get_int ("gtkui.refresh_rate", 10);
if (fps < 1) {
fps = 1;
@@ -755,8 +743,12 @@ gtkui_setup_gui_refresh (void) {
else if (fps > 30) {
fps = 30;
}
+ return fps;
+}
- int tm = 1000/fps;
+void
+gtkui_setup_gui_refresh (void) {
+ int tm = 1000/gtkui_get_gui_refresh_rate ();
if (refresh_timeout) {
g_source_remove (refresh_timeout);
@@ -987,6 +979,7 @@ gtkui_thread (void *ctx) {
w_reg_widget (_("HBox"), 0, w_hbox_create, "hbox", NULL);
w_reg_widget (_("VBox"), 0, w_vbox_create, "vbox", NULL);
w_reg_widget (_("Button"), 0, w_button_create, "button", NULL);
+ w_reg_widget (_("Seekbar"), 0, w_seekbar_create, "seekbar", NULL);
mainwin = create_mainwin ();
diff --git a/plugins/gtkui/gtkui.h b/plugins/gtkui/gtkui.h
index abd71af7..803beccb 100644
--- a/plugins/gtkui/gtkui.h
+++ b/plugins/gtkui/gtkui.h
@@ -94,9 +94,6 @@ int
gtkui_add_new_playlist (void);
void
-seekbar_redraw (void);
-
-void
seekbar_draw (GtkWidget *widget, cairo_t *cr);
gboolean
@@ -162,4 +159,7 @@ gtkui_quit (void);
void
gtkui_run_preferences_dlg (void);
+int
+gtkui_get_gui_refresh_rate ();
+
#endif
diff --git a/plugins/gtkui/prefwin.c b/plugins/gtkui/prefwin.c
index 6034feef..b90f8283 100644
--- a/plugins/gtkui/prefwin.c
+++ b/plugins/gtkui/prefwin.c
@@ -773,7 +773,6 @@ on_override_bar_colors_toggled (GtkToggleButton *togglebutton,
deadbeef->sendmessage (DB_EV_CONFIGCHANGED, 0, 0, 0);
gtkui_init_theme_colors ();
prefwin_init_theme_colors ();
- seekbar_redraw ();
volumebar_redraw ();
eq_redraw ();
}
diff --git a/plugins/gtkui/widgets.c b/plugins/gtkui/widgets.c
index c505d776..7d753b30 100644
--- a/plugins/gtkui/widgets.c
+++ b/plugins/gtkui/widgets.c
@@ -39,6 +39,7 @@
#include "../../strdupa.h"
#include "../../fastftoi.h"
#include "actions.h"
+#include "ddbseekbar.h"
//#define trace(...) { fprintf(stderr, __VA_ARGS__); }
#define trace(fmt,...)
@@ -193,6 +194,13 @@ typedef struct {
unsigned use_textcolor : 1;
} w_button_t;
+typedef struct {
+ ddb_gtkui_widget_t base;
+ GtkWidget *seekbar;
+ gint timer;
+ float last_songpos;
+} w_seekbar_t;
+
static int design_mode;
static ddb_gtkui_widget_t *rootwidget;
@@ -3445,3 +3453,84 @@ w_button_create (void) {
w_override_signals (w->base.widget, w);
return (ddb_gtkui_widget_t *)w;
}
+
+// seekbar
+static gboolean
+redraw_seekbar_cb (gpointer data) {
+ w_seekbar_t *w = data;
+ int iconified = gdk_window_get_state(gtk_widget_get_window(mainwin)) & GDK_WINDOW_STATE_ICONIFIED;
+ if (!gtk_widget_get_visible (mainwin) || iconified) {
+ return FALSE;
+ }
+ gtk_widget_queue_draw (w->seekbar);
+ return FALSE;
+}
+
+static int
+w_seekbar_message (ddb_gtkui_widget_t *w, uint32_t id, uintptr_t ctx, uint32_t p1, uint32_t p2) {
+ switch (id) {
+ case DB_EV_SONGCHANGED:
+ case DB_EV_CONFIGCHANGED:
+ {
+ ddb_event_trackchange_t *ev = (ddb_event_trackchange_t *)ctx;
+ g_idle_add (redraw_seekbar_cb, w);
+ }
+ break;
+ }
+ return 0;
+}
+
+static gboolean
+seekbar_frameupdate (gpointer data) {
+ w_seekbar_t *w = data;
+ DB_output_t *output = deadbeef->get_output ();
+ DB_playItem_t *track = deadbeef->streamer_get_playing_track ();
+ DB_fileinfo_t *c = deadbeef->streamer_get_current_fileinfo (); // FIXME: might crash streamer
+ float songpos = w->last_songpos;
+ float duration = track ? deadbeef->pl_get_item_duration (track) : -1;
+ if (!output || (output->state () == OUTPUT_STATE_STOPPED || !track || !c)) {
+ songpos = 0;
+ }
+ else {
+ songpos = deadbeef->streamer_get_playpos ();
+ }
+ // translate pos to seekbar pixels
+ songpos /= duration;
+ GtkAllocation a;
+ gtk_widget_get_allocation (w->seekbar, &a);
+ songpos *= a.width;
+ if (fabs (songpos - w->last_songpos) > 0.01) {
+ gtk_widget_queue_draw (w->seekbar);
+ w->last_songpos = songpos;
+ }
+ if (track) {
+ deadbeef->pl_item_unref (track);
+ }
+ return TRUE;
+}
+
+static void
+w_seekbar_destroy (ddb_gtkui_widget_t *wbase) {
+ w_seekbar_t *w = (w_seekbar_t *)wbase;
+ if (w->timer) {
+ g_source_remove (w->timer);
+ w->timer = 0;
+ }
+}
+
+ddb_gtkui_widget_t *
+w_seekbar_create (void) {
+ w_seekbar_t *w = malloc (sizeof (w_seekbar_t));
+ memset (w, 0, sizeof (w_seekbar_t));
+ w->base.widget = gtk_event_box_new ();
+ w->base.message = w_seekbar_message;
+ w->base.destroy = w_seekbar_destroy;
+ w->seekbar = ddb_seekbar_new ();
+ w->last_songpos = -1;
+ ddb_seekbar_init_signals (DDB_SEEKBAR (w->seekbar), w->base.widget);
+ gtk_widget_show (w->seekbar);
+ gtk_container_add (GTK_CONTAINER (w->base.widget), w->seekbar);
+ w_override_signals (w->base.widget, w);
+ w->timer = g_timeout_add (1000/gtkui_get_gui_refresh_rate (), seekbar_frameupdate, w);
+ return (ddb_gtkui_widget_t*)w;
+}
diff --git a/plugins/gtkui/widgets.h b/plugins/gtkui/widgets.h
index 964fb665..5a517e55 100644
--- a/plugins/gtkui/widgets.h
+++ b/plugins/gtkui/widgets.h
@@ -122,4 +122,7 @@ w_vbox_create (void);
ddb_gtkui_widget_t *
w_button_create (void);
+ddb_gtkui_widget_t *
+w_seekbar_create (void);
+
#endif