wm/src/util.h

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