vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Fri Dec 7 20:25:56 2012 +0200| [77dae5bceb03ec039745c67275893a52081b9adc] | committer: Rémi Denis-Courmont
power: cosmetic revector > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=77dae5bceb03ec039745c67275893a52081b9adc --- modules/misc/inhibit/power.c | 183 ++++++++++++++++++++++-------------------- 1 file changed, 98 insertions(+), 85 deletions(-) diff --git a/modules/misc/inhibit/power.c b/modules/misc/inhibit/power.c index e08742b..9ca10f8 100644 --- a/modules/misc/inhibit/power.c +++ b/modules/misc/inhibit/power.c @@ -33,107 +33,120 @@ #include <vlc_inhibit.h> #include <dbus/dbus.h> +enum vlc_inhibit_api +{ + FREEDESKTOP, /* KDE and GNOME <= 2.26 */ + GNOME, /**< GNOME 2.26..3.4 */ +}; + +static const char dbus_service[][32] = +{ + [FREEDESKTOP] = "org.freedesktop.PowerManagement", + [GNOME] = "org.gnome.SessionManager", +}; + +static const char dbus_path[][33] = +{ + [FREEDESKTOP] = "/org/freedesktop/PowerManagement", + [GNOME] = "/org/gnome/SessionManager", +}; + +static const char dbus_interface[][40] = +{ + [FREEDESKTOP] = "org.freedesktop.PowerManagement.Inhibit", + [GNOME] = "org.gnome.SessionManager", +}; + +static const char dbus_method_uninhibit[][10] = +{ + [FREEDESKTOP] = "UnInhibit", + [GNOME] = "Uninhibit", +}; + struct vlc_inhibit_sys { DBusConnection *conn; dbus_uint32_t cookie[2]; }; -static void Inhibit (vlc_inhibit_t *ih, unsigned flags) +static void InhibitAPI(vlc_inhibit_t *ih, unsigned flags, + enum vlc_inhibit_api type) { - enum { - FREEDESKTOP = 0, /* as used by KDE and gnome <= 2.26 */ - GNOME = 1, /* as used by gnome > 2.26 */ - }; - - static const char dbus_service[2][32] = { - [FREEDESKTOP] = "org.freedesktop.PowerManagement", - [GNOME] = "org.gnome.SessionManager", - }; - - static const char dbus_path[2][33] = { - [FREEDESKTOP] = "/org/freedesktop/PowerManagement", - [GNOME] = "/org/gnome/SessionManager", - }; - - static const char dbus_interface[2][40] = { - [FREEDESKTOP] = "org.freedesktop.PowerManagement.Inhibit", - [GNOME] = "org.gnome.SessionManager", - }; - - static const char dbus_method[2][2][10] = { - { - [FREEDESKTOP] = "UnInhibit", - [GNOME] = "Uninhibit", - }, - { - [FREEDESKTOP] = "Inhibit", - [GNOME] = "Inhibit", - }, - }; - - static const char *app = PACKAGE; - static const char *reason = N_("Playing some media."); - vlc_inhibit_sys_t *sys = ih->p_sys; DBusConnection *conn = sys->conn; - const bool suspend = !!flags; - const dbus_uint32_t xid = 0; // FIXME ? - const dbus_uint32_t gnome_flags = ((flags & VLC_INHIBIT_SUSPEND) ? 8 : 0) - | ((flags & VLC_INHIBIT_DISPLAY) ? 4 : 0); - for (int type = 0; type < 2; type++) { - dbus_bool_t ret; - - DBusMessage *msg = dbus_message_new_method_call(dbus_service[type], - dbus_path[type], dbus_interface[type], dbus_method[suspend][type]); - if (unlikely(msg == NULL)) - return; - - if (suspend) { - if (type == FREEDESKTOP) - ret = dbus_message_append_args (msg, DBUS_TYPE_STRING, &app, - DBUS_TYPE_STRING, &reason, - DBUS_TYPE_INVALID); - else if (type == GNOME) - ret = dbus_message_append_args (msg, DBUS_TYPE_STRING, &app, - DBUS_TYPE_UINT32, &xid, - DBUS_TYPE_STRING, &reason, - DBUS_TYPE_UINT32, &gnome_flags, - DBUS_TYPE_INVALID); - } else { - ret = false; - if (sys->cookie[type]) - ret = dbus_message_append_args (msg, DBUS_TYPE_UINT32, - &sys->cookie[type], DBUS_TYPE_INVALID); - } - - if (!ret) - goto end; + const char *method = flags ? "Inhibit" : dbus_method_uninhibit[type]; + dbus_bool_t ret; - if (suspend) { /* read reply */ - /* blocks 50ms maximum */ - DBusMessage *reply = dbus_connection_send_with_reply_and_block( - conn, msg, 50, NULL ); + DBusMessage *msg = dbus_message_new_method_call(dbus_service[type], + dbus_path[type], dbus_interface[type], method); + if (unlikely(msg == NULL)) + return; - if (unlikely(reply == NULL)) - goto end; /* gpm is not active, or too slow. Better luck next time? */ + if (flags) { + const char *app = PACKAGE; + const char *reason = N_("Playing some media."); - if (!dbus_message_get_args(reply, NULL, - DBUS_TYPE_UINT32, &sys->cookie[type], - DBUS_TYPE_INVALID)) - sys->cookie[type] = 0; - - dbus_message_unref( reply ); - } else { /* just send and flush */ - if (dbus_connection_send (conn, msg, NULL)) { - sys->cookie[type] = 0; - dbus_connection_flush (conn); + switch (type) + { + case FREEDESKTOP: + ret = dbus_message_append_args(msg, DBUS_TYPE_STRING, &app, + DBUS_TYPE_STRING, &reason, + DBUS_TYPE_INVALID); + break; + case GNOME: + { + dbus_uint32_t xid = 0; // FIXME ? + dbus_uint32_t gflags = + ((flags & VLC_INHIBIT_SUSPEND) ? 8 : 0) | + ((flags & VLC_INHIBIT_DISPLAY) ? 4 : 0); + + ret = dbus_message_append_args(msg, DBUS_TYPE_STRING, &app, + DBUS_TYPE_UINT32, &xid, + DBUS_TYPE_STRING, &reason, + DBUS_TYPE_UINT32, &gflags, + DBUS_TYPE_INVALID); + break; } } -end: - dbus_message_unref (msg); + } else { + if (sys->cookie[type]) + ret = dbus_message_append_args(msg, DBUS_TYPE_UINT32, + &sys->cookie[type], + DBUS_TYPE_INVALID); + else + ret = false; + } + + if (!ret) + goto giveup; + + if (flags) { /* read reply */ + DBusMessage *reply = dbus_connection_send_with_reply_and_block( + conn, msg, 50, NULL); + if (unlikely(reply == NULL)) + goto giveup; /* no reponse?! */ + + if (!dbus_message_get_args(reply, NULL, + DBUS_TYPE_UINT32, &sys->cookie[type], + DBUS_TYPE_INVALID)) + sys->cookie[type] = 0; + + dbus_message_unref(reply); + } else { /* just send and flush */ + if (dbus_connection_send (conn, msg, NULL)) { + sys->cookie[type] = 0; + dbus_connection_flush(conn); + } } +giveup: + dbus_message_unref(msg); +} + +static void Inhibit (vlc_inhibit_t *ih, unsigned flags) +{ + for (int type = 0; type < 2; type++) + InhibitAPI (ih, flags, type); } static int Open (vlc_object_t *obj) _______________________________________________ vlc-commits mailing list [email protected] http://mailman.videolan.org/listinfo/vlc-commits
