2 #include "control_window.h"
3 #include "gmpc-extras.h"
7 * Reuse code from playlist3.
9 extern GtkBuilder *pl3_xml;
10 gboolean playlist_player_volume_changed(GtkWidget * vol_but, int new_vol);
11 void pl3_pb_seek_event(GtkWidget * pb, guint seek_time, gpointer user_data);
14 * Draw background of control box.
17 expose_window(GtkWidget *widget, GdkEventExpose *event, gpointer date)
20 cr = gdk_cairo_create(widget->window);
22 cairo_set_source_rgba(cr, 0.0, 0.0, 0.0, .7);
23 cairo_set_operator(cr, CAIRO_OPERATOR_SOURCE);
24 cairo_paint(cr); /* paint source */
26 cairo_set_source_rgba(cr, .8, .8, .8, .7);
27 cairo_rectangle(cr, 0.5,0.5,
28 widget->allocation.width-1.0,
29 widget->allocation.height-1.0);
38 * change the colors recursively.
39 * Background black, text/fg white.
41 static void control_window_modify_colors(GtkWidget *base)
44 if(GTK_IS_HSCALE(base) == FALSE)
46 gtk_widget_modify_bg(base, GTK_STATE_NORMAL,&(base->style->black));
47 gtk_widget_modify_fg(base, GTK_STATE_NORMAL,&(base->style->white));
48 gtk_widget_modify_text(base, GTK_STATE_NORMAL,&(base->style->white));
50 if(GTK_IS_CONTAINER(base))
52 for (iter = gtk_container_get_children(GTK_CONTAINER(base));
54 iter = g_list_next(iter))
56 control_window_modify_colors(iter->data);
65 static void control_window_leave_fullscreen(GtkWidget *button, GtkWidget *parent)
67 gtk_window_unfullscreen(GTK_WINDOW(parent));
72 GtkWidget *create_control_window(GtkWidget *parent)
75 GtkWidget *pp_button, *next_button, *prev_button, *ff_button;
76 GtkWidget *vol, *progress, *hbox, *play_image;
77 GdkScreen *screen = gtk_window_get_screen(GTK_WINDOW(parent));
81 GtkWidget *base = gtk_window_new(GTK_WINDOW_TOPLEVEL);
82 gtk_window_set_type_hint(GTK_WINDOW(base), GDK_WINDOW_TYPE_HINT_DOCK);
83 gtk_window_set_skip_pager_hint(GTK_WINDOW(base), TRUE);
84 gtk_window_set_skip_taskbar_hint(GTK_WINDOW(base), TRUE);
85 gtk_window_set_decorated(GTK_WINDOW(base), FALSE);
86 gtk_window_set_resizable(GTK_WINDOW(base), FALSE);
87 gtk_window_set_transient_for(GTK_WINDOW(base), GTK_WINDOW(parent));
88 gtk_container_set_border_width(GTK_CONTAINER(base), 4);
90 /* Overwrite background drawing */
91 gtk_widget_set_app_paintable(base, TRUE);
92 g_signal_connect(G_OBJECT(base), "expose-event",
93 G_CALLBACK(expose_window), NULL);
95 hbox = gtk_hbox_new(FALSE, 6);
96 gtk_container_add(GTK_CONTAINER(base), hbox);
99 ff_button = gtk_button_new();
100 gtk_container_add(GTK_CONTAINER(ff_button),
101 gtk_image_new_from_stock(GTK_STOCK_LEAVE_FULLSCREEN,
102 GTK_ICON_SIZE_BUTTON));
103 gtk_button_set_relief(GTK_BUTTON(ff_button), GTK_RELIEF_NONE);
104 gtk_box_pack_start(GTK_BOX(hbox), ff_button, FALSE, FALSE, 0);
105 g_signal_connect(G_OBJECT(ff_button), "clicked",
106 G_CALLBACK(control_window_leave_fullscreen), parent);
108 vol = (GtkWidget *)gmpc_widgets_volume_new();
109 gtk_box_pack_end(GTK_BOX(hbox), vol, FALSE, FALSE, 0);
110 new_volume = mpd_status_get_volume(connection);
111 gmpc_widgets_volume_set_volume_level(GMPC_WIDGETS_VOLUME(vol), new_volume );
112 g_object_set_data(G_OBJECT(base), "vol", vol);
113 g_signal_connect(G_OBJECT(vol), "value_changed",
114 G_CALLBACK(playlist_player_volume_changed), NULL);
116 progress = (GtkWidget *)gmpc_progress_new();
117 gmpc_progress_set_hide_text(GMPC_PROGRESS(progress), FALSE);
118 gtk_box_pack_start(GTK_BOX(hbox), progress, TRUE, TRUE, 0);
119 g_object_set_data(G_OBJECT(base), "progress", progress);
120 g_signal_connect(G_OBJECT(progress), "seek-event", G_CALLBACK(pl3_pb_seek_event), NULL);
122 /* Previous button */
123 prev_button = gtk_button_new();
124 gtk_container_add(GTK_CONTAINER(prev_button),
125 gtk_image_new_from_stock("gtk-media-previous", GTK_ICON_SIZE_BUTTON));
126 gtk_activatable_set_related_action(GTK_ACTIVATABLE(prev_button),
127 GTK_ACTION(gtk_builder_get_object(pl3_xml, "MPDPrevious")));
128 gtk_button_set_relief(GTK_BUTTON(prev_button), GTK_RELIEF_NONE);
129 gtk_box_pack_start(GTK_BOX(hbox), prev_button, FALSE, FALSE, 0);
132 pp_button = gtk_button_new();
133 if(mpd_player_get_state(connection) == MPD_PLAYER_PLAY)
135 play_image = gtk_image_new_from_stock("gtk-media-pause", GTK_ICON_SIZE_BUTTON);
139 play_image = gtk_image_new_from_stock("gtk-media-play", GTK_ICON_SIZE_BUTTON);
141 gtk_container_add(GTK_CONTAINER(pp_button), play_image);
142 g_object_set_data(G_OBJECT(base), "play_image", play_image);
144 gtk_activatable_set_related_action(GTK_ACTIVATABLE(pp_button),
145 GTK_ACTION(gtk_builder_get_object(pl3_xml, "MPDPlayPause")));
146 gtk_button_set_relief(GTK_BUTTON(pp_button), GTK_RELIEF_NONE);
147 gtk_box_pack_start(GTK_BOX(hbox), pp_button, FALSE, FALSE, 0);
150 next_button = gtk_button_new();
151 gtk_container_add(GTK_CONTAINER(next_button),
152 gtk_image_new_from_stock("gtk-media-next", GTK_ICON_SIZE_BUTTON));
153 gtk_activatable_set_related_action(GTK_ACTIVATABLE(next_button),
154 GTK_ACTION(gtk_builder_get_object(pl3_xml, "MPDNext")));
155 gtk_button_set_relief(GTK_BUTTON(next_button), GTK_RELIEF_NONE);
156 gtk_box_pack_start(GTK_BOX(hbox), next_button, FALSE, FALSE, 0);
159 /* Move window to right location and set size */
160 gtk_window_get_size(GTK_WINDOW(parent), &width, &height);
161 gtk_widget_set_size_request(GTK_WIDGET(base), width*0.6, height*0.05);
162 gtk_window_move(GTK_WINDOW(base), width*0.2, height);
164 if (gdk_screen_is_composited(screen))
166 GdkColormap *colormap = gdk_screen_get_rgba_colormap(screen);
168 gtk_widget_set_colormap(base, colormap);
169 gtk_window_set_opacity(GTK_WINDOW(base), 0.7);
172 control_window_modify_colors(base);
173 gtk_widget_show_all(base);
179 void control_window_status_update(MpdObj * mi, ChangedStatusType what, GtkWidget *base)
181 GtkWidget *volume_button, *progress, *play_image;
182 if(base == NULL) return;
183 volume_button = g_object_get_data(G_OBJECT(base), "vol");
184 progress = g_object_get_data(G_OBJECT(base), "progress");
185 play_image = g_object_get_data(G_OBJECT(base), "play_image");
187 if (what & MPD_CST_STATE)
189 int state = mpd_player_get_state(mi);
192 case MPD_PLAYER_PLAY:
193 gtk_image_set_from_stock(GTK_IMAGE(play_image),
194 "gtk-media-pause", GTK_ICON_SIZE_BUTTON);
196 case MPD_PLAYER_PAUSE:
197 gtk_image_set_from_stock(GTK_IMAGE(play_image),
198 "gtk-media-play", GTK_ICON_SIZE_BUTTON);
201 gtk_image_set_from_stock(GTK_IMAGE(play_image),
202 "gtk-media-play", GTK_ICON_SIZE_BUTTON);
203 /* Make sure it's reset correctly */
204 gmpc_progress_set_time(GMPC_PROGRESS(progress), 0, 0);
207 if (what & MPD_CST_ELAPSED_TIME)
209 if (mpd_check_connected(connection))
211 int totalTime = mpd_status_get_total_song_time(connection);
212 int elapsedTime = mpd_status_get_elapsed_song_time(connection);
213 gmpc_progress_set_time(GMPC_PROGRESS(progress), totalTime, elapsedTime);
216 gmpc_progress_set_time(GMPC_PROGRESS(progress), 0, 0);
219 if (what & MPD_CST_VOLUME)
221 int volume = gmpc_widgets_volume_get_volume_level(GMPC_WIDGETS_VOLUME(volume_button));
222 int new_volume = mpd_status_get_volume(connection);
223 if (new_volume >= 0 &&
224 mpd_server_check_command_allowed(connection, "setvol") == MPD_SERVER_COMMAND_ALLOWED
227 gtk_widget_set_sensitive(volume_button, TRUE);
228 /* don't do anything if nothing is changed */
229 if (new_volume != volume)
231 gmpc_widgets_volume_set_volume_level(GMPC_WIDGETS_VOLUME(volume_button), new_volume );
235 gtk_widget_set_sensitive(volume_button, FALSE);
244 void control_window_destroy(GtkWidget *cw)
246 if(cw == NULL) return;
247 gtk_widget_destroy(cw);