mirror of
				https://gitlab.freedesktop.org/wlroots/wlroots.git
				synced 2025-10-29 05:40:12 -04:00 
			
		
		
		
	Identify topmost interactive layer surface
This commit is contained in:
		
							parent
							
								
									d466cc117f
								
							
						
					
					
						commit
						883d8d306c
					
				
					 2 changed files with 31 additions and 3 deletions
				
			
		|  | @ -36,6 +36,7 @@ static int32_t margin_top = 0; | |||
| static double alpha = 1.0; | ||||
| static bool run_display = true; | ||||
| static bool animate = false; | ||||
| static bool keyboard_interactive = false; | ||||
| static double frame = 0; | ||||
| static int cur_x = -1, cur_y = -1; | ||||
| static int buttons = 0; | ||||
|  | @ -274,7 +275,7 @@ int main(int argc, char **argv) { | |||
| 	int32_t margin_right = 0, margin_bottom = 0, margin_left = 0; | ||||
| 	bool found; | ||||
| 	int c; | ||||
| 	while ((c = getopt(argc, argv, "nw:h:o:l:a:x:m:t:")) != -1) { | ||||
| 	while ((c = getopt(argc, argv, "knw:h:o:l:a:x:m:t:")) != -1) { | ||||
| 		switch (c) { | ||||
| 		case 'o': | ||||
| 			output = atoi(optarg); | ||||
|  | @ -354,6 +355,9 @@ int main(int argc, char **argv) { | |||
| 		case 'n': | ||||
| 			animate = true; | ||||
| 			break; | ||||
| 		case 'k': | ||||
| 			keyboard_interactive = true; | ||||
| 			break; | ||||
| 		default: | ||||
| 			break; | ||||
| 		} | ||||
|  | @ -407,9 +411,10 @@ int main(int argc, char **argv) { | |||
| 	zwlr_layer_surface_v1_set_exclusive_zone(layer_surface, exclusive_zone); | ||||
| 	zwlr_layer_surface_v1_set_margin(layer_surface, | ||||
| 			margin_top, margin_right, margin_bottom, margin_left); | ||||
| 	zwlr_layer_surface_v1_set_keyboard_interactivity( | ||||
| 			layer_surface, keyboard_interactive); | ||||
| 	zwlr_layer_surface_v1_add_listener(layer_surface, | ||||
| 			&layer_surface_listener, layer_surface); | ||||
| 	// TODO: interactivity
 | ||||
| 	wl_surface_commit(wl_surface); | ||||
| 	wl_display_roundtrip(display); | ||||
| 
 | ||||
|  |  | |||
|  | @ -192,6 +192,29 @@ void arrange_layers(struct roots_output *output) { | |||
| 	arrange_layer(output->wlr_output, | ||||
| 			&output->layers[ZWLR_LAYER_SHELL_V1_LAYER_BACKGROUND], | ||||
| 			&usable_area, false); | ||||
| 
 | ||||
| 	// Find topmost keyboard interactive layer, if such a layer exists
 | ||||
| 	uint32_t layers_above_shell[] = { | ||||
| 		ZWLR_LAYER_SHELL_V1_LAYER_OVERLAY, | ||||
| 		ZWLR_LAYER_SHELL_V1_LAYER_TOP, | ||||
| 	}; | ||||
| 	struct roots_layer_surface *layer, *topmost = NULL; | ||||
| 	for (size_t i = 0; | ||||
| 			i < sizeof(layers_above_shell) / sizeof(layers_above_shell[0]); | ||||
| 			++i) { | ||||
| 		wl_list_for_each_reverse(layer, | ||||
| 				&output->layers[layers_above_shell[i]], | ||||
| 				link) { | ||||
| 			if (layer->layer_surface->current.keyboard_interactive) { | ||||
| 				topmost = layer; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 		if (topmost != NULL) { | ||||
| 			break; | ||||
| 		} | ||||
| 	} | ||||
| 	wlr_log(L_DEBUG, "topmost interactive layer: %p", topmost); | ||||
| } | ||||
| 
 | ||||
| static void handle_output_destroy(struct wl_listener *listener, void *data) { | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Drew DeVault
						Drew DeVault