about summary refs log tree commit diff stats
path: root/patches/9-restoreafterrestart-20220709-d3f93c7.diff
diff options
context:
space:
mode:
Diffstat (limited to 'patches/9-restoreafterrestart-20220709-d3f93c7.diff')
-rw-r--r--patches/9-restoreafterrestart-20220709-d3f93c7.diff101
1 files changed, 101 insertions, 0 deletions
diff --git a/patches/9-restoreafterrestart-20220709-d3f93c7.diff b/patches/9-restoreafterrestart-20220709-d3f93c7.diff
new file mode 100644
index 0000000..cfcb607
--- /dev/null
+++ b/patches/9-restoreafterrestart-20220709-d3f93c7.diff
@@ -0,0 +1,101 @@
+From 9fd4a02b57aa8a764d8105d5f2f854372f4ef559 Mon Sep 17 00:00:00 2001
+From: ViliamKovac1223 <viliamkovac1223@gmail.com>
+Date: Sat, 9 Jul 2022 17:35:54 +0200
+Subject: [PATCH] add restore patch
+
+---
+ config.def.h |  2 ++
+ dwm.c        | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 55 insertions(+)
+
+diff --git a/config.def.h b/config.def.h
+index 6ec4146..0b91976 100644
+--- a/config.def.h
++++ b/config.def.h
+@@ -1,5 +1,7 @@
+ /* See LICENSE file for copyright and license details. */
+ 
++#define SESSION_FILE "/tmp/dwm-session"
++
+ /* appearance */
+ static const unsigned int borderpx  = 1;        /* border pixel of windows */
+ static const unsigned int snap      = 32;       /* snap pixel */
+diff --git a/dwm.c b/dwm.c
+index 74cec7e..76b40a2 100644
+--- a/dwm.c
++++ b/dwm.c
+@@ -1255,11 +1255,63 @@ propertynotify(XEvent *e)
+ 	}
+ }
+ 
++void
++saveSession(void)
++{
++	FILE *fw = fopen(SESSION_FILE, "w");
++	for (Client *c = selmon->clients; c != NULL; c = c->next) { // get all the clients with their tags and write them to the file
++		fprintf(fw, "%lu %u\n", c->win, c->tags);
++	}
++	fclose(fw);
++}
++
++void
++restoreSession(void)
++{
++	// restore session
++	FILE *fr = fopen(SESSION_FILE, "r");
++	if (!fr)
++		return;
++
++	char *str = malloc(23 * sizeof(char)); // allocate enough space for excepted input from text file
++	while (fscanf(fr, "%[^\n] ", str) != EOF) { // read file till the end
++		long unsigned int winId;
++		unsigned int tagsForWin;
++		int check = sscanf(str, "%lu %u", &winId, &tagsForWin); // get data
++		if (check != 2) // break loop if data wasn't read correctly
++			break;
++		
++		for (Client *c = selmon->clients; c ; c = c->next) { // add tags to every window by winId
++			if (c->win == winId) {
++				c->tags = tagsForWin;
++				break;
++			}
++		}
++    }
++
++	for (Client *c = selmon->clients; c ; c = c->next) { // refocus on windows
++		focus(c);
++		restack(c->mon);
++	}
++
++	for (Monitor *m = selmon; m; m = m->next) // rearrange all monitors
++		arrange(m);
++
++	free(str);
++	fclose(fr);
++	
++	// delete a file
++	remove(SESSION_FILE);
++}
++
+ void
+ quit(const Arg *arg)
+ {
+ 	if(arg->i) restart = 1;
+ 	running = 0;
++
++	if (restart == 1)
++		saveSession();
+ }
+ 
+ Monitor *
+@@ -2173,6 +2225,7 @@ main(int argc, char *argv[])
+ 		die("pledge");
+ #endif /* __OpenBSD__ */
+ 	scan();
++	restoreSession();
+ 	run();
+ 	if(restart) execvp(argv[0], argv);
+ 	cleanup();
+-- 
+2.35.1
+