1 /* Gnome Music Player Client (GMPC)
2 * Copyright (C) 2004-2012 Qball Cow <qball@gmpclient.org>
3 * Project homepage: http://gmpclient.org/
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
25 #include "playlist3.h"
26 #include "mpdinteraction.h"
27 #include "advanced-search.h"
28 #include "gmpc-extras.h"
30 //G_LOCK_DEFINE (connecting_lock);
32 int current_volume
= 0;
34 static GMutex
*connecting_lock
= NULL
; //g_mutex_new();//G_STATIC_MUTEX_INIT;
36 /* Server Settings plugin */
37 static void server_pref_construct(GtkWidget
*);
38 static void server_pref_destroy(GtkWidget
*);
40 /* Connection settings plugin */
41 static void connection_pref_construct(GtkWidget
* container
);
42 static void connection_pref_destroy(GtkWidget
* container
);
44 void server_pref_replaygain_changed(GtkComboBox
* combo
, gpointer data
);
45 static void ServerStatusChangedCallback(MpdObj
* mi
, ChangedStatusType what
, void *userdata
);
47 static GtkBuilder
*server_pref_xml
= NULL
;
48 static GtkBuilder
*connection_pref_xml
= NULL
;
50 gmpcPrefPlugin server_gpp
= {
51 server_pref_construct
,
55 /* Glade prototypes, would be static without glade */
56 void xfade_enable_toggled(GtkToggleButton
* but
);
57 void xfade_time_changed(GtkSpinButton
* but
);
58 void entry_auth_changed(GtkEntry
* entry
);
60 void select_directory_dialog(GtkWidget
*button
);
61 void auth_enable_toggled(GtkToggleButton
* but
);
63 void preferences_window_autoconnect(GtkToggleButton
* tog
);
64 void preferences_window_connect(GtkWidget
* but
);
65 void preferences_window_disconnect(GtkWidget
* but
);
66 void update_preferences_name(GtkWidget
* entry
);
67 void update_preferences_hostname(GtkWidget
* entry
);
68 void update_preferences_portnumber(GtkWidget
* wid
);
69 void update_preferences_information(GtkWidget
* wid
);
70 void connection_profiles_changed(GtkComboBox
* combo
, gpointer data
);
71 void connection_add_profile(GtkWidget
* but
);
72 void connection_remove_profile(GtkWidget
* but
);
73 void submenu_artist_clicked(GtkWidget
* item
);
74 void submenu_album_clicked(GtkWidget
* item
);
75 void submenu_genre_clicked(GtkWidget
* item
);
76 void submenu_dir_clicked(GtkWidget
* item
);
78 static void mpd_interaction_init(void)
82 gmpcPlugin server_plug
= {
83 .name
= N_("Server Settings"), /** name */
84 .version
= {1, 1, 1}, /** Version */
85 .plugin_type
= GMPC_INTERNALL
, /** Plugin Type */
86 .init
= mpd_interaction_init
,/** init */
87 .mpd_status_changed
= ServerStatusChangedCallback
, /** status changed */
88 .pref
= &server_gpp
/** preferences */
99 gmpcPrefPlugin connection_gpp
= {
100 connection_pref_construct
,
101 connection_pref_destroy
104 gmpcPlugin connection_plug
= {
105 .name
= N_("Connection"), /* name */
106 .version
= {1, 1, 1}, /* version */
107 .plugin_type
= GMPC_INTERNALL
, /* type */
108 .pref
= &connection_gpp
/* preferences */
111 guint connecting_pulse
= 0;
112 gboolean
connecting_pulse_callback(void);
113 gboolean
connecting_pulse_callback(void)
117 GtkProgressBar
*pb
= GTK_PROGRESS_BAR(gtk_builder_get_object(pl3_xml
, "pl3_progressbar"));
118 gtk_progress_bar_pulse(pb
);
123 /* this function doesnt use the start/stop_mpd_action because it the user doesnt want to see that */
125 int update_mpd_status(void)
127 if (!mpd_check_connected(connection
))
129 mpd_status_update(connection
);
134 static int connected_to_mpd(mpd_Connection
* mpd_conn
)
136 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(pl3_xml
, "pl3_progressbar")));
137 g_source_remove(connecting_pulse
);
138 connecting_pulse
= 0;
139 g_mutex_unlock(connecting_lock
);
142 mpd_connect_real(connection
, mpd_conn
);
148 static void connection_thread(void)
150 gchar
* hostname
= connection_get_hostname();
151 mpd_Connection
*conn
= mpd_newConnection(hostname
, connection_get_port(), cfg_get_single_value_as_float_with_default(config
, "connection", "timeout", DEFAULT_TIMEOUT
));
154 g_idle_add((GSourceFunc
) connected_to_mpd
, conn
);
158 /* the functiont that connects to mpd */
159 int connect_to_mpd(void)
161 GError
*error
= NULL
;
163 if (connecting_lock
== NULL
)
165 connecting_lock
= g_mutex_new();
167 if (! /*G_TRYLOCK */ g_mutex_trylock(connecting_lock
))
174 string
= connection_get_hostname();
175 mpd_set_hostname(connection
, string
);
180 mpd_set_port(connection
, connection_get_port());
184 mpd_set_connection_timeout(connection
,
185 cfg_get_single_value_as_float_with_default(config
, "connection", "timeout",
188 if (connection_use_auth())
190 string
= connection_get_password();
191 mpd_set_password(connection
, string
);
195 mpd_set_password(connection
, "");
197 g_thread_create((GThreadFunc
) connection_thread
, NULL
, FALSE
, &error
);
199 g_error("Failed to create thread: %s\n", error
->message
);
202 connecting_pulse
= g_timeout_add(200, (GSourceFunc
) (connecting_pulse_callback
), NULL
);
203 gtk_progress_bar_set_text(GTK_PROGRESS_BAR(gtk_builder_get_object(pl3_xml
, "pl3_progressbar")), _("Connecting"));
204 gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(pl3_xml
, "pl3_progressbar")));
208 mpd_stats_update(connection);
210 /* set that user wants to connect */
211 gmpc_connected
= TRUE
;
216 /******************************************************
220 /* the normal play functions, stop, play, next, prev */
221 /* returns FALSE when everything went ok */
224 if (mpd_server_check_command_allowed(connection
, "next") == MPD_SERVER_COMMAND_ALLOWED
)
226 mpd_player_next(connection
);
233 if (mpd_server_check_command_allowed(connection
, "previous") == MPD_SERVER_COMMAND_ALLOWED
)
234 mpd_player_prev(connection
);
240 if (mpd_server_check_command_allowed(connection
, "stop") == MPD_SERVER_COMMAND_ALLOWED
)
241 mpd_player_stop(connection
);
249 mpd_check_connected(connection
) &&
250 mpd_server_check_command_allowed(connection
, "pause") == MPD_SERVER_COMMAND_ALLOWED
)
251 mpd_player_pause(connection
);
255 int real_play_song(void)
257 if (mpd_server_check_command_allowed(connection
, "play") == MPD_SERVER_COMMAND_ALLOWED
)
258 mpd_player_play(connection
);
262 int real_pause_song(void)
264 int state
= mpd_player_get_state(connection
);
265 if (state
== MPD_PLAYER_PLAY
)
267 if (mpd_server_check_command_allowed(connection
, "pause") == MPD_SERVER_COMMAND_ALLOWED
)
268 mpd_player_pause(connection
);
274 int state
= mpd_player_get_state(connection
);
275 if (state
== MPD_PLAYER_STOP
)
277 if (mpd_server_check_command_allowed(connection
, "play") == MPD_SERVER_COMMAND_ALLOWED
)
278 mpd_player_play(connection
);
279 } else if (state
== MPD_PLAYER_PAUSE
|| state
== MPD_PLAYER_PLAY
)
281 if (mpd_server_check_command_allowed(connection
, "pause") == MPD_SERVER_COMMAND_ALLOWED
)
282 mpd_player_pause(connection
);
287 void random_pl(GtkToggleButton
* tb
)
289 if (gtk_toggle_button_get_active(tb
) != mpd_player_get_random(connection
))
290 mpd_player_set_random(connection
, !mpd_player_get_random(connection
));
293 void repeat_pl(GtkToggleButton
* tb
)
295 if (gtk_toggle_button_get_active(tb
) != mpd_player_get_repeat(connection
))
296 mpd_player_set_repeat(connection
, !mpd_player_get_repeat(connection
));
301 if (mpd_server_check_command_allowed(connection
, "seek") == MPD_SERVER_COMMAND_ALLOWED
)
304 int elapsedTime
= mpd_status_get_elapsed_song_time(connection
)+n
;
305 int clamped
= (elapsedTime
< 0)? 0:elapsedTime
;
306 mpd_player_seek(connection
, clamped
);
316 void song_fastforward(void)
321 void song_fastbackward(void)
326 void repeat_toggle(void)
328 mpd_player_set_repeat(connection
, !mpd_player_get_repeat(connection
));
331 void repeat_single_toggle(void)
333 mpd_player_set_single(connection
, !mpd_player_get_single(connection
));
336 void consume_toggle(void)
338 mpd_player_set_consume(connection
, !mpd_player_get_consume(connection
));
341 void random_toggle(void)
343 mpd_player_set_random(connection
, !mpd_player_get_random(connection
));
348 mpd_status_set_volume(connection
, mpd_status_get_volume(connection
) + 5);
351 void volume_down(void)
353 mpd_status_set_volume(connection
, mpd_status_get_volume(connection
) - 5);
356 void volume_mute(void)
358 mpd_status_set_volume(connection
, 0);
361 void volume_unmute(void)
363 if (mpd_status_get_volume(connection
) == 0)
364 mpd_status_set_volume(connection
, current_volume
);
367 void volume_toggle_mute(void)
369 if (current_volume
> 0 && mpd_status_get_volume(connection
) == 0)
371 mpd_status_set_volume(connection
, current_volume
);
374 mpd_status_set_volume(connection
, 0);
378 /*****************************************************************
381 static void outputs_toggled(GtkCellRendererToggle
* cell
, gchar
* path_str
, GtkTreeView
* view
)
386 GtkTreeModel
*model
= gtk_tree_view_get_model(view
);
387 GtkTreePath
*path
= gtk_tree_path_new_from_string(path_str
);
389 if (gtk_tree_model_get_iter(model
, &iter
, path
))
391 gtk_tree_model_get(model
, &iter
, ENABLED_COL
, &state
, ID_COL
, &id
, -1);
393 mpd_server_set_output_device(connection
, id
, state
);
395 gtk_list_store_set(GTK_LIST_STORE(model
), &iter
, ENABLED_COL
, state
, -1);
397 gtk_tree_path_free(path
);
400 static void create_outputs_tree(void)
403 GtkCellRenderer
*cell
;
404 GtkTreeViewColumn
*col
;
407 tree
= GTK_TREE_VIEW(gtk_builder_get_object(server_pref_xml
, "tv_outputs"));
408 model
= gtk_list_store_new(3, G_TYPE_BOOLEAN
, G_TYPE_STRING
, G_TYPE_INT
);
409 gtk_tree_view_set_model(tree
, GTK_TREE_MODEL(model
));
410 g_object_unref(G_OBJECT(model
));
412 cell
= gtk_cell_renderer_toggle_new();
413 col
= gtk_tree_view_column_new();
414 gtk_tree_view_column_pack_start(col
, cell
, TRUE
);
415 gtk_tree_view_column_add_attribute(col
, cell
, "active", 0);
416 gtk_tree_view_column_set_title(col
, "Enabled");
417 gtk_tree_view_append_column(tree
, col
);
418 g_signal_connect(G_OBJECT(cell
), "toggled", G_CALLBACK(outputs_toggled
), tree
);
420 cell
= gtk_cell_renderer_text_new();
421 col
= gtk_tree_view_column_new();
422 gtk_tree_view_column_pack_start(col
, cell
, TRUE
);
423 gtk_tree_view_column_add_attribute(col
, cell
, "text", 1);
424 gtk_tree_view_column_set_title(col
, "Name");
425 gtk_tree_view_append_column(tree
, col
);
427 col
= gtk_tree_view_column_new();
428 gtk_tree_view_column_set_visible(col
, FALSE
);
429 gtk_tree_view_append_column(tree
, col
);
432 static void update_outputs_settings(void)
438 frame
= GTK_FRAME(gtk_builder_get_object(server_pref_xml
, "frm_outputs"));
440 GTK_LIST_STORE(gtk_tree_view_get_model
441 (GTK_TREE_VIEW(gtk_builder_get_object(server_pref_xml
, "tv_outputs"))));
442 gtk_list_store_clear(store
);
443 if (mpd_check_connected(connection
) && mpd_server_check_version(connection
, 0, 12, 0))
445 MpdData
*data
= mpd_server_get_output_devices(connection
);
446 while (data
!= NULL
&& data
->output_dev
->id
!= -10)
448 gtk_list_store_append(store
, &iter
);
449 gtk_list_store_set(store
, &iter
,
450 0, data
->output_dev
->enabled
? TRUE
: FALSE
,
451 1, data
->output_dev
->name
, 2, data
->output_dev
->id
, -1);
452 data
= mpd_data_get_next(data
);
454 gtk_widget_set_sensitive(GTK_WIDGET(frame
), TRUE
);
455 gtk_widget_show_all(GTK_WIDGET(frame
));
458 gtk_widget_set_sensitive(GTK_WIDGET(frame
), FALSE
);
462 void xfade_enable_toggled(GtkToggleButton
* but
)
465 int bool1
= gtk_toggle_button_get_active(but
);
466 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "sb_fade_time")), bool1
);
470 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON
471 (gtk_builder_get_object(server_pref_xml
, "sb_fade_time")));
472 mpd_status_set_crossfade(connection
, fade_time
);
475 mpd_status_set_crossfade(connection
, 0);
479 void xfade_time_changed(GtkSpinButton
* but
)
482 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON
483 (gtk_builder_get_object(server_pref_xml
, "sb_fade_time")));
484 if (!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(server_pref_xml
, "cb_fading"))))
488 mpd_status_set_crossfade(connection
, fade_time
);
491 static void xfade_update(void)
493 if (mpd_status_get_crossfade(connection
) > 0)
495 gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(server_pref_xml
, "sb_fade_time")),
496 mpd_status_get_crossfade(connection
));
498 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(gtk_builder_get_object(server_pref_xml
, "cb_fading")),
499 mpd_status_get_crossfade(connection
) ? TRUE
: FALSE
);
501 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "sb_fade_time")),
502 (mpd_status_get_crossfade(connection
)) ? TRUE
: FALSE
);
509 void play_path(const gchar
* path
)
513 if (mpd_server_check_command_allowed(connection
, "playlistfind") == MPD_SERVER_COMMAND_ALLOWED
)
515 MpdData
*data
= NULL
;
516 mpd_playlist_search_start(connection
, TRUE
);
517 mpd_playlist_search_add_constraint(connection
, MPD_TAG_ITEM_FILENAME
, path
);
518 data
= mpd_playlist_search_commit(connection
);
521 mpd_player_play_id(connection
, data
->song
->id
);
526 if (mpd_server_check_command_allowed(connection
, "addid") == MPD_SERVER_COMMAND_ALLOWED
)
528 int songid
= mpd_playlist_add_get_id(connection
, (gchar
*) path
);
531 mpd_player_play_id(connection
, songid
);
537 void add_artist(const gchar
* artist
)
539 MpdData
*data
= NULL
;
541 g_return_if_fail(artist
!= NULL
);
543 mpd_database_search_start(connection
, TRUE
);
544 mpd_database_search_add_constraint(connection
, MPD_TAG_ITEM_ARTIST
, artist
);
545 data
= mpd_database_search_commit(connection
);
548 data
= misc_sort_mpddata_by_album_disc_track(data
);
549 for (; data
; data
= mpd_data_get_next(data
))
551 mpd_playlist_queue_add(connection
, data
->song
->file
);
553 mpd_playlist_queue_commit(connection
);
557 void add_album(const gchar
* artist
, const gchar
* album
)
559 MpdData
*data
= NULL
;
561 g_return_if_fail(artist
!= NULL
);
562 g_return_if_fail(album
!= NULL
);
564 mpd_database_search_start(connection
, TRUE
);
565 mpd_database_search_add_constraint(connection
, MPD_TAG_ITEM_ARTIST
, artist
);
566 mpd_database_search_add_constraint(connection
, MPD_TAG_ITEM_ALBUM
, album
);
567 data
= mpd_database_search_commit(connection
);
570 data
= misc_sort_mpddata_by_album_disc_track(data
);
571 for (; data
; data
= mpd_data_get_next(data
))
573 mpd_playlist_queue_add(connection
, data
->song
->file
);
575 mpd_playlist_queue_commit(connection
);
579 void add_genre(const gchar
* genre
)
581 MpdData
*data
= NULL
;
583 g_return_if_fail(genre
!= NULL
);
585 mpd_database_search_start(connection
, TRUE
);
586 mpd_database_search_add_constraint(connection
, MPD_TAG_ITEM_GENRE
, genre
);
587 data
= mpd_database_search_commit(connection
);
590 data
= misc_sort_mpddata_by_album_disc_track(data
);
591 for (; data
; data
= mpd_data_get_next(data
))
593 mpd_playlist_queue_add(connection
, data
->song
->file
);
595 mpd_playlist_queue_commit(connection
);
599 void add_directory(const gchar
* path
)
601 gchar
*dirpath
= g_path_get_dirname(path
);
602 MpdData
*data
= mpd_database_get_directory(connection
, dirpath
);
605 data
= misc_sort_mpddata_by_album_disc_track(data
);
606 for (; data
; data
= mpd_data_get_next(data
))
608 if (data
->type
== MPD_DATA_TYPE_SONG
)
610 mpd_playlist_queue_add(connection
, data
->song
->file
);
613 mpd_playlist_queue_commit(connection
);
618 void ServerStatusChangedCallback(MpdObj
* mi
, ChangedStatusType what
, void *userdata
)
620 if (what
& MPD_CST_VOLUME
)
622 int volume
= mpd_status_get_volume(connection
);
624 current_volume
= volume
;
627 if (!server_pref_xml
)
629 if (what
& MPD_CST_CROSSFADE
)
633 if (what
& MPD_CST_OUTPUT
)
635 update_outputs_settings();
637 if (what
& MPD_CST_REPLAYGAIN
)
641 gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(server_pref_xml
, "replay_gain_combo")),
642 mpd_server_get_replaygain_mode(connection
));
647 static void server_pref_destroy(GtkWidget
* container
)
651 GtkWidget
*vbox
= GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "server-vbox"));
652 gtk_container_remove(GTK_CONTAINER(container
), vbox
);
653 g_object_unref(server_pref_xml
);
654 server_pref_xml
= NULL
;
658 void server_pref_replaygain_changed(GtkComboBox
* combo
, gpointer data
)
660 unsigned int cur
= gtk_combo_box_get_active(combo
);
661 if (cur
!= mpd_server_get_replaygain_mode(connection
))
663 if (mpd_server_check_command_allowed(connection
, "replay_gain_mode") == MPD_SERVER_COMMAND_ALLOWED
)
665 mpd_server_set_replaygain_mode(connection
, cur
);
671 static void server_pref_construct(GtkWidget
* container
)
673 gchar
*path
= gmpc_get_full_glade_path("preferences-server.ui");
674 server_pref_xml
= gtk_builder_new();
675 gtk_builder_add_from_file(server_pref_xml
, path
, NULL
);
680 GtkWidget
*vbox
= GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "server-vbox"));
681 GtkWidget
*frame
= GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "replay_gain_frame"));
682 create_outputs_tree();
683 update_outputs_settings();
684 if (!mpd_check_connected(connection
))
686 gtk_widget_set_sensitive(vbox
, FALSE
);
687 gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "hb_warning_mesg")));
690 gtk_widget_set_sensitive(vbox
, TRUE
);
691 gtk_widget_hide(GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "hb_warning_mesg")));
693 switch (mpd_server_check_command_allowed(connection
, "replay_gain_status"))
695 case MPD_SERVER_COMMAND_ALLOWED
:
697 gtk_combo_box_set_active(GTK_COMBO_BOX(gtk_builder_get_object(server_pref_xml
, "replay_gain_combo")),
698 mpd_server_get_replaygain_mode(connection
));
699 switch (mpd_server_check_command_allowed(connection
, "replay_gain_mode"))
701 case MPD_SERVER_COMMAND_ALLOWED
:
704 gtk_widget_set_sensitive(frame
, FALSE
);
709 case MPD_SERVER_COMMAND_NOT_ALLOWED
:
710 gtk_widget_set_sensitive(frame
, FALSE
);
712 case MPD_SERVER_COMMAND_NOT_SUPPORTED
:
714 gtk_widget_hide(frame
);
717 if (mpd_status_get_crossfade(connection
) == 0)
719 gtk_toggle_button_set_active(
720 GTK_TOGGLE_BUTTON(gtk_builder_get_object(server_pref_xml
, "cb_fading")), FALSE
);
721 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "sb_fade_time")), FALSE
);
724 gtk_toggle_button_set_active(
725 GTK_TOGGLE_BUTTON(gtk_builder_get_object(server_pref_xml
, "cb_fading")), TRUE
);
726 gtk_spin_button_set_value(GTK_SPIN_BUTTON(gtk_builder_get_object(server_pref_xml
, "sb_fade_time")),
727 mpd_status_get_crossfade(connection
));
728 gtk_widget_set_sensitive(GTK_WIDGET(gtk_builder_get_object(server_pref_xml
, "sb_fade_time")), TRUE
);
731 gtk_container_add(GTK_CONTAINER(container
), vbox
);
732 // glade_xml_signal_autoconnect(server_pref_xml);
733 gtk_builder_connect_signals(server_pref_xml
, NULL
);
737 /**************************************************
738 * Connection Preferences *
740 static void gmpc_profiles_changed_pref_win(GmpcProfiles
* prof
, GmpcProfilesAction changed
, GmpcProfilesColumn col
, const char *id
,
745 case GMPC_PROFILES_ACTION_ADDED
:
747 GtkComboBox
*combo
= GTK_COMBO_BOX(gtk_builder_get_object(xml
, "cb_profiles"));
749 const char *name
= gmpc_profiles_get_name(prof
, id
);
750 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
751 gtk_list_store_append(GTK_LIST_STORE(store
), &iter
);
752 gtk_list_store_set(GTK_LIST_STORE(store
), &iter
, 0, id
, 1, name
, -1);
755 case GMPC_PROFILES_ACTION_REMOVED
:
758 case GMPC_PROFILES_ACTION_COL_CHANGED
:
761 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(xml
, "cb_profiles");
762 GtkListStore
*store
= (GtkListStore
*) gtk_combo_box_get_model(combo
);
763 /* tell it to update all the information in the view.
764 * might be to much work, so check id*/
766 if (gtk_combo_box_get_active_iter(combo
, &iter
) && id
)
769 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, -1);
770 if (strcmp(uid
, id
) == 0)
772 connection_profiles_changed(combo
, NULL
);
783 static void gmpc_connection_changed_pref_win(GmpcConnection
* object
, MpdObj
* mi
, int connected
, GtkBuilder
* xml
)
785 if (connected
!= mpd_check_connected(mi
))
789 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(xml
, "bt_con"), TRUE
);
790 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(xml
, "bt_dis"), FALSE
);
793 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(xml
, "bt_con"), FALSE
);
794 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(xml
, "bt_dis"), TRUE
);
798 void entry_auth_changed(GtkEntry
* entry
)
800 GtkWidget
*vbox
= (GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "connection-vbox");
801 gulong
*a
= g_object_get_data(G_OBJECT(vbox
), "profile-signal-handler");
802 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles");
804 GtkListStore
*store
= (GtkListStore
*) gtk_combo_box_get_model(combo
);
805 if (gtk_combo_box_get_active_iter(combo
, &iter
))
807 gchar
*value
= NULL
, *uid
= NULL
;
808 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, 1, &value
, -1);
809 g_signal_handler_block(G_OBJECT(gmpc_profiles
), *a
);
810 gmpc_profiles_set_password(gmpc_profiles
, uid
,
812 gtk_entry_get_text(GTK_ENTRY
814 gtk_builder_get_object(connection_pref_xml
, "entry_auth"))));
815 g_signal_handler_unblock(G_OBJECT(gmpc_profiles
), *a
);
821 void auth_enable_toggled(GtkToggleButton
* but
)
823 GtkWidget
*vbox
= (GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "connection-vbox");
824 gulong
*a
= g_object_get_data(G_OBJECT(vbox
), "profile-signal-handler");
825 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles");
827 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
828 if (gtk_combo_box_get_active_iter(combo
, &iter
))
830 char *value
= NULL
, *uid
= NULL
;
831 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, 1, &value
, -1);
832 g_signal_handler_block(G_OBJECT(gmpc_profiles
), *a
);
834 gmpc_profiles_set_do_auth(gmpc_profiles
, uid
, gtk_toggle_button_get_active(but
));
835 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "entry_auth"),
836 gmpc_profiles_get_do_auth(gmpc_profiles
, uid
));
838 g_signal_handler_unblock(G_OBJECT(gmpc_profiles
), *a
);
844 void update_preferences_name(GtkWidget
* entry
)
846 GtkWidget
*vbox
= (GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "connection-vbox");
847 gulong
*a
= g_object_get_data(G_OBJECT(vbox
), "profile-signal-handler");
848 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles");
850 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
851 if (gtk_combo_box_get_active_iter(combo
, &iter
))
853 char *value
= NULL
, *uid
= NULL
;
854 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, 1, &value
, -1);
855 g_signal_handler_block(G_OBJECT(gmpc_profiles
), *a
);
857 gmpc_profiles_set_name(gmpc_profiles
, uid
,
859 gtk_entry_get_text(GTK_ENTRY
861 gtk_builder_get_object(connection_pref_xml
, "name_entry"))));
862 g_signal_handler_unblock(G_OBJECT(gmpc_profiles
), *a
);
868 gtk_entry_get_text(GTK_ENTRY((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "name_entry")));
869 gtk_list_store_set(GTK_LIST_STORE(store
), &iter
, 1, value
, -1);
873 G_MODULE_EXPORT
void select_directory_dialog(GtkWidget
*button
)
876 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles");
878 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
880 if (gtk_combo_box_get_active_iter(combo
, &iter
))
882 GtkWidget
*d
= gtk_file_chooser_dialog_new(_("Select the music directory"),
883 GTK_WINDOW(gtk_widget_get_toplevel(button
)),
884 GTK_FILE_CHOOSER_ACTION_SELECT_FOLDER
,
890 GTK_RESPONSE_OK
,NULL
);
891 const char *value
= NULL
; char *uid
= NULL
;
892 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, -1);
893 value
= gmpc_profiles_get_music_directory(gmpc_profiles
, uid
);
894 gtk_file_chooser_set_filename(GTK_FILE_CHOOSER(d
), value
);
895 switch(gtk_dialog_run(GTK_DIALOG(d
)))
897 case GTK_RESPONSE_REJECT
:
898 gmpc_profiles_set_music_directory(gmpc_profiles
, uid
,(char *)"");
900 case GTK_RESPONSE_OK
:
901 gmpc_profiles_set_music_directory(gmpc_profiles
, uid
,
902 gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(d
)));
907 gtk_widget_destroy(d
);
912 void update_preferences_hostname(GtkWidget
* entry
)
914 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles");
915 GtkWidget
*vbox
= (GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "connection-vbox");
916 gulong
*a
= g_object_get_data(G_OBJECT(vbox
), "profile-signal-handler");
918 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
920 if (gtk_combo_box_get_active_iter(combo
, &iter
))
922 char *value
= NULL
, *uid
= NULL
;
923 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, 1, &value
, -1);
924 g_signal_handler_block(G_OBJECT(gmpc_profiles
), *a
);
926 gmpc_profiles_set_hostname(gmpc_profiles
, uid
,
928 gtk_entry_get_text(GTK_ENTRY
930 gtk_builder_get_object(connection_pref_xml
, "hostname_entry"))));
931 g_signal_handler_unblock(G_OBJECT(gmpc_profiles
), *a
);
938 void update_preferences_portnumber(GtkWidget
* wid
)
940 GtkWidget
*vbox
= (GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "connection-vbox");
941 gulong
*a
= g_object_get_data(G_OBJECT(vbox
), "profile-signal-handler");
942 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles");
944 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
945 if (gtk_combo_box_get_active_iter(combo
, &iter
))
947 char *value
= NULL
, *uid
= NULL
;
948 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, 1, &value
, -1);
949 g_signal_handler_block(G_OBJECT(gmpc_profiles
), *a
);
950 gmpc_profiles_set_port(gmpc_profiles
, uid
,
951 gtk_spin_button_get_value_as_int(GTK_SPIN_BUTTON
953 gtk_builder_get_object(connection_pref_xml
,
955 g_signal_handler_unblock(G_OBJECT(gmpc_profiles
), *a
);
961 void update_preferences_information(GtkWidget
* wid
)
963 cfg_set_single_value_as_float(config
, "connection", "timeout",
965 gtk_spin_button_get_value(GTK_SPIN_BUTTON
967 gtk_builder_get_object(connection_pref_xml
,
970 /* update timeout live */
971 if (mpd_check_connected(connection
))
973 mpd_set_connection_timeout(connection
,
975 gtk_spin_button_get_value(GTK_SPIN_BUTTON
977 gtk_builder_get_object(connection_pref_xml
,
982 void preferences_window_autoconnect(GtkToggleButton
* tog
)
984 cfg_set_single_value_as_int(config
, "connection", "autoconnect", gtk_toggle_button_get_active(tog
));
987 void preferences_window_connect(GtkWidget
* but
)
989 if (connection_pref_xml
)
991 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles");
993 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
994 if (gtk_combo_box_get_active_iter(combo
, &iter
))
997 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, -1);
1000 connection_set_current_profile(uid
);
1001 if (!mpd_check_connected(connection
))
1010 if (!mpd_check_connected(connection
))
1016 void disconnect_from_mpd(void)
1018 /* set that user doesn't want to connect */
1019 gmpc_connected
= FALSE
;
1020 mpd_disconnect(connection
);
1022 void preferences_window_disconnect(GtkWidget
* but
)
1024 disconnect_from_mpd();
1027 static void connection_pref_destroy(GtkWidget
* container
)
1029 GtkWidget
*widget
= gtk_bin_get_child(GTK_BIN(container
));
1032 if (connection_pref_xml
)
1034 gtk_container_remove(GTK_CONTAINER(container
), widget
);
1035 g_object_unref(connection_pref_xml
);
1036 connection_pref_xml
= NULL
;
1041 void connection_profiles_changed(GtkComboBox
* combo
, gpointer data
)
1043 GtkBuilder
*xml
= connection_pref_xml
;
1045 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
1046 if (gtk_combo_box_get_active_iter(combo
, &iter
))
1048 char *value
= NULL
, *uid
= NULL
, *string
;
1050 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, 1, &value
, -1);
1055 gtk_entry_set_text(GTK_ENTRY((GtkWidget
*) gtk_builder_get_object(xml
, "name_entry")), value
);
1059 string
= g_strdup(gmpc_profiles_get_hostname(gmpc_profiles
, uid
));
1060 gtk_entry_set_text(GTK_ENTRY((GtkWidget
*) gtk_builder_get_object(xml
, "hostname_entry")), string
);
1065 gtk_spin_button_set_value(GTK_SPIN_BUTTON((GtkWidget
*) gtk_builder_get_object(xml
, "port_spin")),
1066 gmpc_profiles_get_port(gmpc_profiles
, uid
));
1069 * Set password check, and entry
1071 string
= gmpc_profiles_get_password(gmpc_profiles
, uid
);
1072 gtk_toggle_button_set_active((GtkToggleButton
*)
1073 gtk_builder_get_object(xml
, "ck_auth"),
1074 gmpc_profiles_get_do_auth(gmpc_profiles
, uid
));
1075 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(xml
, "entry_auth"),
1076 gmpc_profiles_get_do_auth(gmpc_profiles
, uid
));
1078 gtk_entry_set_text(GTK_ENTRY((GtkWidget
*) gtk_builder_get_object(xml
, "entry_auth")),
1083 * Set music directory
1085 md
= gmpc_profiles_get_music_directory(gmpc_profiles
, uid
);
1086 gtk_label_set_text(GTK_LABEL(gtk_builder_get_object(xml
,"music_directory_label")), (md
&& md
[0] != 0)?md
:_("(None)"));
1088 * Only enable the rmeove button when there is more then 1 profile
1090 if (gtk_tree_model_iter_n_children(GTK_TREE_MODEL(store
), NULL
) > 1)
1092 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(xml
, "remove_butt"), TRUE
);
1095 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(xml
, "remove_butt"), FALSE
);
1103 void connection_add_profile(GtkWidget
* but
)
1105 gchar
*value
= NULL
;
1106 GtkBuilder
*xml
= connection_pref_xml
;
1107 GtkWidget
*vbox
= (GtkWidget
*) gtk_builder_get_object(xml
, "connection-vbox");
1108 gulong
*a
= g_object_get_data(G_OBJECT(vbox
), "profile-signal-handler");
1109 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(xml
, "cb_profiles");
1111 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
1113 g_signal_handler_block(G_OBJECT(gmpc_profiles
), *a
);
1114 value
= gmpc_profiles_create_new_item(gmpc_profiles
, NULL
); /*g_strdup_printf("%u", g_random_int()); */
1115 gtk_list_store_append(GTK_LIST_STORE(store
), &iter
);
1116 gtk_list_store_set(GTK_LIST_STORE(store
), &iter
, 0, value
, 1, "Name", -1);
1117 gtk_combo_box_set_active_iter(GTK_COMBO_BOX((GtkWidget
*) gtk_builder_get_object(xml
, "cb_profiles")), &iter
);
1118 g_signal_handler_unblock(G_OBJECT(gmpc_profiles
), *a
);
1121 void connection_remove_profile(GtkWidget
* but
)
1123 GtkBuilder
*xml
= connection_pref_xml
;
1124 GtkComboBox
*combo
= (GtkComboBox
*) gtk_builder_get_object(xml
, "cb_profiles");
1126 GtkTreeModel
*store
= gtk_combo_box_get_model(combo
);
1127 if (gtk_combo_box_get_active_iter(combo
, &iter
))
1129 char *value
= NULL
, *uid
= NULL
;
1130 gtk_tree_model_get(GTK_TREE_MODEL(store
), &iter
, 0, &uid
, 1, &value
, -1);
1131 gmpc_profiles_remove_item(gmpc_profiles
, uid
);
1132 gtk_list_store_remove(GTK_LIST_STORE(store
), &iter
);
1135 gtk_combo_box_set_active(GTK_COMBO_BOX((GtkWidget
*) gtk_builder_get_object(xml
, "cb_profiles")), 0);
1139 static void destroy_profile_signal_handler(gpointer box
)
1142 g_signal_handler_disconnect(G_OBJECT(gmpc_profiles
), *a
);
1146 static void destroy_connection_signal_handler(gpointer box
)
1149 g_signal_handler_disconnect(G_OBJECT(gmpcconn
), *a
);
1153 static void connection_pref_construct(GtkWidget
* container
)
1156 gchar
*def_profile
= NULL
;
1158 GtkWidget
*vbox
= NULL
;
1159 GtkCellRenderer
*renderer
= NULL
;
1160 GtkListStore
*store
= NULL
;
1161 gchar
*path
= gmpc_get_full_glade_path("preferences-connection.ui");
1162 connection_pref_xml
= gtk_builder_new(); //glade_xml_new(path, "connection-vbox",NULL);
1163 gtk_builder_add_from_file(connection_pref_xml
, path
, NULL
);
1166 vbox
= (GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "connection-vbox");
1171 def_profile
= gmpc_profiles_get_current(gmpc_profiles
);
1172 store
= gtk_list_store_new(2, G_TYPE_STRING
, G_TYPE_STRING
);
1173 gtk_combo_box_set_model(GTK_COMBO_BOX((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles")),
1174 GTK_TREE_MODEL(store
));
1175 renderer
= gtk_cell_renderer_text_new();
1176 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT
1177 ((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles")), renderer
,
1179 gtk_cell_layout_set_attributes(GTK_CELL_LAYOUT
1180 ((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles")), renderer
,
1183 mult
= gmpc_profiles_get_profiles_ids(gmpc_profiles
);
1191 const gchar
*value
= gmpc_profiles_get_name(gmpc_profiles
, (char *)iter
->data
);
1192 gtk_list_store_append(store
, &piter
);
1193 gtk_list_store_set(store
, &piter
, 0, iter
->data
, 1, value
, -1);
1194 if (!strcmp((char *)(iter
->data
), def_profile
))
1196 gtk_combo_box_set_active(GTK_COMBO_BOX
1197 ((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles")), i
);
1200 } while ((iter
= g_list_next(iter
)));
1204 /* GtkTreeIter piter;
1205 gchar *value = cfg_get_single_value_as_string_with_default(profiles, "Default", "name", "Default");
1206 gtk_list_store_append(store, &piter);
1207 gtk_list_store_set(store, &piter, 0,"Default", 1,value,-1);
1209 gtk_combo_box_set_active(GTK_COMBO_BOX((GtkWidget *) gtk_builder_get_object(connection_pref_xml, "cb_profiles")),0);
1212 q_free(def_profile
);
1214 connection_profiles_changed(GTK_COMBO_BOX((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "cb_profiles")),
1217 gtk_spin_button_set_value(GTK_SPIN_BUTTON
1218 ((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "timeout_spin")),
1219 (gdouble
) cfg_get_single_value_as_float_with_default(config
, "connection", "timeout",
1221 gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON
1222 ((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "ck_autocon")),
1223 cfg_get_single_value_as_int_with_default(config
, "connection", "autoconnect", DEFAULT_AUTOCONNECT
));
1225 /* set the right sensitive stuff */
1226 if (!mpd_check_connected(connection
))
1228 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "bt_con"), TRUE
);
1229 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "bt_dis"), FALSE
);
1232 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "bt_con"), FALSE
);
1233 gtk_widget_set_sensitive((GtkWidget
*) gtk_builder_get_object(connection_pref_xml
, "bt_dis"), TRUE
);
1235 gtk_container_add(GTK_CONTAINER(container
), vbox
);
1236 //glade_xml_signal_autoconnect(connection_pref_xml);
1237 gtk_builder_connect_signals(connection_pref_xml
, NULL
);
1239 a
= g_malloc0(sizeof(*a
));
1240 *a
= g_signal_connect(G_OBJECT(gmpc_profiles
), "changed",
1241 G_CALLBACK(gmpc_profiles_changed_pref_win
), connection_pref_xml
);
1242 g_object_set_data_full(G_OBJECT(vbox
), "profile-signal-handler", a
, destroy_profile_signal_handler
);
1244 a
= g_malloc0(sizeof(*a
));
1245 *a
= g_signal_connect(G_OBJECT(gmpcconn
), "connection-changed",
1246 G_CALLBACK(gmpc_connection_changed_pref_win
), connection_pref_xml
);
1247 g_object_set_data_full(G_OBJECT(vbox
), "conn-signal-handler", a
, destroy_connection_signal_handler
);
1251 void connection_set_current_profile(const char *uid
)
1253 gmpc_profiles_set_current(gmpc_profiles
, uid
);
1256 void connection_set_password(char *password
)
1258 gchar
*profile
= gmpc_profiles_get_current(gmpc_profiles
);
1260 * if NULL, or length 0, then disable, else set
1262 if (password
&& password
[0] != '\0')
1264 gmpc_profiles_set_password(gmpc_profiles
, profile
, password
);
1265 gmpc_profiles_set_do_auth(gmpc_profiles
, profile
, TRUE
);
1269 gmpc_profiles_set_password(gmpc_profiles
, profile
, NULL
);
1270 gmpc_profiles_set_do_auth(gmpc_profiles
, profile
, FALSE
);
1275 int connection_use_auth(void)
1278 gchar
*profile
= gmpc_profiles_get_current(gmpc_profiles
);
1279 retv
= gmpc_profiles_get_do_auth(gmpc_profiles
, profile
);
1284 char *connection_get_hostname(void)
1286 gchar
*profile
= gmpc_profiles_get_current(gmpc_profiles
);
1287 gchar
*retv
= gmpc_profiles_get_hostname(gmpc_profiles
, profile
);
1293 int connection_get_port(void)
1296 gchar
*profile
= gmpc_profiles_get_current(gmpc_profiles
);
1297 retv
= gmpc_profiles_get_port(gmpc_profiles
, profile
);
1302 char *connection_get_password(void)
1304 gchar
*profile
= gmpc_profiles_get_current(gmpc_profiles
);
1305 gchar
*retv
= gmpc_profiles_get_password(gmpc_profiles
, profile
);
1310 const char *connection_get_music_directory(void)
1312 gchar
*profile
= gmpc_profiles_get_current(gmpc_profiles
);
1313 const gchar
*retv
= gmpc_profiles_get_music_directory(gmpc_profiles
, profile
);
1319 * Helper menu functions *
1321 void submenu_artist_clicked(GtkWidget
* item
)
1323 gchar
*artist
= g_object_get_data(G_OBJECT(item
), "artist");
1327 void submenu_album_clicked(GtkWidget
* item
)
1329 gchar
*artist
= g_object_get_data(G_OBJECT(item
), "artist");
1330 gchar
*album
= g_object_get_data(G_OBJECT(item
), "album");
1331 add_album(artist
, album
);
1334 void submenu_genre_clicked(GtkWidget
* item
)
1336 gchar
*genre
= g_object_get_data(G_OBJECT(item
), "genre");
1340 void submenu_dir_clicked(GtkWidget
* item
)
1342 gchar
*dir
= g_object_get_data(G_OBJECT(item
), "path");
1346 void submenu_for_song(GtkWidget
* menu
, mpd_Song
* song
)
1351 smenu
= gtk_menu_new();
1354 gchar
*schema
= g_uri_parse_scheme(song
->file
);
1355 /* If it has a schame, it isn't an mpd url */
1358 g_object_ref_sink(smenu
);
1359 g_object_unref(smenu
);
1364 if (song
->artist
&& song
->album
)
1366 /* Add all from album */
1367 sitem
= gtk_image_menu_item_new_with_label(_("All from album"));
1368 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(sitem
),
1369 gtk_image_new_from_icon_name("media-album", GTK_ICON_SIZE_MENU
));
1370 g_object_set_data_full(G_OBJECT(sitem
), "artist", g_strdup(song
->artist
), g_free
);
1371 g_object_set_data_full(G_OBJECT(sitem
), "album", g_strdup(song
->album
), g_free
);
1372 g_signal_connect(G_OBJECT(sitem
), "activate", G_CALLBACK(submenu_album_clicked
), NULL
);
1373 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1374 gtk_widget_show(sitem
);
1379 /* Add all from artist */
1380 sitem
= gtk_image_menu_item_new_with_label(_("All from artist"));
1381 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(sitem
),
1382 gtk_image_new_from_icon_name("media-artist", GTK_ICON_SIZE_MENU
));
1383 g_object_set_data_full(G_OBJECT(sitem
), "artist", g_strdup(song
->artist
), g_free
);
1384 g_signal_connect(G_OBJECT(sitem
), "activate", G_CALLBACK(submenu_artist_clicked
), NULL
);
1385 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1386 gtk_widget_show(sitem
);
1390 /* Add all from genre */
1391 sitem
= gtk_menu_item_new_with_label(_("All from genre"));
1392 g_object_set_data_full(G_OBJECT(sitem
), "genre", g_strdup(song
->genre
), g_free
);
1393 g_signal_connect(G_OBJECT(sitem
), "activate", G_CALLBACK(submenu_genre_clicked
), NULL
);
1394 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1395 gtk_widget_show(sitem
);
1398 /* Add all from file */
1399 sitem
= gtk_image_menu_item_new_with_label(_("All from same directory"));
1400 gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(sitem
),
1401 gtk_image_new_from_icon_name("gtk-directory", GTK_ICON_SIZE_MENU
));
1402 g_object_set_data_full(G_OBJECT(sitem
), "path", g_strdup(song
->file
), g_free
);
1403 g_signal_connect(G_OBJECT(sitem
), "activate", G_CALLBACK(submenu_dir_clicked
), NULL
);
1404 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1405 gtk_widget_show(sitem
);
1406 /* Create sub menu */
1408 item
= gtk_menu_item_new_with_label(_("Add more"));
1409 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item
), smenu
);
1410 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), item
);
1411 gtk_widget_show(item
);
1414 if (mpd_sticker_supported(connection
) && song
->file
)
1416 smenu
= gtk_menu_new();
1418 item
= gtk_menu_item_new_with_label(_("Set Rating"));
1419 gtk_menu_item_set_submenu(GTK_MENU_ITEM(item
), smenu
);
1420 gtk_menu_shell_append(GTK_MENU_SHELL(menu
), item
);
1421 gtk_widget_show(item
);
1423 sitem
= (GtkWidget
*) gmpc_menu_item_rating_new(connection
, song
,0);
1424 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1425 sitem
= (GtkWidget
*) gmpc_menu_item_rating_new(connection
, song
,2);
1426 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1427 sitem
= (GtkWidget
*) gmpc_menu_item_rating_new(connection
, song
,4);
1428 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1429 sitem
= (GtkWidget
*) gmpc_menu_item_rating_new(connection
, song
,6);
1430 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1431 sitem
= (GtkWidget
*) gmpc_menu_item_rating_new(connection
, song
,8);
1432 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1433 sitem
= (GtkWidget
*) gmpc_menu_item_rating_new(connection
, song
,10);
1434 gtk_menu_shell_append(GTK_MENU_SHELL(smenu
), sitem
);
1437 gtk_widget_show(smenu
);
1441 /* vim: set noexpandtab ts=4 sw=4 sts=4 tw=120: */