diff --git a/Makefile b/Makefile index bc831fa..63a4ff4 100644 --- a/Makefile +++ b/Makefile @@ -8,8 +8,8 @@ ALL_LDFLAGS = $(LDFLAGS) $(LIBS) -lxcb CC = cc -OBJ = src/event.o src/action.o src/sowm.o -HDR = src/event.h src/action.h src/globals.h +OBJ = src/event.o src/sowm.o +HDR = src/event.h src/globals.h .c.o: $(CC) $(ALL_CFLAGS) -c -o $@ $< diff --git a/design.txt b/design.txt new file mode 100644 index 0000000..3f03b3f --- /dev/null +++ b/design.txt @@ -0,0 +1,4 @@ +keybindings +events +actions +manager diff --git a/src/action.c b/src/action.c deleted file mode 100644 index e9e4012..0000000 --- a/src/action.c +++ /dev/null @@ -1,37 +0,0 @@ -#include "action.h" - -void action_win_add() { - -} - -void action_win_del() { - -} - -void action_win_center() { - -} - -void action_win_fullscreen() { - -} - -void action_win_focus() { - -} - -void action_win_kill() { - -} - -void action_win_next() { - -} - -void action_win_to_desktop() { - -} - -void action_to_desktop() { - -} diff --git a/src/action.h b/src/action.h deleted file mode 100644 index 3f18513..0000000 --- a/src/action.h +++ /dev/null @@ -1,11 +0,0 @@ -/* todo */ -void action_win_add(void); -void action_win_center(void); -void action_win_del(void); -void action_win_fullscreen(void); -void action_win_focus(void); -void action_win_kill(void); -void action_win_prev(void); -void action_win_next(void); -void action_win_to_desktop(void); -void action_to_desktop(void); diff --git a/src/event.c b/src/event.c index 78d99eb..b9a8f5f 100644 --- a/src/event.c +++ b/src/event.c @@ -10,10 +10,10 @@ static xcb_window_t motion_win; void (*events[XCB_NO_OPERATION])(xcb_generic_event_t *) = { [XCB_BUTTON_PRESS] = event_button_press, [XCB_BUTTON_RELEASE] = event_button_release, - [XCB_CONFIGURE_REQUEST] = event_configure_request, - [XCB_KEY_PRESS] = event_key_press, + /* [XCB_CONFIGURE_REQUEST] = event_configure_request, */ + /* [XCB_KEY_PRESS] = event_key_press, */ [XCB_CREATE_NOTIFY] = event_notify_create, - [XCB_DESTROY_NOTIFY] = event_notify_destroy, + /* [XCB_DESTROY_NOTIFY] = event_notify_destroy, */ [XCB_ENTER_NOTIFY] = event_notify_enter, [XCB_MOTION_NOTIFY] = event_notify_motion }; @@ -47,17 +47,18 @@ void event_button_press(xcb_generic_event_t *ev) { } void event_button_release(xcb_generic_event_t *ev) { + (void)(ev); xcb_ungrab_pointer(dpy, XCB_CURRENT_TIME); motion_win = 0; } -void event_configure_request(xcb_generic_event_t *ev) { +/* void event_configure_request(xcb_generic_event_t *ev) { */ -} +/* } */ -void event_key_press(xcb_generic_event_t *ev) { +/* void event_key_press(xcb_generic_event_t *ev) { */ -} +/* } */ void event_notify_create(xcb_generic_event_t *ev) { xcb_create_notify_event_t *e = (xcb_create_notify_event_t *)ev; @@ -74,9 +75,9 @@ void event_notify_create(xcb_generic_event_t *ev) { e->window, XCB_CURRENT_TIME); } -void event_notify_destroy(xcb_generic_event_t *ev) { +/* void event_notify_destroy(xcb_generic_event_t *ev) { */ -} +/* } */ void event_notify_enter(xcb_generic_event_t *ev) { xcb_enter_notify_event_t *e = (xcb_enter_notify_event_t *)ev; diff --git a/src/event.h b/src/event.h index d52f60b..ce6b04e 100644 --- a/src/event.h +++ b/src/event.h @@ -2,10 +2,10 @@ void event_button_press(xcb_generic_event_t *ev); void event_button_release(xcb_generic_event_t *ev); -void event_configure_request(xcb_generic_event_t *ev); -void event_key_press(xcb_generic_event_t *ev); +/* void event_configure_request(xcb_generic_event_t *ev); */ +/* void event_key_press(xcb_generic_event_t *ev); */ void event_notify_create(xcb_generic_event_t *ev); -void event_notify_destroy(xcb_generic_event_t *ev); +/* void event_notify_destroy(xcb_generic_event_t *ev); */ void event_notify_enter(xcb_generic_event_t *ev); void event_notify_motion(xcb_generic_event_t *ev); diff --git a/src/globals.h b/src/globals.h index 6ea36c2..97505aa 100644 --- a/src/globals.h +++ b/src/globals.h @@ -2,3 +2,10 @@ extern xcb_connection_t *dpy; extern xcb_screen_t *scr; + +struct desktop { + xcb_window_t *windows; + int num; +}; + +extern int current_desktop; diff --git a/src/sowm.c b/src/sowm.c index 19fe226..32e6d99 100644 --- a/src/sowm.c +++ b/src/sowm.c @@ -5,16 +5,22 @@ #include #include "event.h" +#include "vec.h" #include "globals.h" +#include "config.h" static void init_wm(void); static void init_input(void); +static void init_desktops(void); xcb_connection_t *dpy; xcb_screen_t *scr; -static void init_wm(void) { - uint32_t values[2]; +struct desktop *desktops; +int current_desktop = 0; + +static void init_wm() { + uint32_t values; dpy = xcb_connect(NULL, NULL); @@ -31,29 +37,41 @@ static void init_wm(void) { exit(1); } - values[0] = XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY; + values = XCB_EVENT_MASK_SUBSTRUCTURE_NOTIFY; xcb_change_window_attributes_checked(dpy, scr->root, - XCB_CW_EVENT_MASK, values); + XCB_CW_EVENT_MASK, &values); xcb_flush(dpy); } -static void init_input(void) { - xcb_grab_key(dpy, 1, scr->root, XCB_MOD_MASK_1, XCB_NO_SYMBOL, +static void init_input() { + xcb_grab_key(dpy, 1, scr->root, SOWM_MOD, XCB_NO_SYMBOL, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC); xcb_grab_button(dpy, 0, scr->root, XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE, XCB_GRAB_MODE_ASYNC, - XCB_GRAB_MODE_ASYNC, scr->root, XCB_NONE, 1, XCB_MOD_MASK_1); + XCB_GRAB_MODE_ASYNC, scr->root, XCB_NONE, 1, SOWM_MOD); xcb_grab_button(dpy, 0, scr->root, XCB_EVENT_MASK_BUTTON_PRESS | XCB_EVENT_MASK_BUTTON_RELEASE, XCB_GRAB_MODE_ASYNC, - XCB_GRAB_MODE_ASYNC, scr->root, XCB_NONE, 3, XCB_MOD_MASK_1); + XCB_GRAB_MODE_ASYNC, scr->root, XCB_NONE, 3, SOWM_MOD); xcb_flush(dpy); } +static void init_desktops() { + struct desktop new = {0}; + + for (int i = 0; i < SOWM_NUM_DESKTOPS; i++) { + new.num = i; + vec_push_back(desktops, new); + } + + /* todo finish usage of desktops */ + vec_free(desktops); +} + int main(int argc, char **argv) { xcb_generic_event_t *ev; unsigned int ev_type; @@ -67,6 +85,7 @@ int main(int argc, char **argv) { init_wm(); init_input(); + init_desktops(); while ((ev = xcb_wait_for_event(dpy))) { ev_type = ev->response_type & ~0x80; diff --git a/src/vec.h b/src/vec.h new file mode 100644 index 0000000..f6f6e5e --- /dev/null +++ b/src/vec.h @@ -0,0 +1,175 @@ + +/* +This is an implementation of a std::vector like growable array, but in plain +C89 code. The result is a type safe, easy to use, dynamic array that has a +familiar set of operations. Source: https://github.com/eteran/c-vector + +The MIT License (MIT) + +Copyright (c) 2020 Dylan Araps +Copyright (c) 2015 Evan Teran + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +*/ + +#ifndef VEC_H_ +#define VEC_H_ + +#include /* for assert */ +#include /* for size_t */ +#include /* for malloc/realloc/free */ + +/** + * @brief vec_set_capacity - For internal use, set capacity variable. + * @param vec - the vector + * @param size - the new capacity to set + * @return void + */ +#define vec_set_capacity(vec, size) \ + do { \ + if (vec) { \ + ((size_t *)(vec))[-1] = (size); \ + } \ + } while (0) + +/** + * @brief vec_set_size - For internal use, sets the size variable of the vector + * @param vec - the vector + * @param size - the new capacity to set + * @return void + */ +#define vec_set_size(vec, size) \ + do { \ + if (vec) { \ + ((size_t *)(vec))[-2] = (size); \ + } \ + } while (0) + +/** + * @brief vec_capacity - gets the current capacity of the vector + * @param vec - the vector + * @return the capacity as a size_t + */ +#define vec_capacity(vec) ((vec) ? ((size_t *)(vec))[-1] : (size_t)0) + +/** + * @brief vec_size - gets the current size of the vector + * @param vec - the vector + * @return the size as a size_t + */ +#define vec_size(vec) ((vec) ? ((size_t *)(vec))[-2] : (size_t)0) + +/** + * @brief vec_empty - returns non-zero if the vector is empty + * @param vec - the vector + * @return non-zero if empty, zero if non-empty + */ +#define vec_empty(vec) (vec_size(vec) == 0) + +/** + * @brief vec_grow - For internal use, ensure that the vector is >= . + * @param vec - the vector + * @param size - the new capacity to set + * @return void + */ +#define vec_grow(vec, count) \ + do { \ + const size_t vec__sz = (count) * sizeof(*(vec)) + (sizeof(size_t) * 2); \ + if (!(vec)) { \ + size_t *vec__p = malloc(vec__sz); \ + assert(vec__p); \ + (vec) = (void *)(&vec__p[2]); \ + vec_set_capacity((vec), (count)); \ + vec_set_size((vec), 0); \ + } else { \ + size_t *vec__p1 = &((size_t *)(vec))[-2]; \ + size_t *vec__p2 = realloc(vec__p1, (vec__sz)); \ + assert(vec__p2); \ + (vec) = (void *)(&vec__p2[2]); \ + vec_set_capacity((vec), (count)); \ + } \ + } while (0) + +/** + * @brief vec_pop_back - removes the last element from the vector + * @param vec - the vector + * @return void + */ +#define vec_pop_back(vec) \ + do { \ + vec_set_size((vec), vec_size(vec) - 1); \ + } while (0) + +/** + * @brief vec_erase - removes the element at index i from the vector + * @param vec - the vector + * @param i - index of element to remove + * @return void + */ +#define vec_erase(vec, i) \ + do { \ + if (vec) { \ + const size_t vec__sz = vec_size(vec); \ + if ((i) < vec__sz) { \ + vec_set_size((vec), vec__sz - 1); \ + size_t vec__x; \ + for (vec__x = (i); vec__x < (vec__sz - 1); ++vec__x) { \ + (vec)[vec__x] = (vec)[vec__x + 1]; \ + } \ + } \ + } \ + } while (0) + +/** + * @brief vec_free - frees all memory associated with the vector + * @param vec - the vector + * @return void + */ +#define vec_free(vec) \ + do { \ + if (vec) { \ + size_t *p1 = &((size_t *)(vec))[-2]; \ + free(p1); \ + } \ + } while (0) + +/** + * @brief vec_end - returns an iterator to one past the last element + * @param vec - the vector + * @return a pointer to one past the last element (or NULL) + */ +#define vec_end(vec) ((vec) ? &((vec)[vec_size(vec)]) : NULL) + +/** + * @brief vec_push_back - adds an element to the end of the vector + * @param vec - the vector + * @param value - the value to add + * @return void + */ +#define vec_push_back(vec, value) \ + do { \ + size_t vec__cap = vec_capacity(vec); \ + if (vec__cap <= vec_size(vec)) { \ + vec_grow((vec), !vec__cap ? vec__cap + 1 : vec__cap * 2); \ + } \ + vec[vec_size(vec)] = (value); \ + vec_set_size((vec), vec_size(vec) + 1); \ + } while (0) + +#endif /* VEC_H_ */