mirror of
				https://github.com/DreamMaoMao/maomaowm.git
				synced 2025-11-03 09:01:47 -05:00 
			
		
		
		
	feat: adaptive_sync support
This commit is contained in:
		
							parent
							
								
									99fad07f12
								
							
						
					
					
						commit
						8bf22e77d2
					
				
					 3 changed files with 34 additions and 6 deletions
				
			
		| 
						 | 
				
			
			@ -285,6 +285,7 @@ typedef struct {
 | 
			
		|||
	int single_scratchpad;
 | 
			
		||||
	int xwayland_persistence;
 | 
			
		||||
	int syncobj_enable;
 | 
			
		||||
	int adaptive_sync;
 | 
			
		||||
 | 
			
		||||
	struct xkb_rule_names xkb_rules;
 | 
			
		||||
} Config;
 | 
			
		||||
| 
						 | 
				
			
			@ -961,6 +962,8 @@ void parse_config_line(Config *config, const char *line) {
 | 
			
		|||
		config->xwayland_persistence = atoi(value);
 | 
			
		||||
	} else if (strcmp(key, "syncobj_enable") == 0) {
 | 
			
		||||
		config->syncobj_enable = atoi(value);
 | 
			
		||||
	} else if (strcmp(key, "adaptive_sync") == 0) {
 | 
			
		||||
		config->adaptive_sync = atoi(value);
 | 
			
		||||
	} else if (strcmp(key, "no_border_when_single") == 0) {
 | 
			
		||||
		config->no_border_when_single = atoi(value);
 | 
			
		||||
	} else if (strcmp(key, "snap_distance") == 0) {
 | 
			
		||||
| 
						 | 
				
			
			@ -2273,6 +2276,7 @@ void override_config(void) {
 | 
			
		|||
	// 杂项设置
 | 
			
		||||
	xwayland_persistence = CLAMP_INT(config.xwayland_persistence, 0, 1);
 | 
			
		||||
	syncobj_enable = CLAMP_INT(config.syncobj_enable, 0, 1);
 | 
			
		||||
	adaptive_sync = CLAMP_INT(config.adaptive_sync, 0, 1);
 | 
			
		||||
	axis_bind_apply_timeout =
 | 
			
		||||
		CLAMP_INT(config.axis_bind_apply_timeout, 0, 1000);
 | 
			
		||||
	focus_on_activate = CLAMP_INT(config.focus_on_activate, 0, 1);
 | 
			
		||||
| 
						 | 
				
			
			@ -2416,6 +2420,7 @@ void set_value_default() {
 | 
			
		|||
	config.single_scratchpad = single_scratchpad;
 | 
			
		||||
	config.xwayland_persistence = xwayland_persistence;
 | 
			
		||||
	config.syncobj_enable = syncobj_enable;
 | 
			
		||||
	config.adaptive_sync = adaptive_sync;
 | 
			
		||||
	config.no_border_when_single = no_border_when_single;
 | 
			
		||||
	config.snap_distance = snap_distance;
 | 
			
		||||
	config.drag_tile_to_tile = drag_tile_to_tile;
 | 
			
		||||
| 
						 | 
				
			
			@ -2624,6 +2629,10 @@ void reapply_monitor_rules(void) {
 | 
			
		|||
			}
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		if (adaptive_sync) {
 | 
			
		||||
			enable_adaptive_sync(m, &state);
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		wlr_output_commit_state(m->wlr_output, &state);
 | 
			
		||||
		wlr_output_state_finish(&state);
 | 
			
		||||
		updatemons(NULL, NULL);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -96,6 +96,7 @@ float fullscreen_bg[] = {0.1, 0.1, 0.1, 1.0};
 | 
			
		|||
int warpcursor = 1;			  /* Warp cursor to focused client */
 | 
			
		||||
int xwayland_persistence = 1; /* xwayland persistence */
 | 
			
		||||
int syncobj_enable = 0;
 | 
			
		||||
int adaptive_sync = 0;
 | 
			
		||||
 | 
			
		||||
/* keyboard */
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										30
									
								
								src/mango.c
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								src/mango.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -693,13 +693,15 @@ static struct wlr_scene_tree *
 | 
			
		|||
wlr_scene_tree_snapshot(struct wlr_scene_node *node,
 | 
			
		||||
						struct wlr_scene_tree *parent);
 | 
			
		||||
static bool is_scroller_layout(Monitor *m);
 | 
			
		||||
void create_output(struct wlr_backend *backend, void *data);
 | 
			
		||||
static void create_output(struct wlr_backend *backend, void *data);
 | 
			
		||||
static const char *get_layout_abbr(const char *full_name);
 | 
			
		||||
void apply_named_scratchpad(Client *target_client);
 | 
			
		||||
Client *get_client_by_id_or_title(const char *arg_id, const char *arg_title);
 | 
			
		||||
bool switch_scratchpad_client_state(Client *c);
 | 
			
		||||
bool check_trackpad_disabled(struct wlr_pointer *pointer);
 | 
			
		||||
unsigned int get_tag_status(unsigned int tag, Monitor *m);
 | 
			
		||||
static void apply_named_scratchpad(Client *target_client);
 | 
			
		||||
static Client *get_client_by_id_or_title(const char *arg_id,
 | 
			
		||||
										 const char *arg_title);
 | 
			
		||||
static bool switch_scratchpad_client_state(Client *c);
 | 
			
		||||
static bool check_trackpad_disabled(struct wlr_pointer *pointer);
 | 
			
		||||
static unsigned int get_tag_status(unsigned int tag, Monitor *m);
 | 
			
		||||
static void enable_adaptive_sync(Monitor *m, struct wlr_output_state *state);
 | 
			
		||||
 | 
			
		||||
#include "data/static_keymap.h"
 | 
			
		||||
#include "dispatch/bind_declare.h"
 | 
			
		||||
| 
						 | 
				
			
			@ -2481,6 +2483,18 @@ struct wlr_output_mode *get_nearest_output_mode(struct wlr_output *output,
 | 
			
		|||
	return nearest_mode;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void enable_adaptive_sync(Monitor *m, struct wlr_output_state *state) {
 | 
			
		||||
	wlr_output_state_set_adaptive_sync_enabled(state, true);
 | 
			
		||||
	if (!wlr_output_test_state(m->wlr_output, state)) {
 | 
			
		||||
		wlr_output_state_set_adaptive_sync_enabled(state, false);
 | 
			
		||||
		wlr_log(WLR_DEBUG, "failed to enable adaptive sync for output %s",
 | 
			
		||||
				m->wlr_output->name);
 | 
			
		||||
	} else {
 | 
			
		||||
		wlr_log(WLR_INFO, "adaptive sync enabled for output %s",
 | 
			
		||||
				m->wlr_output->name);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void createmon(struct wl_listener *listener, void *data) {
 | 
			
		||||
	/* This event is raised by the backend when a new output (aka a display or
 | 
			
		||||
	 * monitor) becomes available. */
 | 
			
		||||
| 
						 | 
				
			
			@ -2561,6 +2575,10 @@ void createmon(struct wl_listener *listener, void *data) {
 | 
			
		|||
		}
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (adaptive_sync) {
 | 
			
		||||
		enable_adaptive_sync(m, &state);
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	/* The mode is a tuple of (width, height, refresh rate), and each
 | 
			
		||||
	 * monitor supports only a specific set of modes. We just pick the
 | 
			
		||||
	 * monitor's preferred mode; a more sophisticated compositor would let
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue