rpms/logjam/F-13 0001-Add-MPRIS-support-to-detect-current-music-v2.patch, NONE, 1.1 0001-Add-context-menu-support-in-the-dock-v2.patch, NONE, 1.1 logjam-4.5.3-fix-implicit-DSO.patch, NONE, 1.1 0001-Add-possibility-to-insert-link-by-nickname.patch, 1.1, 1.2 logjam.spec, 1.58, 1.59

Tom Callaway spot at fedoraproject.org
Thu Feb 18 21:55:35 UTC 2010


Author: spot

Update of /cvs/pkgs/rpms/logjam/F-13
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv13687/F-13

Modified Files:
	0001-Add-possibility-to-insert-link-by-nickname.patch 
	logjam.spec 
Added Files:
	0001-Add-MPRIS-support-to-detect-current-music-v2.patch 
	0001-Add-context-menu-support-in-the-dock-v2.patch 
	logjam-4.5.3-fix-implicit-DSO.patch 
Log Message:
update Patch2, Patch12, Patch16 (bz556971), fix implicit DSO linking issue (bz 565012)

0001-Add-MPRIS-support-to-detect-current-music-v2.patch:
 configure.in    |    7 +
 src/Makefile.am |    5 -
 src/conf.h      |    1 
 src/conf_xml.c  |    3 
 src/init.c      |   16 +++
 src/jamview.c   |   10 +-
 src/lj_dbus.c   |  255 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/lj_dbus.h   |   69 +++++++++++++++
 src/music.c     |    3 
 src/music.h     |    3 
 src/settings.c  |   59 ++++++++++--
 11 files changed, 417 insertions(+), 14 deletions(-)

--- NEW FILE 0001-Add-MPRIS-support-to-detect-current-music-v2.patch ---
>From 615b08e85e121433b518c497a82164ebcaa0d171 Mon Sep 17 00:00:00 2001
From: Andy Shevchenko <andy.shevchenko at gmail.com>
Date: Wed, 20 Jan 2010 01:21:43 +0200
Subject: [PATCH 28/32] Add MPRIS support to detect current music (v2)

Changes from last version:
* Take care of Audacious2 which works fine without hack

Signed-off-by: Andy Shevchenko <andy.shevchenko at gmail.com>
---
 configure.in    |    7 ++
 src/Makefile.am |    5 +-
 src/conf.h      |    1 +
 src/conf_xml.c  |    3 +
 src/init.c      |   16 ++++
 src/jamview.c   |   10 ++-
 src/lj_dbus.c   |  255 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/lj_dbus.h   |   69 +++++++++++++++
 src/music.c     |    3 +
 src/music.h     |    3 +
 src/settings.c  |   58 +++++++++++--
 11 files changed, 417 insertions(+), 13 deletions(-)
 create mode 100644 src/lj_dbus.c
 create mode 100644 src/lj_dbus.h

diff --git a/configure.in b/configure.in
index bbb5e28..44575e1 100644
--- a/configure.in
+++ b/configure.in
@@ -214,6 +214,13 @@ AC_SUBST(LIVEJOURNAL_CFLAGS)
 AC_SUBST(LIVEJOURNAL_LIBS)
 dnl end liblivejournal dependencies.
 
+dnl D-Bus API
+MODULES="dbus-1 dbus-glib-1"
+PKG_CHECK_MODULES(DBUSAPI, $MODULES)
+AC_SUBST(DBUSAPI_CFLAGS)
+AC_SUBST(DBUSAPI_LIBS)
+dnl D-Bus API
+
 AM_CONDITIONAL(WITH_XMMS, test "$with_xmms" = "yes")
 AM_CONDITIONAL(WITH_HTML, test "$with_gtkhtml" != "no")
 AM_CONDITIONAL(WITH_RSVG, test "$with_librsvg" = "yes")
diff --git a/src/Makefile.am b/src/Makefile.am
index fff308b..f0b4071 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -3,7 +3,7 @@ bin_PROGRAMS = logjam
 localedir=$(datadir)/locale
 
 # AM_CFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/protocol/liblivejournal -I$(top_srcdir)/protocol/blogger -I$(top_srcdir)/util/gxr @LOGJAM_CFLAGS@ @NETWORK_CFLAGS@
-AM_CFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/protocol/liblivejournal -I$(top_srcdir)/util/gxr @LOGJAM_CFLAGS@ @NETWORK_CFLAGS@
+AM_CFLAGS = -DLOCALEDIR=\"$(localedir)\" -I$(top_srcdir)/protocol/liblivejournal -I$(top_srcdir)/util/gxr @LOGJAM_CFLAGS@ @NETWORK_CFLAGS@ @DBUSAPI_CFLAGS@
 
 ACCOUNT = account.h account.c host.c livejournal.c
 # blogger.c
@@ -50,6 +50,7 @@ src_gtk = gtk-all.h util-gtk.c util-gtk.h \
           settings.c settings.h $(GROUPEDBOX) tie.c tie.h \
           $(HISTORY) $(OFFLINE) \
           jam.c jam.h $(USEJOURNAL) \
+          lj_dbus.c lj_dbus.h \
           security.c security.h about.c thanks.h \
           menu.c menu.h $(TOOLS) smartquotes.c smartquotes.h \
           $(LOGIN) manager.c \
