Bugfix: Don’t hide assigned clients to inactive but visible workspaces (Thanks xeen)
This commit is contained in:
parent
a753684ac5
commit
7cfe520755
|
@ -24,4 +24,12 @@
|
||||||
*/
|
*/
|
||||||
void workspace_set_name(Workspace *ws, const char *name);
|
void workspace_set_name(Workspace *ws, const char *name);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true if the workspace is currently visible. Especially important for
|
||||||
|
* multi-monitor environments, as they can have multiple currenlty active
|
||||||
|
* workspaces.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool workspace_is_visible(Workspace *ws);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
#include "floating.h"
|
#include "floating.h"
|
||||||
#include "xcb.h"
|
#include "xcb.h"
|
||||||
#include "config.h"
|
#include "config.h"
|
||||||
|
#include "workspace.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 */
|
||||||
|
@ -490,10 +491,8 @@ static void move_floating_window_to_workspace(xcb_connection_t *conn, Client *cl
|
||||||
|
|
||||||
floating_assign_to_workspace(client, t_ws);
|
floating_assign_to_workspace(client, t_ws);
|
||||||
|
|
||||||
bool target_invisible = t_ws->screen->current_workspace != t_ws->num;
|
|
||||||
|
|
||||||
/* If we’re moving it to an invisible screen, we need to unmap it */
|
/* If we’re moving it to an invisible screen, we need to unmap it */
|
||||||
if (target_invisible) {
|
if (!workspace_is_visible(t_ws)) {
|
||||||
LOG("This workspace is not visible, unmapping\n");
|
LOG("This workspace is not visible, unmapping\n");
|
||||||
xcb_unmap_window(conn, client->frame);
|
xcb_unmap_window(conn, client->frame);
|
||||||
} else {
|
} else {
|
||||||
|
@ -515,7 +514,7 @@ static void move_floating_window_to_workspace(xcb_connection_t *conn, Client *cl
|
||||||
|
|
||||||
render_layout(conn);
|
render_layout(conn);
|
||||||
|
|
||||||
if (!target_invisible)
|
if (workspace_is_visible(t_ws))
|
||||||
set_focus(conn, client, true);
|
set_focus(conn, client, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -575,10 +574,8 @@ static void move_current_window_to_workspace(xcb_connection_t *conn, int workspa
|
||||||
container->currently_focused = to_focus;
|
container->currently_focused = to_focus;
|
||||||
to_container->currently_focused = current_client;
|
to_container->currently_focused = current_client;
|
||||||
|
|
||||||
bool target_invisible = (to_container->workspace->screen->current_workspace != to_container->workspace->num);
|
|
||||||
|
|
||||||
/* If we’re moving it to an invisible screen, we need to unmap it */
|
/* If we’re moving it to an invisible screen, we need to unmap it */
|
||||||
if (target_invisible) {
|
if (!workspace_is_visible(to_container->workspace)) {
|
||||||
LOG("This workspace is not visible, unmapping\n");
|
LOG("This workspace is not visible, unmapping\n");
|
||||||
xcb_unmap_window(conn, current_client->frame);
|
xcb_unmap_window(conn, current_client->frame);
|
||||||
} else {
|
} else {
|
||||||
|
@ -593,7 +590,7 @@ static void move_current_window_to_workspace(xcb_connection_t *conn, int workspa
|
||||||
|
|
||||||
render_layout(conn);
|
render_layout(conn);
|
||||||
|
|
||||||
if (!target_invisible)
|
if (workspace_is_visible(to_container->workspace))
|
||||||
set_focus(conn, current_client, true);
|
set_focus(conn, current_client, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include "manage.h"
|
#include "manage.h"
|
||||||
#include "floating.h"
|
#include "floating.h"
|
||||||
#include "client.h"
|
#include "client.h"
|
||||||
|
#include "workspace.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Go through all existing windows (if the window manager is restarted) and manage them
|
* Go through all existing windows (if the window manager is restarted) and manage them
|
||||||
|
@ -325,7 +326,7 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
LOG("Changin container/workspace and unmapping the client\n");
|
LOG("Changing container/workspace and unmapping the client\n");
|
||||||
Workspace *t_ws = &(workspaces[assign->workspace-1]);
|
Workspace *t_ws = &(workspaces[assign->workspace-1]);
|
||||||
if (t_ws->screen == NULL) {
|
if (t_ws->screen == NULL) {
|
||||||
LOG("initializing new workspace, setting num to %d\n", assign->workspace);
|
LOG("initializing new workspace, setting num to %d\n", assign->workspace);
|
||||||
|
@ -338,7 +339,7 @@ void reparent_window(xcb_connection_t *conn, xcb_window_t child,
|
||||||
new->workspace = t_ws;
|
new->workspace = t_ws;
|
||||||
old_focused = new->container->currently_focused;
|
old_focused = new->container->currently_focused;
|
||||||
|
|
||||||
map_frame = false;
|
map_frame = workspace_is_visible(t_ws);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,3 +45,13 @@ void workspace_set_name(Workspace *ws, const char *name) {
|
||||||
|
|
||||||
free(label);
|
free(label);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Returns true if the workspace is currently visible. Especially important for
|
||||||
|
* multi-monitor environments, as they can have multiple currenlty active
|
||||||
|
* workspaces.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
bool workspace_is_visible(Workspace *ws) {
|
||||||
|
return (ws->screen->current_workspace == ws->num);
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue