Mercurial > pidgin-audacious
comparison pidgin-audacious.c @ 21:83002f858ee9
- do not retract current song if playing has been paused.
- little bit cleanup.
author | Yoshiki Yazawa <yaz@honeyplanet.jp> |
---|---|
date | Sun, 05 Oct 2008 14:19:55 +0900 |
parents | 4aa711530489 |
children | fbad40babe88 |
comparison
equal
deleted
inserted
replaced
20:4aa711530489 | 21:83002f858ee9 |
---|---|
32 #include "cmds.h" | 32 #include "cmds.h" |
33 #include "savedstatuses.h" | 33 #include "savedstatuses.h" |
34 | 34 |
35 #define PIDGINAUD_PLUGIN_ID "pidgin_audacious" | 35 #define PIDGINAUD_PLUGIN_ID "pidgin_audacious" |
36 #define PLUGIN_NAME "Pidgin-Audacious" | 36 #define PLUGIN_NAME "Pidgin-Audacious" |
37 | |
38 /* preferences */ | |
37 #define OPT_PIDGINAUD "/plugins/pidgin_audacious" | 39 #define OPT_PIDGINAUD "/plugins/pidgin_audacious" |
38 #define OPT_PROCESS_STATUS OPT_PIDGINAUD "/process_status" | 40 #define OPT_PROCESS_STATUS OPT_PIDGINAUD "/process_status" |
39 #define OPT_PROCESS_USERINFO OPT_PIDGINAUD "/process_userinfo" | 41 #define OPT_PROCESS_USERINFO OPT_PIDGINAUD "/process_userinfo" |
40 #define OPT_SONG_TEMPLATE OPT_PIDGINAUD "/song_template" | 42 #define OPT_SONG_TEMPLATE OPT_PIDGINAUD "/song_template" |
41 #define OPT_PASTE_TEMPLATE OPT_PIDGINAUD "/paste_template" | 43 #define OPT_PASTE_TEMPLATE OPT_PIDGINAUD "/paste_template" |
42 #define OPT_LOG_OUTPUT OPT_PIDGINAUD "/log_output" | 44 #define OPT_LOG_OUTPUT OPT_PIDGINAUD "/log_output" |
43 #define OPT_PLAYER OPT_PIDGINAUD "/player" | 45 #define OPT_PLAYER OPT_PIDGINAUD "/player" |
44 | 46 |
47 /* templates */ | |
48 #define TITLE "%title" | |
49 #define ARTIST "%artist" | |
50 #define ALBUM "%album" | |
51 #define GENRE "%genre" | |
45 #define DEFAULT_SONG_TEMPLATE "%title - %artist" | 52 #define DEFAULT_SONG_TEMPLATE "%title - %artist" |
46 #define DEFAULT_PLAYER "audacious" | 53 #define DEFAULT_PLAYER "audacious" |
47 #define SONG_TOKEN "%song" | 54 #define SONG_TOKEN "%song" |
48 #define NO_SONG_MESSAGE "No song being played." | 55 #define NO_SONG_MESSAGE "No song being played." |
49 | 56 |
50 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) | 57 /* constants */ |
51 | 58 #define DBUS_TIMEOUT 1000 |
52 #define aud_debug(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_INFO, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); | 59 #define PLAYING 0 |
53 | 60 #define PAUSED 1 |
54 #define aud_error(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_ERROR, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); | 61 #define STOPPED 2 |
55 | 62 |
56 /* xxx move up */ | 63 /* custom data type */ |
57 #define TITLE "%title" | |
58 #define ARTIST "%artist" | |
59 #define ALBUM "%album" | |
60 #define GENRE "%genre" | |
61 | |
62 typedef struct song_tuple { | 64 typedef struct song_tuple { |
63 gchar *title; | 65 gchar *title; |
64 gchar *artist; | 66 gchar *artist; |
65 gchar *album; | 67 gchar *album; |
66 gchar *genre; | 68 gchar *genre; |
67 } song_tuple; | 69 } song_tuple; |
68 | 70 |
71 /* mpris data containers */ | |
72 #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)) | |
73 | |
74 #define DBUS_TYPE_G_STRING_VALUE_HASHTABLE (dbus_g_type_get_map ("GHashTable", G_TYPE_STRING, G_TYPE_VALUE)) | |
75 | |
76 /* debug macros */ | |
77 #define aud_debug(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_INFO, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); | |
78 | |
79 #define aud_error(fmt, ...) do { if(purple_prefs_get_bool(OPT_LOG_OUTPUT)) purple_debug(PURPLE_DEBUG_ERROR, PLUGIN_NAME, "%s():%4d: " fmt, __FUNCTION__, (int)__LINE__, ## __VA_ARGS__); } while(0); | |
69 | 80 |
70 /* globals */ | 81 /* globals */ |
71 static GHashTable *seed_status; | 82 static GHashTable *seed_status; |
72 static GHashTable *seed_userinfo; | 83 static GHashTable *seed_userinfo; |
73 static GHashTable *pushed_status; | 84 static GHashTable *pushed_status; |
87 static void signed_on_cb(PurpleConnection *gc, void *data); | 98 static void signed_on_cb(PurpleConnection *gc, void *data); |
88 static void prefs_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data); | 99 static void prefs_cb(const char *name, PurplePrefType type, gconstpointer value, gpointer data); |
89 | 100 |
90 | 101 |
91 /* implementation */ | 102 /* implementation */ |
92 | |
93 static DBusGProxy * | 103 static DBusGProxy * |
94 get_dbus_session(void) | 104 get_dbus_session(void) |
95 { | 105 { |
96 GError *error = NULL; | 106 GError *error = NULL; |
97 DBusGProxy *proxy; | 107 DBusGProxy *proxy; |
284 static void | 294 static void |
285 status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data) | 295 status_signal_cb(DBusGProxy *player_proxy, gint status, gpointer data) |
286 { | 296 { |
287 aud_debug("StatusChange %d\n", status); | 297 aud_debug("StatusChange %d\n", status); |
288 | 298 |
289 if (status != 0) { | 299 switch(status) { |
300 case STOPPED: | |
301 /* clear status/user info */ | |
290 aud_process(NULL); | 302 aud_process(NULL); |
291 | |
292 /* clear current song */ | 303 /* clear current song */ |
293 purple_util_set_current_song(NULL, NULL, NULL); | 304 purple_util_set_current_song(NULL, NULL, NULL); |
294 | 305 break; |
295 } | 306 case PLAYING: |
307 case PAUSED: | |
308 default: | |
309 break; | |
310 } | |
296 } | 311 } |
297 | 312 |
298 | 313 |
299 static void | 314 static void |
300 aud_process_status(PurpleConnection *gc, gchar *aud_info) | 315 aud_process_status(PurpleConnection *gc, gchar *aud_info) |
554 | 569 |
555 g_free(song); | 570 g_free(song); |
556 return PURPLE_CMD_RET_OK; | 571 return PURPLE_CMD_RET_OK; |
557 } | 572 } |
558 | 573 |
559 #define DBUS_TIMEOUT 1000 | |
560 #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)) | |
561 | |
562 #define PLAYING 0 | |
563 #define PAUSED 1 | |
564 #define STOPPED 2 | |
565 | |
566 static gboolean | 574 static gboolean |
567 is_app_playing(void) | 575 is_app_playing(void) |
568 { | 576 { |
577 GError *error = NULL; | |
578 int status = STOPPED; | |
579 | |
569 gchar *player_name = g_strconcat("org.mpris.", | 580 gchar *player_name = g_strconcat("org.mpris.", |
570 purple_prefs_get_string(OPT_PLAYER), | 581 purple_prefs_get_string(OPT_PLAYER), |
571 NULL); | 582 NULL); |
572 | |
573 | 583 |
574 aud_debug("player_name = %s\n", player_name); | 584 aud_debug("player_name = %s\n", player_name); |
575 | 585 |
576 if(!session) { | 586 if(!session) { |
577 session = get_dbus_session(); | 587 session = get_dbus_session(); |
578 connect_dbus_signals(); | 588 connect_dbus_signals(); |
579 aud_debug("session == NULL. new session = %p\n", session); | 589 aud_debug("session == NULL. new session = %p\n", session); |
580 } | 590 } |
581 | 591 |
582 /* audacious only supports this form */ | 592 /* audacious only supports this form */ |
583 GError *error = NULL; | |
584 int status = STOPPED; | |
585 | |
586 gboolean result = | 593 gboolean result = |
587 dbus_g_proxy_call_with_timeout( | 594 dbus_g_proxy_call_with_timeout( |
588 session, | 595 session, |
589 "GetStatus", | 596 "GetStatus", |
590 DBUS_TIMEOUT, | 597 DBUS_TIMEOUT, |
593 G_TYPE_INT, | 600 G_TYPE_INT, |
594 &status, | 601 &status, |
595 G_TYPE_INVALID); | 602 G_TYPE_INVALID); |
596 | 603 |
597 aud_debug("GetStatus result = %d\n", result); | 604 aud_debug("GetStatus result = %d\n", result); |
598 | 605 aud_debug("GetStatus status = %d\n", status); |
599 if(status == PLAYING || status == PAUSED) | 606 |
607 switch(status) { | |
608 case PLAYING: | |
609 case PAUSED: | |
600 return TRUE; | 610 return TRUE; |
601 else | 611 break; |
612 case STOPPED: | |
613 default: | |
602 return FALSE; | 614 return FALSE; |
603 | 615 break; |
604 aud_debug("GetStatus status = %d\n", status); | 616 } |
605 | 617 |
606 | 618 #if 0 |
607 /* mpris specification 1.0 insists this is the way. no player | 619 /* mpris specification 1.0 insists this is the way. no player |
608 * supports this at this time. --yaz */ | 620 * supports this at this time. --yaz */ |
609 #if 0 | |
610 GError *error = NULL; | 621 GError *error = NULL; |
611 GValueArray *s; | 622 GValueArray *s; |
612 gboolean result = | 623 gboolean result = |
613 dbus_g_proxy_call_with_timeout( | 624 dbus_g_proxy_call_with_timeout( |
614 session, | 625 session, |
628 int status = g_value_get_int(val); | 639 int status = g_value_get_int(val); |
629 g_value_array_free(s); | 640 g_value_array_free(s); |
630 | 641 |
631 aud_debug("status = %d\n", status); | 642 aud_debug("status = %d\n", status); |
632 | 643 |
633 if(status == STOPPED) | 644 switch(status) { |
645 case PLAYING: | |
646 case PAUSED: | |
647 return TRUE; | |
648 break; | |
649 case STOPPED: | |
650 default: | |
634 return FALSE; | 651 return FALSE; |
635 else | |
636 return TRUE; | |
637 } | 652 } |
638 | 653 |
639 return FALSE; | 654 return FALSE; |
640 #endif | 655 #endif |
641 | |
642 } | 656 } |
643 | 657 |
644 static void | 658 static void |
645 signed_on_cb(PurpleConnection *gc, void *data) | 659 signed_on_cb(PurpleConnection *gc, void *data) |
646 { | 660 { |
709 connect_dbus_signals(); | 723 connect_dbus_signals(); |
710 | 724 |
711 /* connect to purple signals */ | 725 /* connect to purple signals */ |
712 connect_purple_signals(plugin); | 726 connect_purple_signals(plugin); |
713 | 727 |
728 /* clear status */ | |
714 status_signal_cb(NULL, -1, NULL); | 729 status_signal_cb(NULL, -1, NULL); |
715 | |
716 | 730 |
717 /* register /song command */ | 731 /* register /song command */ |
718 cmdid_paste_current_song = | 732 cmdid_paste_current_song = |
719 purple_cmd_register("song", "", PURPLE_CMD_P_DEFAULT, | 733 purple_cmd_register("song", "", PURPLE_CMD_P_DEFAULT, |
720 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_CHAT, | 734 PURPLE_CMD_FLAG_IM | PURPLE_CMD_FLAG_CHAT, |