Index: src/extended-interface.c =================================================================== --- src/extended-interface.c (revision 6585) +++ src/extended-interface.c (working copy) @@ -28,6 +28,7 @@ #include "playlist.h" #include "dbbrowser.h" #include "xfce-arrow-button.h" +#include "preferences.h" #define BORDER 4 @@ -66,8 +67,8 @@ gboolean *push_in, GtkWidget *widget); +static void xfmpc_window_preferences (XfmpcExtendedInterface *extended_interface); - struct _XfmpcExtendedInterfaceClass { GtkVBoxClass parent_class; @@ -296,6 +297,13 @@ G_CALLBACK (cb_random_switch), extended_interface); gtk_menu_shell_append (GTK_MENU_SHELL (menu), priv->random); + GtkWidget *settings = gtk_image_menu_item_new_with_label (_("Server Settings")); + GtkWidget *image = gtk_image_new_from_stock (GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU); + gtk_image_menu_item_set_image (GTK_IMAGE_MENU_ITEM (settings), image); + g_signal_connect_swapped (settings, "activate", + G_CALLBACK (xfmpc_window_preferences), extended_interface); + gtk_menu_shell_append (GTK_MENU_SHELL (menu), settings); + gtk_widget_show_all (menu); } @@ -398,3 +406,115 @@ *push_in = FALSE; } +static void +xfmpc_window_preferences (XfmpcExtendedInterface *extended_interface) +{ + GtkWidget *dialog; + GtkWidget *main_vbox; + GtkWidget *mpd_label; + + GtkWidget *host_box; + GtkWidget *host_label; + GtkWidget *host_entry; + + GtkWidget *port_box; + GtkWidget *port_label; + GtkWidget *port_entry; + + GtkWidget *passwd_box; + GtkWidget *passwd_label; + GtkWidget *passwd_entry; + + const gchar *host_text; + const gchar *port_text; + const gchar *passwd_text; + + dialog = xfce_titled_dialog_new_with_buttons (_("Server Settings"), + GTK_WINDOW (gtk_widget_get_ancestor (GTK_WIDGET (extended_interface), GTK_TYPE_WINDOW)), + GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_NO_SEPARATOR, + GTK_STOCK_CANCEL, + GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, + GTK_RESPONSE_OK, + NULL); + + gtk_window_set_icon_name (GTK_WINDOW (dialog), "xfmpc"); + gtk_window_set_icon_name (GTK_WINDOW (dialog), "stock_volume"); + gtk_window_set_resizable (GTK_WINDOW (dialog), TRUE); + + main_vbox = gtk_vbox_new (FALSE, 6); + gtk_container_set_border_width (GTK_CONTAINER (main_vbox), 12); + gtk_widget_show (main_vbox); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), main_vbox, TRUE, TRUE, 0); + + XfmpcPreferences *preferences = xfmpc_preferences_get (); + g_object_get (G_OBJECT (preferences), + "host", &host_text, + "port", &port_text, + "passwd", &passwd_text, + NULL); + + host_box = gtk_hbox_new (FALSE, 0); + gtk_widget_show (host_box); + gtk_box_pack_start (GTK_BOX (main_vbox), host_box, TRUE, TRUE, 0); + + host_label = gtk_label_new (_("Host : ")); + gtk_widget_show (host_label); + gtk_box_pack_start (GTK_BOX (host_box), host_label, TRUE, TRUE, 0); + + host_entry = gtk_entry_new_with_max_length (50); + gtk_entry_set_text (GTK_ENTRY (host_entry), host_text); + gtk_widget_show (host_entry); + gtk_box_pack_start (GTK_BOX (host_box), host_entry, TRUE, TRUE, 0); + + port_box = gtk_hbox_new (FALSE, 0); + gtk_widget_show (port_box); + gtk_box_pack_start (GTK_BOX (main_vbox), port_box, TRUE, TRUE, 0); + + port_label = gtk_label_new (_("Port : ")); + gtk_widget_show (port_label); + gtk_box_pack_start (GTK_BOX (port_box), port_label, TRUE, TRUE, 0); + + port_entry = gtk_entry_new_with_max_length (50); + gtk_entry_set_text (GTK_ENTRY (port_entry), port_text); + gtk_widget_show (port_entry); + gtk_box_pack_start (GTK_BOX (port_box), port_entry, TRUE, TRUE, 0); + + passwd_box = gtk_hbox_new (FALSE, 0); + gtk_widget_show (passwd_box); + gtk_box_pack_start (GTK_BOX (main_vbox), passwd_box, TRUE, TRUE, 0); + + passwd_label = gtk_label_new (_("Password : ")); + gtk_widget_show (passwd_label); + gtk_box_pack_start (GTK_BOX (passwd_box), passwd_label, TRUE, TRUE, 0); + + passwd_entry = gtk_entry_new_with_max_length (50); + gtk_entry_set_text (GTK_ENTRY (passwd_entry), passwd_text); + gtk_entry_set_visibility (GTK_ENTRY (passwd_entry), FALSE); + gtk_widget_show (passwd_entry); + gtk_box_pack_start (GTK_BOX (passwd_box), passwd_entry, TRUE, TRUE, 0); + + gint result = gtk_dialog_run (GTK_DIALOG(dialog)); + + switch (result) + { + case GTK_RESPONSE_OK: + host_text = gtk_entry_get_text (GTK_ENTRY (host_entry)); + port_text = gtk_entry_get_text (GTK_ENTRY (port_entry)); + passwd_text = gtk_entry_get_text (GTK_ENTRY (passwd_entry)); + + XfmpcPreferences *preferences = xfmpc_preferences_get (); + g_object_set (G_OBJECT (preferences), + "host", host_text, + "port", port_text, + "passwd", passwd_text, + NULL); + g_object_unref (preferences); + + default: + break; + } + + + gtk_widget_destroy (dialog); +} Index: src/preferences.c =================================================================== --- src/preferences.c (revision 6585) +++ src/preferences.c (working copy) @@ -38,6 +38,9 @@ PROP_LAST_WINDOW_STATE_STICKY, PROP_PLAYLIST_AUTOCENTER, PROP_DBBROWSER_LAST_PATH, + PROP_HOST, + PROP_PORT, + PROP_PASSWORD, N_PROPERTIES, }; @@ -174,6 +177,30 @@ "Restores the last path from the database browser", "", G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_HOST, + g_param_spec_string ("host", + "Host", + "Address of the host", + "localhost", + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_PORT, + g_param_spec_string ("port", + "Port", + "Port of the host", + "6600", + G_PARAM_READWRITE)); + + g_object_class_install_property (gobject_class, + PROP_PASSWORD, + g_param_spec_string ("passwd", + "Password", + "Password", + "", + G_PARAM_READWRITE)); } static void @@ -357,3 +384,4 @@ return xfce_rc_config_open (XFCE_RESOURCE_CONFIG, "xfce4/xfmpcrc", FALSE); } + Index: src/mpdclient.c =================================================================== --- src/mpdclient.c (revision 6585) +++ src/mpdclient.c (working copy) @@ -24,6 +24,7 @@ #include #include "mpdclient.h" +#include "preferences.h" #define MPD_HOST "localhost" #define MPD_PORT 6600 @@ -270,26 +271,48 @@ { XfmpcMpdclientPrivate *priv = XFMPC_MPDCLIENT_GET_PRIVATE (mpdclient); - /* Hostname */ - priv->host = (g_getenv ("MPD_HOST") != NULL) ? - g_strdup (g_getenv ("MPD_HOST")) : - g_strdup (MPD_HOST); + /* Read connexion preferences */ + gchar *port; + gchar *host; + gchar *passwd; - /* Port */ - priv->port = (g_getenv ("MPD_PORT") != NULL) ? - (gint) g_ascii_strtoll (g_getenv ("MPD_PORT"), NULL, 0) : - MPD_PORT; + priv->passwd = NULL; - /* Check for password */ - priv->passwd = NULL; - gchar **split = g_strsplit (priv->host, "@", 2); - if (g_strv_length (split) == 2) + XfmpcPreferences *preferences = xfmpc_preferences_get (); + g_object_get (G_OBJECT (preferences), + "host", &host, + "port", &port, + "passwd", &passwd, + NULL); + + if (strcmp (host, "") != 0) { - g_free (priv->host); - priv->host = g_strdup (split[0]); - priv->passwd = g_strdup (split[1]); + priv->host = host; + priv->passwd = passwd; } - g_strfreev (split); + else if (g_getenv ("MPD_HOST") != NULL) + { + priv->host = g_strdup (g_getenv ("MPD_HOST")); + /* Check for password */ + gchar **split = g_strsplit (priv->host, "@", 2); + if (g_strv_length (split) == 2) + { + g_free (priv->host); + priv->host = g_strdup (split[1]); + priv->passwd = g_strdup (split[0]); + } + g_strfreev (split); + } + else + priv->host = MPD_HOST; + + if (strcmp (port, "") != 0) + priv->port = (gint) g_ascii_strtoll (port, NULL, 0); + else if (g_getenv ("MPD_PORT") != NULL) + priv->port = (gint) g_ascii_strtoll (g_getenv ("MPD_PORT"), NULL, 0); + else + priv->port = MPD_PORT; + } gboolean