1
0
Fork 0
mirror of https://github.com/Raymo111/i3lock-color.git synced 2024-10-27 05:23:10 -04:00

Merge pull request #231 from JezerM/passKeys

--pass-*-keys options (#136)
This commit is contained in:
Raymond Li 2021-08-09 17:55:48 -04:00 committed by GitHub
commit 4ff79c0e8f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
6 changed files with 54 additions and 9 deletions

View file

@ -9,7 +9,7 @@ jobs:
- name: Install deps
run: |
sudo apt update
sudo apt install pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
sudo apt install pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util-dev libxcb-xrm-dev libxcb-xtest0-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
- name: Build
run: ./build.sh
- name: Check and distcheck

View file

@ -66,7 +66,7 @@ jobs:
- run: |
sudo apt-get update
sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util-dev libxcb-xrm-dev libxcb-xtest0-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
./build.sh
- name: Perform CodeQL Analysis

View file

@ -81,7 +81,7 @@ The following dependencies will need to be installed for a successful build, dep
### Debian
Run this command to install all dependencies:
```
sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util0-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util0-dev libxcb-xrm-dev libxcb-xtest0-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
```
If you still see missing packages during build after installing all of these dependencies, try following the steps [here](https://github.com/Raymo111/i3lock-color/issues/211#issuecomment-809891727).
@ -95,7 +95,7 @@ sudo dnf install -y autoconf automake cairo-devel fontconfig gcc libev-devel lib
### Ubuntu 18/20.04 LTS
Run this command to install all dependencies:
```
sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util-dev libxcb-xrm-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfontconfig1-dev libxcb-composite0-dev libev-dev libx11-xcb-dev libxcb-xkb-dev libxcb-xinerama0-dev libxcb-randr0-dev libxcb-image0-dev libxcb-util-dev libxcb-xrm-dev libxcb-xtest0-dev libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev
```
## Building i3lock-color

View file

@ -97,7 +97,7 @@ AC_SEARCH_LIBS([iconv_open], [iconv], , [AC_MSG_FAILURE([cannot find the require
dnl Each prefix corresponds to a source tarball which users might have
dnl downloaded in a newer version and would like to overwrite.
PKG_CHECK_MODULES([XCB], [xcb xcb-xkb xcb-xinerama xcb-randr xcb-composite])
PKG_CHECK_MODULES([XCB], [xcb xcb-xkb xcb-xinerama xcb-randr xcb-composite xcb-xtest])
PKG_CHECK_MODULES([XCB_IMAGE], [xcb-image])
PKG_CHECK_MODULES([XCB_UTIL], [xcb-event xcb-util xcb-atom])
PKG_CHECK_MODULES([XCB_UTIL_XRM], [xcb-xrm])

View file

@ -388,6 +388,18 @@ power - XF86PowerDown, XF86PowerOff, XF86Sleep
volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume
.RE
.TP
.B \-\-special\-passthrough
Allows special keys to pass through the locked screen, with \-\-pass\-{media, screen,
power, volume}\-keys. Keystrokes are forcibly sent to the window manager or desktop
environment in three steps: un-grab keyboard, send key, and re-grab the keyboard.
No other keys will be sent to the WM/DE.
Note: ONLY use this option if the special keys are NOT passed through without it.
This could be less safe than the default behavior since the keyboard is ungrabbed for
the keys to be passed through. This HAS been tested though, so there SHOULDN'T be any
security issues.
.TP
.B \-\-bar\-indicator
Replaces the usual ring indicator with a bar indicator. Comes with perks.

View file

@ -49,6 +49,8 @@
#endif
#include <xcb/xcb_aux.h>
#include <xcb/randr.h>
#include <xcb/xtest.h>
#include <time.h>
#include "i3lock.h"
#include "xcb.h"
@ -257,6 +259,7 @@ bool pass_media_keys = false;
bool pass_screen_keys = false;
bool pass_power_keys = false;
bool pass_volume_keys = false;
bool special_passthrough = false;
// for the rendering thread, so we can clean it up
pthread_t draw_thread;
@ -650,6 +653,32 @@ static bool skip_without_validation(void) {
return false;
}
/*
* Sends key press event to root/wm
* Releases the keyboard, sends the event, and
* grabs the keyboard again
* */
static void send_key_to_root(xcb_key_press_event_t *event, bool twice) {
if (!special_passthrough) {
xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event);
return;
}
xcb_ungrab_keyboard(conn, XCB_CURRENT_TIME);
DEBUG("Received: %d at %ld\n", event->detail, time(0));
xcb_test_fake_input(conn, XCB_KEY_PRESS, event->detail, XCB_CURRENT_TIME, screen->root, 0, 0, 0);
xcb_test_fake_input(conn, XCB_KEY_RELEASE, event->detail, XCB_CURRENT_TIME, screen->root, 0, 0, 0);
if (twice) {
xcb_test_fake_input(conn, XCB_KEY_PRESS, event->detail, XCB_CURRENT_TIME, screen->root, 0, 0, 0);
xcb_test_fake_input(conn, XCB_KEY_RELEASE, event->detail, XCB_CURRENT_TIME, screen->root, 0, 0, 0);
}
xcb_grab_keyboard(conn, true, screen->root, XCB_CURRENT_TIME, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC);
xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT, win, XCB_CURRENT_TIME);
}
/*
* Handle key presses. Fixes state, then looks up the key symbol for the
* given keycode, then looks up the key symbol (as UCS-2), converts it to
@ -709,7 +738,7 @@ static void handle_key_press(xcb_key_press_event_t *event) {
case XKB_KEY_XF86AudioMute:
case XKB_KEY_XF86AudioLowerVolume:
case XKB_KEY_XF86AudioRaiseVolume:
xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event);
send_key_to_root(event, true);
return;
}
}
@ -719,7 +748,7 @@ static void handle_key_press(xcb_key_press_event_t *event) {
switch(ksym) {
case XKB_KEY_XF86MonBrightnessUp:
case XKB_KEY_XF86MonBrightnessDown:
xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event);
send_key_to_root(event, false);
return;
}
}
@ -730,7 +759,7 @@ static void handle_key_press(xcb_key_press_event_t *event) {
case XKB_KEY_XF86PowerDown:
case XKB_KEY_XF86PowerOff:
case XKB_KEY_XF86Sleep:
xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event);
send_key_to_root(event, false);
return;
}
}
@ -741,7 +770,7 @@ static void handle_key_press(xcb_key_press_event_t *event) {
case XKB_KEY_XF86AudioMute:
case XKB_KEY_XF86AudioLowerVolume:
case XKB_KEY_XF86AudioRaiseVolume:
xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event);
send_key_to_root(event, true);
return;
}
}
@ -1543,6 +1572,7 @@ int main(int argc, char *argv[]) {
{"pass-screen-keys", no_argument, NULL, 602},
{"pass-power-keys", no_argument, NULL, 603},
{"pass-volume-keys", no_argument, NULL, 604},
{"special-passthrough", no_argument, NULL, 605},
// bar indicator stuff
{"bar-indicator", no_argument, NULL, 700},
@ -2104,6 +2134,9 @@ int main(int argc, char *argv[]) {
case 604:
pass_volume_keys = true;
break;
case 605:
special_passthrough = true;
break;
// Bar indicator
case 700: