mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Implement sort_workspaces() function for outputs.
This seems to have resolved issue #669 for me.
This commit is contained in:
		
							parent
							
								
									907283d230
								
							
						
					
					
						commit
						c6c3a8e758
					
				
					 3 changed files with 33 additions and 17 deletions
				
			
		| 
						 | 
					@ -16,4 +16,7 @@ void get_absolute_position(swayc_t *container, struct wlc_point *point);
 | 
				
			||||||
// given wlc_point.
 | 
					// given wlc_point.
 | 
				
			||||||
void get_absolute_center_position(swayc_t *container, struct wlc_point *point);
 | 
					void get_absolute_center_position(swayc_t *container, struct wlc_point *point);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sort_workspace_cmp_qsort(const void *a, const void *b);
 | 
				
			||||||
 | 
					void sort_workspaces(swayc_t *output);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -13,6 +13,7 @@
 | 
				
			||||||
#include "input_state.h"
 | 
					#include "input_state.h"
 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
#include "ipc-server.h"
 | 
					#include "ipc-server.h"
 | 
				
			||||||
 | 
					#include "output.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#define ASSERT_NONNULL(PTR) \
 | 
					#define ASSERT_NONNULL(PTR) \
 | 
				
			||||||
	sway_assert (PTR, #PTR "must be non-null")
 | 
						sway_assert (PTR, #PTR "must be non-null")
 | 
				
			||||||
| 
						 | 
					@ -180,24 +181,9 @@ swayc_t *new_workspace(swayc_t *output, const char *name) {
 | 
				
			||||||
	workspace->visible = false;
 | 
						workspace->visible = false;
 | 
				
			||||||
	workspace->floating = create_list();
 | 
						workspace->floating = create_list();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (isdigit(workspace->name[0])) {
 | 
						add_child(output, workspace);
 | 
				
			||||||
		// find position for numbered workspace
 | 
						sort_workspaces(output);
 | 
				
			||||||
		// order: ascending numbers, insert before same number
 | 
					 | 
				
			||||||
		//        numbers before unnumbered
 | 
					 | 
				
			||||||
		int num = strtol(workspace->name, NULL, 10);
 | 
					 | 
				
			||||||
		int i;
 | 
					 | 
				
			||||||
		for (i = 0; i < output->children->length; ++i) {
 | 
					 | 
				
			||||||
			char *name = ((swayc_t *)output->children->items[i])->name;
 | 
					 | 
				
			||||||
			if (!isdigit(name[0]) || num <= strtol(name, NULL, 10)) {
 | 
					 | 
				
			||||||
				break;
 | 
					 | 
				
			||||||
			}
 | 
					 | 
				
			||||||
		}
 | 
					 | 
				
			||||||
		insert_child(output, workspace, i);
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
	} else {
 | 
					 | 
				
			||||||
		// append new unnumbered to the end
 | 
					 | 
				
			||||||
		add_child(output, workspace);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	return workspace;
 | 
						return workspace;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -353,6 +339,7 @@ swayc_t *destroy_output(swayc_t *output) {
 | 
				
			||||||
				remove_child(child);
 | 
									remove_child(child);
 | 
				
			||||||
				add_child(root_container.children->items[p], child);
 | 
									add_child(root_container.children->items[p], child);
 | 
				
			||||||
			}
 | 
								}
 | 
				
			||||||
 | 
								sort_workspaces(root_container.children->items[p]);
 | 
				
			||||||
			update_visibility(root_container.children->items[p]);
 | 
								update_visibility(root_container.children->items[p]);
 | 
				
			||||||
			arrange_windows(root_container.children->items[p], -1, -1);
 | 
								arrange_windows(root_container.children->items[p], -1, -1);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,4 +1,6 @@
 | 
				
			||||||
#include <strings.h>
 | 
					#include <strings.h>
 | 
				
			||||||
 | 
					#include <ctype.h>
 | 
				
			||||||
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include "output.h"
 | 
					#include "output.h"
 | 
				
			||||||
#include "log.h"
 | 
					#include "log.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -177,3 +179,27 @@ void get_absolute_center_position(swayc_t *container, struct wlc_point *point) {
 | 
				
			||||||
	point->x += container->width/2;
 | 
						point->x += container->width/2;
 | 
				
			||||||
	point->y += container->height/2;
 | 
						point->y += container->height/2;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int sort_workspace_cmp_qsort(const void *_a, const void *_b) {
 | 
				
			||||||
 | 
						swayc_t *a = *(void **)_a;
 | 
				
			||||||
 | 
						swayc_t *b = *(void **)_b;
 | 
				
			||||||
 | 
						int retval = 0;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (isdigit(a->name[0]) && isdigit(b->name[0])) {
 | 
				
			||||||
 | 
							int a_num = strtol(a->name, NULL, 10);
 | 
				
			||||||
 | 
							int b_num = strtol(b->name, NULL, 10);
 | 
				
			||||||
 | 
							retval = (a_num < b_num) ? -1 : (a_num > b_num);
 | 
				
			||||||
 | 
						} else if (isdigit(a->name[0])) {
 | 
				
			||||||
 | 
							retval = -1;
 | 
				
			||||||
 | 
						} else if (isdigit(b->name[0])) {
 | 
				
			||||||
 | 
							retval = 1;
 | 
				
			||||||
 | 
						} else {
 | 
				
			||||||
 | 
							retval = strcmp(a->name, b->name);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return retval;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void sort_workspaces(swayc_t *output) {
 | 
				
			||||||
 | 
						list_qsort(output->children, sort_workspace_cmp_qsort);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue