Bugfix: Correctly cleanup stack_windows when setting clients to floating
This fixes ticket #44
This commit is contained in:
parent
ac6561019b
commit
b1eb93326f
|
@ -20,7 +20,7 @@
|
||||||
* one or because it was unmapped
|
* one or because it was unmapped
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void client_remove_from_container(xcb_connection_t *conn, Client *client, Container *container);
|
void client_remove_from_container(xcb_connection_t *conn, Client *client, Container *container, bool remove_from_focusstack);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Warps the pointer into the given client (in the middle of it, to be specific), therefore
|
* Warps the pointer into the given client (in the middle of it, to be specific), therefore
|
||||||
|
|
|
@ -29,10 +29,11 @@
|
||||||
* one or because it was unmapped
|
* one or because it was unmapped
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
void client_remove_from_container(xcb_connection_t *conn, Client *client, Container *container) {
|
void client_remove_from_container(xcb_connection_t *conn, Client *client, Container *container, bool remove_from_focusstack) {
|
||||||
CIRCLEQ_REMOVE(&(container->clients), client, clients);
|
CIRCLEQ_REMOVE(&(container->clients), client, clients);
|
||||||
|
|
||||||
SLIST_REMOVE(&(container->workspace->focus_stack), client, Client, focus_clients);
|
if (remove_from_focusstack)
|
||||||
|
SLIST_REMOVE(&(container->workspace->focus_stack), client, Client, focus_clients);
|
||||||
|
|
||||||
/* If the container will be empty now and is in stacking mode, we need to
|
/* If the container will be empty now and is in stacking mode, we need to
|
||||||
unmap the stack_win */
|
unmap the stack_win */
|
||||||
|
|
|
@ -242,7 +242,7 @@ static void move_current_window(xcb_connection_t *conn, direction_t direction) {
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Remove it from the old container and put it into the new one */
|
/* Remove it from the old container and put it into the new one */
|
||||||
client_remove_from_container(conn, current_client, container);
|
client_remove_from_container(conn, current_client, container, true);
|
||||||
|
|
||||||
if (new->currently_focused != NULL)
|
if (new->currently_focused != NULL)
|
||||||
CIRCLEQ_INSERT_AFTER(&(new->clients), new->currently_focused, current_client, clients);
|
CIRCLEQ_INSERT_AFTER(&(new->clients), new->currently_focused, current_client, clients);
|
||||||
|
@ -505,7 +505,7 @@ static void move_current_window_to_workspace(xcb_connection_t *conn, int workspa
|
||||||
|
|
||||||
assert(to_container != NULL);
|
assert(to_container != NULL);
|
||||||
|
|
||||||
client_remove_from_container(conn, current_client, container);
|
client_remove_from_container(conn, current_client, container, true);
|
||||||
if (container->workspace->fullscreen_client == current_client)
|
if (container->workspace->fullscreen_client == current_client)
|
||||||
container->workspace->fullscreen_client = NULL;
|
container->workspace->fullscreen_client = NULL;
|
||||||
|
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include "xcb.h"
|
#include "xcb.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
#include "layout.h"
|
#include "layout.h"
|
||||||
|
#include "client.h"
|
||||||
|
|
||||||
/* On which border was the dragging initiated? */
|
/* On which border was the dragging initiated? */
|
||||||
typedef enum { BORDER_LEFT, BORDER_RIGHT, BORDER_TOP, BORDER_BOTTOM} border_t;
|
typedef enum { BORDER_LEFT, BORDER_RIGHT, BORDER_TOP, BORDER_BOTTOM} border_t;
|
||||||
|
@ -78,7 +79,7 @@ void toggle_floating_mode(xcb_connection_t *conn, Client *client) {
|
||||||
LOG("Entering floating for client %08x\n", client->child);
|
LOG("Entering floating for client %08x\n", client->child);
|
||||||
|
|
||||||
/* Remove the client of its container */
|
/* Remove the client of its container */
|
||||||
CIRCLEQ_REMOVE(&(con->clients), client, clients);
|
client_remove_from_container(conn, client, con, false);
|
||||||
client->container = NULL;
|
client->container = NULL;
|
||||||
|
|
||||||
if (con->currently_focused == client) {
|
if (con->currently_focused == client) {
|
||||||
|
|
|
@ -534,7 +534,7 @@ int handle_unmap_notify_event(void *data, xcb_connection_t *conn, xcb_unmap_noti
|
||||||
con->workspace->fullscreen_client = NULL;
|
con->workspace->fullscreen_client = NULL;
|
||||||
|
|
||||||
/* Remove the client from the list of clients */
|
/* Remove the client from the list of clients */
|
||||||
client_remove_from_container(conn, client, con);
|
client_remove_from_container(conn, client, con, true);
|
||||||
|
|
||||||
/* Set focus to the last focused client in this container */
|
/* Set focus to the last focused client in this container */
|
||||||
con->currently_focused = get_last_focused_client(conn, con, NULL);
|
con->currently_focused = get_last_focused_client(conn, con, NULL);
|
||||||
|
|
Loading…
Reference in New Issue