dwm-restoreafterrestart-20220709-d3f93c7.diff - sites - public wiki contents of suckless.org
(HTM) git clone git://git.suckless.org/sites
(DIR) Log
(DIR) Files
(DIR) Refs
---
dwm-restoreafterrestart-20220709-d3f93c7.diff (2399B)
---
1 From 9fd4a02b57aa8a764d8105d5f2f854372f4ef559 Mon Sep 17 00:00:00 2001
2 From: ViliamKovac1223 <viliamkovac1223@gmail.com>
3 Date: Sat, 9 Jul 2022 17:35:54 +0200
4 Subject: [PATCH] add restore patch
5
6 ---
7 config.def.h | 2 ++
8 dwm.c | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
9 2 files changed, 55 insertions(+)
10
11 diff --git a/config.def.h b/config.def.h
12 index 6ec4146..0b91976 100644
13 --- a/config.def.h
14 +++ b/config.def.h
15 @@ -1,5 +1,7 @@
16 /* See LICENSE file for copyright and license details. */
17
18 +#define SESSION_FILE "/tmp/dwm-session"
19 +
20 /* appearance */
21 static const unsigned int borderpx = 1; /* border pixel of windows */
22 static const unsigned int snap = 32; /* snap pixel */
23 diff --git a/dwm.c b/dwm.c
24 index 74cec7e..76b40a2 100644
25 --- a/dwm.c
26 +++ b/dwm.c
27 @@ -1255,11 +1255,63 @@ propertynotify(XEvent *e)
28 }
29 }
30
31 +void
32 +saveSession(void)
33 +{
34 + FILE *fw = fopen(SESSION_FILE, "w");
35 + for (Client *c = selmon->clients; c != NULL; c = c->next) { // get all the clients with their tags and write them to the file
36 + fprintf(fw, "%lu %u\n", c->win, c->tags);
37 + }
38 + fclose(fw);
39 +}
40 +
41 +void
42 +restoreSession(void)
43 +{
44 + // restore session
45 + FILE *fr = fopen(SESSION_FILE, "r");
46 + if (!fr)
47 + return;
48 +
49 + char *str = malloc(23 * sizeof(char)); // allocate enough space for excepted input from text file
50 + while (fscanf(fr, "%[^\n] ", str) != EOF) { // read file till the end
51 + long unsigned int winId;
52 + unsigned int tagsForWin;
53 + int check = sscanf(str, "%lu %u", &winId, &tagsForWin); // get data
54 + if (check != 2) // break loop if data wasn't read correctly
55 + break;
56 +
57 + for (Client *c = selmon->clients; c ; c = c->next) { // add tags to every window by winId
58 + if (c->win == winId) {
59 + c->tags = tagsForWin;
60 + break;
61 + }
62 + }
63 + }
64 +
65 + for (Client *c = selmon->clients; c ; c = c->next) { // refocus on windows
66 + focus(c);
67 + restack(c->mon);
68 + }
69 +
70 + for (Monitor *m = selmon; m; m = m->next) // rearrange all monitors
71 + arrange(m);
72 +
73 + free(str);
74 + fclose(fr);
75 +
76 + // delete a file
77 + remove(SESSION_FILE);
78 +}
79 +
80 void
81 quit(const Arg *arg)
82 {
83 if(arg->i) restart = 1;
84 running = 0;
85 +
86 + if (restart == 1)
87 + saveSession();
88 }
89
90 Monitor *
91 @@ -2173,6 +2225,7 @@ main(int argc, char *argv[])
92 die("pledge");
93 #endif /* __OpenBSD__ */
94 scan();
95 + restoreSession();
96 run();
97 if(restart) execvp(argv[0], argv);
98 cleanup();
99 --
100 2.35.1
101