154 lines
4.6 KiB
C
154 lines
4.6 KiB
C
#ifndef UTIL_H
|
|
#define UTIL_H
|
|
|
|
#include <stdbool.h>
|
|
#include <stdint.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <json-c/json.h>
|
|
|
|
#include "client.h"
|
|
|
|
#define WM_VERT_LEFT 0
|
|
#define WM_VERT_RIGHT 1
|
|
#define WM_HORIZ_TOP 0
|
|
#define WM_HORIZ_BOT 1
|
|
|
|
typedef enum NodeType {
|
|
NODE_VERTICAL,
|
|
NODE_HORIZONTAL,
|
|
NODE_TAB,
|
|
NODE_CLIENT,
|
|
NODE_COUNT
|
|
} NodeType;
|
|
|
|
typedef struct TreeNode TreeNode;
|
|
|
|
typedef struct {
|
|
TreeNode **nodes;
|
|
size_t size;
|
|
size_t capacity;
|
|
} NodeArray;
|
|
|
|
typedef struct {
|
|
uint64_t *elements;
|
|
size_t size;
|
|
size_t capacity;
|
|
} UIntArray;
|
|
|
|
typedef struct {
|
|
int x;
|
|
int y;
|
|
int w;
|
|
int h;
|
|
} Rect;
|
|
|
|
struct TreeNode {
|
|
NodeType type;
|
|
|
|
TreeNode *parent;
|
|
|
|
NodeArray *children;
|
|
|
|
Rect pos;
|
|
|
|
Client *client;
|
|
unsigned int id;
|
|
uint64_t distance;
|
|
};
|
|
|
|
typedef struct {
|
|
size_t ws_index;
|
|
char *str;
|
|
} WmWorkspaceToStrRet;
|
|
|
|
typedef struct {
|
|
time_t timestamp;
|
|
bool after;
|
|
char function_name[128];
|
|
NodeArray *workspaces;
|
|
} LogEntry;
|
|
|
|
typedef uint64_t (*UpdateCostFunction)(TreeNode*, TreeNode*);
|
|
|
|
typedef struct {
|
|
uint64_t insert_cost;
|
|
uint64_t remove_cost;
|
|
UpdateCostFunction update_cost_function;
|
|
} TreeEditDistanceCosts;
|
|
|
|
NodeArray* wm_nodearray_new();
|
|
void wm_nodearray_set(NodeArray *arr, size_t index, uint64_t value);
|
|
void wm_nodearray_push(NodeArray *arr, TreeNode *node);
|
|
bool wm_nodearray_pop(NodeArray *arr, TreeNode **ret);
|
|
bool wm_nodearray_pop_front(NodeArray *arr, TreeNode **ret);
|
|
void wm_nodearray_clear(NodeArray *arr);
|
|
bool wm_nodearray_remove(NodeArray *arr, size_t index);
|
|
void wm_nodearray_free(NodeArray *arr);
|
|
TreeNode* wm_nodearray_at(NodeArray *arr, size_t index);
|
|
|
|
TreeNode* wm_treenode_new(NodeType type, TreeNode *parent);
|
|
void wm_treenode_free(TreeNode *node);
|
|
bool wm_treenode_is_empty(TreeNode *node);
|
|
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);
|
|
void wm_treenode_add_child(TreeNode *node, TreeNode *child);
|
|
TreeNode* wm_treenode_remove_client(Wm *wm, TreeNode *root, Client *client);
|
|
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);
|
|
UIntArray* wm_nonempty_workspaces_to_strptrarray(Wm *wm);
|
|
NodeType wm_node_type_from_str(char *buf, size_t bufsize);
|
|
char* wm_treenode_to_str(TreeNode *node);
|
|
void wm_treenode_print(TreeNode *node);
|
|
TreeNode* wm_json_obj_to_treenode(struct json_object *jobj);
|
|
|
|
UIntArray* wm_uintarray_new();
|
|
uint64_t wm_uintarray_at(UIntArray *arr, size_t index);
|
|
void wm_uintarray_set(UIntArray *arr, size_t index, uint64_t value);
|
|
void wm_uintarray_push(UIntArray *arr, uint64_t element);
|
|
bool wm_uintarray_pop(UIntArray *arr, uint64_t *ret);
|
|
bool wm_uintarray_pop_front(UIntArray *arr, uint64_t *ret);
|
|
bool wm_uintarray_remove(UIntArray *arr, size_t index);
|
|
void wm_uintarray_free(UIntArray *arr);
|
|
uint64_t wm_uintarray_2d_index(UIntArray *arr, size_t i, size_t j);
|
|
|
|
TreeNode* wm_treenode_ptr_find_focused_client_node(TreeNode *root);
|
|
TreeNode* wm_treenode_ptr_find_client_node(TreeNode *root, Client *client);
|
|
NodeArray* wm_treenode_find_client_nodes(TreeNode *root);
|
|
TreeNode* wm_treenode_split_get_sibling(TreeNode *node);
|
|
NodeArray* wm_all_nodes_to_array(TreeNode *root);
|
|
json_object* wm_state_to_json_object(Wm *wm, const char *prefixstr);
|
|
void wm_log_state(Wm *wm, const char *prefixstr, const char* logfile);
|
|
|
|
TreeNode* wm_treenode_lmd(TreeNode *node);
|
|
NodeArray* wm_treenode_all_lmds(TreeNode *node);
|
|
UIntArray* wm_treenode_all_lmds_index(TreeNode *node);
|
|
NodeArray* wm_postorder_traversal(TreeNode *tree);
|
|
bool wm_is_treenode_keyroot(TreeNode *node, NodeArray *postorder);
|
|
NodeArray* wm_treenode_all_keyroots(TreeNode *node);
|
|
UIntArray* wm_treenode_all_keyroots_index(TreeNode *node);
|
|
bool wm_nodes_are_equal(TreeNode *node1, TreeNode *node2);
|
|
|
|
void wm_treedist(TreeNode *tree1, TreeNode *tree2, size_t i, size_t j,
|
|
UIntArray *dists, TreeEditDistanceCosts costs);
|
|
|
|
size_t wm_tree_edit_distance(TreeNode *tree1, TreeNode *tree2, TreeEditDistanceCosts costs);
|
|
|
|
void wm_logfile_init(const char *path);
|
|
|
|
/* UIntArray<LogEntry*> */
|
|
void wm_logentries_free(UIntArray *entries);
|
|
|
|
/* UIntArray<LogEntry*> */
|
|
UIntArray* wm_read_log(const char* filename);
|
|
|
|
/* UIntArray<LogEntry*> */
|
|
void wm_logentries_calculate_distances(UIntArray *log_entries, TreeNode *curr_tree,
|
|
UpdateCostFunction update_cost_function);
|
|
|
|
#endif
|