mirror of
				https://github.com/swaywm/sway.git
				synced 2025-11-03 09:01:43 -05:00 
			
		
		
		
	Merge branch 'master' into nagbar
This commit is contained in:
		
						commit
						706c0fbe23
					
				
					 11 changed files with 77 additions and 73 deletions
				
			
		| 
						 | 
					@ -42,17 +42,4 @@ void transaction_notify_view_ready(struct sway_view *view, uint32_t serial);
 | 
				
			||||||
void transaction_notify_view_ready_by_size(struct sway_view *view,
 | 
					void transaction_notify_view_ready_by_size(struct sway_view *view,
 | 
				
			||||||
		int width, int height);
 | 
							int width, int height);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					 | 
				
			||||||
 * Get the saved texture that should be rendered for a view.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * The addresses pointed at by the width and height pointers will be populated
 | 
					 | 
				
			||||||
 * with the surface's dimensions, which may be different to the texture's
 | 
					 | 
				
			||||||
 * dimensions if output scaling is used.
 | 
					 | 
				
			||||||
 *
 | 
					 | 
				
			||||||
 * This function should only be called if it is known that the view has
 | 
					 | 
				
			||||||
 * instructions.
 | 
					 | 
				
			||||||
 */
 | 
					 | 
				
			||||||
struct wlr_texture *transaction_get_saved_texture(struct sway_view *view,
 | 
					 | 
				
			||||||
		int *width, int *height);
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -85,6 +85,9 @@ struct sway_view {
 | 
				
			||||||
	bool allow_request_urgent;
 | 
						bool allow_request_urgent;
 | 
				
			||||||
	struct wl_event_source *urgent_timer;
 | 
						struct wl_event_source *urgent_timer;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						struct wlr_buffer *saved_buffer;
 | 
				
			||||||
 | 
						int saved_buffer_width, saved_buffer_height;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	bool destroying;
 | 
						bool destroying;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	list_t *executed_criteria; // struct criteria *
 | 
						list_t *executed_criteria; // struct criteria *
 | 
				
			||||||
| 
						 | 
					@ -339,4 +342,8 @@ void view_set_urgent(struct sway_view *view, bool enable);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
bool view_is_urgent(struct sway_view *view);
 | 
					bool view_is_urgent(struct sway_view *view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void view_remove_saved_buffer(struct sway_view *view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void view_save_buffer(struct sway_view *view);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -44,13 +44,13 @@ systemd        = dependency('libsystemd', required: false)
 | 
				
			||||||
elogind        = dependency('libelogind', required: false)
 | 
					elogind        = dependency('libelogind', required: false)
 | 
				
			||||||
math           = cc.find_library('m')
 | 
					math           = cc.find_library('m')
 | 
				
			||||||
rt             = cc.find_library('rt')
 | 
					rt             = cc.find_library('rt')
 | 
				
			||||||
xcb            = dependency('xcb')
 | 
					 | 
				
			||||||
git            = find_program('git', required: false)
 | 
					git            = find_program('git', required: false)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
conf_data = configuration_data()
 | 
					conf_data = configuration_data()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if get_option('enable-xwayland')
 | 
					if get_option('enable-xwayland')
 | 
				
			||||||
	conf_data.set('HAVE_XWAYLAND', true)
 | 
						conf_data.set('HAVE_XWAYLAND', true)
 | 
				
			||||||
 | 
						xcb = dependency('xcb')
 | 
				
			||||||
else
 | 
					else
 | 
				
			||||||
	conf_data.set('HAVE_XWAYLAND', false)
 | 
						conf_data.set('HAVE_XWAYLAND', false)
 | 
				
			||||||
endif
 | 
					endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -4,6 +4,7 @@
 | 
				
			||||||
#include <string.h>
 | 
					#include <string.h>
 | 
				
			||||||
#include <sys/wait.h>
 | 
					#include <sys/wait.h>
 | 
				
			||||||
#include <unistd.h>
 | 
					#include <unistd.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
#include "sway/commands.h"
 | 
					#include "sway/commands.h"
 | 
				
			||||||
#include "sway/config.h"
 | 
					#include "sway/config.h"
 | 
				
			||||||
#include "sway/tree/container.h"
 | 
					#include "sway/tree/container.h"
 | 
				
			||||||
| 
						 | 
					@ -47,6 +48,9 @@ struct cmd_results *cmd_exec_always(int argc, char **argv) {
 | 
				
			||||||
	if ((pid = fork()) == 0) {
 | 
						if ((pid = fork()) == 0) {
 | 
				
			||||||
		// Fork child process again
 | 
							// Fork child process again
 | 
				
			||||||
		setsid();
 | 
							setsid();
 | 
				
			||||||
 | 
							sigset_t set;
 | 
				
			||||||
 | 
							sigemptyset(&set);
 | 
				
			||||||
 | 
							sigprocmask(SIG_SETMASK, &set, NULL);
 | 
				
			||||||
		close(fd[0]);
 | 
							close(fd[0]);
 | 
				
			||||||
		if ((child = fork()) == 0) {
 | 
							if ((child = fork()) == 0) {
 | 
				
			||||||
			close(fd[1]);
 | 
								close(fd[1]);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -59,8 +59,7 @@ static struct cmd_results *cmd_move_container(struct sway_container *current,
 | 
				
			||||||
			&& strcasecmp(argv[2], "workspace") == 0) {
 | 
								&& strcasecmp(argv[2], "workspace") == 0) {
 | 
				
			||||||
		// move container to workspace x
 | 
							// move container to workspace x
 | 
				
			||||||
		if (current->type == C_WORKSPACE) {
 | 
							if (current->type == C_WORKSPACE) {
 | 
				
			||||||
			// TODO: Wrap children in a container and move that
 | 
								current = container_wrap_children(current);
 | 
				
			||||||
			return cmd_results_new(CMD_FAILURE, "move", "Unimplemented");
 | 
					 | 
				
			||||||
		} else if (current->type != C_CONTAINER && current->type != C_VIEW) {
 | 
							} else if (current->type != C_CONTAINER && current->type != C_VIEW) {
 | 
				
			||||||
			return cmd_results_new(CMD_FAILURE, "move",
 | 
								return cmd_results_new(CMD_FAILURE, "move",
 | 
				
			||||||
					"Can only move containers and views.");
 | 
										"Can only move containers and views.");
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -10,6 +10,7 @@
 | 
				
			||||||
#include <sys/stat.h>
 | 
					#include <sys/stat.h>
 | 
				
			||||||
#include <signal.h>
 | 
					#include <signal.h>
 | 
				
			||||||
#include <strings.h>
 | 
					#include <strings.h>
 | 
				
			||||||
 | 
					#include <signal.h>
 | 
				
			||||||
#include "sway/config.h"
 | 
					#include "sway/config.h"
 | 
				
			||||||
#include "stringop.h"
 | 
					#include "stringop.h"
 | 
				
			||||||
#include "list.h"
 | 
					#include "list.h"
 | 
				
			||||||
| 
						 | 
					@ -175,6 +176,9 @@ void invoke_swaybar(struct bar_config *bar) {
 | 
				
			||||||
	if (bar->pid == 0) {
 | 
						if (bar->pid == 0) {
 | 
				
			||||||
		setpgid(0, 0);
 | 
							setpgid(0, 0);
 | 
				
			||||||
		close(filedes[0]);
 | 
							close(filedes[0]);
 | 
				
			||||||
 | 
							sigset_t set;
 | 
				
			||||||
 | 
							sigemptyset(&set);
 | 
				
			||||||
 | 
							sigprocmask(SIG_SETMASK, &set, NULL);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// run custom swaybar
 | 
							// run custom swaybar
 | 
				
			||||||
		size_t len = snprintf(NULL, 0, "%s -b %s",
 | 
							size_t len = snprintf(NULL, 0, "%s -b %s",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -222,17 +222,14 @@ static void render_saved_view(struct sway_view *view,
 | 
				
			||||||
		struct sway_output *output, pixman_region32_t *damage, float alpha) {
 | 
							struct sway_output *output, pixman_region32_t *damage, float alpha) {
 | 
				
			||||||
	struct wlr_output *wlr_output = output->wlr_output;
 | 
						struct wlr_output *wlr_output = output->wlr_output;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	int width, height;
 | 
						if (!view->saved_buffer || !view->saved_buffer->texture) {
 | 
				
			||||||
	struct wlr_texture *texture =
 | 
					 | 
				
			||||||
		transaction_get_saved_texture(view, &width, &height);
 | 
					 | 
				
			||||||
	if (!texture) {
 | 
					 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	struct wlr_box box = {
 | 
						struct wlr_box box = {
 | 
				
			||||||
		.x = view->swayc->current.view_x - output->swayc->current.swayc_x,
 | 
							.x = view->swayc->current.view_x - output->swayc->current.swayc_x,
 | 
				
			||||||
		.y = view->swayc->current.view_y - output->swayc->current.swayc_y,
 | 
							.y = view->swayc->current.view_y - output->swayc->current.swayc_y,
 | 
				
			||||||
		.width = width,
 | 
							.width = view->saved_buffer_width,
 | 
				
			||||||
		.height = height,
 | 
							.height = view->saved_buffer_height,
 | 
				
			||||||
	};
 | 
						};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	struct wlr_box output_box = {
 | 
						struct wlr_box output_box = {
 | 
				
			||||||
| 
						 | 
					@ -252,7 +249,8 @@ static void render_saved_view(struct sway_view *view,
 | 
				
			||||||
	wlr_matrix_project_box(matrix, &box, WL_OUTPUT_TRANSFORM_NORMAL, 0,
 | 
						wlr_matrix_project_box(matrix, &box, WL_OUTPUT_TRANSFORM_NORMAL, 0,
 | 
				
			||||||
		wlr_output->transform_matrix);
 | 
							wlr_output->transform_matrix);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	render_texture(wlr_output, damage, texture, &box, matrix, alpha);
 | 
						render_texture(wlr_output, damage, view->saved_buffer->texture,
 | 
				
			||||||
 | 
								&box, matrix, alpha);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
/**
 | 
					/**
 | 
				
			||||||
| 
						 | 
					@ -261,7 +259,7 @@ static void render_saved_view(struct sway_view *view,
 | 
				
			||||||
static void render_view(struct sway_output *output, pixman_region32_t *damage,
 | 
					static void render_view(struct sway_output *output, pixman_region32_t *damage,
 | 
				
			||||||
		struct sway_container *con, struct border_colors *colors) {
 | 
							struct sway_container *con, struct border_colors *colors) {
 | 
				
			||||||
	struct sway_view *view = con->sway_view;
 | 
						struct sway_view *view = con->sway_view;
 | 
				
			||||||
	if (view->swayc->instructions->length) {
 | 
						if (view->saved_buffer) {
 | 
				
			||||||
		render_saved_view(view, output, damage, view->swayc->alpha);
 | 
							render_saved_view(view, output, damage, view->swayc->alpha);
 | 
				
			||||||
	} else {
 | 
						} else {
 | 
				
			||||||
		render_view_toplevels(view, output, damage, view->swayc->alpha);
 | 
							render_view_toplevels(view, output, damage, view->swayc->alpha);
 | 
				
			||||||
| 
						 | 
					@ -864,7 +862,7 @@ void output_render(struct sway_output *output, struct timespec *when,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		// TODO: handle views smaller than the output
 | 
							// TODO: handle views smaller than the output
 | 
				
			||||||
		if (fullscreen_con->type == C_VIEW) {
 | 
							if (fullscreen_con->type == C_VIEW) {
 | 
				
			||||||
			if (fullscreen_con->instructions->length) {
 | 
								if (fullscreen_con->sway_view->saved_buffer) {
 | 
				
			||||||
				render_saved_view(fullscreen_con->sway_view,
 | 
									render_saved_view(fullscreen_con->sway_view,
 | 
				
			||||||
						output, damage, 1.0f);
 | 
											output, damage, 1.0f);
 | 
				
			||||||
			} else {
 | 
								} else {
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -41,8 +41,6 @@ struct sway_transaction_instruction {
 | 
				
			||||||
	struct sway_transaction *transaction;
 | 
						struct sway_transaction *transaction;
 | 
				
			||||||
	struct sway_container *container;
 | 
						struct sway_container *container;
 | 
				
			||||||
	struct sway_container_state state;
 | 
						struct sway_container_state state;
 | 
				
			||||||
	struct wlr_buffer *saved_buffer;
 | 
					 | 
				
			||||||
	int saved_buffer_width, saved_buffer_height;
 | 
					 | 
				
			||||||
	uint32_t serial;
 | 
						uint32_t serial;
 | 
				
			||||||
	bool ready;
 | 
						bool ready;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
| 
						 | 
					@ -57,27 +55,6 @@ static struct sway_transaction *transaction_create() {
 | 
				
			||||||
	return transaction;
 | 
						return transaction;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static void remove_saved_view_buffer(
 | 
					 | 
				
			||||||
		struct sway_transaction_instruction *instruction) {
 | 
					 | 
				
			||||||
	if (instruction->saved_buffer) {
 | 
					 | 
				
			||||||
		wlr_buffer_unref(instruction->saved_buffer);
 | 
					 | 
				
			||||||
		instruction->saved_buffer = NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void save_view_buffer(struct sway_view *view,
 | 
					 | 
				
			||||||
		struct sway_transaction_instruction *instruction) {
 | 
					 | 
				
			||||||
	if (!sway_assert(instruction->saved_buffer == NULL,
 | 
					 | 
				
			||||||
				"Didn't expect instruction to have a saved buffer already")) {
 | 
					 | 
				
			||||||
		remove_saved_view_buffer(instruction);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	if (view->surface && wlr_surface_has_buffer(view->surface)) {
 | 
					 | 
				
			||||||
		instruction->saved_buffer = wlr_buffer_ref(view->surface->buffer);
 | 
					 | 
				
			||||||
		instruction->saved_buffer_width = view->surface->current.width;
 | 
					 | 
				
			||||||
		instruction->saved_buffer_height = view->surface->current.height;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
static void transaction_destroy(struct sway_transaction *transaction) {
 | 
					static void transaction_destroy(struct sway_transaction *transaction) {
 | 
				
			||||||
	// Free instructions
 | 
						// Free instructions
 | 
				
			||||||
	for (int i = 0; i < transaction->instructions->length; ++i) {
 | 
						for (int i = 0; i < transaction->instructions->length; ++i) {
 | 
				
			||||||
| 
						 | 
					@ -93,7 +70,6 @@ static void transaction_destroy(struct sway_transaction *transaction) {
 | 
				
			||||||
		if (con->destroying && !con->instructions->length) {
 | 
							if (con->destroying && !con->instructions->length) {
 | 
				
			||||||
			container_free(con);
 | 
								container_free(con);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
		remove_saved_view_buffer(instruction);
 | 
					 | 
				
			||||||
		free(instruction);
 | 
							free(instruction);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	list_free(transaction->instructions);
 | 
						list_free(transaction->instructions);
 | 
				
			||||||
| 
						 | 
					@ -158,9 +134,6 @@ static void transaction_add_container(struct sway_transaction *transaction,
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	copy_pending_state(container, &instruction->state);
 | 
						copy_pending_state(container, &instruction->state);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if (container->type == C_VIEW) {
 | 
					 | 
				
			||||||
		save_view_buffer(container->sway_view, instruction);
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	list_add(transaction->instructions, instruction);
 | 
						list_add(transaction->instructions, instruction);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -220,6 +193,22 @@ static void transaction_apply(struct sway_transaction *transaction) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
		memcpy(&container->current, &instruction->state,
 | 
							memcpy(&container->current, &instruction->state,
 | 
				
			||||||
				sizeof(struct sway_container_state));
 | 
									sizeof(struct sway_container_state));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if (container->type == C_VIEW) {
 | 
				
			||||||
 | 
								if (container->destroying) {
 | 
				
			||||||
 | 
									if (container->instructions->length == 1 &&
 | 
				
			||||||
 | 
											container->sway_view->saved_buffer) {
 | 
				
			||||||
 | 
										view_remove_saved_buffer(container->sway_view);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								} else {
 | 
				
			||||||
 | 
									if (container->sway_view->saved_buffer) {
 | 
				
			||||||
 | 
										view_remove_saved_buffer(container->sway_view);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
									if (container->instructions->length > 1) {
 | 
				
			||||||
 | 
										view_save_buffer(container->sway_view);
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
 | 
								}
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -295,6 +284,9 @@ static void transaction_commit(struct sway_transaction *transaction) {
 | 
				
			||||||
			struct timespec when;
 | 
								struct timespec when;
 | 
				
			||||||
			wlr_surface_send_frame_done(con->sway_view->surface, &when);
 | 
								wlr_surface_send_frame_done(con->sway_view->surface, &when);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
 | 
							if (con->type == C_VIEW && !con->sway_view->saved_buffer) {
 | 
				
			||||||
 | 
								view_save_buffer(con->sway_view);
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
		list_add(con->instructions, instruction);
 | 
							list_add(con->instructions, instruction);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
	transaction->num_configures = transaction->num_waiting;
 | 
						transaction->num_configures = transaction->num_waiting;
 | 
				
			||||||
| 
						 | 
					@ -400,18 +392,6 @@ void transaction_notify_view_ready_by_size(struct sway_view *view,
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
struct wlr_texture *transaction_get_saved_texture(struct sway_view *view,
 | 
					 | 
				
			||||||
		int *width, int *height) {
 | 
					 | 
				
			||||||
	struct sway_transaction_instruction *instruction =
 | 
					 | 
				
			||||||
		view->swayc->instructions->items[0];
 | 
					 | 
				
			||||||
	if (!instruction->saved_buffer) {
 | 
					 | 
				
			||||||
		return NULL;
 | 
					 | 
				
			||||||
	}
 | 
					 | 
				
			||||||
	*width = instruction->saved_buffer_width;
 | 
					 | 
				
			||||||
	*height = instruction->saved_buffer_height;
 | 
					 | 
				
			||||||
	return instruction->saved_buffer->texture;
 | 
					 | 
				
			||||||
}
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
void transaction_commit_dirty(void) {
 | 
					void transaction_commit_dirty(void) {
 | 
				
			||||||
	if (!server.dirty_containers->length) {
 | 
						if (!server.dirty_containers->length) {
 | 
				
			||||||
		return;
 | 
							return;
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -775,8 +775,12 @@ void seat_set_focus_warp(struct sway_seat *seat,
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if (container) {
 | 
				
			||||||
		if (container->type == C_VIEW) {
 | 
							if (container->type == C_VIEW) {
 | 
				
			||||||
			ipc_event_window(container, "focus");
 | 
								ipc_event_window(container, "focus");
 | 
				
			||||||
 | 
							} else if (container->type == C_WORKSPACE) {
 | 
				
			||||||
 | 
								ipc_event_workspace(NULL, container, "focus");
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	seat->has_focus = (container != NULL);
 | 
						seat->has_focus = (container != NULL);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -153,10 +153,6 @@ sway_sources = files(
 | 
				
			||||||
	'tree/output.c',
 | 
						'tree/output.c',
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
if get_option('enable-xwayland')
 | 
					 | 
				
			||||||
	sway_sources += 'desktop/xwayland.c'
 | 
					 | 
				
			||||||
endif
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
sway_deps = [
 | 
					sway_deps = [
 | 
				
			||||||
	cairo,
 | 
						cairo,
 | 
				
			||||||
	gdk_pixbuf,
 | 
						gdk_pixbuf,
 | 
				
			||||||
| 
						 | 
					@ -170,10 +166,14 @@ sway_deps = [
 | 
				
			||||||
	server_protos,
 | 
						server_protos,
 | 
				
			||||||
	wayland_server,
 | 
						wayland_server,
 | 
				
			||||||
	wlroots,
 | 
						wlroots,
 | 
				
			||||||
	xcb,
 | 
					 | 
				
			||||||
	xkbcommon,
 | 
						xkbcommon,
 | 
				
			||||||
]
 | 
					]
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					if get_option('enable-xwayland')
 | 
				
			||||||
 | 
						sway_sources += 'desktop/xwayland.c'
 | 
				
			||||||
 | 
						sway_deps += xcb
 | 
				
			||||||
 | 
					endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
executable(
 | 
					executable(
 | 
				
			||||||
	'sway',
 | 
						'sway',
 | 
				
			||||||
	sway_sources,
 | 
						sway_sources,
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -2,6 +2,7 @@
 | 
				
			||||||
#include <stdlib.h>
 | 
					#include <stdlib.h>
 | 
				
			||||||
#include <wayland-server.h>
 | 
					#include <wayland-server.h>
 | 
				
			||||||
#include <wlr/render/wlr_renderer.h>
 | 
					#include <wlr/render/wlr_renderer.h>
 | 
				
			||||||
 | 
					#include <wlr/types/wlr_buffer.h>
 | 
				
			||||||
#include <wlr/types/wlr_output_layout.h>
 | 
					#include <wlr/types/wlr_output_layout.h>
 | 
				
			||||||
#include "config.h"
 | 
					#include "config.h"
 | 
				
			||||||
#ifdef HAVE_XWAYLAND
 | 
					#ifdef HAVE_XWAYLAND
 | 
				
			||||||
| 
						 | 
					@ -495,7 +496,7 @@ static struct sway_container *select_workspace(struct sway_view *view) {
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	// Use the focused workspace
 | 
						// Use the focused workspace
 | 
				
			||||||
	ws = seat_get_focus(seat);
 | 
						ws = seat_get_focus_inactive(seat, &root_container);
 | 
				
			||||||
	if (ws->type != C_WORKSPACE) {
 | 
						if (ws->type != C_WORKSPACE) {
 | 
				
			||||||
		ws = container_parent(ws, C_WORKSPACE);
 | 
							ws = container_parent(ws, C_WORKSPACE);
 | 
				
			||||||
	}
 | 
						}
 | 
				
			||||||
| 
						 | 
					@ -504,7 +505,8 @@ static struct sway_container *select_workspace(struct sway_view *view) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
static bool should_focus(struct sway_view *view) {
 | 
					static bool should_focus(struct sway_view *view) {
 | 
				
			||||||
	struct sway_seat *seat = input_manager_current_seat(input_manager);
 | 
						struct sway_seat *seat = input_manager_current_seat(input_manager);
 | 
				
			||||||
	struct sway_container *prev_focus = seat_get_focus(seat);
 | 
						struct sway_container *prev_focus =
 | 
				
			||||||
 | 
							seat_get_focus_inactive(seat, &root_container);
 | 
				
			||||||
	struct sway_container *prev_ws = prev_focus->type == C_WORKSPACE ?
 | 
						struct sway_container *prev_ws = prev_focus->type == C_WORKSPACE ?
 | 
				
			||||||
		prev_focus : container_parent(prev_focus, C_WORKSPACE);
 | 
							prev_focus : container_parent(prev_focus, C_WORKSPACE);
 | 
				
			||||||
	struct sway_container *map_ws = container_parent(view->swayc, C_WORKSPACE);
 | 
						struct sway_container *map_ws = container_parent(view->swayc, C_WORKSPACE);
 | 
				
			||||||
| 
						 | 
					@ -1093,3 +1095,22 @@ void view_set_urgent(struct sway_view *view, bool enable) {
 | 
				
			||||||
bool view_is_urgent(struct sway_view *view) {
 | 
					bool view_is_urgent(struct sway_view *view) {
 | 
				
			||||||
	return view->urgent.tv_sec || view->urgent.tv_nsec;
 | 
						return view->urgent.tv_sec || view->urgent.tv_nsec;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void view_remove_saved_buffer(struct sway_view *view) {
 | 
				
			||||||
 | 
						if (!sway_assert(view->saved_buffer, "Expected a saved buffer")) {
 | 
				
			||||||
 | 
							return;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						wlr_buffer_unref(view->saved_buffer);
 | 
				
			||||||
 | 
						view->saved_buffer = NULL;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void view_save_buffer(struct sway_view *view) {
 | 
				
			||||||
 | 
						if (!sway_assert(!view->saved_buffer, "Didn't expect saved buffer")) {
 | 
				
			||||||
 | 
							view_remove_saved_buffer(view);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (view->surface && wlr_surface_has_buffer(view->surface)) {
 | 
				
			||||||
 | 
							view->saved_buffer = wlr_buffer_ref(view->surface->buffer);
 | 
				
			||||||
 | 
							view->saved_buffer_width = view->surface->current.width;
 | 
				
			||||||
 | 
							view->saved_buffer_height = view->surface->current.height;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue