WIP: uv-simple-select #1

Closed
Chris Blackbourn wants to merge 182 commits from uv-simple-select into main

When changing the target branch, be careful to rebase the branch in your fork to match. See documentation.
Showing only changes of commit e71615a26d - Show all commits

View File

@ -306,14 +306,23 @@ static void gwl_window_frame_update_from_pending(GWL_Window *win);
#ifdef USE_EVENT_BACKGROUND_THREAD #ifdef USE_EVENT_BACKGROUND_THREAD
enum eGWL_PendingWindowActions { enum eGWL_PendingWindowActions {
PENDING_FRAME_CONFIGURE = 0, /**
PENDING_EGL_RESIZE, * The state of the window frame has changed, apply the state from #GWL_Window::frame_pending.
*/
PENDING_WINDOW_FRAME_CONFIGURE = 0,
/** The EGL buffer must be resized to match #GWL_WindowFrame::size. */
PENDING_EGL_WINDOW_RESIZE,
# ifdef GHOST_OPENGL_ALPHA # ifdef GHOST_OPENGL_ALPHA
/** Draw an opaque region behind the window. */
PENDING_OPAQUE_SET, PENDING_OPAQUE_SET,
# endif # endif
PENDING_SCALE_UPDATE, /**
* The DPI for a monitor has changed or the monitors (outputs)
* this window is visible on may have changed. Recalculate the windows scale.
*/
PENDING_OUTPUT_SCALE_UPDATE,
}; };
# define PENDING_NUM (PENDING_SCALE_UPDATE + 1) # define PENDING_NUM (PENDING_OUTPUT_SCALE_UPDATE + 1)
static void gwl_window_pending_actions_tag(GWL_Window *win, enum eGWL_PendingWindowActions type) static void gwl_window_pending_actions_tag(GWL_Window *win, enum eGWL_PendingWindowActions type)
{ {
@ -323,10 +332,10 @@ static void gwl_window_pending_actions_tag(GWL_Window *win, enum eGWL_PendingWin
static void gwl_window_pending_actions_handle(GWL_Window *win) static void gwl_window_pending_actions_handle(GWL_Window *win)
{ {
if (win->pending_actions[PENDING_FRAME_CONFIGURE].exchange(false)) { if (win->pending_actions[PENDING_WINDOW_FRAME_CONFIGURE].exchange(false)) {
gwl_window_frame_update_from_pending(win); gwl_window_frame_update_from_pending(win);
} }
if (win->pending_actions[PENDING_EGL_RESIZE].exchange(false)) { if (win->pending_actions[PENDING_EGL_WINDOW_RESIZE].exchange(false)) {
wl_egl_window_resize(win->egl_window, UNPACK2(win->frame.size), 0, 0); wl_egl_window_resize(win->egl_window, UNPACK2(win->frame.size), 0, 0);
} }
# ifdef GHOST_OPENGL_ALPHA # ifdef GHOST_OPENGL_ALPHA
@ -334,7 +343,7 @@ static void gwl_window_pending_actions_handle(GWL_Window *win)
win->ghost_window->setOpaque(); win->ghost_window->setOpaque();
} }
# endif # endif
if (win->pending_actions[PENDING_SCALE_UPDATE].exchange(false)) { if (win->pending_actions[PENDING_OUTPUT_SCALE_UPDATE].exchange(false)) {
win->ghost_window->outputs_changed_update_scale(); win->ghost_window->outputs_changed_update_scale();
} }
} }
@ -342,9 +351,10 @@ static void gwl_window_pending_actions_handle(GWL_Window *win)
#endif /* USE_EVENT_BACKGROUND_THREAD */ #endif /* USE_EVENT_BACKGROUND_THREAD */
/** /**
* Update the window's #GWL_WindowFrame * Update the window's #GWL_WindowFrame.
* The caller must handle locking & run from the main thread.
*/ */
static void gwl_window_frame_update_from_pending_lockfree(GWL_Window *win) static void gwl_window_frame_update_from_pending_no_lock(GWL_Window *win)
{ {
#ifdef USE_EVENT_BACKGROUND_THREAD #ifdef USE_EVENT_BACKGROUND_THREAD
GHOST_ASSERT(win->ghost_system->main_thread_id == std::this_thread::get_id(), GHOST_ASSERT(win->ghost_system->main_thread_id == std::this_thread::get_id(),
@ -381,7 +391,7 @@ static void gwl_window_frame_update_from_pending(GWL_Window *win)
#ifdef USE_EVENT_BACKGROUND_THREAD #ifdef USE_EVENT_BACKGROUND_THREAD
std::lock_guard lock_frame_guard{win->frame_pending_mutex}; std::lock_guard lock_frame_guard{win->frame_pending_mutex};
#endif #endif
gwl_window_frame_update_from_pending_lockfree(win); gwl_window_frame_update_from_pending_no_lock(win);
} }
/** \} */ /** \} */
@ -576,12 +586,12 @@ static void frame_handle_configure(struct libdecor_frame *frame,
GHOST_SystemWayland *system = win->ghost_system; GHOST_SystemWayland *system = win->ghost_system;
const bool is_main_thread = system->main_thread_id == std::this_thread::get_id(); const bool is_main_thread = system->main_thread_id == std::this_thread::get_id();
if (!is_main_thread) { if (!is_main_thread) {
gwl_window_pending_actions_tag(win, PENDING_FRAME_CONFIGURE); gwl_window_pending_actions_tag(win, PENDING_WINDOW_FRAME_CONFIGURE);
} }
else else
# endif # endif
{ {
gwl_window_frame_update_from_pending_lockfree(win); gwl_window_frame_update_from_pending_no_lock(win);
} }
} }
} }
@ -671,7 +681,7 @@ static void xdg_surface_handle_configure(void *data,
if (!is_main_thread) { if (!is_main_thread) {
/* NOTE(@ideasman42): this only gets one redraw, /* NOTE(@ideasman42): this only gets one redraw,
* I could not find a case where this causes problems. */ * I could not find a case where this causes problems. */
gwl_window_pending_actions_tag(win, PENDING_FRAME_CONFIGURE); gwl_window_pending_actions_tag(win, PENDING_WINDOW_FRAME_CONFIGURE);
} }
else else
#endif #endif
@ -1373,7 +1383,7 @@ bool GHOST_WindowWayland::outputs_changed_update_scale()
{ {
#ifdef USE_EVENT_BACKGROUND_THREAD #ifdef USE_EVENT_BACKGROUND_THREAD
if (system_->main_thread_id != std::this_thread::get_id()) { if (system_->main_thread_id != std::this_thread::get_id()) {
gwl_window_pending_actions_tag(window_, PENDING_SCALE_UPDATE); gwl_window_pending_actions_tag(window_, PENDING_OUTPUT_SCALE_UPDATE);
return false; return false;
} }
#endif #endif