aboutsummaryrefslogtreecommitdiff
path: root/sway/workspace.c
diff options
context:
space:
mode:
authorJose Diez <jose.manuel.diez@gmail.com>2015-08-10 22:31:23 +0200
committerJose Diez <jose.manuel.diez@gmail.com>2015-08-10 22:49:50 +0200
commit8cc2c6fa7a4b5e8b2d2030033a4bb9f7df45fc42 (patch)
treed079178cb01d2dd0bbb58792133d64e9cc31d4e7 /sway/workspace.c
parentcaee41b7775d6e7eacc37837b31d92808e1a34de (diff)
Basic workspace functionality
Diffstat (limited to 'sway/workspace.c')
-rw-r--r--sway/workspace.c67
1 files changed, 67 insertions, 0 deletions
diff --git a/sway/workspace.c b/sway/workspace.c
new file mode 100644
index 00000000..1c8cef2c
--- /dev/null
+++ b/sway/workspace.c
@@ -0,0 +1,67 @@
+#include <stdlib.h>
+#include <stdbool.h>
+#include <wlc/wlc.h>
+#include "workspace.h"
+#include "layout.h"
+#include "list.h"
+#include "log.h"
+#include "container.h"
+
+swayc_t *active_workspace = NULL;
+
+char *workspace_next_name() {
+ return "1";
+}
+
+swayc_t *workspace_create(const char* name) {
+ swayc_t *parent = get_focused_container(&root_container);
+ while(parent->type != C_OUTPUT) {
+ parent = parent->parent;
+ }
+
+ swayc_t *workspace = create_container(parent, -1);
+ workspace->type = C_WORKSPACE;
+ workspace->name = strdup(name);
+ workspace->width = parent->width;
+ workspace->height = parent->height;
+ workspace->layout = L_HORIZ; // todo: thing
+
+ add_child(parent, workspace);
+ return workspace;
+}
+
+bool workspace_by_name(swayc_t *view, void *data) {
+ return (view->type == C_WORKSPACE) &&
+ (strcasecmp(view->name, (char *) data) == 0);
+}
+
+void set_mask(swayc_t *view, void *data) {
+ uint32_t *p = data;
+
+ if(view->type == C_VIEW) {
+ wlc_view_set_mask(view->handle, *p);
+ }
+}
+
+swayc_t *workspace_find_by_name(const char* name) {
+ return find_container(&root_container, workspace_by_name, (void *) name);
+}
+
+void workspace_switch(swayc_t *workspace) {
+ if(active_workspace) {
+ sway_log(L_DEBUG, "workspace: changing from %s to %s", active_workspace->name, workspace->name);
+
+ uint32_t mask = 1;
+ // set all c_views in the old workspace to the invisible mask
+ container_map(active_workspace, set_mask, &mask);
+ // and c_views in the new workspace to the visible mask
+ mask = 2;
+ container_map(workspace, set_mask, &mask);
+
+ wlc_output_set_mask(wlc_get_focused_output(), 2);
+ unfocus_all(active_workspace);
+ focus_view(workspace);
+ }
+
+ active_workspace = workspace;
+}