Restore geometry of all windows before exiting/restarting (Thanks Sasha)
This fixes ticket #185
This commit is contained in:
parent
d08ec00329
commit
b53c5861a2
|
@ -23,6 +23,16 @@
|
||||||
void manage_existing_windows(xcb_connection_t *conn, xcb_property_handlers_t
|
void manage_existing_windows(xcb_connection_t *conn, xcb_property_handlers_t
|
||||||
*prophs, xcb_window_t root);
|
*prophs, xcb_window_t root);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Restores the geometry of each window by reparenting it to the root window
|
||||||
|
* at the position of its frame.
|
||||||
|
*
|
||||||
|
* This is to be called *only* before exiting/restarting i3 because of evil
|
||||||
|
* side-effects which are to be expected when continuing to run i3.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void restore_geometry(xcb_connection_t *conn);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Do some sanity checks and then reparent the window.
|
* Do some sanity checks and then reparent the window.
|
||||||
*
|
*
|
||||||
|
|
|
@ -32,6 +32,7 @@
|
||||||
#include "resize.h"
|
#include "resize.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "sighandler.h"
|
#include "sighandler.h"
|
||||||
|
#include "manage.h"
|
||||||
|
|
||||||
bool focus_window_in_container(xcb_connection_t *conn, Container *container, direction_t direction) {
|
bool focus_window_in_container(xcb_connection_t *conn, Container *container, direction_t direction) {
|
||||||
/* If this container is empty, we’re done */
|
/* If this container is empty, we’re done */
|
||||||
|
@ -977,6 +978,7 @@ void parse_command(xcb_connection_t *conn, const char *command) {
|
||||||
/* Is it an <exit>? */
|
/* Is it an <exit>? */
|
||||||
if (STARTS_WITH(command, "exit")) {
|
if (STARTS_WITH(command, "exit")) {
|
||||||
LOG("User issued exit-command, exiting without error.\n");
|
LOG("User issued exit-command, exiting without error.\n");
|
||||||
|
restore_geometry(global_conn);
|
||||||
exit(EXIT_SUCCESS);
|
exit(EXIT_SUCCESS);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
22
src/manage.c
22
src/manage.c
|
@ -63,6 +63,28 @@ void manage_existing_windows(xcb_connection_t *conn, xcb_property_handlers_t *pr
|
||||||
free(cookies);
|
free(cookies);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Restores the geometry of each window by reparenting it to the root window
|
||||||
|
* at the position of its frame.
|
||||||
|
*
|
||||||
|
* This is to be called *only* before exiting/restarting i3 because of evil
|
||||||
|
* side-effects which are to be expected when continuing to run i3.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
void restore_geometry(xcb_connection_t *conn) {
|
||||||
|
Workspace *ws;
|
||||||
|
Client *client;
|
||||||
|
DLOG("Restoring geometry\n");
|
||||||
|
|
||||||
|
TAILQ_FOREACH(ws, workspaces, workspaces)
|
||||||
|
SLIST_FOREACH(client, &(ws->focus_stack), focus_clients)
|
||||||
|
xcb_reparent_window(conn, client->child, root,
|
||||||
|
client->rect.x, client->rect.y);
|
||||||
|
|
||||||
|
/* Make sure our changes reach the X server, we restart/exit now */
|
||||||
|
xcb_flush(conn);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Do some sanity checks and then reparent the window.
|
* Do some sanity checks and then reparent the window.
|
||||||
*
|
*
|
||||||
|
|
|
@ -33,6 +33,7 @@
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
#include "ewmh.h"
|
#include "ewmh.h"
|
||||||
|
#include "manage.h"
|
||||||
|
|
||||||
static iconv_t conversion_descriptor = 0;
|
static iconv_t conversion_descriptor = 0;
|
||||||
struct keyvalue_table_head by_parent = TAILQ_HEAD_INITIALIZER(by_parent);
|
struct keyvalue_table_head by_parent = TAILQ_HEAD_INITIALIZER(by_parent);
|
||||||
|
@ -504,6 +505,8 @@ static char **append_argument(char **original, char *argument) {
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void i3_restart() {
|
void i3_restart() {
|
||||||
|
restore_geometry(global_conn);
|
||||||
|
|
||||||
LOG("restarting \"%s\"...\n", start_argv[0]);
|
LOG("restarting \"%s\"...\n", start_argv[0]);
|
||||||
/* make sure -a is in the argument list or append it */
|
/* make sure -a is in the argument list or append it */
|
||||||
start_argv = append_argument(start_argv, "-a");
|
start_argv = append_argument(start_argv, "-a");
|
||||||
|
|
Loading…
Reference in New Issue