Use composite, and add stretch option.
[gmpc-qosd.git] / src / plugin.c
blob20f0c545a97e3323a124e8ba54b1cf81891d3a19
1 #include <stdio.h>
2 #include <string.h>
3 #include <glib.h>
4 #include <gmpc/plugin.h>
5 #include <config.h>
6 #define QOSD_SONG_MARKUP "[[<span size=\"large\">♪ %title% ♪</span>\n]<span size=\"x-small\">[<i>artist:</i> %artist% ][<i>album:</i> %album%]</span>]|[%name%]|[%shortfile%]"
9 GtkWidget *qosd_vbox = NULL;
11 void qosd_mpd_status_changed(MpdObj *mi, ChangedStatusType what, void *data);
12 void qosd_construct(GtkWidget *container);
13 void qosd_destroy(GtkWidget *container);
14 static int qosd_get_enabled(void);
15 static void qosd_set_enabled(int enabled);
17 gmpcPrefPlugin qosd_gpp = {
18 qosd_construct,
19 qosd_destroy
22 int plugin_api_version = PLUGIN_API_VERSION;
23 /* main plugin_osd info */
24 gmpcPlugin plugin = {
25 .name = "Qball's On Screen Display",
26 .version = {PLUGIN_MAJOR_VERSION,PLUGIN_MINOR_VERSION,PLUGIN_MICRO_VERSION},
27 .plugin_type = GMPC_PLUGIN_NO_GUI,
28 .mpd_status_changed = &qosd_mpd_status_changed,
29 .pref = &qosd_gpp,
30 .get_enabled = qosd_get_enabled,
31 .set_enabled = qosd_set_enabled
35 static int qosd_get_enabled(void)
37 return cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "enable", TRUE);
39 static void qosd_set_enabled(int enabled)
41 cfg_set_single_value_as_int(config, "qosd-plugin", "enable", enabled);
44 static void qosd_song_changed(MpdObj *mi)
46 gchar buffer[1024];
47 int state = 0;
48 mpd_Song *song = NULL;
49 if(!cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "enable", 0))
51 return;
53 state = mpd_player_get_state(connection);
54 song = mpd_playlist_get_current_song(connection);
55 if(song && (state == MPD_STATUS_STATE_PLAY || state == MPD_STATUS_STATE_PAUSE) )
57 /* this is stupid and inefficient, but it's late and I am to lame to fix it */
58 int i= 0, j = 0;
59 char buffer2[1024];
60 char *markup = cfg_get_single_value_as_string_with_default(config, "qosd-plugin","markup",QOSD_SONG_MARKUP);
61 memset(buffer,'\0',1024);
62 mpd_song_markup_escaped(buffer,1024,
63 markup,
64 song);
65 cfg_free_string(markup);
66 qosd_show_popup(buffer);
68 else
70 qosd_show_popup("Stopped");
76 static void qosd_enable_toggle(GtkWidget *wid,GtkWidget *table)
78 int kk = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
79 cfg_set_single_value_as_int(config, "qosd-plugin", "enable", kk);
80 gtk_widget_set_sensitive(table, cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "enable", 0));
83 static void qosd_spin_value_changed(GtkWidget *wid)
85 int kk = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(wid));
86 cfg_set_single_value_as_int(config, "qosd-plugin", "timeout", kk);
90 static void qosd_x_offset_changed(GtkWidget *wid)
92 int kk = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(wid));
93 cfg_set_single_value_as_int(config, "qosd-plugin", "x-offset", kk);
95 static void qosd_x_expand_changed(GtkWidget *wid)
97 int kk = gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(wid));
98 cfg_set_single_value_as_int(config, "qosd-plugin", "expand", kk);
103 static void qosd_y_offset_changed(GtkWidget *wid)
105 int kk = gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON(wid));
106 cfg_set_single_value_as_int(config, "qosd-plugin", "y-offset", kk);
108 static void qosd_test_settings()
110 qosd_show_popup("Test string:\nGnome Music Player Client");
113 static void qosd_color_set(GtkColorButton *colorbut)
115 GdkColor color;
116 gchar *string = NULL;
117 gtk_color_button_get_color(colorbut, &color);
118 cfg_set_single_value_as_int(config, "qosd-plugin", "text-rcolor", color.red);
119 cfg_set_single_value_as_int(config, "qosd-plugin", "text-gcolor", color.green);
120 cfg_set_single_value_as_int(config, "qosd-plugin", "text-bcolor", color.blue);
121 cfg_set_single_value_as_int(config, "qosd-plugin", "text-acolor", gtk_color_button_get_alpha(colorbut));
125 void qosd_destroy(GtkWidget *container)
127 gtk_container_remove(GTK_CONTAINER(container), qosd_vbox);
130 static void qosd_bgcolor_set(GtkColorButton *colorbut)
132 GdkColor color;
133 gchar *string = NULL;
134 gtk_color_button_get_color(colorbut, &color);
135 cfg_set_single_value_as_int(config, "qosd-plugin", "background-rcolor", color.red);
136 cfg_set_single_value_as_int(config, "qosd-plugin", "background-gcolor", color.green);
137 cfg_set_single_value_as_int(config, "qosd-plugin", "background-bcolor", color.blue);
138 cfg_set_single_value_as_int(config, "qosd-plugin", "background-acolor", gtk_color_button_get_alpha(colorbut));
142 static void qosd_vert_pos_changed(GtkComboBox *box)
144 int i = gtk_combo_box_get_active(box);
145 cfg_set_single_value_as_int(config, "qosd-plugin", "vposition", i);
147 static void qosd_horz_pos_changed(GtkComboBox *box)
149 int i = gtk_combo_box_get_active(box);
150 cfg_set_single_value_as_int(config, "qosd-plugin", "hposition", i);
154 void qosd_construct(GtkWidget *container)
156 GtkWidget *enable_cg = gtk_check_button_new_with_mnemonic("_Enable OSD");
157 GtkWidget *label = NULL;
158 GtkWidget *wid2 = NULL;
159 GtkWidget *table = NULL;
160 gchar *string = NULL;
161 GdkColor color;
162 qosd_vbox = gtk_vbox_new(FALSE,6);
163 /* table */
164 table = gtk_table_new(8,2,FALSE);
167 /* enable/disable */
168 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(enable_cg),
169 cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "enable", 0));
170 gtk_widget_set_sensitive(table,
171 cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "enable", 0));
172 g_signal_connect(G_OBJECT(enable_cg), "toggled", G_CALLBACK(qosd_enable_toggle), table);
173 gtk_box_pack_start(GTK_BOX(qosd_vbox), enable_cg, FALSE, FALSE, 0);
179 gtk_table_set_col_spacings(GTK_TABLE(table), 6);
180 gtk_table_set_row_spacings(GTK_TABLE(table), 6);
182 gtk_box_pack_start(GTK_BOX(qosd_vbox), table, FALSE, FALSE,0);
184 /* timeout */
185 label = gtk_label_new("Timeout:");
186 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
187 gtk_table_attach(GTK_TABLE(table), label, 0,1,0,1,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
188 label = gtk_spin_button_new_with_range(1.0,10.0,1.0);
189 gtk_table_attach_defaults(GTK_TABLE(table), label, 1,2,0,1);
190 gtk_spin_button_set_value(GTK_SPIN_BUTTON(label),(gdouble)cfg_get_single_value_as_int_with_default(config, "qosd-plugin","timeout",3));
191 g_signal_connect(G_OBJECT(label), "value-changed", G_CALLBACK(qosd_spin_value_changed), NULL);
193 /* Color Selector */
194 label = gtk_label_new("Text Color:");
195 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
196 gtk_table_attach(GTK_TABLE(table), label, 0,1,1,2,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
197 color.red = cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "text-rcolor", 65535);
198 color.green = cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "text-gcolor",65535);
199 color.blue = cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "text-bcolor", 65535);
200 cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "text-acolor", 65535);
202 label = gtk_color_button_new_with_color(&color);
203 gtk_table_attach_defaults(GTK_TABLE(table), label, 1,2,1,2);
204 g_signal_connect(G_OBJECT(label), "color-set", G_CALLBACK(qosd_color_set), NULL);
205 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON(label), TRUE);
206 gtk_color_button_set_alpha(GTK_COLOR_BUTTON(label),
207 cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "text-acolor", 65535));
211 /* Color Selector */
212 label = gtk_label_new("Background Color:");
213 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
214 gtk_table_attach(GTK_TABLE(table), label, 0,1,2,3,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
215 color.red = cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "background-rcolor", 0);
216 color.green = cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "background-gcolor",0);
217 color.blue = cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "background-bcolor", 0);
218 cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "background-acolor", 35535);
220 label = gtk_color_button_new_with_color(&color);
221 gtk_table_attach_defaults(GTK_TABLE(table), label, 1,2,2,3);
222 g_signal_connect(G_OBJECT(label), "color-set", G_CALLBACK(qosd_bgcolor_set), NULL);
223 gtk_color_button_set_use_alpha (GTK_COLOR_BUTTON(label), TRUE);
224 gtk_color_button_set_alpha(GTK_COLOR_BUTTON(label),
225 cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "background-acolor", 35535));
230 /* position selector */
231 /* TODO*/
232 label = gtk_label_new("Vertical Position:");
233 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
234 gtk_table_attach(GTK_TABLE(table), label, 0,1,3,4,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
235 label = gtk_combo_box_new_text();
236 gtk_combo_box_append_text(GTK_COMBO_BOX(label),"Top");
237 gtk_combo_box_append_text(GTK_COMBO_BOX(label),"Middle");
238 gtk_combo_box_append_text(GTK_COMBO_BOX(label),"Bottom");
240 gtk_combo_box_set_active(GTK_COMBO_BOX(label), cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "vposition", 1));
241 g_signal_connect(label, "changed", G_CALLBACK(qosd_vert_pos_changed), NULL);
242 gtk_table_attach(GTK_TABLE(table), label, 1,2,3,4,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
246 /* x-offset */
247 label = gtk_label_new("Vertical-Offset:");
248 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
249 gtk_table_attach(GTK_TABLE(table), label, 0,1,4,5,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
250 label = gtk_spin_button_new_with_range(0.0,100.0,1.0);
251 gtk_table_attach_defaults(GTK_TABLE(table), label, 1,2,4,5);
252 gtk_spin_button_set_value(GTK_SPIN_BUTTON(label),(gdouble)cfg_get_single_value_as_int_with_default(config, "qosd-plugin","x-offset",0));
253 g_signal_connect(G_OBJECT(label), "value-changed", G_CALLBACK(qosd_x_offset_changed), NULL);
256 /* position selector */
257 /* TODO*/
258 label = gtk_label_new("Horizontal Position:");
259 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
260 gtk_table_attach(GTK_TABLE(table), label, 0,1,5,6,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
261 label = gtk_combo_box_new_text();
262 gtk_combo_box_append_text(GTK_COMBO_BOX(label),"Left");
263 gtk_combo_box_append_text(GTK_COMBO_BOX(label),"Center");
264 gtk_combo_box_append_text(GTK_COMBO_BOX(label),"Right");
265 gtk_combo_box_set_active(GTK_COMBO_BOX(label), cfg_get_single_value_as_int_with_default(config, "qosd-plugin", "hposition", 0));
266 g_signal_connect(label, "changed", G_CALLBACK(qosd_horz_pos_changed), NULL);
267 gtk_table_attach(GTK_TABLE(table), label, 1,2,5,6,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
272 /* y-offset */
273 label = gtk_label_new("Horizontal-Offset:");
274 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
275 gtk_table_attach(GTK_TABLE(table), label, 0,1,6,7,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
276 label = gtk_spin_button_new_with_range(0.0,100.0,1.0);
277 gtk_table_attach_defaults(GTK_TABLE(table), label, 1,2,6,7);
278 gtk_spin_button_set_value(GTK_SPIN_BUTTON(label),(gdouble)cfg_get_single_value_as_int_with_default(config, "qosd-plugin","y-offset",0));
279 g_signal_connect(G_OBJECT(label), "value-changed", G_CALLBACK(qosd_y_offset_changed), NULL);
283 /* y-offset */
284 label = gtk_label_new("Horizontal-Expand:");
285 gtk_misc_set_alignment(GTK_MISC(label), 1,0.5);
286 gtk_table_attach(GTK_TABLE(table), label, 0,1,7,8,GTK_FILL|GTK_SHRINK,GTK_FILL|GTK_SHRINK,0,0);
287 label = gtk_check_button_new();
288 gtk_table_attach_defaults(GTK_TABLE(table), label, 1,2,7,8);
289 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(label),(gdouble)cfg_get_single_value_as_int_with_default(config, "qosd-plugin","expand",0));
290 g_signal_connect(G_OBJECT(label), "toggled", G_CALLBACK(qosd_x_expand_changed), NULL);
293 label = gtk_button_new_with_label("Test Settings");
294 g_signal_connect(G_OBJECT(label), "clicked", G_CALLBACK(qosd_test_settings), NULL);
295 wid2 = gtk_alignment_new(1,0.5, 0,0);
296 gtk_container_add(GTK_CONTAINER(wid2), label);
297 gtk_table_attach(GTK_TABLE(table), wid2, 1,2,8,9,GTK_SHRINK|GTK_FILL,GTK_FILL|GTK_SHRINK,0,0);
300 gtk_container_add(GTK_CONTAINER(container), qosd_vbox);
301 gtk_widget_show_all(container);
304 /* mpd changed */
306 void qosd_mpd_status_changed(MpdObj *mi, ChangedStatusType what, void *data)
308 if(what&(MPD_CST_SONGID|MPD_CST_STATE))
310 int state = mpd_player_get_state(mi);
311 if(state&MPD_STATUS_STATE_PLAY)
312 qosd_song_changed(mi);
313 return;
315 /* don't do this on song change */
316 if(what&MPD_CST_VOLUME)
319 if(what&MPD_CST_REPEAT)
322 if(what&MPD_CST_RANDOM)