forked from enlightenment/enlightenment
move xwayland socket connection to its own thread
this operation performs a synchronous socket connection inside xlib which can block for an infinite amount of time. in order to avoid having a potentially unlimited amount of time where the ui is frozen and polling on the socket connection, move it to a thread where it can hang for as long as it wants and then use the resulting display object for the ecore-x connection
This commit is contained in:
parent
321a421208
commit
1c0a0ab00f
|
@ -1,4 +1,5 @@
|
|||
#include "e.h"
|
||||
#include <dlfcn.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
|
@ -245,6 +246,36 @@ fail:
|
|||
return ECORE_CALLBACK_RENEW;
|
||||
}
|
||||
|
||||
static void
|
||||
xnotify(void *d EINA_UNUSED, Ecore_Thread *eth EINA_UNUSED, void *disp)
|
||||
{
|
||||
if (!disp)
|
||||
{
|
||||
e_util_dialog_internal(_("Error"), _("Could not open X11 socket connection."));
|
||||
return;
|
||||
}
|
||||
assert(ecore_x_init_from_display(disp));
|
||||
e_comp_x_init();
|
||||
}
|
||||
|
||||
static void
|
||||
xinit(void *d, Ecore_Thread *eth)
|
||||
{
|
||||
void (*init_threads)(void);
|
||||
void *(*open_display)(const char *);
|
||||
void *disp = NULL;
|
||||
|
||||
init_threads = dlsym(NULL, "XInitThreads");
|
||||
if (init_threads) init_threads();
|
||||
open_display = dlsym(NULL, "XOpenDisplay");
|
||||
if (open_display) disp = open_display(d);
|
||||
free(d);
|
||||
ecore_thread_feedback(eth, disp);
|
||||
}
|
||||
|
||||
static void
|
||||
xend(){}
|
||||
|
||||
static Eina_Bool
|
||||
_cb_signal_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
||||
{
|
||||
|
@ -259,8 +290,7 @@ _cb_signal_event(void *data EINA_UNUSED, int type EINA_UNUSED, void *event)
|
|||
|
||||
DBG("XWayland Finished Init");
|
||||
snprintf(buf, sizeof(buf), ":%d", exs->disp);
|
||||
assert(ecore_x_init(buf));
|
||||
e_comp_x_init();
|
||||
ecore_thread_feedback_run(xinit, xnotify, (Ecore_Thread_Cb)xend, (Ecore_Thread_Cb)xend, strdup(buf), 0);
|
||||
|
||||
return ECORE_CALLBACK_CANCEL;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue