rpms/logjam/F-10 logjam-4.5.3-keep-drafts.patch, NONE, 1.1 logjam-4.5.3-lj-embed.patch, NONE, 1.1 logjam-4.5.3-mpris.diff, NONE, 1.1 logjam-4.5.3-save-tags.diff, NONE, 1.1 logjam.spec, 1.48, 1.49
Tom Callaway
spot at fedoraproject.org
Mon Apr 27 17:27:49 UTC 2009
- Previous message: rpms/python-igraph/devel .cvsignore, 1.4, 1.5 python-igraph.spec, 1.11, 1.12 sources, 1.4, 1.5
- Next message: rpms/logjam/F-11 logjam-4.5.3-keep-drafts.patch, NONE, 1.1 logjam-4.5.3-lj-embed.patch, NONE, 1.1 logjam-4.5.3-mpris.diff, NONE, 1.1 logjam-4.5.3-save-tags.diff, NONE, 1.1 logjam.spec, 1.50, 1.51
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
Author: spot
Update of /cvs/extras/rpms/logjam/F-10
In directory cvs1.fedora.phx.redhat.com:/tmp/cvs-serv22648/F-10
Modified Files:
logjam.spec
Added Files:
logjam-4.5.3-keep-drafts.patch logjam-4.5.3-lj-embed.patch
logjam-4.5.3-mpris.diff logjam-4.5.3-save-tags.diff
Log Message:
update logjam with new features, bugfixes
logjam-4.5.3-keep-drafts.patch:
--- 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-lj-embed.patch:
--- NEW FILE logjam-4.5.3-lj-embed.patch ---
diff -up logjam-4.5.3/src/menu.c.lj-embed logjam-4.5.3/src/menu.c
--- logjam-4.5.3/src/menu.c.lj-embed 2009-04-27 11:21:06.000000000 -0400
+++ logjam-4.5.3/src/menu.c 2009-04-27 11:21:06.000000000 -0400
@@ -274,6 +274,12 @@ static void
menu_ljcut(JamWin *jw) {
tools_ljcut(GTK_WINDOW(jw), jw->doc);
}
+
+static void
+menu_embedded_media(JamWin *jw) {
+ tools_embedded_media(GTK_WINDOW(jw), jw->doc);
+}
+
static void
menu_validate_xml(JamWin *jw) {
tools_validate_xml(GTK_WINDOW(jw), jw->doc);
@@ -415,6 +421,7 @@ static GtkItemFactoryEntry menu_items[]
{ N_("/Insert/_Image..."), NULL, menu_insert_image },
{ N_("/Insert/_Journal Link..."), "<ctl><alt>L", menu_make_journal_link },
{ N_("/Insert/lj-_cut..."), "<ctl><alt>X", menu_ljcut, 0, NULL },
+{ N_("/Insert/_Embedded Media..."), "<ctl><alt>E", menu_embedded_media },
{ N_("/_View"), NULL, NULL, ACTION_VIEW, "<Branch>" },
{ N_("/View/_Security"), NULL, menu_view_cb, ACTION_VIEW_SECURITY, "<CheckItem>" },
diff -up logjam-4.5.3/src/tools.c.lj-embed logjam-4.5.3/src/tools.c
--- logjam-4.5.3/src/tools.c.lj-embed 2009-04-27 11:21:06.000000000 -0400
+++ logjam-4.5.3/src/tools.c 2009-04-27 12:24:39.000000000 -0400
@@ -322,6 +322,65 @@ tools_validate_xml(GtkWindow *win, JamDo
g_free(str);
}
+/* FIXME: These two functions are practically identical. Abstract them to minimize code duplication. */
+
+void
+tools_embedded_media(GtkWindow *win, JamDoc *doc) {
+ GtkTextBuffer *buffer, *new_buffer;
+ GtkWidget *dlg, *vbox, *hbox, *label, *entry;
+ gchar *text;
+ GtkTextIter start;
+ GtkTextIter end;
+
+ dlg = gtk_dialog_new_with_buttons(_("Embedded Media"), win,
+ GTK_DIALOG_MODAL,
+ GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+ GTK_STOCK_OK, GTK_RESPONSE_OK,
+ NULL);
+ gtk_dialog_set_default_response(GTK_DIALOG(dlg), GTK_RESPONSE_OK);
+ gtk_window_set_default_size (GTK_WINDOW (dlg), 450, 140);
+
+ vbox = gtk_vbox_new(FALSE, 2);
+ gtk_container_set_border_width(GTK_CONTAINER(vbox), 10);
+
+ entry = gtk_text_view_new();
+ gtk_text_view_set_wrap_mode(entry, TRUE);
+ //gtk_entry_set_activates_default(GTK_ENTRY(entry), TRUE);
+ hbox = labelled_box_new(_("E_mbedded code:"), entry);
+ gtk_box_pack_start(GTK_BOX(vbox), hbox, TRUE, TRUE, 0);
+
+ label = gtk_label_new(NULL);
+ gtk_label_set_markup(GTK_LABEL(label),
+ _("<small>This is where you paste the embedded code, e.g. for a YouTube video.</small>"));
+ gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
+
+ jam_dialog_set_contents(GTK_DIALOG(dlg), vbox);
+
+ if (gtk_dialog_run(GTK_DIALOG(dlg)) != GTK_RESPONSE_OK) {
+ gtk_widget_destroy(dlg);
+ return;
+ }
+ buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(entry));
+ gtk_text_buffer_get_start_iter (buffer, &start);
+ gtk_text_buffer_get_end_iter (buffer, &end);
+ text = gtk_text_buffer_get_text(buffer, &start, &end, FALSE);
+ gtk_widget_destroy(dlg);
+ if (text[0] == 0) {
+ g_free(text);
+ text = NULL;
+ }
+ //xml_escape(&text);
+ new_buffer = jam_doc_get_text_buffer(doc);
+
+ gtk_text_buffer_begin_user_action(new_buffer); /* start undo action */
+ gtk_text_buffer_insert_at_cursor(new_buffer, "<lj-embed>", -1);
+ gtk_text_buffer_insert_at_cursor(new_buffer, text, -1);
+ gtk_text_buffer_insert_at_cursor(new_buffer, "</lj-embed>", -1);
+ g_free(text);
+
+ gtk_text_buffer_end_user_action(new_buffer);
+}
+
void
tools_ljcut(GtkWindow *win, JamDoc *doc) {
GtkTextBuffer *buffer;
diff -up logjam-4.5.3/src/tools.h.lj-embed logjam-4.5.3/src/tools.h
--- logjam-4.5.3/src/tools.h.lj-embed 2005-02-21 12:46:10.000000000 -0500
+++ logjam-4.5.3/src/tools.h 2009-04-27 11:21:06.000000000 -0400
@@ -16,5 +16,6 @@ void tools_insert_command_output
(GtkWindow *win, JamDoc *doc);
void tools_validate_xml (GtkWindow *win, JamDoc *doc);
void tools_ljcut (GtkWindow *win, JamDoc *doc);
+void tools_embedded_media (GtkWindow *win, JamDoc *doc);
#endif /* tools_h */
logjam-4.5.3-mpris.diff:
--- 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-save-tags.diff:
--- 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_ */
Index: logjam.spec
===================================================================
RCS file: /cvs/extras/rpms/logjam/F-10/logjam.spec,v
retrieving revision 1.48
retrieving revision 1.49
diff -u -r1.48 -r1.49
--- logjam.spec 28 Jul 2008 18:45:42 -0000 1.48
+++ logjam.spec 27 Apr 2009 17:27:18 -0000 1.49
@@ -2,7 +2,7 @@
Name: logjam
Version: 4.5.3
-Release: 25%{?dist}
+Release: 29%{?dist}
Epoch: 1
Summary: GTK2 client for LiveJournal
License: GPLv2+
@@ -16,7 +16,8 @@
BuildRequires: curl-devel, gtk2-devel, gtkspell-devel, gtkhtml3-devel
BuildRequires: gettext, desktop-file-utils, aspell-devel, librsvg2-devel
BuildRequires: libsoup-devel, sqlite-devel, gnutls-devel, libgcrypt-devel
-BuildRequires: autoconf, automake, libtool, intltool, popt-devel
+BuildRequires: autoconf, automake, libtool, intltool, popt-devel, m4
+BuildRequires: dbus-devel
Obsoletes: loserjabber, logjam-gnome
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Patch2: logjam-4.4.1-backdated.patch
@@ -39,6 +40,11 @@
Patch19: logjam-4.5.3-close_when_send.patch
Patch20: logjam-4.5.3-imageresize.patch
Patch21: logjam-4.5.3-showloginhistory.patch
+Patch22: logjam-4.5.3-libtool.patch
+Patch23: logjam-4.5.3-keep-drafts.patch
+Patch24: logjam-4.5.3-lj-embed.patch
+Patch25: logjam-4.5.3-mpris.diff
+Patch26: logjam-4.5.3-save-tags.diff
%description
This is the new GTK2 client for LiveJournal (http://www.livejournal.com).
@@ -77,6 +83,16 @@
%patch19 -p1 -b .close_when_send
%patch20 -p1 -b .imageresize
%patch21 -p1 -b .showloginhistory
+%patch22 -p1 -b .libtool
+%patch23 -p1 -b .keep_drafts
+%patch24 -p1 -b .lj-embed
+%patch25 -p1 -b .mpris
+%patch26 -p1 -b .save-tags
+
+libtoolize
+rm -rf aclocal.m4
+autoupdate
+intltoolize --force
%build
touch NEWS README AUTHORS
@@ -121,6 +137,22 @@
rm -rf $RPM_BUILD_ROOT
%changelog
+* Mon Apr 27 2009 Tom "spot" Callaway <tcallawa at redhat.com> - 4.5.3-29
+- add support for lj-embed tags
+- add support for MPRIS music detection (Andy Shevchenko)
+- improve tag handling (Andy Shevchenko)
+
+* Thu Apr 2 2009 Tom "spot" Callaway <tcallawa at redhat.com> - 4.5.3-28
+- add patch to enable "keep drafts" functionality
+ see: http://community.livejournal.com/logjam_dev/37274.html
+
+* Wed Feb 25 2009 Fedora Release Engineering <rel-eng at lists.fedoraproject.org> - 1:4.5.3-27
+- Rebuilt for https://fedoraproject.org/wiki/Fedora_11_Mass_Rebuild
+
+* Mon Feb 16 2009 Tom "spot" Callaway <tcallawa at redhat.com> - 4.5.3-26
+- libtoolize to support newer libtool
+- intltoolize so we get translations
+
* Mon Jul 28 2008 Tom "spot" Callaway <tcallawa at redhat.com> - 4.5.3-25
- fix docked behavior again (bz 447146)
- fix config option to start in dock again (bz 445998)
- Previous message: rpms/python-igraph/devel .cvsignore, 1.4, 1.5 python-igraph.spec, 1.11, 1.12 sources, 1.4, 1.5
- Next message: rpms/logjam/F-11 logjam-4.5.3-keep-drafts.patch, NONE, 1.1 logjam-4.5.3-lj-embed.patch, NONE, 1.1 logjam-4.5.3-mpris.diff, NONE, 1.1 logjam-4.5.3-save-tags.diff, NONE, 1.1 logjam.spec, 1.50, 1.51
- Messages sorted by:
[ date ]
[ thread ]
[ subject ]
[ author ]
More information about the scm-commits
mailing list