Merge pull request #54 from DreamMaoMao/virmon

feat: create virtual monitor in dispatch
This commit is contained in:
DreamMaoMao 2025-05-11 10:48:13 +08:00 committed by GitHub
commit 63a34dd15a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 81 additions and 3 deletions

View file

@ -525,6 +525,10 @@ FuncType parse_func_name(char *func_name, Arg *arg, char *arg_value,
(*arg).ui = 1 << (atoi(arg_value2) - 1);
} else if (strcmp(func_name, "quit") == 0) {
func = quit;
} else if (strcmp(func_name, "create_virtual_output") == 0) {
func = create_virtual_output;
} else if (strcmp(func_name, "destroy_all_virtual_output") == 0) {
func = destroy_all_virtual_output;
} else if (strcmp(func_name, "moveresize") == 0) {
func = moveresize;
(*arg).ui = parse_mouse_action(arg_value);

View file

@ -54,4 +54,6 @@ void toggleoverlay(const Arg *arg);
void movewin(const Arg *arg);
void resizewin(const Arg *arg);
void toggle_named_scratch(const Arg *arg);
void toggle_render_border(const Arg *arg);
void toggle_render_border(const Arg *arg);
void create_virtual_output(const Arg *arg);
void destroy_all_virtual_output(const Arg *arg);

View file

@ -15,7 +15,10 @@
#include <unistd.h>
#include <wayland-server-core.h>
#include <wlr/backend.h>
#include <wlr/backend/headless.h>
#include <wlr/backend/libinput.h>
#include <wlr/backend/multi.h>
#include <wlr/backend/wayland.h>
#include <wlr/interfaces/wlr_keyboard.h>
#include <wlr/render/allocator.h>
#include <wlr/render/wlr_renderer.h>
@ -641,6 +644,7 @@ static struct wl_event_loop *event_loop;
static struct wlr_relative_pointer_manager_v1 *pointer_manager;
static struct wlr_foreign_toplevel_manager_v1 *foreign_toplevel_manager;
static struct wlr_backend *backend;
static struct wlr_backend *headless_backend;
static struct wlr_scene *scene;
static struct wlr_scene_tree *layers[NUM_LAYERS];
static struct wlr_renderer *drw;
@ -775,8 +779,8 @@ static struct wlr_xwayland *xwayland;
#endif
#include "client/client.h"
#include "text_input/ime.h"
#include "config/parse_config.h"
#include "text_input/ime.h"
struct vec2 calculate_animation_curve_at(double t, int type) {
struct vec2 point;
@ -1890,7 +1894,7 @@ arrange(Monitor *m, bool want_animation) {
resize(c, c->geom, 0);
} else {
if ((c->tags & (1 << (selmon->pertag->prevtag - 1))) &&
if ((c->tags & (1 << (m->pertag->prevtag - 1))) &&
m->pertag->prevtag != 0 && m->pertag->curtag != 0 && animations) {
c->animation.tagouting = true;
c->animation.tagining = false;
@ -5618,6 +5622,67 @@ void handle_foreign_destroy(struct wl_listener *listener, void *data) {
}
}
void create_output(struct wlr_backend *backend, void *data) {
bool *done = data;
if (*done) {
return;
}
if (wlr_backend_is_wl(backend)) {
wlr_wl_output_create(backend);
*done = true;
} else if (wlr_backend_is_headless(backend)) {
wlr_headless_add_output(backend, 1920, 1080);
*done = true;
}
#if WLR_HAS_X11_BACKEND
else if (wlr_backend_is_x11(backend)) {
wlr_x11_output_create(backend);
*done = true;
}
#endif
}
/**
* This command is intended for developer use only.
*/
void create_virtual_output(const Arg *arg) {
if (!wlr_backend_is_multi(backend)) {
wlr_log(WLR_ERROR, "Expected a multi backend");
return;
}
bool done = false;
wlr_multi_for_each_backend(backend, create_output, &done);
if (!done) {
wlr_log(WLR_ERROR, "Failed to create virtual output");
return;
}
wlr_log(WLR_INFO, "Virtual output created");
return;
}
void destroy_all_virtual_output(const Arg *arg) {
if (!wlr_backend_is_multi(backend)) {
wlr_log(WLR_ERROR, "Expected a multi backend");
return;
}
Monitor *m, *tmp;
wl_list_for_each_safe(m, tmp, &mons, link) {
if (wlr_output_is_headless(m->wlr_output)) {
// if(selmon == m)
// selmon = NULL;
wlr_output_destroy(m->wlr_output);
wlr_log(WLR_INFO, "Virtual output destroyed");
}
}
}
void setup(void) {
setenv("XCURSOR_SIZE", "24", 1);
@ -5651,6 +5716,13 @@ void setup(void) {
if (!(backend = wlr_backend_autocreate(event_loop, &session)))
die("couldn't create backend");
headless_backend = wlr_headless_backend_create(event_loop);
if (!headless_backend) {
wlr_log(WLR_ERROR, "Failed to create secondary headless backend");
} else {
wlr_multi_backend_add(backend, headless_backend);
}
/* Initialize the scene graph used to lay out windows */
scene = wlr_scene_create();
root_bg = wlr_scene_rect_create(&scene->tree, 0, 0, rootcolor);