mirror of
https://gitlab.freedesktop.org/pulseaudio/pulseaudio.git
synced 2025-11-12 13:30:10 -05:00
don't exit when the XSM signals us a session exit. instead just unload all X11 modules
git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@2512 fefdeb5f-60dc-0310-8127-8f9354f1896f
This commit is contained in:
parent
a180edd0a5
commit
c33db3ce68
6 changed files with 196 additions and 58 deletions
|
|
@ -63,7 +63,8 @@ struct pa_x11_wrapper {
|
|||
struct pa_x11_client {
|
||||
PA_LLIST_FIELDS(pa_x11_client);
|
||||
pa_x11_wrapper *wrapper;
|
||||
int (*callback)(pa_x11_wrapper *w, XEvent *e, void *userdata);
|
||||
pa_x11_event_cb_t event_cb;
|
||||
pa_x11_kill_cb_t kill_cb;
|
||||
void *userdata;
|
||||
};
|
||||
|
||||
|
|
@ -72,17 +73,23 @@ static void work(pa_x11_wrapper *w) {
|
|||
pa_assert(w);
|
||||
pa_assert(PA_REFCNT_VALUE(w) >= 1);
|
||||
|
||||
pa_x11_wrapper_ref(w);
|
||||
|
||||
while (XPending(w->display)) {
|
||||
pa_x11_client *c;
|
||||
pa_x11_client *c, *n;
|
||||
XEvent e;
|
||||
XNextEvent(w->display, &e);
|
||||
|
||||
for (c = w->clients; c; c = c->next) {
|
||||
pa_assert(c->callback);
|
||||
if (c->callback(w, &e, c->userdata) != 0)
|
||||
break;
|
||||
for (c = w->clients; c; c = n) {
|
||||
n = c->next;
|
||||
|
||||
if (c->event_cb)
|
||||
if (c->event_cb(w, &e, c->userdata) != 0)
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
pa_x11_wrapper_unref(w);
|
||||
}
|
||||
|
||||
/* IO notification event for the X11 display connection */
|
||||
|
|
@ -251,7 +258,24 @@ Display *pa_x11_wrapper_get_display(pa_x11_wrapper *w) {
|
|||
return w->display;
|
||||
}
|
||||
|
||||
pa_x11_client* pa_x11_client_new(pa_x11_wrapper *w, int (*cb)(pa_x11_wrapper *w, XEvent *e, void *userdata), void *userdata) {
|
||||
void pa_x11_wrapper_kill(pa_x11_wrapper *w) {
|
||||
pa_x11_client *c, *n;
|
||||
|
||||
pa_assert(w);
|
||||
|
||||
pa_x11_wrapper_ref(w);
|
||||
|
||||
for (c = w->clients; c; c = n) {
|
||||
n = c->next;
|
||||
|
||||
if (c->kill_cb)
|
||||
c->kill_cb(w, c->userdata);
|
||||
}
|
||||
|
||||
pa_x11_wrapper_unref(w);
|
||||
}
|
||||
|
||||
pa_x11_client* pa_x11_client_new(pa_x11_wrapper *w, pa_x11_event_cb_t event_cb, pa_x11_kill_cb_t kill_cb, void *userdata) {
|
||||
pa_x11_client *c;
|
||||
|
||||
pa_assert(w);
|
||||
|
|
@ -259,7 +283,8 @@ pa_x11_client* pa_x11_client_new(pa_x11_wrapper *w, int (*cb)(pa_x11_wrapper *w,
|
|||
|
||||
c = pa_xnew(pa_x11_client, 1);
|
||||
c->wrapper = w;
|
||||
c->callback = cb;
|
||||
c->event_cb = event_cb;
|
||||
c->kill_cb = kill_cb;
|
||||
c->userdata = userdata;
|
||||
|
||||
PA_LLIST_PREPEND(pa_x11_client, w->clients, c);
|
||||
|
|
|
|||
|
|
@ -30,6 +30,11 @@
|
|||
|
||||
typedef struct pa_x11_wrapper pa_x11_wrapper;
|
||||
|
||||
typedef struct pa_x11_client pa_x11_client;
|
||||
|
||||
typedef int (*pa_x11_event_cb_t)(pa_x11_wrapper *w, XEvent *e, void *userdata);
|
||||
typedef void (*pa_x11_kill_cb_t)(pa_x11_wrapper *w, void *userdata);
|
||||
|
||||
/* Return the X11 wrapper for this core. In case no wrapper was
|
||||
existant before, allocate a new one */
|
||||
pa_x11_wrapper* pa_x11_wrapper_get(pa_core *c, const char *name);
|
||||
|
|
@ -43,10 +48,11 @@ void pa_x11_wrapper_unref(pa_x11_wrapper* w);
|
|||
/* Return the X11 display object for this connection */
|
||||
Display *pa_x11_wrapper_get_display(pa_x11_wrapper *w);
|
||||
|
||||
typedef struct pa_x11_client pa_x11_client;
|
||||
/* Kill the connection to the X11 display */
|
||||
void pa_x11_wrapper_kill(pa_x11_wrapper *w);
|
||||
|
||||
/* Register an X11 client, that is called for each X11 event */
|
||||
pa_x11_client* pa_x11_client_new(pa_x11_wrapper *w, int (*cb)(pa_x11_wrapper *w, XEvent *e, void *userdata), void *userdata);
|
||||
pa_x11_client* pa_x11_client_new(pa_x11_wrapper *w, pa_x11_event_cb_t event_cb, pa_x11_kill_cb_t kill_cb, void *userdata);
|
||||
|
||||
/* Free an X11 client object */
|
||||
void pa_x11_client_free(pa_x11_client *c);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue