From: hazen2215 <hazen2215@users.noreply.github.com>
To: ml@inbox.vuxu.org
Subject: Re: [PR PATCH] [Updated] New package: keynav-20180821
Date: Sun, 06 Feb 2022 05:28:58 +0100 [thread overview]
Message-ID: <20220206042858.sqYWwCGch00vWV4DdlblUprpNnoiKwwTU_-seqGuKas@z> (raw)
In-Reply-To: <gh-mailinglist-notifications-41a7ca26-5023-4802-975b-f1789d68868e-void-packages-35271@inbox.vuxu.org>
[-- Attachment #1: Type: text/plain, Size: 1059 bytes --]
There is an updated pull request by hazen2215 against master on the void-packages repository
https://github.com/hazen2215/void-packages keynav
https://github.com/void-linux/void-packages/pull/35271
New package: keynav-20180821
<!-- Uncomment relevant sections and delete options which are not applicable -->
#### Testing the changes
- I tested the changes in this PR: **YES**
#### New package
- This new package conforms to the [quality requirements](https://github.com/void-linux/void-packages/blob/master/Manual.md#quality-requirements): **YES**
<!-- Note: If the build is likely to take more than 2 hours, please [skip CI](https://github.com/void-linux/void-packages/blob/master/CONTRIBUTING.md#continuous-integration)
and test at least one native build and, if supported, at least one cross build.
Ignore this section if this PR is not skipping CI.
-->
#### Local build testing
- I built this PR locally for my native architecture, (x86_64-musl)
A patch file from https://github.com/void-linux/void-packages/pull/35271.patch is attached
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #2: github-pr-keynav-35271.patch --]
[-- Type: text/x-diff, Size: 9332 bytes --]
From 5ee05c06944ad8aef8e667bfc79027dea4d14021 Mon Sep 17 00:00:00 2001
From: hazen2215 <haz@disroot.org>
Date: Fri, 28 Jan 2022 18:06:24 +0900
Subject: [PATCH] New package: keynav-20180821
---
.../patches/fix-cursor-passthrough.patch | 161 ++++++++++++++++++
.../patches/fix-overlapping-screens.patch | 57 +++++++
srcpkgs/keynav/template | 27 +++
3 files changed, 245 insertions(+)
create mode 100644 srcpkgs/keynav/patches/fix-cursor-passthrough.patch
create mode 100644 srcpkgs/keynav/patches/fix-overlapping-screens.patch
create mode 100644 srcpkgs/keynav/template
diff --git a/srcpkgs/keynav/patches/fix-cursor-passthrough.patch b/srcpkgs/keynav/patches/fix-cursor-passthrough.patch
new file mode 100644
index 000000000000..85fcce7ebb6c
--- /dev/null
+++ b/srcpkgs/keynav/patches/fix-cursor-passthrough.patch
@@ -0,0 +1,161 @@
+From 024fc8fe47454f460faa14cbb1727e04596886c0 Mon Sep 17 00:00:00 2001
+From: jabashque <jabashque@gmail.com>
+Date: Sun, 23 Feb 2020 01:50:36 -0800
+Subject: [PATCH 1/2] Set input shape to 0x0 to passthrough mouse
+
+Define the input shape to be empty so that one cannot click on the grid.
+This resolves all issues where the cursor ends up pointing to the grid
+itself instead of the window under the grid due to openpixel() not being
+called.
+---
+ keynav.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/keynav.c b/keynav.c
+index 65abe7c..4453fc8 100644
+--- a/keynav.c
++++ b/keynav.c
+@@ -983,6 +983,9 @@ void cmd_start(char *args) {
+ /* Tell the window manager not to manage us */
+ winattr.override_redirect = 1;
+ XChangeWindowAttributes(dpy, zone, CWOverrideRedirect, &winattr);
++ /* Set the input shape to be nothing so that the mouse can still
++ * click/scroll if on the grid */
++ XShapeCombineRectangles(dpy, zone, ShapeInput, 0, 0, NULL, 0, ShapeSet, 0);
+
+ XSelectInput(dpy, zone, StructureNotifyMask | ExposureMask
+ | PointerMotionMask | LeaveWindowMask );
+
+From 88aba2415bd20e70be91a24e2eb2409cb44b4076 Mon Sep 17 00:00:00 2001
+From: jabashque <jabashque@gmail.com>
+Date: Sun, 23 Feb 2020 04:35:37 -0800
+Subject: [PATCH 2/2] Remove {open,close}pixel(), var mouseinfo, type
+ mouseinfo_t
+
+Input shape is now set to 0x0, which takes care of the functionality
+that {open,close}pixel() previously provided. As such, completely remove
+{open,close}pixel() since they're no longer needed. In addition, remove
+the mouseinfo var and the mouseinfo_t type since those were used only by
+{open,close}pixel().
+---
+ keynav.c | 64 +-------------------------------------------------------
+ 1 file changed, 1 insertion(+), 63 deletions(-)
+
+diff --git a/keynav.c b/keynav.c
+index 4453fc8..fae5a76 100644
+--- a/keynav.c
++++ b/keynav.c
+@@ -80,11 +80,6 @@ typedef struct wininfo {
+ int curviewport;
+ } wininfo_t;
+
+-typedef struct mouseinfo {
+- int x;
+- int y;
+-} mouseinfo_t;
+-
+ typedef struct viewport {
+ int x;
+ int y;
+@@ -96,7 +91,6 @@ typedef struct viewport {
+ } viewport_t;
+
+ static wininfo_t wininfo;
+-static mouseinfo_t mouseinfo;
+ static viewport_t *viewports;
+ static int nviewports = 0;
+ static int xinerama = 0;
+@@ -191,8 +185,6 @@ void sighup(int sig);
+ void restart();
+ void recordings_save(const char *filename);
+ void parse_recordings(const char *filename);
+-void openpixel(Display *dpy, Window zone, mouseinfo_t *mouseinfo);
+-void closepixel(Display *dpy, Window zone, mouseinfo_t *mouseinfo);
+
+ typedef struct dispatch {
+ char *command;
+@@ -1178,21 +1170,7 @@ void cmd_warp(char *args) {
+ x = wininfo.x + wininfo.w / 2;
+ y = wininfo.y + wininfo.h / 2;
+
+- if (mouseinfo.x != -1 && mouseinfo.y != -1) {
+- closepixel(dpy, zone, &mouseinfo);
+- }
+-
+- /* Open pixels hould be relative to the window coordinates,
+- * not screen coordinates. */
+- mouseinfo.x = x - wininfo.x;
+- mouseinfo.y = y - wininfo.y;
+- openpixel(dpy, zone, &mouseinfo);
+-
+ xdo_move_mouse(xdo, x, y, viewports[wininfo.curviewport].screen_num);
+- xdo_wait_for_mouse_move_to(xdo, x, y);
+-
+- /* TODO(sissel): do we need to open again? */
+- openpixel(dpy, zone, &mouseinfo);
+ }
+
+ void cmd_click(char *args) {
+@@ -1981,36 +1959,6 @@ void parse_recordings(const char *filename) {
+ fclose(fp);
+ }
+
+-void openpixel(Display *dpy, Window zone, mouseinfo_t *mouseinfo) {
+- XRectangle rect;
+- if (mouseinfo->x == -1 && mouseinfo->y == -1) {
+- return;
+- }
+-
+- rect.x = mouseinfo->x;
+- rect.y = mouseinfo->y;
+- rect.width = 1;
+- rect.height = 1;
+-
+- XShapeCombineRectangles(dpy, zone, ShapeBounding, 0, 0, &rect, 1,
+- ShapeSubtract, 0);
+-} /* void openpixel */
+-
+-void closepixel(Display *dpy, Window zone, mouseinfo_t *mouseinfo) {
+- XRectangle rect;
+- if (mouseinfo->x == -1 && mouseinfo->y == -1) {
+- return;
+- }
+-
+- rect.x = mouseinfo->x;
+- rect.y = mouseinfo->y;
+- rect.width = 1;
+- rect.height = 1;
+-
+- XShapeCombineRectangles(dpy, zone, ShapeBounding, 0, 0, &rect, 1,
+- ShapeUnion, 0);
+-} /* void closepixel */
+-
+ int main(int argc, char **argv) {
+ char *pcDisplay;
+ int ret;
+@@ -2099,17 +2047,6 @@ int main(int argc, char **argv) {
+ }
+ break;
+
+- case MotionNotify:
+- if (zone) {
+- if (mouseinfo.x != -1 && mouseinfo.y != -1) {
+- closepixel(dpy, zone, &mouseinfo);
+- }
+- mouseinfo.x = e.xmotion.x;
+- mouseinfo.y = e.xmotion.y;
+- openpixel(dpy, zone, &mouseinfo);
+- }
+- break;
+-
+ // Ignorable events.
+ case GraphicsExpose:
+ case NoExpose:
+@@ -2118,6 +2055,7 @@ int main(int argc, char **argv) {
+ case DestroyNotify: // window was destroyed
+ case UnmapNotify: // window was unmapped (hidden)
+ case MappingNotify: // when keyboard mapping changes
++ case MotionNotify: // when mouse movement is detected
+ break;
+ default:
+ if (e.type == xrandr_event_base + RRScreenChangeNotify) {
diff --git a/srcpkgs/keynav/patches/fix-overlapping-screens.patch b/srcpkgs/keynav/patches/fix-overlapping-screens.patch
new file mode 100644
index 000000000000..ea9385b9f7a5
--- /dev/null
+++ b/srcpkgs/keynav/patches/fix-overlapping-screens.patch
@@ -0,0 +1,57 @@
+From b3d7a0966c94ea9b6dd0265c512cb7a14293f71e Mon Sep 17 00:00:00 2001
+From: Yutao Yuan <infmagic2047reg@outlook.com>
+Date: Mon, 4 Oct 2021 22:33:32 +0800
+Subject: [PATCH] Treat overlapping screens (like xrandr --same-as) as one
+ screen
+
+---
+ keynav.c | 33 ++++++++++++++++++++++-----------
+ 1 file changed, 22 insertions(+), 11 deletions(-)
+
+diff --git a/keynav.c b/keynav.c
+index 65abe7c..b4e5103 100644
+--- a/keynav.c
++++ b/keynav.c
+@@ -1811,20 +1811,31 @@ void query_screens() {
+ }
+
+ void query_screen_xinerama() {
+- int i;
++ int i, j, num_screens;
+ XineramaScreenInfo *screeninfo;
+
+- screeninfo = XineramaQueryScreens(dpy, &nviewports);
++ screeninfo = XineramaQueryScreens(dpy, &num_screens);
+ free(viewports);
+- viewports = calloc(nviewports, sizeof(viewport_t));
+- for (i = 0; i < nviewports; i++) {
+- viewports[i].x = screeninfo[i].x_org;
+- viewports[i].y = screeninfo[i].y_org;
+- viewports[i].w = screeninfo[i].width;
+- viewports[i].h = screeninfo[i].height;
+- viewports[i].screen_num = 0;
+- viewports[i].screen = ScreenOfDisplay(dpy, 0);
+- viewports[i].root = DefaultRootWindow(dpy);
++ viewports = calloc(num_screens, sizeof(viewport_t));
++ nviewports = 0;
++ for (i = 0; i < num_screens; i++) {
++ int overlapping = 0;
++ for (j = 0; j < nviewports; j++) {
++ if (viewports[j].x == screeninfo[i].x_org && viewports[j].y == screeninfo[i].y_org) {
++ overlapping = 1;
++ break;
++ }
++ }
++ if (!overlapping) {
++ viewports[nviewports].x = screeninfo[i].x_org;
++ viewports[nviewports].y = screeninfo[i].y_org;
++ viewports[nviewports].w = screeninfo[i].width;
++ viewports[nviewports].h = screeninfo[i].height;
++ viewports[nviewports].screen_num = 0;
++ viewports[nviewports].screen = ScreenOfDisplay(dpy, 0);
++ viewports[nviewports].root = DefaultRootWindow(dpy);
++ nviewports++;
++ }
+ }
+ XFree(screeninfo);
+ }
diff --git a/srcpkgs/keynav/template b/srcpkgs/keynav/template
new file mode 100644
index 000000000000..8bdc2e91bf1e
--- /dev/null
+++ b/srcpkgs/keynav/template
@@ -0,0 +1,27 @@
+# Template file for 'keynav'
+pkgname=keynav
+version=20180821
+revision=1
+_githash=78f9e076a5618aba43b030fbb9344c415c30c1e5
+wrksrc="${pkgname}-${_githash}"
+build_style=gnu-makefile
+make_use_env=yes
+hostmakedepends="pkg-config perl"
+makedepends="cairo-devel libXinerama-devel xdotool-devel libglib-devel libXrandr-devel"
+checkdepends="xorg-server-xvfb"
+short_desc="Quick way to use cursor via the keyboard"
+maintainer="hazen2215 <haz@disroot.org>"
+license="BSD-3-Clause"
+homepage="https://www.semicomplete.com/projects/keynav/"
+distfiles="https://github.com/jordansissel/keynav/archive/${_githash}.tar.gz"
+checksum=def79c32ea8aec57ec65310ede962f4d5d54ef26c5adccb351a19fb5683b678f
+
+do_check() {
+ ./test.sh
+}
+
+do_install() {
+ make PREFIX=${DESTDIR}/usr install
+ vsconf keynavrc
+ vlicense COPYRIGHT
+}
next prev parent reply other threads:[~2022-02-06 4:28 UTC|newest]
Thread overview: 25+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-01-28 9:47 [PR PATCH] " hazen2215
2022-01-28 10:31 ` [PR PATCH] [Updated] " hazen2215
2022-01-28 17:42 ` hazen2215
2022-02-06 4:28 ` hazen2215 [this message]
2022-02-20 7:58 ` hazen2215
2022-02-20 21:03 ` [PR REVIEW] " Duncaen
2022-02-21 7:39 ` [PR PATCH] [Updated] " hazen2215
2022-02-21 7:42 ` hazen2215
2022-02-21 7:45 ` New package: keynav-0.0.20180821 hazen2215
2022-03-01 13:25 ` [PR PATCH] [Updated] " hazen2215
2022-03-15 10:58 ` hazen2215
2022-03-30 21:08 ` hazen2215
2022-04-21 11:52 ` hazen2215
2022-06-26 5:11 ` hazen2215
2022-07-18 11:52 ` hazen2215
2022-09-20 11:25 ` hazen2215
2022-09-22 17:51 ` hazen2215
2022-10-22 5:04 ` hazen2215
2022-11-29 10:15 ` hazen2215
2022-11-29 14:03 ` hazen2215
2023-02-28 2:01 ` github-actions
2023-03-07 21:44 ` [PR PATCH] [Updated] " hazen2215
2023-06-06 2:05 ` github-actions
2023-06-06 5:28 ` [PR PATCH] [Updated] " hazen2215
2023-06-24 12:17 ` [PR PATCH] [Merged]: " Duncaen
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20220206042858.sqYWwCGch00vWV4DdlblUprpNnoiKwwTU_-seqGuKas@z \
--to=hazen2215@users.noreply.github.com \
--cc=ml@inbox.vuxu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).