View | Details | Raw Unified | Return to bug 19768
Collapse All | Expand All

(-)logjam-4.5.3/configure.in.dbus (+7 lines)
Lines 220-225 AC_SUBST(LIVEJOURNAL_CFLAGS) Link Here
220
AC_SUBST(LIVEJOURNAL_LIBS)
220
AC_SUBST(LIVEJOURNAL_LIBS)
221
dnl end liblivejournal dependencies.
221
dnl end liblivejournal dependencies.
222
222
223
dnl D-Bus API
224
MODULES="dbus-1 dbus-glib-1"
225
PKG_CHECK_MODULES(DBUSAPI, $MODULES)
226
AC_SUBST(DBUSAPI_CFLAGS)
227
AC_SUBST(DBUSAPI_LIBS)
228
dnl D-Bus API
229
223
AM_CONDITIONAL(WITH_XMMS, test "$with_xmms" = "yes")
230
AM_CONDITIONAL(WITH_XMMS, test "$with_xmms" = "yes")
224
AM_CONDITIONAL(WITH_HTML, test "$with_gtkhtml" != "no")
231
AM_CONDITIONAL(WITH_HTML, test "$with_gtkhtml" != "no")
225
AM_CONDITIONAL(WITH_RSVG, test "$with_librsvg" = "yes")
232
AM_CONDITIONAL(WITH_RSVG, test "$with_librsvg" = "yes")
(-)logjam-4.5.3/src/conf.h.dbus (+1 lines)
Lines 92-97 typedef struct { Link Here
92
	char *spawn_command;
92
	char *spawn_command;
93
93
94
	char *music_command;
94
	char *music_command;
95
	gboolean music_mpris;
95
96
96
	char *proxy;
97
	char *proxy;
97
	char *proxyuser, *proxypass;
98
	char *proxyuser, *proxypass;
(-)logjam-4.5.3/src/conf_xml.c.dbus (+3 lines)
Lines 257-262 parseconf(xmlDocPtr doc, xmlNodePtr node Link Here
257
		XML_GET_CONF("proxyauth", parseproxyauth)
257
		XML_GET_CONF("proxyauth", parseproxyauth)
258
		XML_GET_STR("spawncommand", c->spawn_command)
258
		XML_GET_STR("spawncommand", c->spawn_command)
259
		XML_GET_STR("musiccommand", c->music_command)
259
		XML_GET_STR("musiccommand", c->music_command)
260
		XML_GET_BOOL("musicmpris", c->music_mpris)
260
#endif /* G_OS_WIN32 */
261
#endif /* G_OS_WIN32 */
261
		XML_GET_INT("cfuserinterval", c->cfuserinterval)
262
		XML_GET_INT("cfuserinterval", c->cfuserinterval)
262
		XML_GET_INT("cfthreshold", c->cfthreshold)
263
		XML_GET_INT("cfthreshold", c->cfthreshold)
Lines 396-401 conf_write(Configuration *c, char *base) Link Here
396
397
397
	if (c->music_command)
398
	if (c->music_command)
398
		xmlAddTN(root, "musiccommand", c->music_command);
399
		xmlAddTN(root, "musiccommand", c->music_command);
400
	if (c->music_mpris)
401
		xmlNewChild(root, NULL, BAD_CAST "musicmpris", NULL);
399
#endif
402
#endif
400
403
401
	if (c->cfuserinterval) {
404
	if (c->cfuserinterval) {
(-)logjam-4.5.3/src/init.c.dbus (+16 lines)
Lines 29-34 Link Here
29
#include "conf_xml.h"
29
#include "conf_xml.h"
30
#include "jamdoc.h"
30
#include "jamdoc.h"
31
#include "cmdline.h"
31
#include "cmdline.h"
32
#include "lj_dbus.h"
32
33
33
#ifdef HAVE_GTK
34
#ifdef HAVE_GTK
34
#include "login.h"
35
#include "login.h"
Lines 120-125 init_app(int *argc, gchar *argv[]) { Link Here
120
}
121
}
121
122
122
#ifdef HAVE_GTK
123
#ifdef HAVE_GTK
124
125
extern JamDBus *jdbus;
126
123
static void
127
static void
124
run_gtk(JamDoc *doc) {
128
run_gtk(JamDoc *doc) {
125
	gchar *accelpath;
129
	gchar *accelpath;
Lines 148-155 run_gtk(JamDoc *doc) { Link Here
148
		jam_doc_set_account(doc, acc);
152
		jam_doc_set_account(doc, acc);
149
	}
153
	}
150
154
155
	jdbus = lj_dbus_new();
156
	if (conf.music_mpris) {
157
		GError *error = NULL;
158
		if (!lj_dbus_mpris_update_list(jdbus, &error)) {
159
			g_printerr("Error: %s\n", error->message);
160
			g_error_free(error);
161
		}
162
	}
163
151
	jam_run(doc);
164
	jam_run(doc);
152
165
166
	lj_dbus_close(jdbus);
167
	jdbus = NULL;
168
153
	g_object_unref(G_OBJECT(app.remote));
169
	g_object_unref(G_OBJECT(app.remote));
154
170
155
	gtk_accel_map_save(accelpath);
171
	gtk_accel_map_save(accelpath);
(-)logjam-4.5.3/src/jamview.c.dbus (-2 / +8 lines)
Lines 20-25 Link Here
20
#include "marshalers.h"
20
#include "marshalers.h"
21
#include "datesel.h"
21
#include "datesel.h"
22
#include "tags.h"
22
#include "tags.h"
23
#include "lj_dbus.h"
23
24
24
#define KEY_PICTUREKEYWORD "logjam-picturekeyword"
25
#define KEY_PICTUREKEYWORD "logjam-picturekeyword"
25
26
Lines 356-362 picture_store(JamView *view) { Link Here
356
static void
357
static void
357
music_refresh_cb(JamView *view) {
358
music_refresh_cb(JamView *view) {
358
	GError *err = NULL;
359
	GError *err = NULL;
359
	gchar *music = music_detect(&err);
360
	gchar *music;
361
362
	if (conf.music_mpris)
363
		music = lj_dbus_mpris_current_music(jdbus, &err);
364
	else
365
		music = music_detect(&err);
360
366
361
	if (music) {
367
	if (music) {
362
		gtk_entry_set_text(GTK_ENTRY(view->music), music);
368
		gtk_entry_set_text(GTK_ENTRY(view->music), music);
Lines 373-379 static void Link Here
373
music_add(JamView *view) {
379
music_add(JamView *view) {
374
	view->music = gtk_entry_new();
380
	view->music = gtk_entry_new();
375
	view->musicbar = labelled_box_new_sg(_("_Music:"), view->music, view->sizegroup);
381
	view->musicbar = labelled_box_new_sg(_("_Music:"), view->music, view->sizegroup);
376
	if (music_can_detect(NULL)) {
382
	if (conf.music_mpris || music_can_detect(NULL)) {
377
		GtkWidget *refresh = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
383
		GtkWidget *refresh = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
378
		g_signal_connect_swapped(G_OBJECT(refresh), "clicked",
384
		g_signal_connect_swapped(G_OBJECT(refresh), "clicked",
379
				G_CALLBACK(music_refresh_cb), view);
385
				G_CALLBACK(music_refresh_cb), view);
(-)logjam-4.5.3/src/lj_dbus.c.dbus (+244 lines)
Line 0 Link Here
1
/* logjam - a GTK client for LiveJournal.
2
 * Copyright (C) 2009 Andy Shevchenko <andy@smile.org.ua>
3
 *
4
 * vim: tabstop=4 shiftwidth=4 noexpandtab :
5
 *
6
 * See http://wiki.xmms2.xmms.se/wiki/MPRIS for MRPIS specification
7
 */
8
9
#include <string.h>		/* memset */
10
11
#include "lj_dbus.h"
12
13
#define MPRIS_IF	"org.freedesktop.MediaPlayer"
14
15
/* Internal prototypes */
16
static gboolean lj_dbus_open(JamDBus *jd);
17
static gboolean lj_dbus_append_player(JamDBus *jd, gchar *dest);
18
static void lj_dbus_players_clear(JamDBus *jd);
19
static gboolean lj_dbus_players_find(JamDBus *jd, GError **error);
20
21
/* Implementation */
22
static gboolean
23
lj_dbus_open(JamDBus *jd) {
24
	GError *error = NULL;
25
26
	jd->bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
27
	if (jd->bus == NULL) {
28
		g_printerr("Failed to open connection to bus: %s\n", error->message);
29
		g_error_free(error);
30
		return FALSE;
31
    }
32
	return TRUE;
33
}
34
35
void lj_dbus_close(JamDBus *jd) {
36
	if (jd == NULL)
37
		return;
38
	lj_dbus_players_clear(jd);
39
	dbus_g_connection_unref(jd->bus);
40
}
41
42
JamDBus *
43
lj_dbus_new(void) {
44
	JamDBus *jd = (JamDBus *) g_malloc0(sizeof(JamDBus));
45
46
	if (lj_dbus_open(jd) == FALSE) {
47
		g_free(jd);
48
		return NULL;
49
	}
50
	return jd;
51
}
52
53
static gboolean
54
lj_dbus_append_player(JamDBus *jd, gchar *dest) {
55
	MediaPlayer *player;
56
	DBusGProxy *proxy;
57
	GError *error = NULL;
58
	gchar *name;
59
60
	proxy = dbus_g_proxy_new_for_name(jd->bus, dest, "/", MPRIS_IF);
61
62
	if (!dbus_g_proxy_call(proxy, "Identity", &error, G_TYPE_INVALID,
63
						   G_TYPE_STRING, &name, G_TYPE_INVALID)) {
64
		g_printerr("Error: %s\n", error->message);
65
		g_error_free(error);
66
		return FALSE;
67
	}
68
69
	player = (MediaPlayer *) g_malloc0(sizeof(MediaPlayer));
70
	player->dest = g_strdup(dest);
71
	player->name = g_strdup(name);
72
	player->proxy = dbus_g_proxy_new_for_name(jd->bus, dest, "/Player", MPRIS_IF);
73
74
	if (g_str_has_suffix(dest, "audacious"))
75
		player->hint |= MPRIS_HINT_BAD_STATUS;
76
77
	jd->player = g_list_append(jd->player, (gpointer) player);
78
79
	g_free(name);
80
	g_object_unref(proxy);
81
82
	return TRUE;
83
}
84
85
static void
86
lj_dbus_players_clear(JamDBus *jd) {
87
	GList *list;
88
89
	if (jd->player == NULL)
90
		return;
91
92
	for (list = g_list_first(jd->player); list; list = g_list_next(list)) {
93
		MediaPlayer *player = (MediaPlayer *) list->data;
94
		g_object_unref(player->proxy);
95
		if (player->name)
96
			g_free(player->name);
97
		if (player->dest)
98
			g_free(player->dest);
99
	}
100
	g_list_free(jd->player);
101
	jd->player = NULL;
102
}
103
104
static gboolean
105
lj_dbus_players_find(JamDBus *jd, GError **error) {
106
	DBusGProxy *proxy;
107
	gchar **names, **p;
108
109
	proxy = dbus_g_proxy_new_for_name(jd->bus,
110
                                      DBUS_SERVICE_DBUS,
111
                                      DBUS_PATH_DBUS,
112
                                      DBUS_INTERFACE_DBUS);
113
114
	if (!dbus_g_proxy_call(proxy, "ListNames", error, G_TYPE_INVALID,
115
						   G_TYPE_STRV, &names, G_TYPE_INVALID)) {
116
		return FALSE;
117
	}
118
119
	for (p = names; *p; p++) {
120
		if (g_str_has_prefix(*p, "org.mpris.")) {
121
			lj_dbus_append_player(jd, *p);
122
		}
123
	}
124
125
	g_strfreev(names);
126
	g_object_unref(proxy);
127
128
	return TRUE;
129
}
130
131
gboolean
132
lj_dbus_mpris_update_list(JamDBus *jd, GError **error) {
133
	if (jd == NULL)
134
		return FALSE;
135
	lj_dbus_players_clear(jd);
136
	return lj_dbus_players_find(jd, error);
137
}
138
139
#define DBUS_TYPE_MPRIS_STATUS \
140
	(dbus_g_type_get_struct("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
141
#define DBUS_TYPE_G_STRING_VALUE_HASHTABLE \
142
	(dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
143
144
/* TODO: Connect to status change signal */
145
146
gboolean
147
lj_dbus_mpris_update_info(JamDBus *jd, GList *list, GError **error) {
148
	GValueArray *array = NULL;
149
	GHashTable *info = NULL;
150
	GValue *value;
151
	MediaPlayer *player;
152
153
	if (jd == NULL)
154
		return FALSE;
155
156
	if (list == NULL)
157
		return FALSE;
158
159
	if ((player = (MediaPlayer *) list->data) == NULL)
160
		return FALSE;
161
162
	memset((void *) &player->info, 0, sizeof(MetaInfo));
163
164
	if (player->hint & MPRIS_HINT_BAD_STATUS) {
165
		if (!dbus_g_proxy_call(player->proxy, "GetStatus", error, G_TYPE_INVALID,
166
							   G_TYPE_INT, &player->info.status, G_TYPE_INVALID)) {
167
			return FALSE;
168
		}
169
	} else {
170
		if (!dbus_g_proxy_call(player->proxy, "GetStatus", error, G_TYPE_INVALID,
171
							   DBUS_TYPE_MPRIS_STATUS, &array, G_TYPE_INVALID)) {
172
			return FALSE;
173
		}
174
175
		value = g_value_array_get_nth(array, 0);
176
		player->info.status = g_value_get_int(value);
177
		g_value_array_free(array);
178
	}
179
180
	if (player->info.status == MPRIS_STATUS_PLAYING) {
181
		if (!dbus_g_proxy_call(player->proxy, "GetMetadata", error, G_TYPE_INVALID,
182
							   DBUS_TYPE_G_STRING_VALUE_HASHTABLE, &info, G_TYPE_INVALID)) {
183
			return FALSE;
184
		}
185
		value = (GValue *) g_hash_table_lookup(info, "artist");
186
		if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
187
			g_strlcpy(player->info.artist, g_value_get_string(value), MPRIS_INFO_LEN);
188
		}
189
190
		value = (GValue *) g_hash_table_lookup(info, "album");
191
		if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
192
			g_strlcpy(player->info.album, g_value_get_string(value), MPRIS_INFO_LEN);
193
		}
194
195
		value = (GValue *) g_hash_table_lookup(info, "title");
196
		if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
197
			g_strlcpy(player->info.title, g_value_get_string(value), MPRIS_INFO_LEN);
198
		}
199
	}
200
201
	return TRUE;
202
}
203
204
GQuark
205
lj_dbus_error_quark(void) {
206
	static GQuark quark = 0;
207
	if (quark == 0)
208
		quark = g_quark_from_static_string("dbus-error-quark");
209
	return quark;
210
}
211
212
/* TODO: User defined format */
213
214
gchar *
215
lj_dbus_mpris_current_music(JamDBus *jd, GError **error) {
216
	gchar *music;
217
	GList *list;
218
219
	if (!lj_dbus_mpris_update_list(jd, error))
220
		return NULL;
221
222
	list = jd ? jd->player : NULL;
223
224
	if (lj_dbus_mpris_update_info(jd, list, error)) {
225
		MediaPlayer *player = (MediaPlayer *) list->data;
226
		if (player->info.status == MPRIS_STATUS_PLAYING) {
227
			music = g_strdup_printf("%s - %s - %s",
228
						player->info.artist[0] ? player->info.artist : _("Unknown Artist"),
229
						player->info.album[0] ? player->info.album: _("Unknown Album"),
230
						player->info.title[0] ? player->info.title: _("Unknown Track"));
231
			return music;
232
		} else {
233
			g_set_error(error, lj_dbus_error_quark(), MPRIS_ERROR_NOT_PLAYING,
234
				_("Player is stopped."));
235
		}
236
	} else if (error == NULL || *error == NULL) {
237
		g_set_error(error, lj_dbus_error_quark(), MPRIS_ERROR_NO_PLAYER,
238
			_("No players found."));
239
	}
240
	return NULL;
241
}
242
243
/* lj_dbus.c */
244
(-)logjam-4.5.3/src/lj_dbus.h.dbus (+68 lines)
Line 0 Link Here
1
/* logjam - a GTK client for LiveJournal.
2
 * Copyright (C) 2009 Andy Shevchenko <andy@smile.org.ua>
3
 *
4
 * vim: tabstop=4 shiftwidth=4 noexpandtab :
5
 */
6
7
#ifndef lj_dbus_h
8
#define lj_dbus_h
9
10
#include <glib.h>
11
#include <dbus/dbus.h>
12
#include <dbus/dbus-glib.h>
13
14
/* Take care about i18n strings */
15
#ifndef _
16
#ifdef GETTEXT_PACKAGE
17
#include <glib/gi18n-lib.h>
18
#else
19
#define _(x)	x
20
#endif
21
#endif		/* _ */
22
23
#define MPRIS_INFO_LEN	128
24
25
typedef struct _MetaInfo MetaInfo;
26
struct _MetaInfo {
27
	gchar artist[MPRIS_INFO_LEN];
28
	gchar album[MPRIS_INFO_LEN];
29
	gchar title[MPRIS_INFO_LEN];
30
31
#define	MPRIS_STATUS_PLAYING	0
32
#define	MPRIS_STATUS_PAUSED		1
33
#define	MPRIS_STATUS_STOPPED	2
34
35
	gint status;
36
};
37
38
typedef struct _MediaPlayer MediaPlayer;
39
struct _MediaPlayer {
40
	gchar *name;
41
	gchar *dest;
42
	DBusGProxy *proxy;
43
	MetaInfo info;
44
45
#define MPRIS_HINT_BAD_STATUS	1 << 0
46
47
	gint hint;
48
};
49
50
typedef struct _JamDBus JamDBus;
51
struct _JamDBus {
52
	DBusGConnection *bus;
53
	GList *player;
54
};
55
56
void lj_dbus_close(JamDBus *jd);
57
JamDBus *lj_dbus_new(void);
58
59
gboolean lj_dbus_mpris_update_list(JamDBus *jd, GError **error);
60
gboolean lj_dbus_mpris_update_info(JamDBus *jd, GList *list, GError **error);
61
62
#define MPRIS_ERROR_NOT_PLAYING		1
63
#define MPRIS_ERROR_NO_PLAYER		2
64
65
gchar *lj_dbus_mpris_current_music(JamDBus *jd, GError **error);
66
67
#endif /* lj_dbus_h */
68
(-)logjam-4.5.3/src/Makefile.am.dbus (-2 / +3 lines)
Lines 3-9 bin_PROGRAMS = logjam Link Here
3
localedir=$(datadir)/locale
3
localedir=$(datadir)/locale
4
4
5
# AM_CFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/protocol/liblivejournal -I$(top_srcdir)/protocol/blogger -I$(top_srcdir)/util/gxr @LOGJAM_CFLAGS@ @NETWORK_CFLAGS@
5
# AM_CFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/protocol/liblivejournal -I$(top_srcdir)/protocol/blogger -I$(top_srcdir)/util/gxr @LOGJAM_CFLAGS@ @NETWORK_CFLAGS@
6
AM_CFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/protocol/liblivejournal -I$(top_srcdir)/util/gxr @LOGJAM_CFLAGS@ @NETWORK_CFLAGS@
6
AM_CFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/protocol/liblivejournal -I$(top_srcdir)/util/gxr @LOGJAM_CFLAGS@ @NETWORK_CFLAGS@ @DBUSAPI_CFLAGS@
7
7
8
ACCOUNT = account.h account.c host.c livejournal.c
8
ACCOUNT = account.h account.c host.c livejournal.c
9
# blogger.c
9
# blogger.c
Lines 50-55 src_gtk = gtk-all.h util-gtk.c util-gtk. Link Here
50
          settings.c settings.h $(GROUPEDBOX) tie.c tie.h \
50
          settings.c settings.h $(GROUPEDBOX) tie.c tie.h \
51
          $(HISTORY) $(OFFLINE) \
51
          $(HISTORY) $(OFFLINE) \
52
          jam.c jam.h $(USEJOURNAL) \
52
          jam.c jam.h $(USEJOURNAL) \
53
          lj_dbus.c lj_dbus.h \
53
          security.c security.h about.c thanks.h \
54
          security.c security.h about.c thanks.h \
54
          menu.c menu.h $(TOOLS) smartquotes.c smartquotes.h \
55
          menu.c menu.h $(TOOLS) smartquotes.c smartquotes.h \
55
          $(LOGIN) manager.c \
56
          $(LOGIN) manager.c \
Lines 116-122 logjam_SOURCES += journalstore-xml.c Link Here
116
endif
117
endif
117
118
118
# logjam_LDADD=$(top_builddir)/protocol/liblivejournal/livejournal/liblivejournal.la $(top_builddir)/protocol/blogger/libblogger.la @LOGJAM_LIBS@ @NETWORK_LIBS@
119
# logjam_LDADD=$(top_builddir)/protocol/liblivejournal/livejournal/liblivejournal.la $(top_builddir)/protocol/blogger/libblogger.la @LOGJAM_LIBS@ @NETWORK_LIBS@
119
logjam_LDADD=$(top_builddir)/protocol/liblivejournal/livejournal/liblivejournal.la @LOGJAM_LIBS@ @NETWORK_LIBS@
120
logjam_LDADD=$(top_builddir)/protocol/liblivejournal/livejournal/liblivejournal.la @LOGJAM_LIBS@ @NETWORK_LIBS@ @DBUSAPI_LIBS@
120
121
121
ctags:
122
ctags:
122
	@version=`ctags --version | head -1`; \
123
	@version=`ctags --version | head -1`; \
(-)logjam-4.5.3/src/music.c.dbus (+3 lines)
Lines 9-16 Link Here
9
#include "gtk-all.h"
9
#include "gtk-all.h"
10
10
11
#include "conf.h"
11
#include "conf.h"
12
#include "lj_dbus.h"
12
#include "music.h"
13
#include "music.h"
13
14
15
JamDBus *jdbus = NULL;
16
14
const CommandList music_commands[] = {
17
const CommandList music_commands[] = {
15
	{ N_("None"), NULL },
18
	{ N_("None"), NULL },
16
	{ "Music Player Daemon", "sh -c \"mpc | grep -v '^volume: .* repeat: .* random: .*'\"" },
19
	{ "Music Player Daemon", "sh -c \"mpc | grep -v '^volume: .* repeat: .* random: .*'\"" },
(-)logjam-4.5.3/src/music.h.dbus (+3 lines)
Lines 8-13 Link Here
8
#define music_h
8
#define music_h
9
9
10
#include "conf.h" /* CommandList */
10
#include "conf.h" /* CommandList */
11
#include "lj_dbus.h"
12
13
extern JamDBus *jdbus;
11
14
12
typedef enum {
15
typedef enum {
13
	MUSIC_SOURCE_NONE,
16
	MUSIC_SOURCE_NONE,
(-)logjam-4.5.3/src/settings.c.dbus (-9 / +49 lines)
Lines 24-29 Link Here
24
#include "tie.h"
24
#include "tie.h"
25
#include "account.h"
25
#include "account.h"
26
#include "jamview.h"
26
#include "jamview.h"
27
#include "lj_dbus.h"
27
28
28
/* what's this?  all of these funny structures in the settings box?
29
/* what's this?  all of these funny structures in the settings box?
29
 * well, instead of creating and tearing down all of these widgets, i
30
 * well, instead of creating and tearing down all of these widgets, i
Lines 101-106 static SettingsWidget settingswidgets[] Link Here
101
102
102
	{ "music_command", &conf.music_command,
103
	{ "music_command", &conf.music_command,
103
		SW_COMMAND, N_("Detect music from:"), (gpointer)music_commands },
104
		SW_COMMAND, N_("Detect music from:"), (gpointer)music_commands },
105
	{ "music_mpris", &conf.music_mpris,
106
		SW_TOGGLE, N_("Detect music via MPRIS") },
104
107
105
	{ "net_useproxy", &conf.options.useproxy, 
108
	{ "net_useproxy", &conf.options.useproxy, 
106
		SW_TOGGLE, N_("Use _proxy server") },
109
		SW_TOGGLE, N_("Use _proxy server") },
Lines 169-174 toggle_tie_enable(GtkWidget *toggle, Gtk Link Here
169
}
172
}
170
173
171
static void
174
static void
175
toggle_disable_cb(GtkWidget *toggle, GtkWidget *target) {
176
	gtk_widget_set_sensitive(target, 
177
			!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)));
178
}
179
static void
180
toggle_tie_disable(GtkWidget *toggle, GtkWidget *target) {
181
	gtk_widget_set_sensitive(target, 
182
			!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)));
183
	g_signal_connect(G_OBJECT(toggle), "toggled",
184
			G_CALLBACK(toggle_disable_cb), target);
185
}
186
187
static void
172
toggle_tie(SettingsWidget *sw) {
188
toggle_tie(SettingsWidget *sw) {
173
	tie_toggle(GTK_TOGGLE_BUTTON(sw->widget), (gboolean*)sw->conf);
189
	tie_toggle(GTK_TOGGLE_BUTTON(sw->widget), (gboolean*)sw->conf);
174
}
190
}
Lines 499-514 static void Link Here
499
music_diagnose(GtkWidget *button) {
515
music_diagnose(GtkWidget *button) {
500
	GtkWindow *dlg = GTK_WINDOW(gtk_widget_get_toplevel(button));
516
	GtkWindow *dlg = GTK_WINDOW(gtk_widget_get_toplevel(button));
501
	GError *err = NULL;
517
	GError *err = NULL;
502
	char *music, *result;
518
	char *music = NULL, *result;
503
	MusicSource source = music_current_source();
519
	MusicSource source = MUSIC_SOURCE_NONE;
504
520
505
	if (!music_can_detect(&err)) {
521
	if (conf.music_mpris) {
506
		jam_warning(dlg, "%s", err->message);
522
		music = lj_dbus_mpris_current_music(jdbus, &err);
507
		g_error_free(err);
523
	} else {
508
		return;
524
		source = music_current_source();
525
		if (!music_can_detect(&err)) {
526
			jam_warning(dlg, "%s", err->message);
527
			g_error_free(err);
528
			return;
529
		}
530
		music = music_detect(&err);
509
	}
531
	}
510
532
511
	music = music_detect(&err);
512
	if (!music) {
533
	if (!music) {
513
		if (source == MUSIC_SOURCE_XMMS &&
534
		if (source == MUSIC_SOURCE_XMMS &&
514
				err->domain == G_SPAWN_ERROR && err->code == G_SPAWN_ERROR_NOENT) {
535
				err->domain == G_SPAWN_ERROR && err->code == G_SPAWN_ERROR_NOENT) {
Lines 555-575 proxysettings(void) { Link Here
555
	return group;
576
	return group;
556
}
577
}
557
578
579
static void
580
mpris_update_cb(GtkToggleButton *button, JamDBus *jd) {
581
	GError *error = NULL;
582
	if (!lj_dbus_mpris_update_list(jdbus, &error)) {
583
		GtkWindow *dlg = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
584
		jam_warning(dlg, _("Error detecting music: %s"), error->message);
585
		g_error_free(error);
586
	}
587
}
588
558
static GtkWidget*
589
static GtkWidget*
559
programsettings(JamWin *jw) {
590
programsettings(JamWin *jw) {
560
	GtkWidget *group;
591
	GtkWidget *group;
561
	GtkWidget *button, *hbox;
592
	GtkWidget *button, *vbox, *hbox;
562
	SettingsWidget *sw;
593
	SettingsWidget *sw;
563
	JamView *jv = jam_win_get_cur_view(jw);
594
	JamView *jv = jam_win_get_cur_view(jw);
564
	
595
	
565
	group = groupedbox_new_with_text(_("Programs"));
596
	group = groupedbox_new_with_text(_("Programs"));
566
	groupedbox_pack(GROUPEDBOX(group), sw_make("web_spawn"), FALSE);
597
	groupedbox_pack(GROUPEDBOX(group), sw_make("web_spawn"), FALSE);
567
598
568
	groupedbox_pack(GROUPEDBOX(group), sw_make("music_command"), FALSE);
599
	vbox = sw_make("music_command");
600
	groupedbox_pack(GROUPEDBOX(group), vbox, FALSE);
569
	sw = sw_lookup("music_command");
601
	sw = sw_lookup("music_command");
570
	g_signal_connect_swapped(G_OBJECT(sw->widget), "changed",
602
	g_signal_connect_swapped(G_OBJECT(sw->widget), "changed",
571
			G_CALLBACK(jam_view_settings_changed), jv);
603
			G_CALLBACK(jam_view_settings_changed), jv);
572
604
605
	button = sw_make("music_mpris");
606
	groupedbox_pack(GROUPEDBOX(group), button, FALSE);
607
	g_signal_connect(G_OBJECT(button), "toggled",
608
			G_CALLBACK(mpris_update_cb), jdbus);
609
	toggle_tie_disable(button, vbox);
610
	g_signal_connect_swapped(G_OBJECT(button), "toggled",
611
			G_CALLBACK(jam_view_settings_changed), jv);
612
573
	button = gtk_button_new_with_mnemonic(_("_Diagnose"));
613
	button = gtk_button_new_with_mnemonic(_("_Diagnose"));
574
	g_signal_connect(G_OBJECT(button), "clicked",
614
	g_signal_connect(G_OBJECT(button), "clicked",
575
			G_CALLBACK(music_diagnose), NULL);
615
			G_CALLBACK(music_diagnose), NULL);

Return to bug 19768