mirror of
https://github.com/DreamMaoMao/maomaowm.git
synced 2026-06-19 14:33:16 -04:00
Merge branch 'mangowm:wl-only' into wl-only
This commit is contained in:
commit
61e692f8bc
10 changed files with 136 additions and 108 deletions
87
src/mango.c
87
src/mango.c
|
|
@ -1094,7 +1094,7 @@ static struct wl_listener last_cursor_surface_destroy_listener = {
|
|||
.notify = last_cursor_surface_destroy};
|
||||
|
||||
#ifdef XWAYLAND
|
||||
static void fix_xwayland_unmanaged_coordinate(Client *c);
|
||||
static void fix_xwayland_coordinate(struct wlr_box *geom);
|
||||
static int32_t synckeymap(void *data);
|
||||
static void activatex11(struct wl_listener *listener, void *data);
|
||||
static void configurex11(struct wl_listener *listener, void *data);
|
||||
|
|
@ -1634,7 +1634,7 @@ void applyrules(Client *c) {
|
|||
|
||||
#ifdef XWAYLAND
|
||||
if (c->isfloating && client_is_x11(c)) {
|
||||
fix_xwayland_unmanaged_coordinate(c);
|
||||
fix_xwayland_coordinate(&c->geom);
|
||||
c->float_geom = c->geom;
|
||||
}
|
||||
#endif
|
||||
|
|
@ -3099,7 +3099,6 @@ void createlayersurface(struct wl_listener *listener, void *data) {
|
|||
LISTEN(&l->scene->node.events.destroy, &l->destroy, destroylayernodenotify);
|
||||
|
||||
wl_list_insert(&l->mon->layers[layer_surface->pending.layer], &l->link);
|
||||
wlr_surface_send_enter(surface, layer_surface->output);
|
||||
}
|
||||
|
||||
void createlocksurface(struct wl_listener *listener, void *data) {
|
||||
|
|
@ -4159,6 +4158,11 @@ void keypress(struct wl_listener *listener, void *data) {
|
|||
}
|
||||
}
|
||||
|
||||
if (config.cursor_hide_on_keypress && !cursor_hidden &&
|
||||
event->state == WL_KEYBOARD_KEY_STATE_PRESSED) {
|
||||
hidecursor(NULL);
|
||||
}
|
||||
|
||||
/* On _press_ if there is no active screen locker,
|
||||
* attempt to process a compositor keybinding. */
|
||||
for (i = 0; i < nsyms; i++)
|
||||
|
|
@ -4408,23 +4412,26 @@ mapnotify(struct wl_listener *listener, void *data) {
|
|||
/* Handle unmanaged clients first so we can return prior create borders
|
||||
*/
|
||||
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_unmanaged(c)) {
|
||||
/* Unmanaged clients always are floating */
|
||||
#ifdef XWAYLAND
|
||||
if (client_is_x11(c)) {
|
||||
fix_xwayland_unmanaged_coordinate(c);
|
||||
LISTEN(&c->surface.xwayland->events.set_geometry, &c->set_geometry,
|
||||
setgeometrynotify);
|
||||
}
|
||||
#endif
|
||||
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
|
||||
fix_xwayland_coordinate(&c->geom);
|
||||
wlr_scene_node_set_position(&c->scene->node, c->geom.x, c->geom.y);
|
||||
wlr_xwayland_surface_configure(c->surface.xwayland, c->geom.x,
|
||||
c->geom.y, c->geom.width,
|
||||
c->geom.height);
|
||||
LISTEN(&c->surface.xwayland->events.set_geometry, &c->set_geometry,
|
||||
setgeometrynotify);
|
||||
wlr_scene_node_reparent(&c->scene->node, layers[LyrOverlay]);
|
||||
if (client_wants_focus(c)) {
|
||||
focusclient(c, 1);
|
||||
exclusive_focus = c;
|
||||
}
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
// extra node
|
||||
|
||||
for (i = 0; i < 4; i++) {
|
||||
c->border[i] = wlr_scene_rect_create(c->scene, 0, 0,
|
||||
|
|
@ -4432,7 +4439,6 @@ mapnotify(struct wl_listener *listener, void *data) {
|
|||
: config.bordercolor);
|
||||
c->border[i]->node.data = c;
|
||||
}
|
||||
// extra node
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
c->splitindicator[i] = wlr_scene_rect_create(
|
||||
|
|
@ -4741,7 +4747,8 @@ void motionnotify(uint32_t time, struct wlr_input_device *device, double dx,
|
|||
if (!surface && !seat->drag && !cursor_hidden)
|
||||
wlr_cursor_set_xcursor(cursor, cursor_mgr, "default");
|
||||
|
||||
if (c && c->mon && !c->animation.running && (INSIDEMON(c) || !ISTILED(c))) {
|
||||
if (c && c->mon && !c->animation.running &&
|
||||
(INSIDEMON(c) || !ISSCROLLTILED(c))) {
|
||||
scroller_focus_lock = 0;
|
||||
}
|
||||
|
||||
|
|
@ -4753,13 +4760,15 @@ void motionnotify(uint32_t time, struct wlr_input_device *device, double dx,
|
|||
}
|
||||
|
||||
if (!scroller_focus_lock || !(c && c->mon && !INSIDEMON(c))) {
|
||||
if (c && c->mon && is_scroller_layout(c->mon) && !INSIDEMON(c)) {
|
||||
if (c && c->mon && ISSCROLLTILED(c) && is_scroller_layout(c->mon) &&
|
||||
!INSIDEMON(c)) {
|
||||
should_lock = true;
|
||||
}
|
||||
|
||||
if (!((!config.edge_scroller_pointer_focus ||
|
||||
speed < config.edge_scroller_focus_allow_speed) &&
|
||||
c && c->mon && is_scroller_layout(c->mon) && !INSIDEMON(c))) {
|
||||
c && c->mon && ISSCROLLTILED(c) && is_scroller_layout(c->mon) &&
|
||||
!INSIDEMON(c))) {
|
||||
pointerfocus(c, surface, sx, sy, time);
|
||||
}
|
||||
|
||||
|
|
@ -6850,16 +6859,17 @@ void virtualpointer(struct wl_listener *listener, void *data) {
|
|||
}
|
||||
|
||||
#ifdef XWAYLAND
|
||||
void fix_xwayland_unmanaged_coordinate(Client *c) {
|
||||
void fix_xwayland_coordinate(struct wlr_box *geom) {
|
||||
if (!selmon)
|
||||
return;
|
||||
|
||||
// 1. 如果窗口已经在当前活动显示器内,直接返回
|
||||
if (c->geom.x >= selmon->m.x && c->geom.x < selmon->m.x + selmon->m.width &&
|
||||
c->geom.y >= selmon->m.y && c->geom.y < selmon->m.y + selmon->m.height)
|
||||
if (geom->x >= selmon->m.x && geom->x <= selmon->m.x + selmon->m.width &&
|
||||
geom->y >= selmon->m.y && geom->y <= selmon->m.y + selmon->m.height)
|
||||
return;
|
||||
|
||||
c->geom = setclient_coordinate_center(c, selmon, c->geom, 0, 0);
|
||||
geom->x = selmon->m.x + (selmon->m.width - geom->width) / 2;
|
||||
geom->y = selmon->m.y + (selmon->m.height - geom->height) / 2;
|
||||
}
|
||||
|
||||
int32_t synckeymap(void *data) {
|
||||
|
|
@ -6914,24 +6924,41 @@ void activatex11(struct wl_listener *listener, void *data) {
|
|||
void configurex11(struct wl_listener *listener, void *data) {
|
||||
Client *c = wl_container_of(listener, c, configure);
|
||||
struct wlr_xwayland_surface_configure_event *event = data;
|
||||
struct wlr_box new_geo;
|
||||
new_geo.x = event->x;
|
||||
new_geo.y = event->y;
|
||||
new_geo.width = event->width;
|
||||
new_geo.height = event->height;
|
||||
fix_xwayland_coordinate(&new_geo);
|
||||
|
||||
if (!client_surface(c) || !client_surface(c)->mapped) {
|
||||
wlr_xwayland_surface_configure(c->surface.xwayland, event->x, event->y,
|
||||
event->width, event->height);
|
||||
|
||||
wlr_xwayland_surface_configure(c->surface.xwayland, new_geo.x,
|
||||
new_geo.y, new_geo.width,
|
||||
new_geo.height);
|
||||
return;
|
||||
}
|
||||
|
||||
if (client_is_unmanaged(c)) {
|
||||
wlr_scene_node_set_position(&c->scene->node, event->x, event->y);
|
||||
wlr_xwayland_surface_configure(c->surface.xwayland, event->x, event->y,
|
||||
event->width, event->height);
|
||||
wlr_scene_node_set_position(&c->scene->node, new_geo.x, new_geo.y);
|
||||
wlr_xwayland_surface_configure(c->surface.xwayland, new_geo.x,
|
||||
new_geo.y, new_geo.width,
|
||||
new_geo.height);
|
||||
return;
|
||||
}
|
||||
if ((c->isfloating && c != grabc) ||
|
||||
!c->mon->pertag->ltidxs[c->mon->pertag->curtag]->arrange) {
|
||||
|
||||
if (c->isfloating && c != grabc) {
|
||||
new_geo.x = new_geo.x - c->bw;
|
||||
new_geo.y = new_geo.y - c->bw;
|
||||
new_geo.width = new_geo.width + c->bw * 2;
|
||||
new_geo.height = new_geo.height + c->bw * 2;
|
||||
fix_xwayland_coordinate(&new_geo);
|
||||
|
||||
resize(c,
|
||||
(struct wlr_box){.x = event->x - c->bw,
|
||||
.y = event->y - c->bw,
|
||||
.width = event->width + c->bw * 2,
|
||||
.height = event->height + c->bw * 2},
|
||||
(struct wlr_box){.x = new_geo.x,
|
||||
.y = new_geo.y,
|
||||
.width = new_geo.width,
|
||||
.height = new_geo.height},
|
||||
0);
|
||||
} else {
|
||||
arrange(c->mon, false, false);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue