mirror of
				https://github.com/labwc/labwc.git
				synced 2025-11-03 09:01:51 -05:00 
			
		
		
		
	
							parent
							
								
									208f383c66
								
							
						
					
					
						commit
						89589f17c4
					
				
					 8 changed files with 60 additions and 21 deletions
				
			
		
							
								
								
									
										21
									
								
								src/action.c
									
										
									
									
									
								
							
							
						
						
									
										21
									
								
								src/action.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -422,6 +422,19 @@ action_arg_from_xml_node(struct action *action, const char *nodename, const char
 | 
			
		|||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	case ACTION_TYPE_AUTO_PLACE:
 | 
			
		||||
		if (!strcmp(argument, "policy")) {
 | 
			
		||||
			enum view_placement_policy policy =
 | 
			
		||||
				view_placement_parse(content);
 | 
			
		||||
			if (policy == LAB_PLACE_INVALID) {
 | 
			
		||||
				wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s' (%s)",
 | 
			
		||||
						action_names[action->type], argument, content);
 | 
			
		||||
			} else {
 | 
			
		||||
				action_arg_add_int(action, argument, policy);
 | 
			
		||||
			}
 | 
			
		||||
			goto cleanup;
 | 
			
		||||
		}
 | 
			
		||||
		break;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	wlr_log(WLR_ERROR, "Invalid argument for action %s: '%s'",
 | 
			
		||||
| 
						 | 
				
			
			@ -1030,10 +1043,10 @@ actions_run(struct view *activator, struct server *server,
 | 
			
		|||
			break;
 | 
			
		||||
		case ACTION_TYPE_AUTO_PLACE:
 | 
			
		||||
			if (view) {
 | 
			
		||||
				struct wlr_box geometry = view->pending;
 | 
			
		||||
				if (placement_find_best(view, &geometry)) {
 | 
			
		||||
					view_move(view, geometry.x, geometry.y);
 | 
			
		||||
				}
 | 
			
		||||
				enum view_placement_policy policy =
 | 
			
		||||
					action_get_int(action, "policy", LAB_PLACE_AUTOMATIC);
 | 
			
		||||
				view_place_by_policy(view,
 | 
			
		||||
					/* allow_cursor */ true, policy);
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
		case ACTION_TYPE_TOGGLE_TEARING:
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -873,11 +873,8 @@ entry(xmlNode *node, char *nodename, char *content)
 | 
			
		|||
	} else if (!strcasecmp(nodename, "reuseOutputMode.core")) {
 | 
			
		||||
		set_bool(content, &rc.reuse_output_mode);
 | 
			
		||||
	} else if (!strcmp(nodename, "policy.placement")) {
 | 
			
		||||
		if (!strcmp(content, "automatic")) {
 | 
			
		||||
			rc.placement_policy = LAB_PLACE_AUTOMATIC;
 | 
			
		||||
		} else if (!strcmp(content, "cursor")) {
 | 
			
		||||
			rc.placement_policy = LAB_PLACE_CURSOR;
 | 
			
		||||
		} else {
 | 
			
		||||
		rc.placement_policy = view_placement_parse(content);
 | 
			
		||||
		if (rc.placement_policy == LAB_PLACE_INVALID) {
 | 
			
		||||
			rc.placement_policy = LAB_PLACE_CENTER;
 | 
			
		||||
		}
 | 
			
		||||
	} else if (!strcmp(nodename, "name.theme")) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
							
								
								
									
										28
									
								
								src/view.c
									
										
									
									
									
								
							
							
						
						
									
										28
									
								
								src/view.c
									
										
									
									
									
								
							| 
						 | 
				
			
			@ -833,12 +833,13 @@ view_center(struct view *view, const struct wlr_box *ref)
 | 
			
		|||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
view_place_initial(struct view *view, bool allow_cursor)
 | 
			
		||||
view_place_by_policy(struct view *view, bool allow_cursor,
 | 
			
		||||
		enum view_placement_policy policy)
 | 
			
		||||
{
 | 
			
		||||
	if (allow_cursor && rc.placement_policy == LAB_PLACE_CURSOR) {
 | 
			
		||||
	if (allow_cursor && policy == LAB_PLACE_CURSOR) {
 | 
			
		||||
		view_move_to_cursor(view);
 | 
			
		||||
		return;
 | 
			
		||||
	} else if (rc.placement_policy == LAB_PLACE_AUTOMATIC) {
 | 
			
		||||
	} else if (policy == LAB_PLACE_AUTOMATIC) {
 | 
			
		||||
		struct wlr_box geometry = view->pending;
 | 
			
		||||
		if (placement_find_best(view, &geometry)) {
 | 
			
		||||
			view_move(view, geometry.x, geometry.y);
 | 
			
		||||
| 
						 | 
				
			
			@ -1866,6 +1867,24 @@ view_edge_parse(const char *direction)
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
enum view_placement_policy
 | 
			
		||||
view_placement_parse(const char *policy)
 | 
			
		||||
{
 | 
			
		||||
	if (!policy) {
 | 
			
		||||
		return LAB_PLACE_CENTER;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	if (!strcasecmp(policy, "automatic")) {
 | 
			
		||||
		return LAB_PLACE_AUTOMATIC;
 | 
			
		||||
	} else if (!strcasecmp(policy, "cursor")) {
 | 
			
		||||
		return LAB_PLACE_CURSOR;
 | 
			
		||||
	} else if (!strcasecmp(policy, "center")) {
 | 
			
		||||
		return LAB_PLACE_CENTER;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return LAB_PLACE_INVALID;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void
 | 
			
		||||
view_snap_to_edge(struct view *view, enum view_edge edge,
 | 
			
		||||
			bool across_outputs, bool store_natural_geometry)
 | 
			
		||||
| 
						 | 
				
			
			@ -1969,7 +1988,8 @@ view_move_to_output(struct view *view, struct output *output)
 | 
			
		|||
		struct wlr_box output_area = output_usable_area_in_layout_coords(output);
 | 
			
		||||
		view->pending.x = output_area.x;
 | 
			
		||||
		view->pending.y = output_area.y;
 | 
			
		||||
		view_place_initial(view, /* allow_cursor */ false);
 | 
			
		||||
		view_place_by_policy(view,
 | 
			
		||||
				/* allow_cursor */ false, rc.placement_policy);
 | 
			
		||||
	} else if (view->maximized != VIEW_AXIS_NONE) {
 | 
			
		||||
		view_apply_maximized_geometry(view);
 | 
			
		||||
	} else if (view->tiled) {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -530,7 +530,7 @@ set_initial_position(struct view *view)
 | 
			
		|||
	}
 | 
			
		||||
 | 
			
		||||
	/* All other views are placed according to a configured strategy */
 | 
			
		||||
	view_place_initial(view, /* allow_cursor */ true);
 | 
			
		||||
	view_place_by_policy(view, /* allow_cursor */ true, rc.placement_policy);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static const char *
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -571,7 +571,8 @@ set_initial_position(struct view *view,
 | 
			
		|||
		view_constrain_size_to_that_of_usable_area(view);
 | 
			
		||||
 | 
			
		||||
		if (view_is_floating(view)) {
 | 
			
		||||
			view_place_initial(view, /* allow_cursor */ true);
 | 
			
		||||
			view_place_by_policy(view,
 | 
			
		||||
				/* allow_cursor */ true, rc.placement_policy);
 | 
			
		||||
		} else {
 | 
			
		||||
			/*
 | 
			
		||||
			 * View is maximized/fullscreen. Center the
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue