rpms/logjam/EL-5 logjam-4.5.3-close_when_send.patch, NONE, 1.1 logjam-4.5.3-disable-threads.patch, NONE, 1.1 logjam-4.5.3-keep-drafts.patch, NONE, 1.1 logjam-4.5.3-libtool.patch, NONE, 1.1 logjam-4.5.3-mpris.diff, NONE, 1.1 logjam-4.5.3-no_quit_when_docked.patch, NONE, 1.1 logjam-4.5.3-save-tags.diff, NONE, 1.1 logjam-4.5.3-showloginhistory.patch, NONE, 1.1 logjam-4.5.3-start_in_dock.patch, NONE, 1.1 logjam-4.5.3-tags.patch, NONE, 1.1

Tom Callaway spot at fedoraproject.org
Mon Aug 24 16:32:22 UTC 2009


Author: spot

Update of /cvs/pkgs/rpms/logjam/EL-5
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv3170/EL-5

Added Files:
	logjam-4.5.3-close_when_send.patch 
	logjam-4.5.3-disable-threads.patch 
	logjam-4.5.3-keep-drafts.patch logjam-4.5.3-libtool.patch 
	logjam-4.5.3-mpris.diff logjam-4.5.3-no_quit_when_docked.patch 
	logjam-4.5.3-save-tags.diff 
	logjam-4.5.3-showloginhistory.patch 
	logjam-4.5.3-start_in_dock.patch logjam-4.5.3-tags.patch 
Log Message:
get logjam working again

logjam-4.5.3-close_when_send.patch:
 conf.h     |    1 +
 conf_xml.c |    2 ++
 jam.c      |    8 ++++++++
 settings.c |    6 ++++++
 4 files changed, 17 insertions(+)

--- NEW FILE logjam-4.5.3-close_when_send.patch ---
diff -up logjam-4.5.3/src/jam.c.close-when-send logjam-4.5.3/src/jam.c
--- logjam-4.5.3/src/jam.c.close-when-send	2008-05-18 09:12:19.000000000 +0300
+++ logjam-4.5.3/src/jam.c	2008-05-18 10:31:30.000000000 +0300
@@ -363,6 +363,10 @@ action_cb(GtkWidget *w, JamWin *jw) {
 	} else {
 		g_warning("action callback, but no default action?\n");
 	}
+#ifdef USE_DOCK
+	if (conf.options.close_when_send && app.docklet)
+		gtk_widget_hide(GTK_WIDGET(jw));
+#endif
 }
 
 static void
@@ -395,6 +399,10 @@ delete_cb(GtkWidget *w, JamWin *jw) {
 	} else {
 		delete_server_entry(jw);
 	}
+#ifdef USE_DOCK
+	if (conf.options.close_when_send && app.docklet)
+		gtk_widget_hide(GTK_WIDGET(jw));
+#endif
 }
 
 static void
diff -up logjam-4.5.3/src/conf_xml.c.close-when-send logjam-4.5.3/src/conf_xml.c
--- logjam-4.5.3/src/conf_xml.c.close-when-send	2008-05-18 09:12:19.000000000 +0300
+++ logjam-4.5.3/src/conf_xml.c	2008-05-18 09:49:33.000000000 +0300
@@ -183,6 +183,7 @@ parseoptions(Configuration *c, xmlDocPtr
 		READOPTION(autosave)
 		READOPTION(cfautostart)
 		READOPTION(cfusemask)
+		READOPTION(close_when_send)
 		READOPTION(docklet)
 		READOPTION(start_in_dock)
 		READOPTION(cffloat)
@@ -326,6 +327,7 @@ writeoptions(Options *options, xmlNodePt
 	WRITEOPTION(autosave);
 	WRITEOPTION(cfautostart);
 	WRITEOPTION(cfusemask);
+	WRITEOPTION(close_when_send);
 	WRITEOPTION(docklet);
 	WRITEOPTION(start_in_dock);
 	WRITEOPTION(cffloatraise);
diff -up logjam-4.5.3/src/settings.c.close-when-send logjam-4.5.3/src/settings.c
--- logjam-4.5.3/src/settings.c.close-when-send	2008-05-18 09:12:19.000000000 +0300
+++ logjam-4.5.3/src/settings.c	2008-05-18 09:56:35.000000000 +0300
@@ -85,6 +85,8 @@ static SettingsWidget settingswidgets[] 
 	{ "ui_font", &conf.uifont,
 		SW_CUSTOM, N_("Entry display font:") },
 #ifndef G_OS_WIN32
+	{ "ui_close_when_send", &conf.options.close_when_send,
+		SW_TOGGLE, N_("Close main window after sending") },
 	{ "ui_docklet", &conf.options.docklet,
 		SW_TOGGLE, N_("Add icon to system _tray (for GNOME/KDE/etc. dock)") },
 	{ "ui_start_in_dock", &conf.options.start_in_dock,
@@ -397,6 +399,10 @@ uisettings(JamWin *jw) {
 			G_CALLBACK(sec_changed_cb), sw);
 	groupedbox_pack(GROUPEDBOX(post), sw_make("ui_defaultsecurity"), FALSE);
 
+#ifdef USE_DOCK
+	groupedbox_pack(GROUPEDBOX(post), sw_make("ui_close_when_send"), FALSE);
+#endif /* USE_DOCK */
+
 	entry = groupedbox_new_with_text(_("Entries"));
 	gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
 
diff -up logjam-4.5.3/src/conf.h.close-when-send logjam-4.5.3/src/conf.h
--- logjam-4.5.3/src/conf.h.close-when-send	2008-05-18 09:12:19.000000000 +0300
+++ logjam-4.5.3/src/conf.h	2008-05-18 09:52:36.000000000 +0300
@@ -51,6 +51,7 @@ typedef struct {
 	gboolean autosave;
 	gboolean cfautostart;
 	gboolean cfusemask;
+	gboolean close_when_send;
 	gboolean docklet;
 	gboolean cffloat;
 	gboolean cffloatraise;

logjam-4.5.3-disable-threads.patch:
 history.c      |    4 ++++
 init.c         |    4 ++--
 network-fork.c |    1 +
 3 files changed, 7 insertions(+), 2 deletions(-)

--- NEW FILE logjam-4.5.3-disable-threads.patch ---
diff -up logjam-4.5.3/src/init.c.BAD logjam-4.5.3/src/init.c
--- logjam-4.5.3/src/init.c.BAD	2008-03-11 14:48:18.000000000 -0400
+++ logjam-4.5.3/src/init.c	2008-03-11 14:49:35.000000000 -0400
@@ -177,13 +177,13 @@ setup_locales() {
 
 static void
 setup_glibgdk() {
-#ifdef HAVE_GTK
+#if defined (HAVE_GTK) && defined (G_OS_WIN32)
 	/* calls to these thread inits must happen before any other
 	 * g* calls. */
 	if (!g_thread_supported()) g_thread_init(NULL);
 	gdk_threads_init();
 	gdk_threads_enter();
-#endif /* HAVE_GTK */
+#endif /* HAVE_GTK && G_OS_WIN32 */
 
 	g_type_init();
 
diff -up logjam-4.5.3/src/history.c.BAD logjam-4.5.3/src/history.c
--- logjam-4.5.3/src/history.c.BAD	2008-03-18 16:02:18.000000000 -0400
+++ logjam-4.5.3/src/history.c	2008-03-18 16:02:36.000000000 -0400
@@ -368,9 +368,13 @@ hc_show_current(history_calendar_dlg *hc
 
 static gint
 hc_list_click_idle_cb(gpointer d) {
+#if defined (G_OS_WIN32)
 	gdk_threads_enter();
+#endif
 	hc_show_current(d);
+#if defined (G_OS_WIN32)
 	gdk_threads_leave();
+#endif
 	return FALSE;
 }
 	
diff -up logjam-4.5.3/src/network-fork.c.hack logjam-4.5.3/src/network-fork.c
--- logjam-4.5.3/src/network-fork.c.hack	2008-03-18 16:31:40.000000000 -0400
+++ logjam-4.5.3/src/network-fork.c	2008-03-18 16:32:06.000000000 -0400
@@ -171,6 +171,7 @@ net_post_mainloop(const char *url, GSLis
 		GString *response;
 		GError *err = NULL;
 
+        	if (!g_thread_supported ()) g_thread_init (NULL);
 		response = net_post_blocking(url, headers, post, fork_cb, &forkdata, &err);
 		if (response == NULL) {
 			int len = strlen(err->message);

logjam-4.5.3-keep-drafts.patch:
 conf.h     |    1 +
 conf_xml.c |    2 ++
 jam.c      |    2 +-
 settings.c |    6 ++++++
 4 files changed, 10 insertions(+), 1 deletion(-)

--- NEW FILE logjam-4.5.3-keep-drafts.patch ---
diff -up logjam-4.5.3/src/conf.h.keep_drafts logjam-4.5.3/src/conf.h
--- logjam-4.5.3/src/conf.h.keep_drafts	2009-04-02 13:06:49.000000000 -0400
+++ logjam-4.5.3/src/conf.h	2009-04-02 13:08:45.000000000 -0400
@@ -62,6 +62,7 @@ typedef struct {
 	gboolean showloginhistory;
 	gboolean showmeta[JAM_VIEW_META_COUNT];
 	gboolean start_in_dock;
+	gboolean keepsaveddrafts;
 #endif /* HAVE_GTK */
 } Options;
 
diff -up logjam-4.5.3/src/conf_xml.c.keep_drafts logjam-4.5.3/src/conf_xml.c
--- logjam-4.5.3/src/conf_xml.c.keep_drafts	2009-04-02 13:06:49.000000000 -0400
+++ logjam-4.5.3/src/conf_xml.c	2009-04-02 13:08:15.000000000 -0400
@@ -181,6 +181,7 @@ parseoptions(Configuration *c, xmlDocPtr
 #endif
 		READOPTION(revertusejournal)
 		READOPTION(autosave)
+		READOPTION(keepsaveddrafts)
 		READOPTION(cfautostart)
 		READOPTION(cfusemask)
 		READOPTION(close_when_send)
@@ -326,6 +327,7 @@ writeoptions(Options *options, xmlNodePt
 #endif
 	WRITEOPTION(revertusejournal);
 	WRITEOPTION(autosave);
+	WRITEOPTION(keepsaveddrafts);
 	WRITEOPTION(cfautostart);
 	WRITEOPTION(cfusemask);
 	WRITEOPTION(close_when_send);
diff -up logjam-4.5.3/src/jam.c.keep_drafts logjam-4.5.3/src/jam.c
--- logjam-4.5.3/src/jam.c.keep_drafts	2009-04-02 13:06:49.000000000 -0400
+++ logjam-4.5.3/src/jam.c	2009-04-02 13:06:49.000000000 -0400
@@ -340,7 +340,7 @@ jam_submit_entry(JamWin *jw) {
 	ctx = net_ctx_gtk_new(GTK_WINDOW(jw), NULL);
 	if (jam_host_do_post(jam_account_get_host(acc), ctx, jw->doc, NULL)) {
 		gint type = jam_doc_get_entry_type(jw->doc);
-		if (type == ENTRY_DRAFT) {
+		if (type == ENTRY_DRAFT && !conf.options.keepsaveddrafts) {
 			if (jam_confirm(GTK_WINDOW(jw),
 					_("Delete"), _("Delete this draft from disk?")))
 				delete_draft(jw);
diff -up logjam-4.5.3/src/settings.c.keep_drafts logjam-4.5.3/src/settings.c
--- logjam-4.5.3/src/settings.c.keep_drafts	2009-04-02 13:06:49.000000000 -0400
+++ logjam-4.5.3/src/settings.c	2009-04-02 13:06:49.000000000 -0400
@@ -74,6 +74,10 @@ static SettingsWidget settingswidgets[] 
 
 	{ "ui_allowmultipleinstances", &conf.options.allowmultipleinstances,
 		SW_TOGGLE, N_("Allow multiple _instances of LogJam to run simultaneously") },
+	
+	{ "ui_keepsaveddrafts", &conf.options.keepsaveddrafts, 
+		SW_TOGGLE, N_("_Keep saved drafts after posting") },
+	
 #ifdef HAVE_GTKSPELL
 	{ "ui_spellcheck", &conf.options.usespellcheck, 
 		SW_TOGGLE, N_("_Use spell check") },
@@ -409,6 +413,8 @@ uisettings(JamWin *jw) {
 	gtk_box_pack_start(GTK_BOX(vbox), entry, FALSE, FALSE, 0);
 
 	groupedbox_pack(GROUPEDBOX(entry), sw_make("ui_autosave"), FALSE);
+	
+	groupedbox_pack(GROUPEDBOX(entry), sw_make("ui_keepsaveddrafts"), FALSE);
 
 #ifdef HAVE_GTKSPELL
 	{

logjam-4.5.3-libtool.patch:
 Makefile.am  |    1 +
 configure.in |    1 +
 2 files changed, 2 insertions(+)

--- NEW FILE logjam-4.5.3-libtool.patch ---
diff -up logjam-4.5.3/configure.in.libtool logjam-4.5.3/configure.in
--- logjam-4.5.3/configure.in.libtool	2009-02-16 12:03:43.000000000 -0500
+++ logjam-4.5.3/configure.in	2009-02-16 12:04:00.000000000 -0500
@@ -1,5 +1,6 @@
 AC_PREREQ(2.52)
 AC_INIT(logjam, 4.5.3, evan at livejournal.com)
+AC_CONFIG_MACRO_DIR([m4])
 AC_CANONICAL_SYSTEM
 AM_INIT_AUTOMAKE
 AC_CONFIG_SRCDIR(src/jam.c)
diff -up logjam-4.5.3/Makefile.am.libtool logjam-4.5.3/Makefile.am
--- logjam-4.5.3/Makefile.am.libtool	2005-02-21 12:46:10.000000000 -0500
+++ logjam-4.5.3/Makefile.am	2009-02-16 12:03:44.000000000 -0500
@@ -1,4 +1,5 @@
 AUTOMAKE_OPTIONS = dist-bzip2
+ACLOCAL_AMFLAGS = -I m4
 
 if WITH_GTK
 MAYBE_IMAGES = images

logjam-4.5.3-mpris.diff:
 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   |  244 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
 src/lj_dbus.h   |   68 +++++++++++++++
 src/music.c     |    3 
 src/music.h     |    3 
 src/settings.c  |   58 +++++++++++--
 11 files changed, 405 insertions(+), 13 deletions(-)

--- NEW FILE logjam-4.5.3-mpris.diff ---
diff -up logjam-4.5.3/configure.in.dbus logjam-4.5.3/configure.in
--- logjam-4.5.3/configure.in.dbus	2009-04-22 23:46:38.000000000 +0300
+++ logjam-4.5.3/configure.in	2009-04-23 00:38:34.000000000 +0300
@@ -220,6 +220,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 -up logjam-4.5.3/src/conf.h.dbus logjam-4.5.3/src/conf.h
--- logjam-4.5.3/src/conf.h.dbus	2009-04-22 23:46:38.000000000 +0300
+++ logjam-4.5.3/src/conf.h	2009-04-23 22:10:14.000000000 +0300
@@ -92,6 +92,7 @@ typedef struct {
 	char *spawn_command;
 
 	char *music_command;
+	gboolean music_mpris;
 
 	char *proxy;
 	char *proxyuser, *proxypass;
diff -up logjam-4.5.3/src/conf_xml.c.dbus logjam-4.5.3/src/conf_xml.c
--- logjam-4.5.3/src/conf_xml.c.dbus	2009-04-23 22:19:10.000000000 +0300
+++ logjam-4.5.3/src/conf_xml.c	2009-04-24 15:40:45.000000000 +0300
@@ -257,6 +257,7 @@ parseconf(xmlDocPtr doc, xmlNodePtr node
 		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 -up logjam-4.5.3/src/init.c.dbus logjam-4.5.3/src/init.c
--- logjam-4.5.3/src/init.c.dbus	2009-04-22 23:46:38.000000000 +0300
+++ logjam-4.5.3/src/init.c	2009-04-25 11:56:05.000000000 +0300
@@ -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 -up logjam-4.5.3/src/jamview.c.dbus logjam-4.5.3/src/jamview.c
--- logjam-4.5.3/src/jamview.c.dbus	2009-04-25 13:39:45.000000000 +0300
+++ logjam-4.5.3/src/jamview.c	2009-04-25 14:27:56.000000000 +0300
@@ -20,6 +20,7 @@
 #include "marshalers.h"
 #include "datesel.h"
 #include "tags.h"
+#include "lj_dbus.h"
 
 #define KEY_PICTUREKEYWORD "logjam-picturekeyword"
 
@@ -356,7 +357,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);
@@ -373,7 +379,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 -up logjam-4.5.3/src/lj_dbus.c.dbus logjam-4.5.3/src/lj_dbus.c
--- logjam-4.5.3/src/lj_dbus.c.dbus	2009-04-25 13:40:31.000000000 +0300
+++ logjam-4.5.3/src/lj_dbus.c	2009-04-25 14:21:30.000000000 +0300
@@ -0,0 +1,244 @@
+/* logjam - a GTK client for LiveJournal.
+ * Copyright (C) 2009 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;
+
+	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);
+	player->proxy = dbus_g_proxy_new_for_name(jd->bus, dest, "/Player", MPRIS_IF);
+
+	if (g_str_has_suffix(dest, "audacious"))
+		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 -up logjam-4.5.3/src/lj_dbus.h.dbus logjam-4.5.3/src/lj_dbus.h
--- logjam-4.5.3/src/lj_dbus.h.dbus	2009-04-25 13:40:36.000000000 +0300
+++ logjam-4.5.3/src/lj_dbus.h	2009-04-25 14:25:27.000000000 +0300
@@ -0,0 +1,68 @@
+/* logjam - a GTK client for LiveJournal.
+ * Copyright (C) 2009 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 *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 -up logjam-4.5.3/src/Makefile.am.dbus logjam-4.5.3/src/Makefile.am
--- logjam-4.5.3/src/Makefile.am.dbus	2009-04-23 00:44:11.000000000 +0300
+++ logjam-4.5.3/src/Makefile.am	2009-04-24 15:59:08.000000000 +0300
@@ -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.
           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 -up logjam-4.5.3/src/music.c.dbus logjam-4.5.3/src/music.c
--- logjam-4.5.3/src/music.c.dbus	2009-04-22 23:46:38.000000000 +0300
+++ logjam-4.5.3/src/music.c	2009-04-25 01:11:29.000000000 +0300
@@ -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 -up logjam-4.5.3/src/music.h.dbus logjam-4.5.3/src/music.h
--- logjam-4.5.3/src/music.h.dbus	2005-02-21 20:30:27.000000000 +0200
+++ logjam-4.5.3/src/music.h	2009-04-25 01:05:55.000000000 +0300
@@ -8,6 +8,9 @@
 #define music_h
 
 #include "conf.h" /* CommandList */
+#include "lj_dbus.h"
+
+extern JamDBus *jdbus;
 
 typedef enum {
 	MUSIC_SOURCE_NONE,
diff -up logjam-4.5.3/src/settings.c.dbus logjam-4.5.3/src/settings.c
--- logjam-4.5.3/src/settings.c.dbus	2009-04-25 13:41:03.000000000 +0300
+++ logjam-4.5.3/src/settings.c	2009-04-25 15:19:42.000000000 +0300
@@ -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, Gtk
 }
 
 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);

logjam-4.5.3-no_quit_when_docked.patch:
 jam.c |    5 +++++
 1 file changed, 5 insertions(+)

--- NEW FILE logjam-4.5.3-no_quit_when_docked.patch ---
diff -up logjam-4.5.3/src/jam.c.no_quit_when_docked logjam-4.5.3/src/jam.c
--- logjam-4.5.3/src/jam.c.no_quit_when_docked	2008-07-28 13:55:37.000000000 -0400
+++ logjam-4.5.3/src/jam.c	2008-07-28 14:00:57.000000000 -0400
@@ -757,6 +757,11 @@ jam_quit(JamWin *jw) {
 
 static gboolean
 delete_event_cb(JamWin *jw) {
+#ifdef USE_DOCK
+	if (app.docklet)
+		gtk_widget_hide(GTK_WIDGET(jw));
+	else
+#endif
 	jam_quit(jw);
 	return TRUE; /* don't ever let this delete the window; quit will do it. */
 }

logjam-4.5.3-save-tags.diff:
 jamview.c |    3 +-
 tags.c    |   74 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++----
 tags.h    |    2 -
 3 files changed, 73 insertions(+), 6 deletions(-)

--- NEW FILE logjam-4.5.3-save-tags.diff ---
diff -up logjam-4.5.3/src/jamview.c.save logjam-4.5.3/src/jamview.c
--- logjam-4.5.3/src/jamview.c.save	2009-04-26 10:26:39.000000000 +0300
+++ logjam-4.5.3/src/jamview.c	2009-04-26 10:28:00.000000000 +0300
@@ -418,7 +424,8 @@ tags_select_cb(JamView *view) {
 
   tags = tags_dialog(toplevel,
 		     JAM_ACCOUNT_LJ(view->account), 
-		     jam_doc_get_usejournal(view->doc));
+		     jam_doc_get_usejournal(view->doc),
+		     (gchar *) gtk_entry_get_text(GTK_ENTRY(view->tags)));
 
   if (tags) {
       gtk_entry_set_text(GTK_ENTRY(view->tags), tags);
diff -up logjam-4.5.3/src/tags.c.save logjam-4.5.3/src/tags.c
--- logjam-4.5.3/src/tags.c.save	2009-04-26 10:05:38.000000000 +0300
+++ logjam-4.5.3/src/tags.c	2009-04-26 15:15:13.000000000 +0300
@@ -78,8 +78,23 @@ create_tag_string (GtkTreeModel *model,
   return FALSE;
 }
 
+static void
+tags_set_fg(GtkTreeViewColumn *column, GtkCellRenderer *cell,
+	    GtkTreeModel *model, GtkTreeIter *iter, gpointer data)
+{
+  GSList *prev = (GSList *) data;
+  gchar *text;
+
+  gtk_tree_model_get(model, iter, 1, &text, -1);
+  if (prev && g_slist_find_custom(prev, text, g_utf8_collate))
+    g_object_set(G_OBJECT(cell), "foreground", "Red", NULL);
+  else
+    g_object_set(G_OBJECT(cell), "foreground", "Black", NULL);
+  g_free(text);
+}
+
 GtkWidget* 
-taglist_create (GSList *l)
+taglist_create (GSList *l, GSList **head)
 {
   GtkWidget *treeview;
   GtkListStore *store;
@@ -87,20 +102,37 @@ taglist_create (GSList *l)
   GtkCellRenderer *renderer;
   GtkTreeViewColumn *column;
   guint i;
+  GSList *prev = *head, *p;
 
   /* create model */
   store = gtk_list_store_new (2, G_TYPE_BOOLEAN, G_TYPE_STRING);
   for (i = 0; i < g_slist_length (l); i++)
     {
       LJTag *t = (LJTag *) g_slist_nth_data (l, i);
+      gboolean check = FALSE;
 
+      if (prev && (p = g_slist_find_custom(prev, t->tag, g_utf8_collate)) != NULL) {
+        check = TRUE;
+        prev = g_slist_remove_link(prev, p);
+        g_free(p->data);
+        g_slist_free1(p);
+      }
       gtk_list_store_append (store, &iter);
       gtk_list_store_set (store, &iter,
-			  0, FALSE,
+			  0, check,
 			  1, t->tag,
 			  -1);
     }
 
+  /* rest of the typed tags */
+  for (p = prev; p; p = g_slist_next(p)) {
+    gtk_list_store_append(store, &iter);
+    gtk_list_store_set(store, &iter,
+      		  0, TRUE,
+      		  1, p->data,
+      		  -1);
+  }
+
   /* create treeview */
   treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
   gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
@@ -120,20 +152,44 @@ taglist_create (GSList *l)
   column = gtk_tree_view_column_new_with_attributes (_("Tag name"), 
 						     renderer, "text", 1,
 						     NULL);
+
+  gtk_tree_view_column_set_cell_data_func(column, renderer, tags_set_fg,
+					  prev, NULL);
+
   gtk_tree_view_column_set_sort_column_id (column, 1);
   gtk_tree_view_append_column (treeview, column);
  
+  /* update head of the prev list */
+  *head = prev;
   g_object_unref (store);
 
   return treeview;
 }
 
+static GSList *
+tags_split(gchar *typed) {
+  GSList *head = NULL;
+  gchar **result, **p;
+
+  if (typed == NULL || *typed == '\0')
+    return NULL;
+
+  for (p = result = g_strsplit(typed, ",", 0); *p; p++) {
+    gchar *token = g_strstrip(*p);
+    if (*token)
+      head = g_slist_prepend(head, g_utf8_strdown(token, -1));
+  }
+  g_strfreev(result);
+  return head;
+}
+
 gchar* 
-tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal)
+tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal, gchar *typed)
 {
   GtkWidget *dlg, *sw, *tv;
   GSList *list = NULL;
   gchar *taglist = NULL;
+  GSList *prev;
 
   if (acc == NULL) return NULL;
 
@@ -156,7 +212,8 @@ tags_dialog (GtkWidget *win, JamAccountL
 				  GTK_POLICY_AUTOMATIC);
   gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), sw, TRUE, TRUE, 0);
 
-  tv = taglist_create (list);
+  prev = tags_split(typed);
+  tv = taglist_create (list, &prev);
   gtk_container_add (GTK_CONTAINER (sw), tv);
 
   gtk_window_resize(dlg, 60, 210);
@@ -177,5 +234,14 @@ tags_dialog (GtkWidget *win, JamAccountL
 
   gtk_widget_destroy (dlg);
   
+  /* free rest of prev list */
+  if (prev) {
+    GSList *p;
+    for (p = prev; p; p = g_slist_next(p)) {
+      g_free(p->data);
+    }
+    g_slist_free(prev);
+  }
+
   return taglist;
 }
diff -up logjam-4.5.3/src/tags.h.save logjam-4.5.3/src/tags.h
--- logjam-4.5.3/src/tags.h.save	2009-04-26 10:22:25.000000000 +0300
+++ logjam-4.5.3/src/tags.h	2009-04-26 10:22:03.000000000 +0300
@@ -1,6 +1,6 @@
 #ifndef _TAGS_H_
 #define _TAGS_H_
 
-gchar* tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal);
+gchar* tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal, gchar *typed);
 
 #endif /* _TAGS_H_ */

logjam-4.5.3-showloginhistory.patch:
 conf.h     |    1 +
 conf_xml.c |    2 ++
 login.c    |    3 +++
 settings.c |    3 +++
 4 files changed, 9 insertions(+)

--- NEW FILE logjam-4.5.3-showloginhistory.patch ---
diff -up logjam-4.5.3/src/conf.h.BAD logjam-4.5.3/src/conf.h
--- logjam-4.5.3/src/conf.h.BAD	2008-07-28 14:20:23.000000000 -0400
+++ logjam-4.5.3/src/conf.h	2008-07-28 14:21:08.000000000 -0400
@@ -59,6 +59,7 @@ typedef struct {
 	gboolean friends_hidestats;
 	gboolean allowmultipleinstances;
 	gboolean smartquotes;
+	gboolean showloginhistory;
 	gboolean showmeta[JAM_VIEW_META_COUNT];
 	gboolean start_in_dock;
 #endif /* HAVE_GTK */
diff -up logjam-4.5.3/src/conf_xml.c.BAD logjam-4.5.3/src/conf_xml.c
--- logjam-4.5.3/src/conf_xml.c.BAD	2008-07-28 14:19:17.000000000 -0400
+++ logjam-4.5.3/src/conf_xml.c	2008-07-28 14:20:16.000000000 -0400
@@ -191,6 +191,7 @@ parseoptions(Configuration *c, xmlDocPtr
 		READOPTION(friends_hidestats)
 		READOPTION(allowmultipleinstances)
 		READOPTION(smartquotes)
+		READOPTION(showloginhistory)
 
 		XML_GET_IF("showmeta", parseshowmeta(options, doc, node);)
 
@@ -335,6 +336,7 @@ writeoptions(Options *options, xmlNodePt
 	WRITEOPTION(friends_hidestats);
 	WRITEOPTION(allowmultipleinstances);
 	WRITEOPTION(smartquotes);
+	WRITEOPTION(showloginhistory);
 
 	writeshowmeta(options, node);
 #endif /* HAVE_GTK */
diff -up logjam-4.5.3/src/login.c.BAD logjam-4.5.3/src/login.c
--- logjam-4.5.3/src/login.c.BAD	2008-07-28 14:30:27.000000000 -0400
+++ logjam-4.5.3/src/login.c	2008-07-28 14:30:55.000000000 -0400
@@ -292,6 +292,9 @@ login_check_lastupdate(GtkWindow *parent
 	gboolean ret = TRUE;
 	JamAccount *acc = JAM_ACCOUNT(acclj);
 
+	if (!conf.options.showloginhistory)
+		return TRUE;
+
 	deltat = time(NULL) - acclj->lastupdate;
 	if (deltat < 2 * 7 * 24 * 60 * 60) /* two weeks. */
 		return TRUE;
diff -up logjam-4.5.3/src/settings.c.BAD logjam-4.5.3/src/settings.c
--- logjam-4.5.3/src/settings.c.BAD	2008-07-28 14:21:36.000000000 -0400
+++ logjam-4.5.3/src/settings.c	2008-07-28 14:24:59.000000000 -0400
@@ -80,6 +80,8 @@ static SettingsWidget settingswidgets[] 
 	{ "ui_spell_language", &conf.spell_language,
 		SW_TEXT, N_("Entry _language:") },
 #endif
+	{ "ui_showloginhistory", &conf.options.showloginhistory,
+		SW_TOGGLE, N_("Show login history (number of days since last login)") },
 	{ "ui_smartquotes", &conf.options.smartquotes,
 		SW_TOGGLE, N_("Automatically change _quotes to matching pairs") },
 	{ "ui_font", &conf.uifont,
@@ -430,6 +432,7 @@ uisettings(JamWin *jw) {
 	}
 #endif
 
+	groupedbox_pack(GROUPEDBOX(entry), sw_make("ui_showloginhistory"), TRUE);
 	groupedbox_pack(GROUPEDBOX(entry),
 			sw_make("ui_smartquotes"), FALSE);
 	

logjam-4.5.3-start_in_dock.patch:
 conf.h     |    1 +
 conf_xml.c |    2 ++
 jam.c      |    8 ++++++--
 settings.c |    3 +++
 4 files changed, 12 insertions(+), 2 deletions(-)

--- NEW FILE logjam-4.5.3-start_in_dock.patch ---
Allow start logjam in system tray (no main window at start).

diff -up logjam-4.5.3/src/conf_xml.c.orig logjam-4.5.3/src/conf_xml.c
--- logjam-4.5.3/src/conf_xml.c.orig	2008-05-11 14:35:48.000000000 +0300
+++ logjam-4.5.3/src/conf_xml.c	2008-05-11 14:55:24.000000000 +0300
@@ -184,6 +184,7 @@ parseoptions(Configuration *c, xmlDocPtr
 		READOPTION(cfautostart)
 		READOPTION(cfusemask)
 		READOPTION(docklet)
+		READOPTION(start_in_dock)
 		READOPTION(cffloat)
 		READOPTION(cffloatraise)
 		READOPTION(friends_hidestats)
@@ -326,6 +327,7 @@ writeoptions(Options *options, xmlNodePt
 	WRITEOPTION(cfautostart);
 	WRITEOPTION(cfusemask);
 	WRITEOPTION(docklet);
+	WRITEOPTION(start_in_dock);
 	WRITEOPTION(cffloatraise);
 	WRITEOPTION(cffloat);
 	WRITEOPTION(friends_hidestats);
diff -up logjam-4.5.3/src/jam.c.orig logjam-4.5.3/src/jam.c
--- logjam-4.5.3/src/jam.c.orig	2005-09-10 04:45:01.000000000 +0300
+++ logjam-4.5.3/src/jam.c	2008-05-11 14:56:59.000000000 +0300
@@ -832,8 +845,6 @@
 	gtk_widget_show(vbox);
 	jam_update_actions(jw);
 
-	gtk_widget_show(GTK_WIDGET(jw));
-
 	/* suck a bunch of events in. */
 	while (gtk_events_pending())
 		gtk_main_iteration();
@@ -853,7 +864,13 @@
 #ifdef USE_DOCK
 	if (conf.options.docklet)
 		docklet_setup(GTK_WINDOW(jw));
+
+	if (app.docklet) {
+		if (!conf.options.start_in_dock)
+			gtk_widget_show(GTK_WIDGET(jw));
+	} else
 #endif
+	gtk_widget_show(GTK_WIDGET(jw));
 
 	draftentry = jam_load_autosave(jw);
 	if (draftentry) {
diff -up logjam-4.5.3/src/conf.h.orig logjam-4.5.3/src/conf.h
--- logjam-4.5.3/src/conf.h.orig	2005-02-21 19:46:10.000000000 +0200
+++ logjam-4.5.3/src/conf.h	2008-05-11 14:54:16.000000000 +0300
@@ -59,6 +59,7 @@ typedef struct {
 	gboolean allowmultipleinstances;
 	gboolean smartquotes;
 	gboolean showmeta[JAM_VIEW_META_COUNT];
+	gboolean start_in_dock;
 #endif /* HAVE_GTK */
 } Options;
 
diff -up logjam-4.5.3/src/settings.c.orig logjam-4.5.3/src/settings.c
--- logjam-4.5.3/src/settings.c.orig	2005-02-21 20:31:21.000000000 +0200
+++ logjam-4.5.3/src/settings.c	2008-05-11 14:59:13.000000000 +0300
@@ -87,6 +87,8 @@ static SettingsWidget settingswidgets[] 
 #ifndef G_OS_WIN32
 	{ "ui_docklet", &conf.options.docklet,
 		SW_TOGGLE, N_("Add icon to system _tray (for GNOME/KDE/etc. dock)") },
+	{ "ui_start_in_dock", &conf.options.start_in_dock,
+		SW_TOGGLE, N_("Start in system tray") },
 #endif
 
 #ifndef G_OS_WIN32
@@ -460,6 +468,7 @@ uisettings(JamWin *jw) {
 	g_signal_connect(G_OBJECT(button), "toggled",
 			G_CALLBACK(docklet_change_cb), jw);
 	groupedbox_pack(GROUPEDBOX(misc), button, FALSE);
+	groupedbox_pack(GROUPEDBOX(misc), sw_make("ui_start_in_dock"), FALSE);
 #endif /* USE_DOCK */
 
 	return vbox;

logjam-4.5.3-tags.patch:
 protocol/liblivejournal/livejournal/Makefile.am   |    3 
 protocol/liblivejournal/livejournal/gettags.c     |   65 +++++++
 protocol/liblivejournal/livejournal/gettags.h     |   16 +
 protocol/liblivejournal/livejournal/livejournal.h |    1 
 protocol/liblivejournal/livejournal/tags.h        |   18 ++
 protocol/liblivejournal/livejournal/types.c       |   13 +
 src/Makefile.am                                   |    1 
 src/jamview.c                                     |   24 ++
 src/tags.c                                        |  181 ++++++++++++++++++++++
 src/tags.h                                        |    6 
 10 files changed, 327 insertions(+), 1 deletion(-)

--- NEW FILE logjam-4.5.3-tags.patch ---
diff -up /dev/null logjam-4.5.3/protocol/liblivejournal/livejournal/tags.h
--- /dev/null	2008-03-11 09:22:57.310023055 -0400
+++ logjam-4.5.3/protocol/liblivejournal/livejournal/tags.h	2008-03-11 17:53:46.000000000 -0400
@@ -0,0 +1,18 @@
+/* liblivejournal - a client library for LiveJournal.
+ * Copyright (C) 2003 Evan Martin <evan at livejournal.com>
+ *
+ * vim: tabstop=4 shiftwidth=4 noexpandtab :
+ */
+
+#ifndef __LIVEJOURNAL_TAGS_H__
+#define __LIVEJOURNAL_TAGS_H__
+
+typedef struct _LJTag {
+	char *tag;
+	guint32 count;
+} LJTag;
+
+LJTag *lj_tag_new(void);
+void   lj_tag_free(LJTag *t);
+
+#endif /* __LIVEJOURNAL_TAGS_H__ */
diff -up logjam-4.5.3/protocol/liblivejournal/livejournal/types.c.tags logjam-4.5.3/protocol/liblivejournal/livejournal/types.c
--- logjam-4.5.3/protocol/liblivejournal/livejournal/types.c.tags	2005-10-23 21:29:32.000000000 -0400
+++ logjam-4.5.3/protocol/liblivejournal/livejournal/types.c	2008-03-11 17:53:46.000000000 -0400
@@ -14,6 +14,7 @@
 
 #include "entry.h"
 #include "friends.h"
+#include "tags.h"
 #include "types.h"
 
 char*
@@ -75,6 +76,18 @@ lj_friend_compare_username(gconstpointer
 	return strcmp(fa->username, fb->username);
 }
 
+LJTag*
+lj_tag_new(void) {
+    LJTag *t = g_new0(LJTag, 1);
+    return t;
+}
+
+void
+lj_tag_free(LJTag *t) {
+   g_free(t->tag);
+   g_free(t);
+}
+
 void 
 lj_security_append_to_request(LJSecurity *security, LJRequest *request) {
 	char *text = NULL;
diff -up logjam-4.5.3/protocol/liblivejournal/livejournal/Makefile.am.tags logjam-4.5.3/protocol/liblivejournal/livejournal/Makefile.am
--- logjam-4.5.3/protocol/liblivejournal/livejournal/Makefile.am.tags	2005-08-24 22:42:14.000000000 -0400
+++ logjam-4.5.3/protocol/liblivejournal/livejournal/Makefile.am	2008-03-11 17:53:46.000000000 -0400
@@ -7,7 +7,7 @@ liblivejournal_la_LIBADD = @LIVEJOURNAL_
 liblivejournal_la_SOURCES = \
 	md5.c              md5.h            \
 	protocol.c         protocol.h       \
-	friends.h                           \
+	friends.h          tags.h           \    
 	serveruser.c       serveruser.h     \
 	entry.c            entry.h          \
 	types.c            types.h          \
@@ -21,6 +21,7 @@ liblivejournal_la_SOURCES = \
 	getchallenge.c     getchallenge.h   \
 	getevents.c        getevents.h      \
 	getfriends.c       getfriends.h     \
+	gettags.c          gettags.h        \
 	syncitems.c        syncitems.h      \
 	sync.c             sync.h           \
 	livejournal.h
diff -up logjam-4.5.3/protocol/liblivejournal/livejournal/livejournal.h.tags logjam-4.5.3/protocol/liblivejournal/livejournal/livejournal.h
--- logjam-4.5.3/protocol/liblivejournal/livejournal/livejournal.h.tags	2005-02-21 12:46:10.000000000 -0500
+++ logjam-4.5.3/protocol/liblivejournal/livejournal/livejournal.h	2008-03-11 17:53:46.000000000 -0400
@@ -16,5 +16,6 @@
 #include <livejournal/serveruser.h>
 #include <livejournal/friends.h>
 #include <livejournal/entry.h>
+#include <livejournal/tags.h>
 
 #endif /* __LIVEJOURNAL_H__ */
diff -up /dev/null logjam-4.5.3/protocol/liblivejournal/livejournal/gettags.h
--- /dev/null	2008-03-11 09:22:57.310023055 -0400
+++ logjam-4.5.3/protocol/liblivejournal/livejournal/gettags.h	2008-03-11 17:53:46.000000000 -0400
@@ -0,0 +1,16 @@
+
+#ifndef __LIVEJOURNAL_GETTAGS_H__
+#define __LIVEJOURNAL_GETTAGS_H__
+
+#include <livejournal/verb.h>
+
+typedef struct {
+	LJVerb verb;
+	GHashTable *tags;
+} LJGetTags;
+
+LJGetTags* lj_gettags_new(LJUser *user, const gchar *journal);
+void       lj_gettags_free(LJGetTags *gettags, gboolean includetags);
+
+#endif /* __LIVEJOURNAL_GETTAGS_H__ */
+
diff -up /dev/null logjam-4.5.3/protocol/liblivejournal/livejournal/gettags.c
--- /dev/null	2008-03-11 09:22:57.310023055 -0400
+++ logjam-4.5.3/protocol/liblivejournal/livejournal/gettags.c	2008-03-11 17:53:46.000000000 -0400
@@ -0,0 +1,65 @@
+
+#include <config.h>
+
+#include <glib.h>
+
+#include "tags.h"
+#include "gettags.h"
+
+static void
+read_tags(LJResult *result, GHashTable *tags) {
+	LJTag *t;
+	int i, count;
+	guint32 mask;
+	char *value;
+
+	count = lj_result_get_int(result, "tag_count");
+	for (i = 1; i <= count; i++) {
+		t = lj_tag_new();
+		t->tag = g_strdup(lj_result_getf(result, "tag_%d_name", i));
+
+        value = lj_result_getf(result, "tag_%d_uses", i);
+		if (value) t->count = lj_color_to_int(value);
+
+		g_hash_table_insert(tags, t->tag, t);
+	}
+}
+
+static void
+parse_result(LJVerb *verb) {
+	GHashTable *tags;
+	
+	tags = g_hash_table_new(g_str_hash, g_str_equal);
+
+	read_tags(verb->result, tags);
+	((LJGetTags*)verb)->tags = tags;
+}
+
+LJGetTags*
+lj_gettags_new(LJUser *user, const gchar *journal) {
+	LJGetTags *gettags = g_new0(LJGetTags, 1);
+	LJVerb *verb = (LJVerb*)gettags;
+
+	lj_verb_init(verb, user, "getusertags", FALSE, parse_result);
+    if (journal)
+	    lj_request_add(verb->request, "usejournal", journal);
+
+	return gettags;
+}
+
+static void
+hash_tag_free_cb(gpointer key, LJTag *t, gpointer data) {
+	lj_tag_free(t);
+}
+
+void
+lj_gettags_free(LJGetTags *gettags, gboolean includetags) {
+	if (gettags->tags) {
+		if (includetags)
+			g_hash_table_foreach(gettags->tags,
+					(GHFunc)hash_tag_free_cb, NULL);
+		g_hash_table_destroy(gettags->tags);
+	}
+	g_free(gettags);
+}
+
diff -up /dev/null logjam-4.5.3/src/tags.c
--- /dev/null	2008-03-11 09:22:57.310023055 -0400
+++ logjam-4.5.3/src/tags.c	2008-03-11 17:53:46.000000000 -0400
@@ -0,0 +1,181 @@
+
+#include "gtk-all.h"
+
+#include <livejournal/livejournal.h>
+#include <livejournal/gettags.h>
+
+#include "account.h"
+#include "tags.h"
+
+static void
+tags_hash_list_cb (gpointer key, LJTag *t, GSList **list) 
+{
+  *list = g_slist_append(*list, t);
+}
+
+static gboolean
+load_tags (GtkWindow *parent, JamAccountLJ *acc, gchar *journal, GSList **l) 
+{
+  LJGetTags *gettags;
+  NetContext *ctx;
+  
+  ctx = net_ctx_gtk_new (parent, _("Loading Tags"));
+  gettags = lj_gettags_new (jam_account_lj_get_user (acc), journal);
+  if (!net_run_verb_ctx ((LJVerb*) gettags, ctx, NULL)) 
+    { 
+      lj_gettags_free (gettags, TRUE);
+      net_ctx_gtk_free (ctx);
+      return FALSE;
+    }
+  
+  g_hash_table_foreach (gettags->tags, (GHFunc) tags_hash_list_cb, l);
+  
+  lj_gettags_free (gettags, FALSE);
+  net_ctx_gtk_free (ctx);
+  
+  return TRUE;
+}
+
+static void
+tag_toggled (GtkCellRendererToggle *cell,
+	     gchar                 *path_str,
+	     gpointer               data)
+{
+  GtkTreeModel *model = (GtkTreeModel *)data;
+  GtkTreeIter  iter;
+  GtkTreePath *path = gtk_tree_path_new_from_string (path_str);
+  gboolean tag;
+
+  gtk_tree_model_get_iter (model, &iter, path);
+  gtk_tree_model_get (model, &iter, 0, &tag, -1);
+
+  tag ^= 1;
+
+  gtk_list_store_set (GTK_LIST_STORE (model), &iter, 0, tag, -1);
+
+  gtk_tree_path_free (path);
+}
+
+gboolean
+create_tag_string (GtkTreeModel *model,
+		   GtkTreePath  *path,
+		   GtkTreeIter  *iter,
+		   gpointer     data)
+{
+  gchar *tag;
+  gboolean is_sel;
+  gchar **tagstr = (gchar **) data;
+    
+  gtk_tree_model_get (model, iter, 0, &is_sel, -1);
+  if (is_sel)
+    {
+      gchar *buf = *tagstr;
+      gtk_tree_model_get (model, iter, 1, &tag, -1);
+      *tagstr = g_strconcat (buf, tag, ", ", NULL);
+      g_free (buf);
+    }
+
+  return FALSE;
+}
+
+GtkWidget* 
+taglist_create (GSList *l)
+{
+  GtkWidget *treeview;
+  GtkListStore *store;
+  GtkTreeIter iter;
+  GtkCellRenderer *renderer;
+  GtkTreeViewColumn *column;
+  guint i;
+
+  /* create model */
+  store = gtk_list_store_new (2, G_TYPE_BOOLEAN, G_TYPE_STRING);
+  for (i = 0; i < g_slist_length (l); i++)
+    {
+      LJTag *t = (LJTag *) g_slist_nth_data (l, i);
+
+      gtk_list_store_append (store, &iter);
+      gtk_list_store_set (store, &iter,
+			  0, FALSE,
+			  1, t->tag,
+			  -1);
+    }
+
+  /* create treeview */
+  treeview = gtk_tree_view_new_with_model (GTK_TREE_MODEL (store));
+  gtk_tree_view_set_rules_hint (GTK_TREE_VIEW (treeview), TRUE);
+  gtk_tree_view_set_search_column (GTK_TREE_VIEW (treeview), 1);
+
+  /* add columns */
+  renderer = gtk_cell_renderer_toggle_new ();
+  g_signal_connect (renderer, "toggled",
+		    G_CALLBACK (tag_toggled), 
+		    GTK_TREE_MODEL (store));
+  column = gtk_tree_view_column_new_with_attributes ("#", 
+						     renderer, "active", 0,
+						     NULL);
+  gtk_tree_view_append_column (treeview, column);
+
+  renderer = gtk_cell_renderer_text_new ();
+  column = gtk_tree_view_column_new_with_attributes (_("Tag name"), 
+						     renderer, "text", 1,
+						     NULL);
+  gtk_tree_view_column_set_sort_column_id (column, 1);
+  gtk_tree_view_append_column (treeview, column);
+ 
+  g_object_unref (store);
+
+  return treeview;
+}
+
+gchar* 
+tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal)
+{
+  GtkWidget *dlg, *sw, *tv;
+  GSList *list = NULL;
+  gchar *taglist = NULL;
+
+  if (acc == NULL) return NULL;
+
+  load_tags (GTK_WINDOW (win), acc, journal, &list);
+  
+  dlg = gtk_dialog_new_with_buttons (_("Select tags"),
+                                     GTK_WINDOW (win),
+                                     GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
+                                     GTK_STOCK_OK,
+                                     GTK_RESPONSE_OK,
+                                     GTK_STOCK_CLOSE,
+                                     GTK_RESPONSE_CLOSE,
+                                     NULL);
+
+  sw = gtk_scrolled_window_new (NULL, NULL);
+  gtk_scrolled_window_set_shadow_type (GTK_SCROLLED_WINDOW (sw),
+				       GTK_SHADOW_ETCHED_IN);
+  gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (sw),
+				  GTK_POLICY_AUTOMATIC,
+				  GTK_POLICY_AUTOMATIC);
+  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dlg)->vbox), sw, TRUE, TRUE, 0);
+
+  tv = taglist_create (list);
+  gtk_container_add (GTK_CONTAINER (sw), tv);
+
+  gtk_window_resize(dlg, 60, 210);
+  gtk_widget_show_all (sw);
+
+  if (gtk_dialog_run (GTK_DIALOG (dlg)) == GTK_RESPONSE_OK)
+    {
+      taglist = g_strdup ("");
+      gtk_tree_model_foreach (gtk_tree_view_get_model (tv),
+			      create_tag_string,
+			      &taglist);
+      if (g_ascii_strcasecmp (taglist, "") == 0) 
+	{
+	  g_free (taglist);
+	  taglist = NULL;
+	}
+    }  
+
+  gtk_widget_destroy (dlg);
+  
+  return taglist;
+}
diff -up /dev/null logjam-4.5.3/src/tags.h
--- /dev/null	2008-03-11 09:22:57.310023055 -0400
+++ logjam-4.5.3/src/tags.h	2008-03-11 17:53:46.000000000 -0400
@@ -0,0 +1,6 @@
+#ifndef _TAGS_H_
+#define _TAGS_H_
+
+gchar* tags_dialog (GtkWidget *win, JamAccountLJ *acc, gchar *journal);
+
+#endif /* _TAGS_H_ */
diff -up logjam-4.5.3/src/Makefile.am.tags logjam-4.5.3/src/Makefile.am
--- logjam-4.5.3/src/Makefile.am.tags	2005-10-23 21:16:08.000000000 -0400
+++ logjam-4.5.3/src/Makefile.am	2008-03-11 17:53:46.000000000 -0400
@@ -59,6 +59,7 @@ src_gtk = gtk-all.h util-gtk.c util-gtk.
           undo.c undo.h \
           userlabel.c userlabel.h \
           get_cmd_out.c get_cmd_out.h \
+          tags.c tags.h \
           $(HTML_MARKUP)
 
 src_preview = $(PREVIEW)
diff -up logjam-4.5.3/src/jamview.c.tags logjam-4.5.3/src/jamview.c
--- logjam-4.5.3/src/jamview.c.tags	2008-03-11 17:53:46.000000000 -0400
+++ logjam-4.5.3/src/jamview.c	2008-03-11 17:53:46.000000000 -0400
@@ -19,6 +19,7 @@
 #include "security.h"
 #include "marshalers.h"
 #include "datesel.h"
+#include "tags.h"
 
 #define KEY_PICTUREKEYWORD "logjam-picturekeyword"
 
@@ -408,11 +409,34 @@ music_store(JamView *view) {
 	jam_doc_set_music(view->doc, music);
 }
 
+static void tags_store(JamView *view);
+
+static void
+tags_select_cb(JamView *view) {
+  gchar *tags;
+  GtkWidget *toplevel = gtk_widget_get_toplevel(GTK_WIDGET(view));
+
+  tags = tags_dialog(toplevel,
+		     JAM_ACCOUNT_LJ(view->account), 
+		     jam_doc_get_usejournal(view->doc));
+
+  if (tags) {
+      gtk_entry_set_text(GTK_ENTRY(view->tags), tags);
+      tags_store(view);
+  }
+}
+
 static void
 tags_add(JamView *view) {
+	GtkWidget *tagbutton;
 	view->tags = gtk_entry_new();
 	view->tagsbar = labelled_box_new_sg(_("_Tags:"), view->tags, view->sizegroup);
 	gtk_box_pack_start(GTK_BOX(view), view->tagsbar, FALSE, FALSE, 0);
+	tagbutton = gtk_button_new_with_label("...");
+	g_signal_connect_swapped(G_OBJECT(tagbutton), "clicked",
+				 G_CALLBACK(tags_select_cb), view);
+	gtk_box_pack_start(GTK_BOX(view->tagsbar),
+			   tagbutton, FALSE, FALSE, 0);
 	gtk_box_reorder_child(GTK_BOX(view), view->tagsbar, view->musicbar ? 2 : 1);
 	gtk_widget_show_all(view->tagsbar);
 }




More information about the fedora-extras-commits mailing list