Restore geometry of all windows before exiting/restarting (Thanks Sasha)

This fixes ticket #185
This commit is contained in:
Michael Stapelberg 2010-03-02 15:25:08 +01:00
parent d08ec00329
commit b53c5861a2
4 changed files with 37 additions and 0 deletions

View File

@ -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.
* *

View File

@ -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, were done */ /* If this container is empty, were 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);
} }

View File

@ -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.
* *

View File

@ -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");