Compare commits
2 Commits
25dbe40cb3
...
3e5f29057f
Author | SHA1 | Date | |
---|---|---|---|
3e5f29057f | |||
f8bd395e50 |
27
src/config.c
27
src/config.c
@ -73,6 +73,33 @@ void wm_keybinds_init_def(Config *config)
|
||||
(Keybind) {Mod4Mask, XK_9, *wm_kb_switch_ws,
|
||||
(Arg) {.i = 8}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_1, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 0}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_2, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 1}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_3, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 2}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_4, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 3}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_5, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 4}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_6, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 5}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_7, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 6}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_8, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 7}},
|
||||
|
||||
(Keybind) {Mod4Mask | ShiftMask, XK_9, *wm_kb_move_client_ws,
|
||||
(Arg) {.i = 8}},
|
||||
|
||||
(Keybind) {Mod4Mask, XK_h, *wm_kb_focus_dir,
|
||||
(Arg) {.i = LEFT}},
|
||||
|
||||
|
80
src/util.c
80
src/util.c
@ -2,6 +2,7 @@
|
||||
#include "wm.h"
|
||||
#include <json-c/json_object.h>
|
||||
#include <json-c/json_tokener.h>
|
||||
#include <stdint.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
@ -156,6 +157,13 @@ char* wm_treenode_to_str(TreeNode *node)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void wm_treenode_print(TreeNode *node)
|
||||
{
|
||||
char *str = wm_treenode_to_str(node);
|
||||
DEBUG_PRINT("%s\n", str);
|
||||
free(str);
|
||||
}
|
||||
|
||||
void wm_tree_to_DOT(TreeNode *root, const char *filename)
|
||||
{
|
||||
DEBUG_PRINT("%s\n", __func__);
|
||||
@ -216,23 +224,73 @@ int wm_get_node_index(TreeNode *parent, unsigned int node_id)
|
||||
return -1;
|
||||
}
|
||||
|
||||
void wm_treenode_remove_node(TreeNode *root, unsigned int node_id)
|
||||
void wm_treenode_remove_node(Wm *wm, TreeNode *root, TreeNode *node)
|
||||
{
|
||||
DEBUG_PRINT("%s\n", __func__);
|
||||
assert(root);
|
||||
|
||||
PtrArray all_nodes = wm_all_nodes_to_ptrarray(root);
|
||||
wm_tree_to_DOT(root, "wm_output.dot");
|
||||
|
||||
for (size_t i = 0; i < all_nodes.size; i++) {
|
||||
TreeNode *node = all_nodes.ptrs[i];
|
||||
if (node->id == node_id) {
|
||||
TreeNode *parent = node->parent;
|
||||
int index = wm_get_node_index(parent, node_id);
|
||||
assert(index >= 0);
|
||||
assert(node);
|
||||
|
||||
wm_nodearray_remove(&parent->children, index);
|
||||
TreeNode *parent = node->parent;
|
||||
|
||||
if (node->parent == NULL) {
|
||||
node->client = NULL;
|
||||
return;
|
||||
}
|
||||
|
||||
for (size_t i = 0; i < parent->children.size; i++) {
|
||||
if (parent->children.nodes[i]->type == NODE_CLIENT &&
|
||||
parent->children.nodes[i] != node) {
|
||||
|
||||
parent->type = NODE_CLIENT;
|
||||
parent->client = parent->children.nodes[i]->client;
|
||||
wm_treenode_free(node);
|
||||
wm_treenode_free(parent->children.nodes[i]);
|
||||
wm_nodearray_clear(&parent->children);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
DEBUG_PRINT("%s: other_client was NULL!\n", __func__);
|
||||
|
||||
TreeNode *sibling_node = wm_treenode_split_get_sibling(node);
|
||||
wm_treenode_free(node);
|
||||
|
||||
// wm_nodearray_free(&node->children);
|
||||
|
||||
// TODO
|
||||
size_t dock_y = 0;
|
||||
|
||||
if (parent->parent == NULL) {
|
||||
// parent is root node
|
||||
DEBUG_PRINT("parent is root node!\n");
|
||||
sibling_node->parent = NULL;
|
||||
assert(node->type == NODE_CLIENT);
|
||||
node->client->ws->tree = sibling_node;
|
||||
|
||||
node->client->ws->tree->pos = (Rect) {
|
||||
.x = wm->config.border_width, .y = wm->config.border_width + dock_y ,
|
||||
.w = node->client->ws->monitor->info.width - wm->config.border_width*2,
|
||||
.h = node->client->ws->monitor->info.height - wm->config.border_width*2 - dock_y,
|
||||
};
|
||||
|
||||
assert(node->client->ws->tree->children.size == 2);
|
||||
wm_treenode_split_space(node->client->ws->tree, &node->client->ws->tree->children.nodes[0]->pos,
|
||||
&node->client->ws->tree->children.nodes[1]->pos);
|
||||
} else {
|
||||
sibling_node->parent = parent->parent;
|
||||
*parent = *sibling_node;
|
||||
|
||||
for (size_t i = 0; i < parent->children.size; i++) {
|
||||
parent->children.nodes[i]->parent = parent;
|
||||
}
|
||||
|
||||
wm_treenode_recalculate_space(parent->parent);
|
||||
wm_treenode_recalculate_space(parent);
|
||||
}
|
||||
|
||||
assert(node->client->ws->tree->children.size >= 1);
|
||||
}
|
||||
|
||||
TreeNode* wm_treenode_split_get_sibling(TreeNode *node)
|
||||
@ -555,10 +613,12 @@ void wm_ptrarray_free(PtrArray *arr)
|
||||
{
|
||||
// DEBUG_PRINT("%s\n", __func__);
|
||||
assert(arr);
|
||||
RETURN_IF_NULL(arr->ptrs);
|
||||
|
||||
arr->capacity = 0;
|
||||
arr->size = 0;
|
||||
free(arr->ptrs);
|
||||
arr->ptrs = NULL;
|
||||
}
|
||||
|
||||
TreeNode* wm_treenode_ptr_find_focused_client_node(TreeNode *root)
|
||||
|
@ -68,11 +68,12 @@ void wm_treenode_split_space(TreeNode *node, Rect *ret1, Rect *ret2);
|
||||
void wm_treenode_recalculate_space(TreeNode *node);
|
||||
void wm_treenode_swap(TreeNode *root, TreeNode *node1, TreeNode* node2);
|
||||
TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client);
|
||||
void wm_treenode_remove_node(TreeNode *root, unsigned int node_id);
|
||||
void wm_treenode_remove_node(Wm *wm, TreeNode *root, TreeNode *node);
|
||||
int wm_get_node_index(TreeNode *parent, unsigned int node_id);
|
||||
void wm_tree_to_DOT(TreeNode *root, const char *filename);
|
||||
void wm_node_type_to_str(NodeType type, char *buf, size_t bufsize);
|
||||
char* wm_treenode_to_str(TreeNode *node);
|
||||
void wm_treenode_print(TreeNode *node);
|
||||
|
||||
NodeArray wm_nodearray_new();
|
||||
void wm_nodearray_push(NodeArray *arr, TreeNode *node);
|
||||
|
Loading…
x
Reference in New Issue
Block a user