diff options
Diffstat (limited to 'src/modules/module-x11-xsmp.c')
-rw-r--r-- | src/modules/module-x11-xsmp.c | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/src/modules/module-x11-xsmp.c b/src/modules/module-x11-xsmp.c index dc23ebe3..4ef437a1 100644 --- a/src/modules/module-x11-xsmp.c +++ b/src/modules/module-x11-xsmp.c @@ -49,17 +49,14 @@ PA_MODULE_AUTHOR("Lennart Poettering") PA_MODULE_DESCRIPTION("X11 session management") PA_MODULE_VERSION(PACKAGE_VERSION) -struct userdata { - pa_core *core; - SmcConn sm_conn; -}; +static int ice_in_use = 0; static const char* const valid_modargs[] = { NULL }; static void die_cb(SmcConn connection, SmPointer client_data){ - pa_core *c = client_data; + pa_core *c = PA_CORE(client_data); pa_log_debug("Got die message from XSM. Exiting..."); @@ -98,18 +95,26 @@ static void new_ice_connection(IceConn connection, IcePointer client_data, Bool c->mainloop->io_free(*watch_data); } -int pa__init(pa_core *c, pa_module*m) { - struct userdata *u = NULL; +int pa__init(pa_module*m) { + pa_modargs *ma = NULL; char t[256], *vendor, *client_id; SmcCallbacks callbacks; SmProp prop_program, prop_user; SmProp *prop_list[2]; SmPropValue val_program, val_user; + SmcConn connection; - pa_assert(c); pa_assert(m); + if (ice_in_use) { + pa_log("module-x11-xsmp may no be loaded twice."); + return -1; + } + + IceAddConnectionWatch(new_ice_connection, m->core); + ice_in_use = 1; + if (!(ma = pa_modargs_new(m->argument, valid_modargs))) { pa_log("Failed to parse module arguments"); goto fail; @@ -119,23 +124,19 @@ int pa__init(pa_core *c, pa_module*m) { pa_log("X11 session manager not running."); goto fail; } - - m->userdata = u = pa_xnew(struct userdata, 1); - u->core = c; - u->sm_conn = NULL; - - IceAddConnectionWatch(new_ice_connection, c); memset(&callbacks, 0, sizeof(callbacks)); callbacks.die.callback = die_cb; - callbacks.die.client_data = c; - + callbacks.die.client_data = m->core; callbacks.save_yourself.callback = save_yourself_cb; + callbacks.save_yourself.client_data = m->core; callbacks.save_complete.callback = save_complete_cb; + callbacks.save_complete.client_data = m->core; callbacks.shutdown_cancelled.callback = shutdown_cancelled_cb; + callbacks.shutdown_cancelled.client_data = m->core; - if (!(u->sm_conn = SmcOpenConnection( - NULL, u, + if (!(m->userdata = connection = SmcOpenConnection( + NULL, m->core, SmProtoMajor, SmProtoMinor, SmcSaveYourselfProcMask | SmcDieProcMask | SmcSaveCompleteProcMask | SmcShutdownCancelledProcMask, &callbacks, NULL, &client_id, @@ -162,9 +163,9 @@ int pa__init(pa_core *c, pa_module*m) { prop_user.vals = &val_user; prop_list[1] = &prop_user; - SmcSetProperties(u->sm_conn, PA_ELEMENTSOF(prop_list), prop_list); + SmcSetProperties(connection, PA_ELEMENTSOF(prop_list), prop_list); - pa_log_info("Connected to session manager '%s' as '%s'.", vendor = SmcVendor(u->sm_conn), client_id); + pa_log_info("Connected to session manager '%s' as '%s'.", vendor = SmcVendor(connection), client_id); free(vendor); free(client_id); @@ -176,26 +177,19 @@ fail: if (ma) pa_modargs_free(ma); - pa__done(c, m); + pa__done(m); return -1; } -void pa__done(pa_core *c, pa_module*m) { - struct userdata *u; - - assert(c); - assert(m); - - if (!m->userdata) - return; - - u = m->userdata; +void pa__done(pa_module*m) { + pa_assert(m); - if (u->sm_conn) - SmcCloseConnection(u->sm_conn, 0, NULL); + if (m->userdata) + SmcCloseConnection(m->userdata, 0, NULL); - IceRemoveConnectionWatch(new_ice_connection, c); - - pa_xfree(u); + if (ice_in_use) { + IceRemoveConnectionWatch(new_ice_connection, m->core); + ice_in_use = 0; + } } |