forked from blender/blender
WIP: uv-simple-select #1
@ -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
|
||||||
|
Loading…
Reference in New Issue
Block a user