about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrandon Doornbos <b.doornbos@protonmail.com>2022-01-15 22:56:10 +0100
committerZach DeCook <zachdecook@librem.one>2024-01-12 17:05:55 -0500
commit9ffa0cf890e03334a36bf29c1fe6d0af8c665eae (patch)
treeeecda4ff66a357dea0c9f5ae17fd117d30865c7c
parent9a5fd9e73456861de6f6194d51893518da365a2c (diff)
downloadsuggpicker-9ffa0cf890e03334a36bf29c1fe6d0af8c665eae.tar.gz
main.c: add a real-time signal for toggling visibility of the keyboard
Previously it was only possible to either show or hide the keyboard.
When you want to control the keyboard with a single button in, i.e.
a window manager, this requires a separate script to keep track of
state. This solves this by only needing one signal to toggle.

Since there are only 2 USR signals, I had to use real-time signals,
which are in the [POSIX
standard](https://standards.ieee.org/standard/1003_1b-1993.html) and
available in the [Linux kernel since
2.2](https://www.man7.org/linux/man-pages/man7/signal.7.html).
-rw-r--r--main.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/main.c b/main.c
index 9a0d395..e18b092 100644
--- a/main.c
+++ b/main.c
@@ -43,6 +43,7 @@ static int cur_x = -1, cur_y = -1;
 static bool cur_press = false;
 static struct kbd keyboard;
 static uint32_t height, normal_height, landscape_height;
+static bool hidden = false;
 
 /* event handler prototypes */
 static void wl_pointer_enter(void *data, struct wl_pointer *wl_pointer,
@@ -346,6 +347,7 @@ hide(int sigint) {
 	zwlr_layer_surface_v1_destroy(layer_surface);
 	wl_surface_destroy(draw_surf.surf);
 	layer_surface = NULL;
+	hidden = true;
 }
 
 void
@@ -372,8 +374,17 @@ show(int sigint) {
 
 	wl_display_roundtrip(display);
 	drwsurf_flip(&draw_surf);
+	hidden = false;
 }
 
+void toggle_visibility(int sigint) {
+	signal(SIGRTMIN, toggle_visibility);
+	if (hidden) {
+		show(sigint);
+	} else {
+		hide(sigint);
+	}
+}
 void
 handle_input(FILE *fd, struct key *sugg, struct kbd *kb) {
 	char *line;
@@ -423,8 +434,6 @@ main(int argc, char **argv) {
 	/* keyboard settings */
 	keyboard.scheme = scheme;
 
-	bool starthidden = false;
-
 	int i;
 	for (i = 1; argv[i]; i++) {
 		if ((!strcmp(argv[i], "-v")) || (!strcmp(argv[i], "--version"))) {
@@ -456,7 +465,7 @@ main(int argc, char **argv) {
 			fc_font_pattern = estrdup(argv[++i]);
 		} else if ((!strcmp(argv[i], "-hidden")) ||
 		           (!strcmp(argv[i], "--hidden"))) {
-			starthidden = true;
+			hidden = true;
 		} else {
 			fprintf(stderr, "Invalid argument: %s\n", argv[i]);
 			usage(argv[0]);
@@ -495,7 +504,7 @@ main(int argc, char **argv) {
 	draw_ctx.font_description =
 	  pango_font_description_from_string(fc_font_pattern);
 
-	if (!starthidden) {
+	if (!hidden) {
 		show(0);
 	} else {
 		signal(SIGUSR2, show);
@@ -503,6 +512,7 @@ main(int argc, char **argv) {
 
 	signal(SIGUSR1, hide);
 	signal(SIGPIPE, pipewarn);
+	signal(SIGRTMIN, toggle_visibility);
 
 	// We need a more complicated event loop than wayland's default.
 	struct pollfd fds[2];