mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge pull request #1155 from 4e554c4c/get_marks
Add `-t get_marks` and use more i3-like marks
This commit is contained in:
		
						commit
						8d191b2785
					
				
					 2 changed files with 37 additions and 0 deletions
				
			
		| 
						 | 
				
			
			@ -5,6 +5,15 @@
 | 
			
		|||
#include "list.h"
 | 
			
		||||
#include "stringop.h"
 | 
			
		||||
 | 
			
		||||
static void find_marks_callback(swayc_t *container, void *_mark) {
 | 
			
		||||
	char *mark = (char *)_mark;
 | 
			
		||||
 | 
			
		||||
	int index;
 | 
			
		||||
	if (container->marks && ((index = list_seq_find(container->marks, (int (*)(const void *, const void *))strcmp, mark)) != -1)) {
 | 
			
		||||
		list_del(container->marks, index);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
struct cmd_results *cmd_mark(int argc, char **argv) {
 | 
			
		||||
	struct cmd_results *error = NULL;
 | 
			
		||||
	if (config->reading) return cmd_results_new(CMD_FAILURE, "mark", "Can't be used in config file.");
 | 
			
		||||
| 
						 | 
				
			
			@ -30,6 +39,10 @@ struct cmd_results *cmd_mark(int argc, char **argv) {
 | 
			
		|||
 | 
			
		||||
	if (argc) {
 | 
			
		||||
		char *mark = join_args(argv, argc);
 | 
			
		||||
 | 
			
		||||
		// Remove all existing marks of this type
 | 
			
		||||
		container_map(&root_container, find_marks_callback, mark);
 | 
			
		||||
 | 
			
		||||
		if (view->marks) {
 | 
			
		||||
			if (add) {
 | 
			
		||||
				int index;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -63,6 +63,7 @@ void ipc_client_handle_command(struct ipc_client *client);
 | 
			
		|||
bool ipc_send_reply(struct ipc_client *client, const char *payload, uint32_t payload_length);
 | 
			
		||||
void ipc_get_workspaces_callback(swayc_t *workspace, void *data);
 | 
			
		||||
void ipc_get_outputs_callback(swayc_t *container, void *data);
 | 
			
		||||
static void ipc_get_marks_callback(swayc_t *container, void *data);
 | 
			
		||||
 | 
			
		||||
void ipc_init(void) {
 | 
			
		||||
	ipc_socket = socket(AF_UNIX, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);
 | 
			
		||||
| 
						 | 
				
			
			@ -464,6 +465,19 @@ void ipc_client_handle_command(struct ipc_client *client) {
 | 
			
		|||
		goto exit_cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	case IPC_GET_MARKS:
 | 
			
		||||
	{
 | 
			
		||||
		if (!(client->security_policy & IPC_FEATURE_GET_MARKS)) {
 | 
			
		||||
			goto exit_denied;
 | 
			
		||||
		}
 | 
			
		||||
		json_object *marks = json_object_new_array();
 | 
			
		||||
		container_map(&root_container, ipc_get_marks_callback, marks);
 | 
			
		||||
		const char *json_string = json_object_to_json_string(marks);
 | 
			
		||||
		ipc_send_reply(client, json_string, (uint32_t) strlen(json_string));
 | 
			
		||||
		json_object_put(marks);
 | 
			
		||||
		goto exit_cleanup;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	case IPC_GET_VERSION:
 | 
			
		||||
	{
 | 
			
		||||
		json_object *version = ipc_json_get_version();
 | 
			
		||||
| 
						 | 
				
			
			@ -617,6 +631,16 @@ void ipc_get_outputs_callback(swayc_t *container, void *data) {
 | 
			
		|||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static void ipc_get_marks_callback(swayc_t *container, void *data) {
 | 
			
		||||
	json_object *object = (json_object *)data;
 | 
			
		||||
	if (container->marks) {
 | 
			
		||||
		for (int i = 0; i < container->marks->length; ++i) {
 | 
			
		||||
			char *mark = (char *)container->marks->items[i];
 | 
			
		||||
			json_object_array_add(object, json_object_new_string(mark));
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void ipc_send_event(const char *json_string, enum ipc_command_type event) {
 | 
			
		||||
	static struct {
 | 
			
		||||
		enum ipc_command_type event;
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue