]> Pileus Git - wmpus/blob - wm-tags.c
Start adding support for atoms
[wmpus] / wm-tags.c
1 /*
2  * Copyright (c) 2011-2012, Andy Spencer <andy753421@gmail.com>
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  */
15
16 /* Brain-dead multiple desktop manager */
17
18 #include <stdio.h>
19
20 #include "util.h"
21 #include "types.h"
22 #include "sys.h"
23 #include "wm.h"
24
25 /* Configuration */
26 #ifndef MODKEY
27 #define MODKEY alt
28 #endif
29
30 /* Data */
31 int     tag = 1;
32 list_t *tags[10];
33
34 /* Window management functions */
35 void wm_update(void)
36 {
37 }
38
39 int wm_handle_event(win_t *win, event_t ev, mod_t mod, ptr_t ptr)
40 {
41         int new = ev - '0';
42         if (!win || !mod.MODKEY || mod.up || new == tag ||
43                         ev < '0' || ev > '9')
44                 return 0;
45
46         if (mod.shift) {
47                 list_t *node = list_find(tags[tag], win);
48                 if (node == NULL)
49                         return 0;
50                 tags[tag] = list_remove(tags[tag], node, 0);
51                 tags[new] = list_insert(tags[new], win);
52                 sys_show(win, ST_HIDE);
53         } else {
54                 for (list_t *cur = tags[new]; cur; cur = cur->next)
55                         sys_show(cur->data, ST_SHOW);
56                 for (list_t *cur = tags[tag]; cur; cur = cur->next)
57                         sys_show(cur->data, ST_HIDE);
58                 tag = new;
59         }
60         return 1;
61 }
62
63 int wm_handle_ptr(win_t *cwin, ptr_t ptr)
64 {
65         return 0;
66 }
67
68 int wm_handle_state(win_t *win, state_t prev, state_t next)
69 {
70         return 0;
71 }
72
73 void wm_insert(win_t *win)
74 {
75         tags[tag] = list_insert(tags[tag], win);
76 }
77
78 void wm_remove(win_t *win)
79 {
80         for (int i = 0; i < 10; i++) {
81                 list_t *node = list_find(tags[i], win);
82                 if (node == NULL)
83                         continue;
84                 tags[i] = list_remove(tags[i], node, 0);
85         }
86 }
87
88 void wm_init(void)
89 {
90         event_t keys[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
91         for (int i = 0; i < countof(keys); i++) {
92                 sys_watch(NULL, keys[i], MOD(.MODKEY=1));
93                 sys_watch(NULL, keys[i], MOD(.MODKEY=1,.shift=1));
94         }
95 }
96
97 void wm_free(void)
98 {
99         for (int i = 0; i < 10; i++) {
100                 while (tags[i]) {
101                         sys_show(tags[i]->data, ST_SHOW);
102                         tags[i] = list_remove(tags[i], tags[i], 0);
103                 }
104         }
105 }