Implement DisplayServer.window_start_resize.
This commit is contained in:
parent
4cf02312f6
commit
7f0b4e58b0
14 changed files with 340 additions and 2 deletions
|
|
@ -993,6 +993,13 @@ void DisplayServerWayland::window_start_drag(WindowID p_window) {
|
|||
wayland_thread.window_start_drag(p_window);
|
||||
}
|
||||
|
||||
void DisplayServerWayland::window_start_resize(WindowResizeEdge p_edge, WindowID p_window) {
|
||||
MutexLock mutex_lock(wayland_thread.mutex);
|
||||
|
||||
ERR_FAIL_INDEX(int(p_edge), WINDOW_EDGE_MAX);
|
||||
wayland_thread.window_start_resize(p_edge, p_window);
|
||||
}
|
||||
|
||||
void DisplayServerWayland::cursor_set_shape(CursorShape p_shape) {
|
||||
ERR_FAIL_INDEX(p_shape, CURSOR_MAX);
|
||||
|
||||
|
|
|
|||
|
|
@ -273,6 +273,7 @@ public:
|
|||
virtual DisplayServer::VSyncMode window_get_vsync_mode(WindowID p_window_id) const override;
|
||||
|
||||
virtual void window_start_drag(WindowID p_window = MAIN_WINDOW_ID) override;
|
||||
virtual void window_start_resize(WindowResizeEdge p_edge, WindowID p_window) override;
|
||||
|
||||
virtual void cursor_set_shape(CursorShape p_shape) override;
|
||||
virtual CursorShape cursor_get_shape() const override;
|
||||
|
|
|
|||
|
|
@ -3354,6 +3354,80 @@ void WaylandThread::window_start_drag(DisplayServer::WindowID p_window_id) {
|
|||
#endif
|
||||
}
|
||||
|
||||
void WaylandThread::window_start_resize(DisplayServer::WindowResizeEdge p_edge, DisplayServer::WindowID p_window) {
|
||||
// TODO: Use window IDs for multiwindow support.
|
||||
WindowState &ws = main_window;
|
||||
SeatState *ss = wl_seat_get_seat_state(wl_seat_current);
|
||||
|
||||
if (ss && ws.xdg_toplevel) {
|
||||
xdg_toplevel_resize_edge edge = XDG_TOPLEVEL_RESIZE_EDGE_NONE;
|
||||
switch (p_edge) {
|
||||
case DisplayServer::WINDOW_EDGE_TOP_LEFT: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP_LEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_TOP: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_TOP_RIGHT: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_TOP_RIGHT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_LEFT: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_LEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_RIGHT: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_RIGHT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM_LEFT: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_LEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM_RIGHT: {
|
||||
edge = XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
xdg_toplevel_resize(ws.xdg_toplevel, ss->wl_seat, ss->pointer_data.button_serial, edge);
|
||||
}
|
||||
|
||||
#ifdef LIBDECOR_ENABLED
|
||||
if (ws.libdecor_frame) {
|
||||
libdecor_resize_edge edge = LIBDECOR_RESIZE_EDGE_NONE;
|
||||
switch (p_edge) {
|
||||
case DisplayServer::WINDOW_EDGE_TOP_LEFT: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_TOP_LEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_TOP: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_TOP;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_TOP_RIGHT: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_TOP_RIGHT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_LEFT: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_LEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_RIGHT: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_RIGHT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM_LEFT: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_BOTTOM_LEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_BOTTOM;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM_RIGHT: {
|
||||
edge = LIBDECOR_RESIZE_EDGE_BOTTOM_RIGHT;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
libdecor_frame_resize(ws.libdecor_frame, ss->wl_seat, ss->pointer_data.button_serial, edge);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void WaylandThread::window_set_max_size(DisplayServer::WindowID p_window_id, const Size2i &p_size) {
|
||||
// TODO: Use window IDs for multiwindow support.
|
||||
WindowState &ws = main_window;
|
||||
|
|
|
|||
|
|
@ -955,6 +955,8 @@ public:
|
|||
|
||||
struct wl_surface *window_get_wl_surface(DisplayServer::WindowID p_window_id) const;
|
||||
|
||||
void window_start_resize(DisplayServer::WindowResizeEdge p_edge, DisplayServer::WindowID p_window);
|
||||
|
||||
void window_set_max_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
|
||||
void window_set_min_size(DisplayServer::WindowID p_window_id, const Size2i &p_size);
|
||||
|
||||
|
|
|
|||
|
|
@ -69,6 +69,14 @@
|
|||
#define _NET_WM_STATE_REMOVE 0L // remove/unset property
|
||||
#define _NET_WM_STATE_ADD 1L // add/set property
|
||||
|
||||
#define _NET_WM_MOVERESIZE_SIZE_TOPLEFT 0L
|
||||
#define _NET_WM_MOVERESIZE_SIZE_TOP 1L
|
||||
#define _NET_WM_MOVERESIZE_SIZE_TOPRIGHT 2L
|
||||
#define _NET_WM_MOVERESIZE_SIZE_RIGHT 3L
|
||||
#define _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT 4L
|
||||
#define _NET_WM_MOVERESIZE_SIZE_BOTTOM 5L
|
||||
#define _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT 6L
|
||||
#define _NET_WM_MOVERESIZE_SIZE_LEFT 7L
|
||||
#define _NET_WM_MOVERESIZE_MOVE 8L
|
||||
|
||||
// 2.2 is the first release with multitouch
|
||||
|
|
@ -5516,6 +5524,70 @@ void DisplayServerX11::window_start_drag(WindowID p_window) {
|
|||
XSync(x11_display, 0);
|
||||
}
|
||||
|
||||
void DisplayServerX11::window_start_resize(WindowResizeEdge p_edge, WindowID p_window) {
|
||||
_THREAD_SAFE_METHOD_
|
||||
|
||||
ERR_FAIL_INDEX(int(p_edge), WINDOW_EDGE_MAX);
|
||||
|
||||
ERR_FAIL_COND(!windows.has(p_window));
|
||||
WindowData &wd = windows[p_window];
|
||||
|
||||
XClientMessageEvent m;
|
||||
memset(&m, 0, sizeof(m));
|
||||
|
||||
XUngrabPointer(x11_display, CurrentTime);
|
||||
|
||||
Window root_return, child_return;
|
||||
int root_x, root_y, win_x, win_y;
|
||||
unsigned int mask_return;
|
||||
|
||||
Bool xquerypointer_result = XQueryPointer(x11_display, wd.x11_window, &root_return, &child_return, &root_x, &root_y, &win_x, &win_y, &mask_return);
|
||||
|
||||
m.type = ClientMessage;
|
||||
m.window = wd.x11_window;
|
||||
m.message_type = XInternAtom(x11_display, "_NET_WM_MOVERESIZE", True);
|
||||
m.format = 32;
|
||||
if (xquerypointer_result) {
|
||||
m.data.l[0] = root_x;
|
||||
m.data.l[1] = root_y;
|
||||
m.data.l[3] = Button1;
|
||||
}
|
||||
|
||||
switch (p_edge) {
|
||||
case DisplayServer::WINDOW_EDGE_TOP_LEFT: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_TOPLEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_TOP: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_TOP;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_TOP_RIGHT: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_TOPRIGHT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_LEFT: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_LEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_RIGHT: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_RIGHT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM_LEFT: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_BOTTOMLEFT;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_BOTTOM;
|
||||
} break;
|
||||
case DisplayServer::WINDOW_EDGE_BOTTOM_RIGHT: {
|
||||
m.data.l[2] = _NET_WM_MOVERESIZE_SIZE_BOTTOMRIGHT;
|
||||
} break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
m.data.l[4] = 1; // Source - normal application.
|
||||
|
||||
XSendEvent(x11_display, DefaultRootWindow(x11_display), False, SubstructureRedirectMask | SubstructureNotifyMask, (XEvent *)&m);
|
||||
|
||||
XSync(x11_display, 0);
|
||||
}
|
||||
|
||||
pid_t get_window_pid(Display *p_display, Window p_window) {
|
||||
Atom atom = XInternAtom(p_display, "_NET_WM_PID", False);
|
||||
Atom actualType;
|
||||
|
|
|
|||
|
|
@ -527,6 +527,7 @@ public:
|
|||
virtual DisplayServer::VSyncMode window_get_vsync_mode(WindowID p_vsync_mode) const override;
|
||||
|
||||
virtual void window_start_drag(WindowID p_window = MAIN_WINDOW_ID) override;
|
||||
virtual void window_start_resize(WindowResizeEdge p_edge, WindowID p_window) override;
|
||||
|
||||
virtual Error embed_process(WindowID p_window, OS::ProcessID p_pid, const Rect2i &p_rect, bool p_visible, bool p_grab_focus) override;
|
||||
virtual Error remove_embedded_process(OS::ProcessID p_pid) override;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue