[client] wayland: implement resizing for libdecor

This commit is contained in:
SytheZN 2021-10-04 19:55:18 +02:00 committed by Geoffrey McRae
parent 148ab0278e
commit 12321a8880
6 changed files with 56 additions and 22 deletions

View File

@ -53,3 +53,4 @@ orcephrye <drakethebanditi@yahoo.com> (orcephrye)
thejavascriptman <thejavascriptman@outlook.com> (thejavascriptman) thejavascriptman <thejavascriptman@outlook.com> (thejavascriptman)
vroad <396351+vroad@users.noreply.github.com> (vroad) vroad <396351+vroad@users.noreply.github.com> (vroad)
williamvds <w.vigolodasilva@gmail.com> (williamvds) williamvds <w.vigolodasilva@gmail.com> (williamvds)
SytheZN <sythe.zn@gmail.com> (SytheZN)

View File

@ -51,29 +51,32 @@ static void libdecorHandleError(struct libdecor * context, enum libdecor_error e
static void libdecorFrameConfigure(struct libdecor_frame * frame, static void libdecorFrameConfigure(struct libdecor_frame * frame,
struct libdecor_configuration * configuration, void * opaque) struct libdecor_configuration * configuration, void * opaque)
{ {
if (!wlWm.configured)
{
xdg_surface_ack_configure(libdecor_frame_get_xdg_surface(frame), configuration->serial);
wlWm.configured = true;
return;
}
int width, height; int width, height;
if (libdecor_configuration_get_content_size(configuration, frame, &width, &height)) { if (libdecor_configuration_get_content_size(configuration, frame, &width, &height))
{
wlWm.width = width; wlWm.width = width;
wlWm.height = height; wlWm.height = height;
struct libdecor_state * state = libdecor_state_new(wlWm.width, wlWm.height);
libdecor_frame_commit(wlWm.libdecorFrame, state, NULL);
libdecor_state_free(state);
} }
enum libdecor_window_state windowState; enum libdecor_window_state windowState;
if (libdecor_configuration_get_window_state(configuration, &windowState)) if (libdecor_configuration_get_window_state(configuration, &windowState))
wlWm.fullscreen = windowState & LIBDECOR_WINDOW_STATE_FULLSCREEN; wlWm.fullscreen = windowState & LIBDECOR_WINDOW_STATE_FULLSCREEN;
struct libdecor_state * state = libdecor_state_new(wlWm.width, wlWm.height); wlWm.needsResize = true;
libdecor_frame_commit(frame, state, wlWm.configured ? NULL : configuration); wlWm.resizeSerial = configuration->serial;
libdecor_state_free(state); app_invalidateWindow(true);
waylandStopWaitFrame();
if (wlWm.configured)
{
wlWm.needsResize = true;
wlWm.resizeSerial = configuration->serial;
app_invalidateWindow(true);
waylandStopWaitFrame();
}
else
wlWm.configured = true;
} }
static void libdecorFrameClose(struct libdecor_frame * frame, void * opaque) static void libdecorFrameClose(struct libdecor_frame * frame, void * opaque)
@ -103,7 +106,7 @@ static void libdecorCallback(uint32_t events, void * opaque)
libdecor_dispatch(wlWm.libdecor, 0); libdecor_dispatch(wlWm.libdecor, 0);
} }
bool waylandShellInit(const char * title, bool fullscreen, bool maximize, bool borderless) bool waylandShellInit(const char * title, bool fullscreen, bool maximize, bool borderless, bool resizable)
{ {
wlWm.libdecor = libdecor_new(wlWm.display, &libdecorListener); wlWm.libdecor = libdecor_new(wlWm.display, &libdecorListener);
wlWm.libdecorFrame = libdecor_decorate(wlWm.libdecor, wlWm.surface, &libdecorFrameListener, NULL); wlWm.libdecorFrame = libdecor_decorate(wlWm.libdecor, wlWm.surface, &libdecorFrameListener, NULL);
@ -112,6 +115,11 @@ bool waylandShellInit(const char * title, bool fullscreen, bool maximize, bool b
libdecor_frame_set_title(wlWm.libdecorFrame, title); libdecor_frame_set_title(wlWm.libdecorFrame, title);
libdecor_frame_map(wlWm.libdecorFrame); libdecor_frame_map(wlWm.libdecorFrame);
if (resizable)
libdecor_frame_set_capabilities(wlWm.libdecorFrame, LIBDECOR_ACTION_RESIZE);
else
libdecor_frame_unset_capabilities(wlWm.libdecorFrame, LIBDECOR_ACTION_RESIZE);
while (!wlWm.configured) while (!wlWm.configured)
libdecor_dispatch(wlWm.libdecor, 0); libdecor_dispatch(wlWm.libdecor, 0);
@ -138,6 +146,8 @@ void waylandSetFullscreen(bool fs)
libdecor_frame_set_fullscreen(wlWm.libdecorFrame, NULL); libdecor_frame_set_fullscreen(wlWm.libdecorFrame, NULL);
else else
libdecor_frame_unset_fullscreen(wlWm.libdecorFrame); libdecor_frame_unset_fullscreen(wlWm.libdecorFrame);
libdecor_frame_set_visibility(wlWm.libdecorFrame, !fs);
} }
bool waylandGetFullscreen(void) bool waylandGetFullscreen(void)
@ -149,3 +159,20 @@ void waylandMinimize(void)
{ {
libdecor_frame_set_minimized(wlWm.libdecorFrame); libdecor_frame_set_minimized(wlWm.libdecorFrame);
} }
void waylandShellResize(int w, int h)
{
if (!libdecor_frame_is_floating(wlWm.libdecorFrame))
return;
wlWm.width = w;
wlWm.height = h;
struct libdecor_state * state = libdecor_state_new(w, h);
libdecor_frame_commit(wlWm.libdecorFrame, state, NULL);
libdecor_state_free(state);
wlWm.needsResize = true;
app_invalidateWindow(true);
waylandStopWaitFrame();
}

View File

@ -87,7 +87,7 @@ static const struct xdg_toplevel_listener xdgToplevelListener = {
.close = xdgToplevelClose, .close = xdgToplevelClose,
}; };
bool waylandShellInit(const char * title, bool fullscreen, bool maximize, bool borderless) bool waylandShellInit(const char * title, bool fullscreen, bool maximize, bool borderless, bool resizable)
{ {
if (!wlWm.xdgWmBase) if (!wlWm.xdgWmBase)
{ {
@ -153,3 +153,8 @@ void waylandMinimize(void)
{ {
xdg_toplevel_set_minimized(wlWm.xdgToplevel); xdg_toplevel_set_minimized(wlWm.xdgToplevel);
} }
void waylandShellResize(int w, int h)
{
//TODO: Implement resize for XDG.
}

View File

@ -98,7 +98,7 @@ static bool waylandInit(const LG_DSInitParams params)
if (!waylandInputInit()) if (!waylandInputInit())
return false; return false;
if (!waylandWindowInit(params.title, params.fullscreen, params.maximize, params.borderless)) if (!waylandWindowInit(params.title, params.fullscreen, params.maximize, params.borderless, params.resizable))
return false; return false;
if (!waylandEGLInit(params.w, params.h)) if (!waylandEGLInit(params.w, params.h))

View File

@ -306,14 +306,15 @@ bool waylandRegistryInit(void);
void waylandRegistryFree(void); void waylandRegistryFree(void);
// shell module // shell module
bool waylandShellInit(const char * title, bool fullscreen, bool maximize, bool borderless); bool waylandShellInit(const char * title, bool fullscreen, bool maximize, bool borderless, bool resizable);
void waylandShellAckConfigureIfNeeded(void); void waylandShellAckConfigureIfNeeded(void);
void waylandSetFullscreen(bool fs); void waylandSetFullscreen(bool fs);
bool waylandGetFullscreen(void); bool waylandGetFullscreen(void);
void waylandMinimize(void); void waylandMinimize(void);
void waylandShellResize(int w, int h);
// window module // window module
bool waylandWindowInit(const char * title, bool fullscreen, bool maximize, bool borderless); bool waylandWindowInit(const char * title, bool fullscreen, bool maximize, bool borderless, bool resizable);
void waylandWindowFree(void); void waylandWindowFree(void);
void waylandWindowUpdateScale(void); void waylandWindowUpdateScale(void);
void waylandSetWindowSize(int x, int y); void waylandSetWindowSize(int x, int y);

View File

@ -79,7 +79,7 @@ static const struct wl_surface_listener wlSurfaceListener = {
.leave = wlSurfaceLeaveHandler, .leave = wlSurfaceLeaveHandler,
}; };
bool waylandWindowInit(const char * title, bool fullscreen, bool maximize, bool borderless) bool waylandWindowInit(const char * title, bool fullscreen, bool maximize, bool borderless, bool resizable)
{ {
wlWm.scale = wl_fixed_from_int(1); wlWm.scale = wl_fixed_from_int(1);
@ -106,7 +106,7 @@ bool waylandWindowInit(const char * title, bool fullscreen, bool maximize, bool
wl_surface_add_listener(wlWm.surface, &wlSurfaceListener, NULL); wl_surface_add_listener(wlWm.surface, &wlSurfaceListener, NULL);
if (!waylandShellInit(title, fullscreen, maximize, borderless)) if (!waylandShellInit(title, fullscreen, maximize, borderless, resizable))
return false; return false;
wl_surface_commit(wlWm.surface); wl_surface_commit(wlWm.surface);
@ -121,7 +121,7 @@ void waylandWindowFree(void)
void waylandSetWindowSize(int x, int y) void waylandSetWindowSize(int x, int y)
{ {
// FIXME: implement. waylandShellResize(x, y);
} }
bool waylandIsValidPointerPos(int x, int y) bool waylandIsValidPointerPos(int x, int y)