4 #include <gmpc/plugin.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
= {
22 int plugin_api_version
= PLUGIN_API_VERSION
;
23 /* main plugin_osd info */
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
,
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
)
48 mpd_Song
*song
= NULL
;
49 if(!cfg_get_single_value_as_int_with_default(config
, "qosd-plugin", "enable", 0))
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 */
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,
65 cfg_free_string(markup
);
66 qosd_show_popup(buffer
);
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
)
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
)
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
;
162 qosd_vbox
= gtk_vbox_new(FALSE
,6);
164 table
= gtk_table_new(8,2,FALSE
);
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);
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
);
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));
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 */
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);
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 */
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);
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
);
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
);
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
);
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
)