@@ -116,7 +117,7 @@ logjam_SOURCES += journalstore-xml.c
 endif
 
 # logjam_LDADD=$(top_builddir)/protocol/liblivejournal/livejournal/liblivejournal.la $(top_builddir)/protocol/blogger/libblogger.la @LOGJAM_LIBS@ @NETWORK_LIBS@
-logjam_LDADD=$(top_builddir)/protocol/liblivejournal/livejournal/liblivejournal.la @LOGJAM_LIBS@ @NETWORK_LIBS@
+logjam_LDADD=$(top_builddir)/protocol/liblivejournal/livejournal/liblivejournal.la @LOGJAM_LIBS@ @NETWORK_LIBS@ @DBUSAPI_LIBS@
 
 ctags:
 	@version=`ctags --version | head -1`; \
diff --git a/src/conf.h b/src/conf.h
index 33f832d..5535269 100644
--- a/src/conf.h
+++ b/src/conf.h
@@ -92,6 +92,7 @@ typedef struct {
 	char *spawn_command;
 
 	char *music_command;
+	gboolean music_mpris;
 
 	char *proxy;
 	char *proxyuser, *proxypass;
diff --git a/src/conf_xml.c b/src/conf_xml.c
index 337b0dc..cf3aa28 100644
--- a/src/conf_xml.c
+++ b/src/conf_xml.c
@@ -257,6 +257,7 @@ parseconf(xmlDocPtr doc, xmlNodePtr node, void *data) {
 		XML_GET_CONF("proxyauth", parseproxyauth)
 		XML_GET_STR("spawncommand", c->spawn_command)
 		XML_GET_STR("musiccommand", c->music_command)
+		XML_GET_BOOL("musicmpris", c->music_mpris)
 #endif /* G_OS_WIN32 */
 		XML_GET_INT("cfuserinterval", c->cfuserinterval)
 		XML_GET_INT("cfthreshold", c->cfthreshold)
@@ -396,6 +397,8 @@ conf_write(Configuration *c, char *base) {
 
 	if (c->music_command)
 		xmlAddTN(root, "musiccommand", c->music_command);
+	if (c->music_mpris)
+		xmlNewChild(root, NULL, BAD_CAST "musicmpris", NULL);
 #endif
 
 	if (c->cfuserinterval) {
diff --git a/src/init.c b/src/init.c
index 23edaf9..27e0e4c 100644
--- a/src/init.c
+++ b/src/init.c
@@ -29,6 +29,7 @@
 #include "conf_xml.h"
 #include "jamdoc.h"
 #include "cmdline.h"
+#include "lj_dbus.h"
 
 #ifdef HAVE_GTK
 #include "login.h"
@@ -120,6 +121,9 @@ init_app(int *argc, gchar *argv[]) {
 }
 
 #ifdef HAVE_GTK
+
+extern JamDBus *jdbus;
+
 static void
 run_gtk(JamDoc *doc) {
 	gchar *accelpath;
@@ -148,8 +152,20 @@ run_gtk(JamDoc *doc) {
 		jam_doc_set_account(doc, acc);
 	}
 
+	jdbus = lj_dbus_new();
+	if (conf.music_mpris) {
+		GError *error = NULL;
+		if (!lj_dbus_mpris_update_list(jdbus, &error)) {
+			g_printerr("Error: %s\n", error->message);
+			g_error_free(error);
+		}
+	}
+
 	jam_run(doc);
 
+	lj_dbus_close(jdbus);
+	jdbus = NULL;
+
 	g_object_unref(G_OBJECT(app.remote));
 
 	gtk_accel_map_save(accelpath);
diff --git a/src/jamview.c b/src/jamview.c
index cb00b3a..8cc946e 100644
--- a/src/jamview.c
+++ b/src/jamview.c
@@ -20,6 +20,7 @@
 #include "marshalers.h"
 #include "datesel.h"
 #include "tags.h"
+#include "lj_dbus.h"
 
 #define KEY_PICTUREKEYWORD "logjam-picturekeyword"
 
@@ -359,7 +360,12 @@ picture_store(JamView *view) {
 static void
 music_refresh_cb(JamView *view) {
 	GError *err = NULL;
-	gchar *music = music_detect(&err);
+	gchar *music;
+
+	if (conf.music_mpris)
+		music = lj_dbus_mpris_current_music(jdbus, &err);
+	else
+		music = music_detect(&err);
 
 	if (music) {
 		gtk_entry_set_text(GTK_ENTRY(view->music), music);
@@ -376,7 +382,7 @@ static void
 music_add(JamView *view) {
 	view->music = gtk_entry_new();
 	view->musicbar = labelled_box_new_sg(_("_Music:"), view->music, view->sizegroup);
-	if (music_can_detect(NULL)) {
+	if (conf.music_mpris || music_can_detect(NULL)) {
 		GtkWidget *refresh = gtk_button_new_from_stock(GTK_STOCK_REFRESH);
 		g_signal_connect_swapped(G_OBJECT(refresh), "clicked",
 				G_CALLBACK(music_refresh_cb), view);
diff --git a/src/lj_dbus.c b/src/lj_dbus.c
new file mode 100644
index 0000000..09f0f7c
--- /dev/null
+++ b/src/lj_dbus.c
@@ -0,0 +1,255 @@
+/* logjam - a GTK client for LiveJournal.
+ * Copyright (C) 2009, 2010 Andy Shevchenko <andy at smile.org.ua>
+ *
+ * vim: tabstop=4 shiftwidth=4 noexpandtab :
+ *
+ * See http://wiki.xmms2.xmms.se/wiki/MPRIS for MRPIS specification
+ */
+
+#include <string.h>		/* memset */
+
+#include "lj_dbus.h"
+
+#define MPRIS_IF	"org.freedesktop.MediaPlayer"
+
+/* Internal prototypes */
+static gboolean lj_dbus_open(JamDBus *jd);
+static gboolean lj_dbus_append_player(JamDBus *jd, gchar *dest);
+static void lj_dbus_players_clear(JamDBus *jd);
+static gboolean lj_dbus_players_find(JamDBus *jd, GError **error);
+
+/* Implementation */
+static gboolean
+lj_dbus_open(JamDBus *jd) {
+	GError *error = NULL;
+
+	jd->bus = dbus_g_bus_get(DBUS_BUS_SESSION, &error);
+	if (jd->bus == NULL) {
+		g_printerr("Failed to open connection to bus: %s\n", error->message);
+		g_error_free(error);
+		return FALSE;
+    }
+	return TRUE;
+}
+
+void lj_dbus_close(JamDBus *jd) {
+	if (jd == NULL)
+		return;
+	lj_dbus_players_clear(jd);
+	dbus_g_connection_unref(jd->bus);
+}
+
+JamDBus *
+lj_dbus_new(void) {
+	JamDBus *jd = (JamDBus *) g_malloc0(sizeof(JamDBus));
+
+	if (lj_dbus_open(jd) == FALSE) {
+		g_free(jd);
+		return NULL;
+	}
+	return jd;
+}
+
+static gboolean
+lj_dbus_append_player(JamDBus *jd, gchar *dest) {
+	MediaPlayer *player;
+	DBusGProxy *proxy;
+	GError *error = NULL;
+	gchar *name, *version;
+
+	proxy = dbus_g_proxy_new_for_name(jd->bus, dest, "/", MPRIS_IF);
+
+	if (!dbus_g_proxy_call(proxy, "Identity", &error, G_TYPE_INVALID,
+						   G_TYPE_STRING, &name, G_TYPE_INVALID)) {
+		g_printerr("Error: %s\n", error->message);
+		g_error_free(error);
+		return FALSE;
+	}
+
+	player = (MediaPlayer *) g_malloc0(sizeof(MediaPlayer));
+	player->dest = g_strdup(dest);
+	player->name = g_strdup(name);
+
+	/* Guess version of the player */
+	version = g_utf8_strchr(player->name, strlen(player->name), ' ');
+	player->version = version ? ++version : NULL;
+
+	player->proxy = dbus_g_proxy_new_for_name(jd->bus, dest, "/Player", MPRIS_IF);
+
+	/* Audacious2 works fine and doesn't need such hack */
+	if (g_str_has_suffix(dest, "audacious") &&
+		(g_str_has_prefix(version, "1.") ||
+		 /* Actually I doubt about usefulness of check older versions of
+		  * Audacious */
+		 g_str_has_prefix(version, "0."))) {
+		player->hint |= MPRIS_HINT_BAD_STATUS;
+	}
+
+	jd->player = g_list_append(jd->player, (gpointer) player);
+
+	g_free(name);
+	g_object_unref(proxy);
+
+	return TRUE;
+}
+
+static void
+lj_dbus_players_clear(JamDBus *jd) {
+	GList *list;
+
+	if (jd->player == NULL)
+		return;
+
+	for (list = g_list_first(jd->player); list; list = g_list_next(list)) {
+		MediaPlayer *player = (MediaPlayer *) list->data;
+		g_object_unref(player->proxy);
+		if (player->name)
+			g_free(player->name);
+		if (player->dest)
+			g_free(player->dest);
+	}
+	g_list_free(jd->player);
+	jd->player = NULL;
+}
+
+static gboolean
+lj_dbus_players_find(JamDBus *jd, GError **error) {
+	DBusGProxy *proxy;
+	gchar **names, **p;
+
+	proxy = dbus_g_proxy_new_for_name(jd->bus,
+                                      DBUS_SERVICE_DBUS,
+                                      DBUS_PATH_DBUS,
+                                      DBUS_INTERFACE_DBUS);
+
+	if (!dbus_g_proxy_call(proxy, "ListNames", error, G_TYPE_INVALID,
+						   G_TYPE_STRV, &names, G_TYPE_INVALID)) {
+		return FALSE;
+	}
+
+	for (p = names; *p; p++) {
+		if (g_str_has_prefix(*p, "org.mpris.")) {
+			lj_dbus_append_player(jd, *p);
+		}
+	}
+
+	g_strfreev(names);
+	g_object_unref(proxy);
+
+	return TRUE;
+}
+
+gboolean
+lj_dbus_mpris_update_list(JamDBus *jd, GError **error) {
+	if (jd == NULL)
+		return FALSE;
+	lj_dbus_players_clear(jd);
+	return lj_dbus_players_find(jd, error);
+}
+
+#define DBUS_TYPE_MPRIS_STATUS \
+	(dbus_g_type_get_struct("GValueArray", G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INT, G_TYPE_INVALID))
+#define DBUS_TYPE_G_STRING_VALUE_HASHTABLE \
+	(dbus_g_type_get_map("GHashTable", G_TYPE_STRING, G_TYPE_VALUE))
+
+/* TODO: Connect to status change signal */
+
+gboolean
+lj_dbus_mpris_update_info(JamDBus *jd, GList *list, GError **error) {
+	GValueArray *array = NULL;
+	GHashTable *info = NULL;
+	GValue *value;
+	MediaPlayer *player;
+
+	if (jd == NULL)
+		return FALSE;
+
+	if (list == NULL)
+		return FALSE;
+
+	if ((player = (MediaPlayer *) list->data) == NULL)
+		return FALSE;
+
+	memset((void *) &player->info, 0, sizeof(MetaInfo));
+
+	if (player->hint & MPRIS_HINT_BAD_STATUS) {
+		if (!dbus_g_proxy_call(player->proxy, "GetStatus", error, G_TYPE_INVALID,
+							   G_TYPE_INT, &player->info.status, G_TYPE_INVALID)) {
+			return FALSE;
+		}
+	} else {
+		if (!dbus_g_proxy_call(player->proxy, "GetStatus", error, G_TYPE_INVALID,
+							   DBUS_TYPE_MPRIS_STATUS, &array, G_TYPE_INVALID)) {
+			return FALSE;
+		}
+
+		value = g_value_array_get_nth(array, 0);
+		player->info.status = g_value_get_int(value);
+		g_value_array_free(array);
+	}
+
+	if (player->info.status == MPRIS_STATUS_PLAYING) {
+		if (!dbus_g_proxy_call(player->proxy, "GetMetadata", error, G_TYPE_INVALID,
+							   DBUS_TYPE_G_STRING_VALUE_HASHTABLE, &info, G_TYPE_INVALID)) {
+			return FALSE;
+		}
+		value = (GValue *) g_hash_table_lookup(info, "artist");
+		if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
+			g_strlcpy(player->info.artist, g_value_get_string(value), MPRIS_INFO_LEN);
+		}
+
+		value = (GValue *) g_hash_table_lookup(info, "album");
+		if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
+			g_strlcpy(player->info.album, g_value_get_string(value), MPRIS_INFO_LEN);
+		}
+
+		value = (GValue *) g_hash_table_lookup(info, "title");
+		if (value != NULL && G_VALUE_HOLDS_STRING(value)) {
+			g_strlcpy(player->info.title, g_value_get_string(value), MPRIS_INFO_LEN);
+		}
+	}
+
+	return TRUE;
+}
+
+GQuark
+lj_dbus_error_quark(void) {
+	static GQuark quark = 0;
+	if (quark == 0)
+		quark = g_quark_from_static_string("dbus-error-quark");
+	return quark;
+}
+
+/* TODO: User defined format */
+
+gchar *
+lj_dbus_mpris_current_music(JamDBus *jd, GError **error) {
+	gchar *music;
+	GList *list;
+
+	if (!lj_dbus_mpris_update_list(jd, error))
+		return NULL;
+
+	list = jd ? jd->player : NULL;
+
+	if (lj_dbus_mpris_update_info(jd, list, error)) {
+		MediaPlayer *player = (MediaPlayer *) list->data;
+		if (player->info.status == MPRIS_STATUS_PLAYING) {
+			music = g_strdup_printf("%s - %s - %s",
+						player->info.artist[0] ? player->info.artist : _("Unknown Artist"),
+						player->info.album[0] ? player->info.album: _("Unknown Album"),
+						player->info.title[0] ? player->info.title: _("Unknown Track"));
+			return music;
+		} else {
+			g_set_error(error, lj_dbus_error_quark(), MPRIS_ERROR_NOT_PLAYING,
+				_("Player is stopped."));
+		}
+	} else if (error == NULL || *error == NULL) {
+		g_set_error(error, lj_dbus_error_quark(), MPRIS_ERROR_NO_PLAYER,
+			_("No players found."));
+	}
+	return NULL;
+}
+
+/* lj_dbus.c */
+
diff --git a/src/lj_dbus.h b/src/lj_dbus.h
new file mode 100644
index 0000000..3ab7563
--- /dev/null
+++ b/src/lj_dbus.h
@@ -0,0 +1,69 @@
+/* logjam - a GTK client for LiveJournal.
+ * Copyright (C) 2009, 2010 Andy Shevchenko <andy at smile.org.ua>
+ *
+ * vim: tabstop=4 shiftwidth=4 noexpandtab :
+ */
+
+#ifndef lj_dbus_h
+#define lj_dbus_h
+
+#include <glib.h>
+#include <dbus/dbus.h>
+#include <dbus/dbus-glib.h>
+
+/* Take care about i18n strings */
+#ifndef _
+#ifdef GETTEXT_PACKAGE
+#include <glib/gi18n-lib.h>
+#else
+#define _(x)	x
+#endif
+#endif		/* _ */
+
+#define MPRIS_INFO_LEN	128
+
+typedef struct _MetaInfo MetaInfo;
+struct _MetaInfo {
+	gchar artist[MPRIS_INFO_LEN];
+	gchar album[MPRIS_INFO_LEN];
+	gchar title[MPRIS_INFO_LEN];
+
+#define	MPRIS_STATUS_PLAYING	0
+#define	MPRIS_STATUS_PAUSED		1
+#define	MPRIS_STATUS_STOPPED	2
+
+	gint status;
+};
+
+typedef struct _MediaPlayer MediaPlayer;
+struct _MediaPlayer {
+	gchar *name;
+	gchar *version;
+	gchar *dest;
+	DBusGProxy *proxy;
+	MetaInfo info;
+
+#define MPRIS_HINT_BAD_STATUS	1 << 0
+
+	gint hint;
+};
+
+typedef struct _JamDBus JamDBus;
+struct _JamDBus {
+	DBusGConnection *bus;
+	GList *player;
+};
+
+void lj_dbus_close(JamDBus *jd);
+JamDBus *lj_dbus_new(void);
+
+gboolean lj_dbus_mpris_update_list(JamDBus *jd, GError **error);
+gboolean lj_dbus_mpris_update_info(JamDBus *jd, GList *list, GError **error);
+
+#define MPRIS_ERROR_NOT_PLAYING		1
+#define MPRIS_ERROR_NO_PLAYER		2
+
+gchar *lj_dbus_mpris_current_music(JamDBus *jd, GError **error);
+
+#endif /* lj_dbus_h */
+
diff --git a/src/music.c b/src/music.c
index 063fc70..b51af08 100644
--- a/src/music.c
+++ b/src/music.c
@@ -9,8 +9,11 @@
 #include "gtk-all.h"
 
 #include "conf.h"
+#include "lj_dbus.h"
 #include "music.h"
 
+JamDBus *jdbus = NULL;
+
 const CommandList music_commands[] = {
 	{ N_("None"), NULL },
 	{ "Music Player Daemon", "sh -c \"mpc | grep -v '^volume: .* repeat: .* random: .*'\"" },
diff --git a/src/music.h b/src/music.h
index eda3eb9..e530739 100644
--- a/src/music.h
+++ b/src/music.h
@@ -8,6 +8,9 @@
 #define music_h
 
 #include "conf.h" /* CommandList */
+#include "lj_dbus.h"
+
+extern JamDBus *jdbus;
 
 typedef enum {
 	MUSIC_SOURCE_NONE,
diff --git a/src/settings.c b/src/settings.c
index 24c17e9..63cdd84 100644
--- a/src/settings.c
+++ b/src/settings.c
@@ -24,6 +24,7 @@
 #include "tie.h"
 #include "account.h"
 #include "jamview.h"
+#include "lj_dbus.h"
 
 /* what's this?  all of these funny structures in the settings box?
  * well, instead of creating and tearing down all of these widgets, i
@@ -101,6 +102,8 @@ static SettingsWidget settingswidgets[] = {
 
 	{ "music_command", &conf.music_command,
 		SW_COMMAND, N_("Detect music from:"), (gpointer)music_commands },
+	{ "music_mpris", &conf.music_mpris,
+		SW_TOGGLE, N_("Detect music via MPRIS") },
 
 	{ "net_useproxy", &conf.options.useproxy, 
 		SW_TOGGLE, N_("Use _proxy server") },
@@ -169,6 +172,19 @@ toggle_tie_enable(GtkWidget *toggle, GtkWidget *target) {
 }
 
 static void
+toggle_disable_cb(GtkWidget *toggle, GtkWidget *target) {
+	gtk_widget_set_sensitive(target,
+			!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)));
+}
+static void
+toggle_tie_disable(GtkWidget *toggle, GtkWidget *target) {
+	gtk_widget_set_sensitive(target,
+			!gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(toggle)));
+	g_signal_connect(G_OBJECT(toggle), "toggled",
+			G_CALLBACK(toggle_disable_cb), target);
+}
+
+static void
 toggle_tie(SettingsWidget *sw) {
 	tie_toggle(GTK_TOGGLE_BUTTON(sw->widget), (gboolean*)sw->conf);
 }
@@ -499,16 +515,21 @@ static void
 music_diagnose(GtkWidget *button) {
 	GtkWindow *dlg = GTK_WINDOW(gtk_widget_get_toplevel(button));
 	GError *err = NULL;
-	char *music, *result;
-	MusicSource source = music_current_source();
+	char *music = NULL, *result;
+	MusicSource source = MUSIC_SOURCE_NONE;
 
-	if (!music_can_detect(&err)) {
-		jam_warning(dlg, "%s", err->message);
-		g_error_free(err);
-		return;
+	if (conf.music_mpris) {
+		music = lj_dbus_mpris_current_music(jdbus, &err);
+	} else {
+		source = music_current_source();
+		if (!music_can_detect(&err)) {
+			jam_warning(dlg, "%s", err->message);
+			g_error_free(err);
+			return;
+		}
+		music = music_detect(&err);
 	}
 
-	music = music_detect(&err);
 	if (!music) {
 		if (source == MUSIC_SOURCE_XMMS &&
 				err->domain == G_SPAWN_ERROR && err->code == G_SPAWN_ERROR_NOENT) {
@@ -555,21 +576,40 @@ proxysettings(void) {
 	return group;
 }
 
+static void
+mpris_update_cb(GtkToggleButton *button, JamDBus *jd) {
+	GError *error = NULL;
+	if (!lj_dbus_mpris_update_list(jdbus, &error)) {
+		GtkWindow *dlg = GTK_WINDOW(gtk_widget_get_toplevel(GTK_WIDGET(button)));
+		jam_warning(dlg, _("Error detecting music: %s"), error->message);
+		g_error_free(error);
+	}
+}
+
 static GtkWidget*
 programsettings(JamWin *jw) {
 	GtkWidget *group;
-	GtkWidget *button, *hbox;
+	GtkWidget *button, *vbox, *hbox;
 	SettingsWidget *sw;
 	JamView *jv = jam_win_get_cur_view(jw);
 	
 	group = groupedbox_new_with_text(_("Programs"));
 	groupedbox_pack(GROUPEDBOX(group), sw_make("web_spawn"), FALSE);
 
-	groupedbox_pack(GROUPEDBOX(group), sw_make("music_command"), FALSE);
+	vbox = sw_make("music_command");
+	groupedbox_pack(GROUPEDBOX(group), vbox, FALSE);
 	sw = sw_lookup("music_command");
 	g_signal_connect_swapped(G_OBJECT(sw->widget), "changed",
 			G_CALLBACK(jam_view_settings_changed), jv);
 
+	button = sw_make("music_mpris");
+	groupedbox_pack(GROUPEDBOX(group), button, FALSE);
+	g_signal_connect(G_OBJECT(button), "toggled",
+			G_CALLBACK(mpris_update_cb), jdbus);
+	toggle_tie_disable(button, vbox);
+	g_signal_connect_swapped(G_OBJECT(button), "toggled",
+			G_CALLBACK(jam_view_settings_changed), jv);
+
 	button = gtk_button_new_with_mnemonic(_("_Diagnose"));
 	g_signal_connect(G_OBJECT(button), "clicked",
 			G_CALLBACK(music_diagnose), NULL);
-- 
1.7.0


0001-Add-context-menu-support-in-the-dock-v2.patch:
 docklet.c |   58 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 menu.c    |    2 +-
 menu.h    |    2 +-
 3 files changed, 59 insertions(+), 3 deletions(-)

--- NEW FILE 0001-Add-context-menu-support-in-the-dock-v2.patch ---
>From 7e6f867b0bbef8ea139d895a8915d6ec93c1cbe7 Mon Sep 17 00:00:00 2001
From: Andy Shevchenko <andy.shevchenko at gmail.com>
Date: Tue, 19 Jan 2010 23:25:43 +0200
Subject: [PATCH 20/32] Add context menu support in the dock (v2)

Changes from original patch:
* Removed unnecessary braces
* Method prototypes are defined in headers and included throught them
* Minor clean up of code

Originally patch was observed here:
http://people.freebsd.org/~novel/patches/non-freebsd/logjam_docklet_context_menu.diff

Signed-off-by: Andy Shevchenko <andy.shevchenko at gmail.com>
---
 src/docklet.c |   58 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++-
 src/menu.c    |    2 +-
 src/menu.h    |    1 +
 3 files changed, 59 insertions(+), 2 deletions(-)

diff --git a/src/docklet.c b/src/docklet.c
index ccf40bf..2a1d2da 100644
--- a/src/docklet.c
+++ b/src/docklet.c
@@ -8,19 +8,75 @@
 
 #include "gtk-all.h"
 
+#include "jam.h"		/* jam_quit() */
 #include "conf.h"
 #include "eggtrayicon.h"
+#include "about.h"		/* about_dlg() */
+#include "menu.h"		/* menu_friends_manager() */
+#include "settings.h"	/* settings_run() */
 
 static void
 docklet_destroy_cb(GtkWidget *widget) {
 	app.docklet = NULL;
 }
 
+static void
+docklet_menu(GtkWidget *win) {
+	static GtkWidget *menu = NULL;
+	GtkWidget *entry;
+	GtkWidget *menuitem;
+	GtkWidget *image;
+
+	if (menu) {
+		gtk_widget_destroy(menu);
+	}
+
+	menu = gtk_menu_new();
+
+	/* About... */
+	menuitem = gtk_image_menu_item_new_with_mnemonic(_("About LogJam..."));
+	image = gtk_image_new_from_stock("logjam-goat", GTK_ICON_SIZE_MENU);
+	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+	g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(about_dlg), win);
+	gtk_widget_show_all(menuitem);
+
+	/* Friends... */
+	menuitem = gtk_menu_item_new_with_mnemonic(_("Friends..."));
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+	g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(menu_friends_manager), win);
+	gtk_widget_show_all(menuitem);
+
+	/* Preferences... */
+	menuitem = gtk_image_menu_item_new_with_mnemonic(_("Preferences..."));
+	image = gtk_image_new_from_stock(GTK_STOCK_PREFERENCES, GTK_ICON_SIZE_MENU);
+	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+	g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(settings_run), win);
+	gtk_widget_show_all(menuitem);
+
+	/* -------------- */
+	menuitem = gtk_separator_menu_item_new();
+	gtk_widget_show(menuitem);
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+
+	/* Quit */
+	menuitem = gtk_image_menu_item_new_with_mnemonic(_("Quit"));
+	image = gtk_image_new_from_stock(GTK_STOCK_QUIT, GTK_ICON_SIZE_MENU);
+	gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(menuitem), image);
+	gtk_menu_shell_append(GTK_MENU_SHELL(menu), menuitem);
+	g_signal_connect_swapped(G_OBJECT(menuitem), "activate", G_CALLBACK(jam_quit), win);
+	gtk_widget_show_all(menuitem);
+
+	gtk_widget_show_all(menu);
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, 0, gtk_get_current_event_time());
+}
+
 static gboolean
 click_cb(GtkWidget* w, GdkEventButton *ev, GtkWidget *win) {
 	/* right-clicks start context menu (note: this case is terminal) */
 	if (ev->button == 3) {
-		//cf_context_menu(cfi, ev);
+		docklet_menu(win);
 		return TRUE;
 	}
 
diff --git a/src/menu.c b/src/menu.c
index 5cdd37e..6ca6e23 100644
--- a/src/menu.c
+++ b/src/menu.c
@@ -295,7 +295,7 @@ menu_console(JamWin *jw) {
 	console_dialog_run(GTK_WINDOW(jw), JAM_ACCOUNT_LJ(jw->account));
 }
 
-static void
+void
 menu_friends_manager(JamWin *jw) {
 	g_assert(JAM_ACCOUNT_IS_LJ(jw->account));
 	friends_manager_show(GTK_WINDOW(jw), JAM_ACCOUNT_LJ(jw->account));
diff --git a/src/menu.h b/src/menu.h
index 1d60a4f..39ac8c6 100644
--- a/src/menu.h
+++ b/src/menu.h
@@ -9,6 +9,7 @@
 
 #include "jam.h"
 
+void menu_friends_manager(JamWin *jw);
 GtkWidget* menu_make_bar(JamWin *jw);
 
 void menu_new_doc(JamWin *jw);
-- 
1.7.0


logjam-4.5.3-fix-implicit-DSO.patch:
 configure.in |    2 ++
 1 file changed, 2 insertions(+)

--- NEW FILE logjam-4.5.3-fix-implicit-DSO.patch ---
diff -up logjam-git/configure.in.BAD logjam-git/configure.in
--- logjam-git/configure.in.BAD	2010-02-18 16:39:39.873640343 -0500
+++ logjam-git/configure.in	2010-02-18 16:39:43.690774897 -0500
@@ -15,6 +15,8 @@ AC_CACHE_SAVE
 
 AC_CHECK_HEADERS([regex.h])
 
+AC_CHECK_LIB(X11, XFlush)
+
 dnl Check for gettext.
 GETTEXT_PACKAGE=logjam
 AC_SUBST(GETTEXT_PACKAGE)

0001-Add-possibility-to-insert-link-by-nickname.patch:
 link-journal.c |   35 +++++++++++++++++++++++++++++++++--
 1 file changed, 33 insertions(+), 2 deletions(-)

Index: 0001-Add-possibility-to-insert-link-by-nickname.patch
===================================================================
RCS file: /cvs/pkgs/rpms/logjam/F-13/0001-Add-possibility-to-insert-link-by-nickname.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -p -r1.1 -r1.2
--- 0001-Add-possibility-to-insert-link-by-nickname.patch	24 Aug 2009 16:31:04 -0000	1.1
+++ 0001-Add-possibility-to-insert-link-by-nickname.patch	18 Feb 2010 21:55:35 -0000	1.2
@@ -1,18 +1,20 @@
-From 43ff911da0f0d81a264bc52e8db565e0fb52c2af Mon Sep 17 00:00:00 2001
+From 90f888a78488448961516f218fd1168faa5156be Mon Sep 17 00:00:00 2001
 From: Andy Shevchenko <andy.shevchenko at gmail.com>
-Date: Sat, 2 May 2009 15:56:28 +0300
-Subject: [PATCH] Add possibility to insert link by nickname
+Date: Sat, 9 May 2009 15:55:27 +0300
+Subject: [PATCH 30/32] Add possibility to insert link by nickname
 
 Originally patch was found here:
 	http://people.freebsd.org/~novel/patches/non-freebsd/logjam452_userlink.diff
 
+Slightly optimized.
+
 Signed-off-by: Andy Shevchenko <andy.shevchenko at gmail.com>
 ---
- src/link-journal.c |   44 +++++++++++++++++++++++++++++++++++++++++++-
- 1 files changed, 43 insertions(+), 1 deletions(-)
+ src/link-journal.c |   34 +++++++++++++++++++++++++++++++++-
+ 1 files changed, 33 insertions(+), 1 deletions(-)
 
 diff --git a/src/link-journal.c b/src/link-journal.c
-index d70e70d..ec47e2d 100644
+index d70e70d..ae2d3e3 100644
 --- a/src/link-journal.c
 +++ b/src/link-journal.c
 @@ -44,11 +44,12 @@ make_usertype_omenu() {
@@ -49,40 +51,30 @@ index d70e70d..ec47e2d 100644
  	usertype = gtk_option_menu_get_history(GTK_OPTION_MENU(omenu));
  	gtk_widget_destroy(dlg);
  	if (username[0] == 0) {
-@@ -102,6 +109,41 @@ link_journal_dialog_run(GtkWindow *win, JamDoc *doc) {
+@@ -102,6 +109,31 @@ link_journal_dialog_run(GtkWindow *win, JamDoc *doc) {
  		gtk_text_buffer_get_iter_at_mark(buffer, &start,
  				gtk_text_buffer_get_insert(buffer));
  
 +	if (usernick && *usernick) {
 +		gchar *link;
-+		gchar *img;
 +		JamAccount *acc = jam_doc_get_account(doc);
++		gchar *url = jam_account_lj_get_server(JAM_ACCOUNT_LJ(acc))->url;
 +
 +		xml_escape(&username);
 +		xml_escape(&usernick);
 +
-+		if (usertype == 0)
-+			img = g_strdup("userinfo.gif");
-+		else
-+			img = g_strdup("community.gif");
-+
 +		link = g_strdup_printf(
 +			"<a href='%s/userinfo.bml?user=%s'>"
 +				"<img src='%s/img/%s' alt='[info]' align='absmiddle' width='17' height='17' border='0' />"
 +			"</a>"
 +			"<a style='FONT-WEIGHT: 800' href='%s/users/%s'>%s</a>",
-+			jam_account_lj_get_server(JAM_ACCOUNT_LJ(acc))->url,
-+			username,
-+			jam_account_lj_get_server(JAM_ACCOUNT_LJ(acc))->url,
-+			img,
-+			jam_account_lj_get_server(JAM_ACCOUNT_LJ(acc))->url,
-+			username,
-+			usernick);
++			url, username,
++				url, usertype == 0 ? "userinfo.gif" : "community.gif",
++			url, username, usernick);
 +
 +		gtk_text_buffer_insert(buffer, &start, link, -1);
 +
 +		g_free(link);
-+		g_free(img);
 +		free(username);
 +		free(usernick);
 +		return;
@@ -92,5 +84,5 @@ index d70e70d..ec47e2d 100644
  	if (usertype == 0)
  		gtk_text_buffer_insert(buffer, &start, "user=\"", -1);
 -- 
-1.6.4
+1.7.0
 


Index: logjam.spec
===================================================================
RCS file: /cvs/pkgs/rpms/logjam/F-13/logjam.spec,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -p -r1.58 -r1.59
--- logjam.spec	24 Aug 2009 16:31:04 -0000	1.58
+++ logjam.spec	18 Feb 2010 21:55:35 -0000	1.59
@@ -2,7 +2,7 @@
 
 Name:		logjam
 Version:	4.5.3
-Release:	36%{?dist}
+Release:	37%{?dist}
 Epoch:		1
 Summary:	GTK2 client for LiveJournal
 License:	GPLv2+
@@ -26,7 +26,8 @@ BuildRequires:	dbus-devel, perl(YAML)
 Obsoletes:	loserjabber, logjam-gnome
 BuildRoot:	%{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
 Patch1:		logjam-4.4.1-fedora-desktop.patch
-Patch2:		http://people.freebsd.org/~novel/patches/non-freebsd/logjam_docklet_context_menu.diff
+# From: http://github.com/andy-shev/LogJam/commit/7e6f867b0bbef8ea139d895a8915d6ec93c1cbe7
+Patch2:		0001-Add-context-menu-support-in-the-dock-v2.patch
 Patch3:		logjam-4.5.3-disable-threads.patch
 Patch4:		0001-Adds-titles-to-links-and-images-and-link-to-images.patch
 Patch5:		logjam-4.5.3-tags.patch
@@ -36,16 +37,19 @@ Patch8:		logjam-4.5.3-close_when_send.pa
 Patch9:		logjam-4.5.3-showloginhistory.patch
 Patch10:	logjam-4.5.3-libtool.patch
 Patch11:	logjam-4.5.3-keep-drafts.patch
-Patch12:	logjam-4.5.3-mpris.diff
+# From: http://github.com/andy-shev/LogJam/commit/615b08e85e121433b518c497a82164ebcaa0d171
+Patch12:	0001-Add-MPRIS-support-to-detect-current-music-v2.patch
 Patch13:	logjam-4.5.3-save-tags.diff
 # From: http://github.com/andy-shev/LogJam/commit/1426ae5af7f0c1ba4084f0ce0e0b63c43c763dc7
 Patch14:	0001-Add-support-of-the-User-Agent-header.patch
 # From: http://github.com/andy-shev/LogJam/commit/7ab07309963ac85c42ab7f235ac39189091a2718
 Patch15:	0001-Add-Location-support-to-the-logjam.patch
-# From: http://github.com/andy-shev/LogJam/commit/43ff911da0f0d81a264bc52e8db565e0fb52c2af
+# From: http://github.com/andy-shev/LogJam/commit/90f888a78488448961516f218fd1168faa5156be
 Patch16:	0001-Add-possibility-to-insert-link-by-nickname.patch
 # From: http://github.com/andy-shev/LogJam/commit/bbe8da1dd21a193d232e6b63ed37cb30ea2068ca
 Patch17:	0001-Add-automake-1.11-to-autogen.sh.patch
+# Fix implicit DSO linking issue
+Patch18:	logjam-4.5.3-fix-implicit-DSO.patch
 
 %description
 This is the new GTK2 client for LiveJournal (http://www.livejournal.com).
@@ -84,6 +88,7 @@ current music from XMMS.
 %patch15 -p1 -b .location
 %patch16 -p1 -b .link-by-nickname
 %patch17 -p1 -b .automake111
+%patch18 -p1 -b .DSO
 
 %if 0%{fedora} >= 10
 libtoolize
@@ -136,6 +141,10 @@ desktop-file-install --vendor fedora    
 rm -rf $RPM_BUILD_ROOT
 
 %changelog
+* Thu Feb 18 2010 Tom "spot" Callaway <tcallawa at redhat.com> - 1:4.5.3-37
+- update Patch2, Patch12, Patch16 (Andy Shevchenko) (bz 556971)
+- fix implicit DSO linking issue (bz 565012)
+
 * Mon Aug 24 2009 Tom "spot" Callaway <tcallawa at redhat.com> - 1:4.5.3-36
 - use properly formed user-agent string (Andy Shevchenko) (bz 518757)
 - rebase to git master (bz 518758)



More information about the scm-commits mailing list