perfect MwLLDetach
All checks were successful
pyrite-dev/milsko/pipeline/head This commit looks good
All checks were successful
pyrite-dev/milsko/pipeline/head This commit looks good
This commit is contained in:
parent
2a7327f27a
commit
195cccd65a
2 changed files with 41 additions and 30 deletions
|
|
@ -479,8 +479,6 @@ struct _MwLLWayland {
|
||||||
|
|
||||||
MwBool moving;
|
MwBool moving;
|
||||||
|
|
||||||
struct wl_surface* curSurface;
|
|
||||||
|
|
||||||
cairo_surface_t* front_cs;
|
cairo_surface_t* front_cs;
|
||||||
cairo_surface_t* back_cs;
|
cairo_surface_t* back_cs;
|
||||||
cairo_t* front_cairo;
|
cairo_t* front_cairo;
|
||||||
|
|
|
||||||
|
|
@ -449,6 +449,8 @@ static void zwp_primary_selection_device_manager_v1_interface_destroy(struct _Mw
|
||||||
(void)data;
|
(void)data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static struct wl_surface* curSurface;
|
||||||
|
|
||||||
/* `wl_pointer.enter` callback */
|
/* `wl_pointer.enter` callback */
|
||||||
static void pointer_enter(void* data, struct wl_pointer* wl_pointer, MwU32 serial,
|
static void pointer_enter(void* data, struct wl_pointer* wl_pointer, MwU32 serial,
|
||||||
struct wl_surface* surface, wl_fixed_t surface_x,
|
struct wl_surface* surface, wl_fixed_t surface_x,
|
||||||
|
|
@ -458,7 +460,7 @@ static void pointer_enter(void* data, struct wl_pointer* wl_pointer, MwU32 seria
|
||||||
(void)surface_y;
|
(void)surface_y;
|
||||||
|
|
||||||
WAYLAND_EVENT_OP_START(self);
|
WAYLAND_EVENT_OP_START(self);
|
||||||
self->wayland.curSurface = surface;
|
curSurface = surface;
|
||||||
|
|
||||||
self->wayland.pointer_serial = serial;
|
self->wayland.pointer_serial = serial;
|
||||||
|
|
||||||
|
|
@ -477,7 +479,7 @@ static void pointer_leave(void* data, struct wl_pointer* wl_pointer, MwU32 seria
|
||||||
};
|
};
|
||||||
|
|
||||||
static void xdg_borderless_step(MwLL self, MwLLMouse p, MwU32 serial) {
|
static void xdg_borderless_step(MwLL self, MwLLMouse p, MwU32 serial) {
|
||||||
if(self->wayland.type == MWLL_WAYLAND_TOPLEVEL && self->wayland.backbuffer.surface == self->wayland.curSurface) {
|
if(self->wayland.type == MWLL_WAYLAND_TOPLEVEL && self->wayland.backbuffer.surface == curSurface) {
|
||||||
if(p.point.y >= (self->wayland.wh + CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM) - 5) {
|
if(p.point.y >= (self->wayland.wh + CSD_BORDER_FRAME_TOP + CSD_BORDER_FRAME_BOTTOM) - 5) {
|
||||||
if(p.point.x >= (self->wayland.ww + CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT) - 5) {
|
if(p.point.x >= (self->wayland.ww + CSD_BORDER_FRAME_LEFT + CSD_BORDER_FRAME_RIGHT) - 5) {
|
||||||
xdg_toplevel_resize(self->wayland.toplevel->xdg_top_level, self->wayland.pointer_seat, serial, XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT);
|
xdg_toplevel_resize(self->wayland.toplevel->xdg_top_level, self->wayland.pointer_seat, serial, XDG_TOPLEVEL_RESIZE_EDGE_BOTTOM_RIGHT);
|
||||||
|
|
@ -539,8 +541,8 @@ static void pointer_button(void* data, struct wl_pointer* wl_pointer, MwU32 seri
|
||||||
|
|
||||||
// p.point.x > x && p.point.x < x + self->wayland.ww && p.point.y > y && p.point.y < y + self->wayland.wh
|
// p.point.x > x && p.point.x < x + self->wayland.ww && p.point.y > y && p.point.y < y + self->wayland.wh
|
||||||
if(
|
if(
|
||||||
self->wayland.framebuffer.surface == self->wayland.curSurface ||
|
self->wayland.framebuffer.surface == curSurface ||
|
||||||
self->wayland.backbuffer.surface == self->wayland.curSurface) {
|
self->wayland.backbuffer.surface == curSurface) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
switch(button) {
|
switch(button) {
|
||||||
|
|
@ -1108,9 +1110,9 @@ static void xdg_toplevel_configure(void* data,
|
||||||
|
|
||||||
backbuffer_destroy(&self->wayland);
|
backbuffer_destroy(&self->wayland);
|
||||||
backbuffer_setup(&self->wayland);
|
backbuffer_setup(&self->wayland);
|
||||||
|
|
||||||
framebuffer_destroy(&self->wayland);
|
framebuffer_destroy(&self->wayland);
|
||||||
framebuffer_setup(&self->wayland);
|
framebuffer_setup(&self->wayland);
|
||||||
|
|
||||||
region_setup(self);
|
region_setup(self);
|
||||||
MwLLDispatch(self, resize, NULL);
|
MwLLDispatch(self, resize, NULL);
|
||||||
|
|
||||||
|
|
@ -1261,7 +1263,7 @@ static void region_setup(MwLL handle) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_region_add(handle->wayland.o_region, 0, 0, 1, 1);
|
wl_region_add(handle->wayland.o_region, 0, 0, width, height);
|
||||||
|
|
||||||
if(handle->wayland.type == MWLL_WAYLAND_POPUP) {
|
if(handle->wayland.type == MWLL_WAYLAND_POPUP) {
|
||||||
wl_region_add(handle->wayland.region, 0, 0, width + abs(handle->wayland.x), height + abs(handle->wayland.y));
|
wl_region_add(handle->wayland.region, 0, 0, width + abs(handle->wayland.x), height + abs(handle->wayland.y));
|
||||||
|
|
@ -1626,12 +1628,7 @@ static void wl_logger(const char* fmt, va_list args) {
|
||||||
raise(SIGTRAP);
|
raise(SIGTRAP);
|
||||||
}
|
}
|
||||||
|
|
||||||
static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
static void widget_setup(MwLL r, MwLL parent, int x, int y, int width, int height, enum _MwLLWaylandType ty) {
|
||||||
MwLL r;
|
|
||||||
r = malloc(sizeof(*r));
|
|
||||||
memset(r, 0, sizeof(*r));
|
|
||||||
MwLLCreateCommon(r);
|
|
||||||
|
|
||||||
/* Wayland does not report global coordinates ever. Compositors are not even expected to have knowledge of this.
|
/* Wayland does not report global coordinates ever. Compositors are not even expected to have knowledge of this.
|
||||||
*/
|
*/
|
||||||
r->common.coordinate_type = MwCoordinatesLocal;
|
r->common.coordinate_type = MwCoordinatesLocal;
|
||||||
|
|
@ -1654,11 +1651,27 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||||
r->wayland.y = y;
|
r->wayland.y = y;
|
||||||
r->wayland.parent = parent;
|
r->wayland.parent = parent;
|
||||||
|
|
||||||
|
if(ty == MWLL_WAYLAND_UNKNOWN) {
|
||||||
if(parent == NULL) {
|
if(parent == NULL) {
|
||||||
setup_toplevel(r, x, y);
|
setup_toplevel(r, x, y);
|
||||||
} else {
|
} else {
|
||||||
setup_sublevel(parent, r, x, y);
|
setup_sublevel(parent, r, x, y);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
switch(ty) {
|
||||||
|
case MWLL_WAYLAND_UNKNOWN:
|
||||||
|
break;
|
||||||
|
case MWLL_WAYLAND_TOPLEVEL:
|
||||||
|
setup_toplevel(r, x, y);
|
||||||
|
break;
|
||||||
|
case MWLL_WAYLAND_SUBLEVEL:
|
||||||
|
setup_sublevel(parent, r, x, y);
|
||||||
|
break;
|
||||||
|
case MWLL_WAYLAND_POPUP:
|
||||||
|
setup_popup(r, x, y);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
framebuffer_setup(&r->wayland);
|
framebuffer_setup(&r->wayland);
|
||||||
backbuffer_setup(&r->wayland);
|
backbuffer_setup(&r->wayland);
|
||||||
|
|
@ -1671,6 +1684,14 @@ static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||||
if(parent != NULL) {
|
if(parent != NULL) {
|
||||||
MwLLForceRender(parent);
|
MwLLForceRender(parent);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
static MwLL MwLLCreateImpl(MwLL parent, int x, int y, int width, int height) {
|
||||||
|
MwLL r;
|
||||||
|
r = malloc(sizeof(*r));
|
||||||
|
memset(r, 0, sizeof(*r));
|
||||||
|
MwLLCreateCommon(r);
|
||||||
|
|
||||||
|
widget_setup(r, parent, x, y, width, height, MWLL_WAYLAND_UNKNOWN);
|
||||||
|
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
|
@ -1887,10 +1908,10 @@ static void MwLLBeginDrawImpl(MwLL handle) {
|
||||||
|
|
||||||
static void MwLLEndDrawImpl(MwLL handle) {
|
static void MwLLEndDrawImpl(MwLL handle) {
|
||||||
if(handle->wayland.configured) {
|
if(handle->wayland.configured) {
|
||||||
update_buffer(&handle->wayland.framebuffer);
|
|
||||||
if(handle->wayland.type == MWLL_WAYLAND_TOPLEVEL) {
|
if(handle->wayland.type == MWLL_WAYLAND_TOPLEVEL) {
|
||||||
update_buffer(&handle->wayland.backbuffer);
|
update_buffer(&handle->wayland.backbuffer);
|
||||||
}
|
}
|
||||||
|
update_buffer(&handle->wayland.framebuffer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -2303,6 +2324,7 @@ static void MwLLEndStateChangeImpl(MwLL handle) {
|
||||||
if(handle->wayland.detatching) {
|
if(handle->wayland.detatching) {
|
||||||
switch(handle->wayland.type) {
|
switch(handle->wayland.type) {
|
||||||
case MWLL_WAYLAND_UNKNOWN:
|
case MWLL_WAYLAND_UNKNOWN:
|
||||||
|
break;
|
||||||
case MWLL_WAYLAND_TOPLEVEL:
|
case MWLL_WAYLAND_TOPLEVEL:
|
||||||
destroy_toplevel(handle);
|
destroy_toplevel(handle);
|
||||||
break;
|
break;
|
||||||
|
|
@ -2310,22 +2332,13 @@ static void MwLLEndStateChangeImpl(MwLL handle) {
|
||||||
destroy_sublevel(handle);
|
destroy_sublevel(handle);
|
||||||
break;
|
break;
|
||||||
case MWLL_WAYLAND_POPUP:
|
case MWLL_WAYLAND_POPUP:
|
||||||
return;
|
destroy_popup(handle);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
wl_flush(handle);
|
wl_flush(handle);
|
||||||
|
|
||||||
switch(handle->wayland.type_to_be) {
|
widget_setup(handle, handle->wayland.parent, handle->wayland.detach_point.x, handle->wayland.detach_point.y, handle->wayland.ww, handle->wayland.wh, handle->wayland.type_to_be);
|
||||||
case MWLL_WAYLAND_POPUP:
|
|
||||||
setup_popup(handle, handle->wayland.detach_point.x, handle->wayland.detach_point.y);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
setup_toplevel(handle, handle->wayland.detach_point.x, handle->wayland.detach_point.y);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// framebuffer_setup(&handle->wayland);
|
|
||||||
// backbuffer_setup(&handle->wayland);
|
|
||||||
|
|
||||||
handle->wayland.region = wl_compositor_create_region(handle->wayland.compositor);
|
handle->wayland.region = wl_compositor_create_region(handle->wayland.compositor);
|
||||||
handle->wayland.o_region = wl_compositor_create_region(handle->wayland.compositor);
|
handle->wayland.o_region = wl_compositor_create_region(handle->wayland.compositor);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue