00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00034 #include "stdinc.h"
00035
00036 #include <dbus/dbus-glib-bindings.h>
00037
00038 #include "dbus.h"
00039 #include "playq.h"
00040 #include "gui.h"
00041 #include "gui_internal.h"
00042
00048 GType dbus_server_get_type(void);
00049
00053 typedef struct {
00057 GObject parent;
00058 } DBusServer;
00059
00063 typedef struct {
00067 GObjectClass parent_class;
00068 } DBusServerClass;
00069
00073 G_DEFINE_TYPE(DBusServer, dbus_server, G_TYPE_OBJECT);
00074
00075 GMutex *dbus_mtx;
00076
00080 #define HERRIE_BUS_NAME "info.herrie.Herrie"
00081
00084 #define HERRIE_PATH_NAME "/info/herrie/Herrie"
00085
00089 static void *
00090 dbus_runner_thread(void *unused)
00091 {
00092 DBusServer *ds;
00093 DBusGConnection *dc;
00094 GMainLoop *loop;
00095 DBusGProxy *proxy;
00096 guint ret;
00097
00098 gui_input_sigmask();
00099
00100 g_type_init();
00101 ds = g_object_new(dbus_server_get_type(), NULL);
00102 loop = g_main_loop_new(NULL, FALSE);
00103
00104
00105 dc = dbus_g_bus_get(DBUS_BUS_SESSION, NULL);
00106 if (dc == NULL)
00107 goto done;
00108
00109
00110 dbus_g_connection_register_g_object(dc, HERRIE_PATH_NAME,
00111 G_OBJECT(ds));
00112
00113 proxy = dbus_g_proxy_new_for_name(dc, DBUS_SERVICE_DBUS,
00114 DBUS_PATH_DBUS, DBUS_INTERFACE_DBUS);
00115
00116
00117 if (org_freedesktop_DBus_request_name(proxy, HERRIE_BUS_NAME,
00118 0, &ret, NULL) == 0)
00119 goto done;
00120
00121
00122
00123
00124
00125 if (ret != DBUS_REQUEST_NAME_REPLY_PRIMARY_OWNER)
00126 goto done;
00127
00128 g_main_loop_run(loop);
00129
00130 done: g_main_loop_unref(loop);
00131 g_object_unref(ds);
00132 return (NULL);
00133 }
00134
00138 void
00139 dbus_init(void)
00140 {
00141 g_type_init();
00142 dbus_mtx = g_mutex_new();
00143 }
00144
00148 void
00149 dbus_spawn(void)
00150 {
00151 g_thread_create(dbus_runner_thread, NULL, 0, NULL);
00152 }
00153
00157 static gboolean
00158 dbus_server_next(DBusServer *self, GError **error)
00159 {
00160 dbus_lock();
00161 playq_cursong_next();
00162 dbus_unlock();
00163
00164 return (TRUE);
00165 }
00166
00170 static gboolean
00171 dbus_server_pause(DBusServer *self, GError **error)
00172 {
00173 dbus_lock();
00174 playq_cursong_pause();
00175 dbus_unlock();
00176
00177 return (TRUE);
00178 }
00179
00183 static gboolean
00184 dbus_server_play(DBusServer *self, GError **error)
00185 {
00186 dbus_lock();
00187 gui_playq_song_select();
00188 dbus_unlock();
00189
00190 return (TRUE);
00191 }
00192
00196 static gboolean
00197 dbus_server_stop(DBusServer *self, GError **error)
00198 {
00199 dbus_lock();
00200 playq_cursong_stop();
00201 dbus_unlock();
00202
00203 return (TRUE);
00204 }
00205
00209 static gboolean
00210 dbus_server_volume_down(DBusServer *self, GError **error)
00211 {
00212 #ifdef BUILD_VOLUME
00213 dbus_lock();
00214 gui_playq_volume_down();
00215 dbus_unlock();
00216 #endif
00217
00218 return (TRUE);
00219 }
00220
00224 static gboolean
00225 dbus_server_volume_up(DBusServer *self, GError **error)
00226 {
00227 #ifdef BUILD_VOLUME
00228 dbus_lock();
00229 gui_playq_volume_up();
00230 dbus_unlock();
00231 #endif
00232
00233 return (TRUE);
00234 }
00235
00236 #include <dbus_binding.h>
00237
00241 static void
00242 dbus_server_init(DBusServer *self)
00243 {
00244 }
00245
00249 static void
00250 dbus_server_class_init(DBusServerClass *klass)
00251 {
00252 dbus_g_object_type_install_info(dbus_server_get_type(),
00253 &dbus_glib_dbus_server_object_info);
00254 }