mirror of
				https://github.com/DreamMaoMao/maomaowm.git
				synced 2025-11-03 09:01:47 -05:00 
			
		
		
		
	feat: create virtual monitor
This commit is contained in:
		
							parent
							
								
									9fe1baeda7
								
							
						
					
					
						commit
						d6e7b63dfc
					
				
					 3 changed files with 81 additions and 3 deletions
				
			
		| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -55,3 +55,5 @@ 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 create_virtual_output(const Arg *arg);
 | 
			
		||||
void destroy_all_virtual_output(const Arg *arg);
 | 
			
		||||
							
								
								
									
										76
									
								
								src/maomao.c
									
										
									
									
									
								
							
							
						
						
									
										76
									
								
								src/maomao.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -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;
 | 
			
		||||
| 
						 | 
				
			
			@ -1891,7 +1895,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;
 | 
			
		||||
| 
						 | 
				
			
			@ -5619,6 +5623,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);
 | 
			
		||||
| 
						 | 
				
			
			@ -5652,6 +5717,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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue