mirror of
https://github.com/gnif/LookingGlass.git
synced 2024-11-22 05:27:20 +00:00
[client] wayland: implement resizing for libdecor
This commit is contained in:
parent
148ab0278e
commit
12321a8880
1
AUTHORS
1
AUTHORS
@ -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)
|
||||||
|
@ -51,30 +51,33 @@ 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);
|
|
||||||
libdecor_frame_commit(frame, state, wlWm.configured ? NULL : configuration);
|
|
||||||
libdecor_state_free(state);
|
|
||||||
|
|
||||||
if (wlWm.configured)
|
|
||||||
{
|
|
||||||
wlWm.needsResize = true;
|
wlWm.needsResize = true;
|
||||||
wlWm.resizeSerial = configuration->serial;
|
wlWm.resizeSerial = configuration->serial;
|
||||||
app_invalidateWindow(true);
|
app_invalidateWindow(true);
|
||||||
waylandStopWaitFrame();
|
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();
|
||||||
|
}
|
||||||
|
@ -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.
|
||||||
|
}
|
||||||
|
@ -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))
|
||||||
|
@ -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);
|
||||||
|
@ -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)
|
||||||
|
Loading…
Reference in New Issue
Block a user