Wayland: replace global fl_display by function struct wl_display *fl_wl_display().

This commit is contained in:
ManoloFLTK
2022-03-23 11:37:15 +01:00
parent 4c854dbbc3
commit 2d71a95b5d
7 changed files with 48 additions and 66 deletions
+3 -4
View File
@@ -20,8 +20,6 @@
typedef struct wld_window *Window; typedef struct wld_window *Window;
extern struct wl_display *fl_display;
struct flWaylandRegion { struct flWaylandRegion {
int count; int count;
struct _cairo_rectangle *rects; struct _cairo_rectangle *rects;
@@ -30,5 +28,6 @@ struct flWaylandRegion {
#include <stdint.h> #include <stdint.h>
extern FL_EXPORT uint32_t fl_event_time; extern FL_EXPORT uint32_t fl_event_time;
extern FL_EXPORT struct wl_surface *fl_wl_surface(Window xid); FL_EXPORT struct wl_display *fl_wl_display();
extern FL_EXPORT struct _cairo *fl_wl_cairo(); FL_EXPORT struct wl_surface *fl_wl_surface(Window xid);
FL_EXPORT struct _cairo *fl_wl_cairo();
+3 -3
View File
@@ -943,11 +943,11 @@ from X11-specific source code :
#endif #endif
\endcode \endcode
extern struct wl_display *fl_display; extern struct wl_display *fl_wl_display();
\par \par
After fl_open_display() has run, the \c fl_display global variable points to the After fl_open_display() has run, function \c fl_wl_display() returns a pointer to the
struct wl_display representing the connection between the application and Wayland. struct wl_display representing the connection between the application and Wayland.
Therefore, \c wl_display_get_fd(fl_display) gives the file descriptor one can For example, \c wl_display_get_fd(fl_wl_display()) gives the file descriptor one can
use to communicate with the Wayland compositor according to the Wayland protocol. use to communicate with the Wayland compositor according to the Wayland protocol.
Window fl_xid(const Fl_Window *) Window fl_xid(const Fl_Window *)
@@ -62,8 +62,8 @@ Fl_Wayland_Gl_Window_Driver::Fl_Wayland_Gl_Window_Driver(Fl_Gl_Window *win) : Fl
void Fl_Wayland_Gl_Window_Driver::init() { void Fl_Wayland_Gl_Window_Driver::init() {
EGLint major, minor; EGLint major, minor;
if (!fl_display) Fl::screen_driver()->open_display(); if (!Fl_Wayland_Screen_Driver::wl_display) Fl::screen_driver()->open_display();
egl_display = eglGetDisplay((EGLNativeDisplayType) fl_display); egl_display = eglGetDisplay((EGLNativeDisplayType) Fl_Wayland_Screen_Driver::wl_display);
if (egl_display == EGL_NO_DISPLAY) { if (egl_display == EGL_NO_DISPLAY) {
Fl::fatal("Can't create egl display\n"); Fl::fatal("Can't create egl display\n");
} }
@@ -77,7 +77,7 @@ void Fl_Wayland_Gl_Window_Driver::init() {
//printf("EGL has %d configs\n", configs_count); //printf("EGL has %d configs\n", configs_count);
eglBindAPI(EGL_OPENGL_API); eglBindAPI(EGL_OPENGL_API);
gl_event_queue = wl_display_create_queue(fl_display); gl_event_queue = wl_display_create_queue(Fl_Wayland_Screen_Driver::wl_display);
} }
@@ -246,7 +246,7 @@ void Fl_Wayland_Gl_Window_Driver::make_current_before() {
struct wl_callback *callback = wl_surface_frame(surface); struct wl_callback *callback = wl_surface_frame(surface);
wl_surface_commit(surface); wl_surface_commit(surface);
wl_callback_add_listener(callback, &gl_surface_frame_listener, &done); wl_callback_add_listener(callback, &gl_surface_frame_listener, &done);
while (!done) wl_display_dispatch(fl_display); while (!done) wl_display_dispatch(Fl_Wayland_Screen_Driver::wl_display);
} }
} }
} }
@@ -301,11 +301,11 @@ void Fl_Wayland_Gl_Window_Driver::swap_buffers() {
if (egl_surface) { if (egl_surface) {
//eglSwapInterval(egl_display, 0); // doesn't seem to have any effect in this context //eglSwapInterval(egl_display, 0); // doesn't seem to have any effect in this context
if (!egl_resize_in_progress) { if (!egl_resize_in_progress) {
while (wl_display_prepare_read(fl_display) != 0) { while (wl_display_prepare_read(Fl_Wayland_Screen_Driver::wl_display) != 0) {
wl_display_dispatch_pending(fl_display); wl_display_dispatch_pending(Fl_Wayland_Screen_Driver::wl_display);
} }
wl_display_read_events(fl_display); wl_display_read_events(Fl_Wayland_Screen_Driver::wl_display);
wl_display_dispatch_queue_pending(fl_display, gl_event_queue); wl_display_dispatch_queue_pending(Fl_Wayland_Screen_Driver::wl_display, gl_event_queue);
} }
egl_resize_in_progress = false; egl_resize_in_progress = false;
eglSwapBuffers(Fl_Wayland_Gl_Window_Driver::egl_display, egl_surface); eglSwapBuffers(Fl_Wayland_Gl_Window_Driver::egl_display, egl_surface);
@@ -63,6 +63,7 @@ class FL_EXPORT Fl_Wayland_Screen_Driver : public Fl_Screen_Driver
static int insertion_point_height; static int insertion_point_height;
static bool insertion_point_location_is_valid; static bool insertion_point_location_is_valid;
public: public:
static struct wl_display *wl_display;
static void insertion_point_location(int x, int y, int height); static void insertion_point_location(int x, int y, int height);
static bool insertion_point_location(int *px, int *py, int *pwidth, int *pheight); static bool insertion_point_location(int *px, int *py, int *pwidth, int *pheight);
int get_mouse_unscaled(int &xx, int &yy); int get_mouse_unscaled(int &xx, int &yy);
@@ -157,8 +157,6 @@ extern const char *fl_bg2;
// end of extern additions workaround // end of extern additions workaround
FL_EXPORT struct wl_display *fl_display = NULL;
static bool has_xrgb = false; static bool has_xrgb = false;
@@ -225,6 +223,9 @@ static inline void checkdouble() {
} }
struct wl_display *Fl_Wayland_Screen_Driver::wl_display = NULL;
Fl_Window *Fl_Wayland_Screen_Driver::surface_to_window(struct wl_surface *surface) { Fl_Window *Fl_Wayland_Screen_Driver::surface_to_window(struct wl_surface *surface) {
Fl_X *xp = Fl_X::first; Fl_X *xp = Fl_X::first;
while (xp) { while (xp) {
@@ -749,7 +750,7 @@ void text_input_enter(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
zwp_text_input_v3_set_cursor_rectangle(zwp_text_input_v3, x, y, width, height); zwp_text_input_v3_set_cursor_rectangle(zwp_text_input_v3, x, y, width, height);
} }
zwp_text_input_v3_commit(zwp_text_input_v3); zwp_text_input_v3_commit(zwp_text_input_v3);
wl_display_roundtrip(fl_display); wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display);
} }
void text_input_leave(void *data, struct zwp_text_input_v3 *zwp_text_input_v3, void text_input_leave(void *data, struct zwp_text_input_v3 *zwp_text_input_v3,
@@ -1059,7 +1060,6 @@ Fl_Wayland_Screen_Driver::Fl_Wayland_Screen_Driver() : Fl_Screen_Driver() {
} }
void Fl_Wayland_Screen_Driver::open_display_platform() { void Fl_Wayland_Screen_Driver::open_display_platform() {
struct wl_display *wl_display;
struct wl_registry *wl_registry; struct wl_registry *wl_registry;
static bool beenHereDoneThat = false; static bool beenHereDoneThat = false;
@@ -1071,7 +1071,6 @@ void Fl_Wayland_Screen_Driver::open_display_platform() {
if (!wl_display) { if (!wl_display) {
Fl::fatal("No Wayland connection\n"); Fl::fatal("No Wayland connection\n");
} }
fl_display = wl_display;
wl_list_init(&seats); wl_list_init(&seats);
wl_list_init(&outputs); wl_list_init(&outputs);
@@ -1090,8 +1089,9 @@ void Fl_Wayland_Screen_Driver::open_display_platform() {
} }
void Fl_Wayland_Screen_Driver::close_display() { void Fl_Wayland_Screen_Driver::close_display() {
Fl::remove_fd(wl_display_get_fd(fl_display)); Fl::remove_fd(wl_display_get_fd(Fl_Wayland_Screen_Driver::wl_display));
wl_display_disconnect(fl_display); wl_display_disconnect(Fl_Wayland_Screen_Driver::wl_display);
Fl_Wayland_Screen_Driver::wl_display = NULL;
} }
@@ -1112,7 +1112,7 @@ void Fl_Wayland_Screen_Driver::init_workarea()
int Fl_Wayland_Screen_Driver::x() { int Fl_Wayland_Screen_Driver::x() {
if (!fl_display) open_display(); if (!Fl_Wayland_Screen_Driver::wl_display) open_display();
Fl_Wayland_Screen_Driver::output *output; Fl_Wayland_Screen_Driver::output *output;
wl_list_for_each(output, &outputs, link) { wl_list_for_each(output, &outputs, link) {
break; break;
@@ -1121,7 +1121,7 @@ int Fl_Wayland_Screen_Driver::x() {
} }
int Fl_Wayland_Screen_Driver::y() { int Fl_Wayland_Screen_Driver::y() {
if (!fl_display) open_display(); if (!Fl_Wayland_Screen_Driver::wl_display) open_display();
Fl_Wayland_Screen_Driver::output *output; Fl_Wayland_Screen_Driver::output *output;
wl_list_for_each(output, &outputs, link) { wl_list_for_each(output, &outputs, link) {
break; break;
@@ -1130,7 +1130,7 @@ int Fl_Wayland_Screen_Driver::y() {
} }
int Fl_Wayland_Screen_Driver::w() { int Fl_Wayland_Screen_Driver::w() {
if (!fl_display) open_display(); if (!Fl_Wayland_Screen_Driver::wl_display) open_display();
Fl_Wayland_Screen_Driver::output *output; Fl_Wayland_Screen_Driver::output *output;
wl_list_for_each(output, &outputs, link) { wl_list_for_each(output, &outputs, link) {
break; break;
@@ -1139,7 +1139,7 @@ int Fl_Wayland_Screen_Driver::w() {
} }
int Fl_Wayland_Screen_Driver::h() { int Fl_Wayland_Screen_Driver::h() {
if (!fl_display) open_display(); if (!Fl_Wayland_Screen_Driver::wl_display) open_display();
Fl_Wayland_Screen_Driver::output *output; Fl_Wayland_Screen_Driver::output *output;
wl_list_for_each(output, &outputs, link) { wl_list_for_each(output, &outputs, link) {
break; break;
@@ -1149,7 +1149,7 @@ int Fl_Wayland_Screen_Driver::h() {
void Fl_Wayland_Screen_Driver::init() { void Fl_Wayland_Screen_Driver::init() {
if (!fl_display) open_display(); if (!Fl_Wayland_Screen_Driver::wl_display) open_display();
} }
@@ -1219,8 +1219,8 @@ void Fl_Wayland_Screen_Driver::beep(int type)
void Fl_Wayland_Screen_Driver::flush() void Fl_Wayland_Screen_Driver::flush()
{ {
if (fl_display) { if (Fl_Wayland_Screen_Driver::wl_display) {
wl_display_flush(fl_display); wl_display_flush(Fl_Wayland_Screen_Driver::wl_display);
} }
} }
@@ -1245,13 +1245,6 @@ void Fl_Wayland_Screen_Driver::grab(Fl_Window* win)
} else { } else {
if (Fl::grab()) { if (Fl::grab()) {
// We must keep the grab in the non-EWMH fullscreen case // We must keep the grab in the non-EWMH fullscreen case
if (!fullscreen_win ) {
//XUngrabKeyboard(fl_display, fl_event_time);
}
//XUngrabPointer(fl_display, fl_event_time);
// this flush is done in case the picked menu item goes into
// an infinite loop, so we don't leave the X server locked up:
//XFlush(fl_display);
Fl::grab_ = 0; // FIXME: Fl::grab_ "should be private", but we need Fl::grab_ = 0; // FIXME: Fl::grab_ "should be private", but we need
// a way to *set* the variable from the driver! // a way to *set* the variable from the driver!
fl_fix_focus(); fl_fix_focus();
@@ -636,21 +636,6 @@ void Fl_Wayland_Window_Driver::show_with_args_begin() {
if (Fl::first_window()) key = Fl::first_window()->xclass(); if (Fl::first_window()) key = Fl::first_window()->xclass();
if (!key) key = "fltk"; if (!key) key = "fltk";
/*const char *val = XGetDefault(fl_display, key, "dndTextOps");
if (val) Fl::dnd_text_ops(strcasecmp(val, "true") == 0 ||
strcasecmp(val, "on") == 0 ||
strcasecmp(val, "yes") == 0);
val = XGetDefault(fl_display, key, "tooltips");
if (val) Fl_Tooltip::enable(strcasecmp(val, "true") == 0 ||
strcasecmp(val, "on") == 0 ||
strcasecmp(val, "yes") == 0);
val = XGetDefault(fl_display, key, "visibleFocus");
if (val) Fl::visible_focus(strcasecmp(val, "true") == 0 ||
strcasecmp(val, "on") == 0 ||
strcasecmp(val, "yes") == 0);*/
} }
@@ -662,8 +647,6 @@ void Fl_Wayland_Window_Driver::show_with_args_end(int argc, char **argv) {
char *buffer = new char[n]; char *buffer = new char[n];
char *p = buffer; char *p = buffer;
for (j=0; j<argc; j++) for (const char *q = argv[j]; (*p++ = *q++);); for (j=0; j<argc; j++) for (const char *q = argv[j]; (*p++ = *q++););
//XChangeProperty(fl_display, fl_xid(pWindow), XA_WM_COMMAND, XA_STRING, 8, 0,
// (unsigned char *)buffer, p-buffer-1);
delete[] buffer; delete[] buffer;
} }
} }
@@ -875,10 +858,10 @@ void Fl_Wayland_Window_Driver::wait_for_expose()
Window xid = fl_xid(pWindow); Window xid = fl_xid(pWindow);
if (xid->kind == DECORATED) { if (xid->kind == DECORATED) {
while (!(xid->state & LIBDECOR_WINDOW_STATE_FULLSCREEN) || !(xid->state & LIBDECOR_WINDOW_STATE_ACTIVE)) { while (!(xid->state & LIBDECOR_WINDOW_STATE_FULLSCREEN) || !(xid->state & LIBDECOR_WINDOW_STATE_ACTIVE)) {
wl_display_dispatch(fl_display); wl_display_dispatch(Fl_Wayland_Screen_Driver::wl_display);
} }
} else if (xid->kind == UNFRAMED) { } else if (xid->kind == UNFRAMED) {
wl_display_roundtrip(fl_display); wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display);
} }
} }
} }
@@ -1114,7 +1097,7 @@ Fl_X *Fl_Wayland_Window_Driver::makeWindow()
} else if ( pWindow->border() && !pWindow->parent() ) { // a decorated window } else if ( pWindow->border() && !pWindow->parent() ) { // a decorated window
new_window->kind = DECORATED; new_window->kind = DECORATED;
if (!scr_driver->libdecor_context) scr_driver->libdecor_context = libdecor_new(fl_display, &libdecor_iface); if (!scr_driver->libdecor_context) scr_driver->libdecor_context = libdecor_new(Fl_Wayland_Screen_Driver::wl_display, &libdecor_iface);
new_window->frame = libdecor_decorate(scr_driver->libdecor_context, new_window->wl_surface, new_window->frame = libdecor_decorate(scr_driver->libdecor_context, new_window->wl_surface,
&libdecor_frame_iface, new_window); &libdecor_frame_iface, new_window);
//fprintf(stderr, "makeWindow: libdecor_decorate=%p pos:%dx%d\n", new_window->frame, pWindow->x(), pWindow->y()); //fprintf(stderr, "makeWindow: libdecor_decorate=%p pos:%dx%d\n", new_window->frame, pWindow->x(), pWindow->y());
@@ -1378,8 +1361,8 @@ void Fl_Wayland_Window_Driver::fullscreen_on() {
if (xdg_toplevel()) { if (xdg_toplevel()) {
xdg_toplevel_set_fullscreen(xdg_toplevel(), NULL); xdg_toplevel_set_fullscreen(xdg_toplevel(), NULL);
pWindow->_set_fullscreen(); pWindow->_set_fullscreen();
wl_display_roundtrip(fl_display); // OK, but try to find something more specific wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display); // OK, but try to find something more specific
wl_display_roundtrip(fl_display); wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display);
Fl::handle(FL_FULLSCREEN, pWindow); Fl::handle(FL_FULLSCREEN, pWindow);
} }
} }
@@ -1563,12 +1546,12 @@ void Fl_Wayland_Window_Driver::reposition_menu_window(int x, int y) {
xdg_positioner_destroy(positioner); xdg_positioner_destroy(positioner);
xdg_popup_add_listener(xid_menu->xdg_popup, &popup_listener, xid_menu); xdg_popup_add_listener(xid_menu->xdg_popup, &popup_listener, xid_menu);
wl_surface_commit(xid_menu->wl_surface); wl_surface_commit(xid_menu->wl_surface);
wl_display_roundtrip(fl_display); wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display);
// delete the previous popup // delete the previous popup
xdg_popup_destroy(old_popup); xdg_popup_destroy(old_popup);
xdg_surface_destroy(old_xdg); xdg_surface_destroy(old_xdg);
wl_surface_destroy(old_surface); wl_surface_destroy(old_surface);
wl_display_roundtrip(fl_display); wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display);
this->y(true_y); this->y(true_y);
} }
@@ -1585,10 +1568,16 @@ void Fl_Wayland_Window_Driver::menu_window_area(int &X, int &Y, int &W, int &H,
} }
FL_EXPORT struct wl_surface *fl_wl_surface(Window xid) { struct wl_surface *fl_wl_surface(Window xid) {
return xid->wl_surface; return xid->wl_surface;
} }
FL_EXPORT struct _cairo *fl_wl_cairo() {
struct _cairo *fl_wl_cairo() {
return ((Fl_Cairo_Graphics_Driver*)fl_graphics_driver)->cr(); return ((Fl_Cairo_Graphics_Driver*)fl_graphics_driver)->cr();
} }
struct wl_display *fl_wl_display() {
return Fl_Wayland_Screen_Driver::wl_display;
}
@@ -338,7 +338,7 @@ static void get_clipboard_or_dragged_text(struct wl_data_offer *offer) {
if (pipe(fds)) return; if (pipe(fds)) return;
wl_data_offer_receive(offer, wld_plain_text_clipboard, fds[1]); wl_data_offer_receive(offer, wld_plain_text_clipboard, fds[1]);
close(fds[1]); close(fds[1]);
wl_display_flush(fl_display); wl_display_flush(Fl_Wayland_Screen_Driver::wl_display);
// read in fl_selection_buffer // read in fl_selection_buffer
char *to = fl_selection_buffer[1]; char *to = fl_selection_buffer[1];
ssize_t rest = fl_selection_buffer_length[1]; ssize_t rest = fl_selection_buffer_length[1];
@@ -370,7 +370,7 @@ static void get_clipboard_or_dragged_text(struct wl_data_offer *offer) {
if (pipe(fds)) return; if (pipe(fds)) return;
wl_data_offer_receive(offer, wld_plain_text_clipboard, fds[1]); wl_data_offer_receive(offer, wld_plain_text_clipboard, fds[1]);
close(fds[1]); close(fds[1]);
wl_display_flush(fl_display); wl_display_flush(Fl_Wayland_Screen_Driver::wl_display);
if (rest+1 > fl_selection_buffer_length[1]) { if (rest+1 > fl_selection_buffer_length[1]) {
delete[] fl_selection_buffer[1]; delete[] fl_selection_buffer[1];
fl_selection_buffer[1] = new char[rest+1000+1]; fl_selection_buffer[1] = new char[rest+1000+1];
@@ -431,7 +431,7 @@ static void data_device_handle_motion(void *data, struct wl_data_device *data_de
uint32_t supported_actions = ret ? WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY : WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE; uint32_t supported_actions = ret ? WL_DATA_DEVICE_MANAGER_DND_ACTION_COPY : WL_DATA_DEVICE_MANAGER_DND_ACTION_NONE;
uint32_t preferred_action = supported_actions; uint32_t preferred_action = supported_actions;
wl_data_offer_set_actions(current_drag_offer, supported_actions, preferred_action); wl_data_offer_set_actions(current_drag_offer, supported_actions, preferred_action);
wl_display_roundtrip(fl_display); wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display);
if (ret && current_drag_offer) wl_data_offer_accept(current_drag_offer, fl_dnd_serial, "text/plain"); if (ret && current_drag_offer) wl_data_offer_accept(current_drag_offer, fl_dnd_serial, "text/plain");
} }
@@ -488,7 +488,7 @@ static int get_clipboard_image() {
if (pipe(fds)) return 1; if (pipe(fds)) return 1;
wl_data_offer_receive(fl_selection_offer, fl_selection_offer_type, fds[1]); wl_data_offer_receive(fl_selection_offer, fl_selection_offer_type, fds[1]);
close(fds[1]); close(fds[1]);
wl_display_roundtrip(fl_display); wl_display_roundtrip(Fl_Wayland_Screen_Driver::wl_display);
if (strcmp(fl_selection_offer_type, "image/png") == 0) { if (strcmp(fl_selection_offer_type, "image/png") == 0) {
char tmp_fname[21]; char tmp_fname[21];
Fl_Shared_Image *shared = 0; Fl_Shared_Image *shared = 0;