Fix restarting with 32bit depth windows
Patch status: superseded
Patch by Yuxuan Shui
To apply this patch, use:
curl http://cr.i3wm.org/patch/83/raw.patch | git am
b/include/con.h
| 17 |
@@ -12,10 +12,20 @@ |
| 18 |
#ifndef I3_CON_H |
| 19 |
#define I3_CON_H |
| 20 |
|
| 21 |
-/** |
| 22 |
+/* |
| 23 |
* Create a new container (and attach it to the given parent, if not NULL). |
| 24 |
- * This function initializes the data structures and creates the appropriate |
| 25 |
- * X11 IDs using x_con_init(). |
| 26 |
+ * This function only initializes the data structures. |
| 27 |
+ * |
| 28 |
+ */ |
| 29 |
+Con *con_new_sketelon(Con *parent, i3Window *window); |
| 30 |
+ |
| 31 |
+/* Create the appropriate X11 IDs for a con using x_con_init() |
| 32 |
+ * |
| 33 |
+ */ |
| 34 |
+void con_new_window(Con *con); |
| 35 |
+ |
| 36 |
+/* A wrapper for con_new_sketelon and con_new_window, |
| 37 |
+ * to retain the old con_new behaviour |
| 38 |
* |
| 39 |
*/ |
| 40 |
Con *con_new(Con *parent, i3Window *window); |
b/include/data.h
| 45 |
@@ -584,6 +584,9 @@ struct Con {
|
| 46 |
/* The ID of this container before restarting. Necessary to correctly |
| 47 |
* interpret back-references in the JSON (such as the focus stack). */ |
| 48 |
int old_id; |
| 49 |
+ |
| 50 |
+ /* Depth of the container window */ |
| 51 |
+ uint16_t depth; |
| 52 |
}; |
| 53 |
|
| 54 |
#endif |
b/src/con.c
| 59 |
@@ -44,11 +44,10 @@ static void con_force_split_parents_redraw(Con *con) {
|
| 60 |
|
| 61 |
/* |
| 62 |
* Create a new container (and attach it to the given parent, if not NULL). |
| 63 |
- * This function initializes the data structures and creates the appropriate |
| 64 |
- * X11 IDs using x_con_init(). |
| 65 |
+ * This function only initializes the data structures. |
| 66 |
* |
| 67 |
*/ |
| 68 |
-Con *con_new(Con *parent, i3Window *window) {
|
| 69 |
+Con *con_new_sketelon(Con *parent, i3Window *window) {
|
| 70 |
Con *new = scalloc(sizeof(Con)); |
| 71 |
new->on_remove_child = con_on_remove_child; |
| 72 |
TAILQ_INSERT_TAIL(&all_cons, new, all_cons); |
| 73 |
@@ -56,6 +55,10 @@ Con *con_new(Con *parent, i3Window *window) {
|
| 74 |
new->window = window; |
| 75 |
new->border_style = config.default_border; |
| 76 |
new->current_border_width = -1; |
| 77 |
+ if (window) |
| 78 |
+ new->depth = window->depth; |
| 79 |
+ else |
| 80 |
+ new->depth = XCB_COPY_FROM_PARENT; |
| 81 |
static int cnt = 0; |
| 82 |
DLOG("opening window %d\n", cnt);
|
| 83 |
|
| 84 |
@@ -66,10 +69,6 @@ Con *con_new(Con *parent, i3Window *window) {
|
| 85 |
cnt++; |
| 86 |
if ((cnt % (sizeof(colors) / sizeof(char*))) == 0) |
| 87 |
cnt = 0; |
| 88 |
- if (window) |
| 89 |
- x_con_init(new, window->depth); |
| 90 |
- else |
| 91 |
- x_con_init(new, XCB_COPY_FROM_PARENT); |
| 92 |
|
| 93 |
TAILQ_INIT(&(new->floating_head)); |
| 94 |
TAILQ_INIT(&(new->nodes_head)); |
| 95 |
@@ -82,6 +81,15 @@ Con *con_new(Con *parent, i3Window *window) {
|
| 96 |
return new; |
| 97 |
} |
| 98 |
|
| 99 |
+/* A wrapper for con_new_sketelon, to retain the old con_new behaviour |
| 100 |
+ * |
| 101 |
+ */ |
| 102 |
+Con *con_new(Con *parent, i3Window *window) {
|
| 103 |
+ Con *new = con_new_sketelon(parent, window); |
| 104 |
+ x_con_init(new, new->depth); |
| 105 |
+ return new; |
| 106 |
+} |
| 107 |
+ |
| 108 |
/* |
| 109 |
* Attaches the given container to the given parent. This happens when moving |
| 110 |
* a container or when inserting a new container at a specific place in the |
b/src/ipc.c
| 115 |
@@ -354,6 +354,11 @@ void dump_node(yajl_gen gen, struct Con *con, bool inplace_restart) {
|
| 116 |
} |
| 117 |
y(array_close); |
| 118 |
|
| 119 |
+ if (inplace_restart && con->window != NULL) {
|
| 120 |
+ ystr("depth");
|
| 121 |
+ y(integer, con->depth); |
| 122 |
+ } |
| 123 |
+ |
| 124 |
y(map_close); |
| 125 |
} |
| 126 |
|
b/src/load_layout.c
| 131 |
@@ -27,6 +27,7 @@ static bool parsing_rect; |
| 132 |
static bool parsing_window_rect; |
| 133 |
static bool parsing_geometry; |
| 134 |
static bool parsing_focus; |
| 135 |
+static bool parsing_depth; |
| 136 |
struct Match *current_swallow; |
| 137 |
|
| 138 |
/* This list is used for reordering the focus stack after parsing the 'focus' |
| 139 |
@@ -51,12 +52,12 @@ static int json_start_map(void *ctx) {
|
| 140 |
if (last_key && strcasecmp(last_key, "floating_nodes") == 0) {
|
| 141 |
DLOG("New floating_node\n");
|
| 142 |
Con *ws = con_get_workspace(json_node); |
| 143 |
- json_node = con_new(NULL, NULL); |
| 144 |
+ json_node = con_new_sketelon(NULL, NULL); |
| 145 |
json_node->parent = ws; |
| 146 |
DLOG("Parent is workspace = %p\n", ws);
|
| 147 |
} else {
|
| 148 |
Con *parent = json_node; |
| 149 |
- json_node = con_new(NULL, NULL); |
| 150 |
+ json_node = con_new_sketelon(NULL, NULL); |
| 151 |
json_node->parent = parent; |
| 152 |
} |
| 153 |
} |
| 154 |
@@ -69,6 +70,8 @@ static int json_end_map(void *ctx) {
|
| 155 |
if (!parsing_swallows && !parsing_rect && !parsing_window_rect && !parsing_geometry) {
|
| 156 |
LOG("attaching\n");
|
| 157 |
con_attach(json_node, json_node->parent, true); |
| 158 |
+ LOG("Creating window\n");
|
| 159 |
+ x_con_init(json_node, json_node->depth); |
| 160 |
json_node = json_node->parent; |
| 161 |
} |
| 162 |
if (parsing_rect) |
| 163 |
@@ -77,6 +80,8 @@ static int json_end_map(void *ctx) {
|
| 164 |
parsing_window_rect = false; |
| 165 |
if (parsing_geometry) |
| 166 |
parsing_geometry = false; |
| 167 |
+ if (parsing_depth) |
| 168 |
+ parsing_depth = false; |
| 169 |
return 1; |
| 170 |
} |
| 171 |
|
| 172 |
@@ -277,6 +282,9 @@ static int json_int(void *ctx, long val) {
|
| 173 |
if (strcasecmp(last_key, "current_border_width") == 0) |
| 174 |
json_node->current_border_width = val; |
| 175 |
|
| 176 |
+ if (strcasecmp(last_key, "depth") == 0) |
| 177 |
+ json_node->depth = val; |
| 178 |
+ |
| 179 |
if (!parsing_swallows && strcasecmp(last_key, "id") == 0) |
| 180 |
json_node->old_id = val; |
| 181 |
|