From 9ada23e3755e712ed7000bd41d3c6674d4e98a30 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 14 May 2020 19:33:30 -0400 Subject: [PATCH 001/183] Dynamically update version --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 4ae7132e..4b924db6 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Run autoreconf -fi to generate a configure script from this file. AC_PREREQ([2.69]) -AC_INIT([i3lock-color], [2.12.c.3], [https://github.com/Raymo11/i3lock-color/issues]) +AC_INIT([i3lock-color], [m4_esyscmd_s([cat I3LOCK_VERSION])], [https://github.com/Raymo11/i3lock-color/issues]) # For AX_EXTEND_SRCDIR AX_ENABLE_BUILDDIR AM_INIT_AUTOMAKE([foreign subdir-objects -Wall no-dist-gzip dist-bzip2]) From 195fa4a7f24b2f8ffcc26f33fd26c4c7f2288570 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 17 May 2020 20:30:56 -0400 Subject: [PATCH 002/183] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index ea71e48a..692eeae7 100644 --- a/.gitignore +++ b/.gitignore @@ -30,3 +30,4 @@ Makefile.in /install-sh /missing /stamp-h1 +*.in~ From 0ea7fe08854161a70115a0add2d1de5e1d05a8be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Beno=C3=AEt=20Dardenne?= Date: Mon, 18 May 2020 19:36:20 +0200 Subject: [PATCH 003/183] Fix #161 'padded' array can be used outside its scope --- i3lock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index 1514c3bf..58733d77 100644 --- a/i3lock.c +++ b/i3lock.c @@ -1500,13 +1500,13 @@ int main(int argc, char *argv[]) { char *optstring = "hvnbdc:p:ui:tCeI:frsS:kB:m"; char *arg = NULL; int opt = 0; + char padded[9] = "ffffffff"; \ #define parse_color(acolor)\ arg = optarg;\ if (arg[0] == '#') arg++;\ if (strlen(arg) == 6) {\ /* If 6 digits given, assume RGB and pad 0xff for alpha */\ - char padded[9] = "ffffffff"; \ strncpy( padded, arg, 6 );\ arg = padded;\ }\ @@ -1589,7 +1589,7 @@ int main(int argc, char *argv[]) { // Begin colors case 'c': - parse_color(color); + parse_color(color); break; case 300: parse_color(insidevercolor); From 720e2b4cfce703b870788de283be21e50c22096f Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 18 May 2020 16:35:37 -0400 Subject: [PATCH 004/183] Update I3LOCK_VERSION --- I3LOCK_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/I3LOCK_VERSION b/I3LOCK_VERSION index 6f0bb122..8e2f0af2 100644 --- a/I3LOCK_VERSION +++ b/I3LOCK_VERSION @@ -1 +1 @@ -2.12.c.3 +2.12.c.4 From 7982dfd6fe13c33ef6b57c1a23bdc627bfaf4d29 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mar=C3=A7ais?= Date: Tue, 2 Jun 2020 10:01:37 -0400 Subject: [PATCH 005/183] Looks for correct key group. Does not show if key group changed during typing password. --- xcb.c | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/xcb.c b/xcb.c index 1907f4b0..287d46b5 100644 --- a/xcb.c +++ b/xcb.c @@ -537,6 +537,15 @@ static char * get_atom_name(xcb_connection_t* conn, xcb_atom_t atom) { } +uint8_t xcb_get_key_group_index(xcb_connection_t *conn) { + xcb_xkb_get_state_cookie_t cookie; + xcb_xkb_get_state_reply_t* reply = NULL; + cookie = xcb_xkb_get_state(conn, XCB_XKB_ID_USE_CORE_KBD); + reply = xcb_xkb_get_state_reply(conn, cookie, NULL); + return reply->group; +} + + char* xcb_get_key_group_names(xcb_connection_t *conn) { uint8_t xkb_base_event; uint8_t xkb_base_error; @@ -585,15 +594,17 @@ char* xcb_get_key_group_names(xcb_connection_t *conn) { int length; xcb_atom_t *iter; + uint8_t index; char* answer = NULL; length = xcb_xkb_get_names_value_list_groups_length(reply, &list); iter = xcb_xkb_get_names_value_list_groups(&list); + index = xcb_get_key_group_index(conn); for (int i = 0; i < length; i++) { xcb_atom_t group_name = *iter; char* name = get_atom_name(conn, group_name); DEBUG("group_name %d: %s\n", i, name); - if (i == 0) { + if (i == index) { answer = name; } else { free(name); From 58b6f3ba963fba2dc6ccf5fe6e011d3f7e5cbcf6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mar=C3=A7ais?= Date: Tue, 2 Jun 2020 11:02:01 -0400 Subject: [PATCH 006/183] Layout text changed on XcbStateNotify event. --- i3lock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/i3lock.c b/i3lock.c index 58733d77..690500f5 100644 --- a/i3lock.c +++ b/i3lock.c @@ -882,6 +882,7 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { event->state_notify.baseGroup, event->state_notify.latchedGroup, event->state_notify.lockedGroup); + layout_text = get_keylayoutname(keylayout_mode, conn); break; } } From 44aae234930412f88ae694defc30418d891e7f63 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mar=C3=A7ais?= Date: Tue, 2 Jun 2020 11:29:46 -0400 Subject: [PATCH 007/183] Fixed forgetting to free in xcb_get_key_group_index. --- xcb.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/xcb.c b/xcb.c index 287d46b5..adafb76e 100644 --- a/xcb.c +++ b/xcb.c @@ -542,7 +542,9 @@ uint8_t xcb_get_key_group_index(xcb_connection_t *conn) { xcb_xkb_get_state_reply_t* reply = NULL; cookie = xcb_xkb_get_state(conn, XCB_XKB_ID_USE_CORE_KBD); reply = xcb_xkb_get_state_reply(conn, cookie, NULL); - return reply->group; + uint8_t ans = reply->group; + free(reply); + return ans; } From f5ea093365ade77e5ab94353a8986ddc3322e0cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Mar=C3=A7ais?= Date: Tue, 2 Jun 2020 12:06:41 -0400 Subject: [PATCH 008/183] Redraw on keyboard state change. --- i3lock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/i3lock.c b/i3lock.c index 690500f5..2108867d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -883,6 +883,7 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { event->state_notify.latchedGroup, event->state_notify.lockedGroup); layout_text = get_keylayoutname(keylayout_mode, conn); + redraw_screen(); break; } } From 2e4e2298eb4ba05a2a580de6ac770c24800ea5e0 Mon Sep 17 00:00:00 2001 From: Sergey Alirzaev Date: Wed, 3 Jun 2020 21:40:28 +0300 Subject: [PATCH 009/183] Fixed --greeterpos description in man page --- i3lock.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock.1 b/i3lock.1 index 425812ed..8aed60a3 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -337,7 +337,7 @@ Sets the color of the greeter text. .TP .B \-\-greeterpos="x position:y position" -Sets the position for the date string. All the variables from \-\-indpos and \-\-timepos may be used. +Sets the position for the greeter string. All the variables from \-\-indpos and \-\-timepos may be used. .TP .B \-\-refresh\-rate=seconds\-as\-double From ab07eafbc31dfd7c5cd5dd9498abec55ff1544f6 Mon Sep 17 00:00:00 2001 From: cptpcrd <31829097+cptpcrd@users.noreply.github.com> Date: Mon, 8 Jun 2020 09:27:09 -0400 Subject: [PATCH 010/183] Add --pass-volume-keys option to just pass volume keys --- i3lock.1 | 5 +++++ i3lock.c | 16 ++++++++++++++++ 2 files changed, 21 insertions(+) diff --git a/i3lock.1 b/i3lock.1 index 425812ed..93a4e46c 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -199,6 +199,11 @@ XF86MonBrightnessUp, XF86MonBrightnessDown. Allow the following keys to be used while the screen is locked by passing them through: XF86PowerDown, XF86PowerOff, XF86Sleep. +.TP +.B \-\-pass\-volume\-keys +Allow the following keys to be used while the screen is locked by passing them through: +XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume. + .TP .B \-\-insidevercolor=rrggbbaa Sets the interior circle color while the password is being verified. diff --git a/i3lock.c b/i3lock.c index 58733d77..ecc78c3d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -236,6 +236,7 @@ bool skip_repeated_empty_password = false; bool pass_media_keys = false; bool pass_screen_keys = false; bool pass_power_keys = false; +bool pass_volume_keys = false; // for the rendering thread, so we can clean it up pthread_t draw_thread; @@ -700,6 +701,17 @@ static void handle_key_press(xcb_key_press_event_t *event) { } } + // volume keys + if (pass_volume_keys) { + switch(ksym) { + 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); + return; + } + } + // return/enter/etc switch (ksym) { case XKB_KEY_j: @@ -1467,6 +1479,7 @@ int main(int argc, char *argv[]) { {"pass-media-keys", no_argument, NULL, 601}, {"pass-screen-keys", no_argument, NULL, 602}, {"pass-power-keys", no_argument, NULL, 603}, + {"pass-volume-keys", no_argument, NULL, 604}, // bar indicator stuff {"bar-indicator", no_argument, NULL, 700}, @@ -1943,6 +1956,9 @@ int main(int argc, char *argv[]) { case 603: pass_power_keys = true; break; + case 604: + pass_volume_keys = true; + break; // Bar indicator case 700: From b5724ab6d2af48302e62672158c51b98ebe6aad1 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 19 Jun 2020 17:33:22 -0400 Subject: [PATCH 011/183] Update manpage date --- i3lock.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock.1 b/i3lock.1 index 92410991..44f7727f 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -8,7 +8,7 @@ .fi .. -.TH i3lock-color 1 "JANUARY 2012" Linux "User Manuals" +.TH i3lock-color 1 "JUNE 2020" Linux "User Manuals" .SH NAME i3lock-color \- improved screen locker From 467e46c077a5b7e38aca28e8a43da9bd393713ff Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 5 Jul 2020 09:05:16 +0200 Subject: [PATCH 012/183] avoid pixmap allocations in the redraw path MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Before this change, i3lock could become unusable on systems where pixmap allocations take long. I don’t know precisely why, but slow pixmap allocations is a symptom that my computer sometimes exhibits, apparently when low on GPU memory. In that situation, duplicate key press events would be processed (apparently received from X11!), making correct password entry impossible. --- i3lock.c | 3 ++- unlock_indicator.c | 49 +++++++++++++++++++++++++++++++--------------- unlock_indicator.h | 5 ++++- 3 files changed, 39 insertions(+), 18 deletions(-) diff --git a/i3lock.c b/i3lock.c index 134fddaa..bd5008d2 100644 --- a/i3lock.c +++ b/i3lock.c @@ -1221,7 +1221,8 @@ int main(int argc, char *argv[]) { free(image_raw_format); /* Pixmap on which the image is rendered to (if any) */ - xcb_pixmap_t bg_pixmap = draw_image(last_resolution); + xcb_pixmap_t bg_pixmap = create_bg_pixmap(conn, screen, last_resolution, color); + draw_image(bg_pixmap, last_resolution); xcb_window_t stolen_focus = find_focused_window(conn, screen->root); diff --git a/unlock_indicator.c b/unlock_indicator.c index d6237ed2..b677a908 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -86,8 +86,7 @@ auth_state_t auth_state; * resolution and returns it. * */ -xcb_pixmap_t draw_image(uint32_t *resolution) { - xcb_pixmap_t bg_pixmap = XCB_NONE; +void draw_image(xcb_pixmap_t bg_pixmap, uint32_t *resolution) { const double scaling_factor = get_dpi_value() / 96.0; int button_diameter_physical = ceil(scaling_factor * BUTTON_DIAMETER); DEBUG("scaling_factor is %.f, physical diameter is %d px\n", @@ -95,7 +94,7 @@ xcb_pixmap_t draw_image(uint32_t *resolution) { if (!vistype) vistype = get_root_visual_type(screen); - bg_pixmap = create_bg_pixmap(conn, screen, resolution, color); + /* Initialize cairo: Create one in-memory surface to render the unlock * indicator on, create one XCB surface to actually draw (one or more, * depending on the amount of screens) unlock indicators on. */ @@ -105,6 +104,19 @@ xcb_pixmap_t draw_image(uint32_t *resolution) { cairo_surface_t *xcb_output = cairo_xcb_surface_create(conn, bg_pixmap, vistype, resolution[0], resolution[1]); cairo_t *xcb_ctx = cairo_create(xcb_output); + /* After the first iteration, the pixmap will still contain the previous + * contents. Explicitly clear the entire pixmap with the background color + * first to get back into a defined state: */ + char strgroups[3][3] = {{color[0], color[1], '\0'}, + {color[2], color[3], '\0'}, + {color[4], color[5], '\0'}}; + uint32_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)), + (strtol(strgroups[1], NULL, 16)), + (strtol(strgroups[2], NULL, 16))}; + cairo_set_source_rgb(xcb_ctx, rgb16[0] / 255.0, rgb16[1] / 255.0, rgb16[2] / 255.0); + cairo_rectangle(xcb_ctx, 0, 0, resolution[0], resolution[1]); + cairo_fill(xcb_ctx); + if (img) { if (!tile) { cairo_set_source_surface(xcb_ctx, img, 0, 0); @@ -119,16 +131,6 @@ xcb_pixmap_t draw_image(uint32_t *resolution) { cairo_fill(xcb_ctx); cairo_pattern_destroy(pattern); } - } else { - char strgroups[3][3] = {{color[0], color[1], '\0'}, - {color[2], color[3], '\0'}, - {color[4], color[5], '\0'}}; - uint32_t rgb16[3] = {(strtol(strgroups[0], NULL, 16)), - (strtol(strgroups[1], NULL, 16)), - (strtol(strgroups[2], NULL, 16))}; - cairo_set_source_rgb(xcb_ctx, rgb16[0] / 255.0, rgb16[1] / 255.0, rgb16[2] / 255.0); - cairo_rectangle(xcb_ctx, 0, 0, resolution[0], resolution[1]); - cairo_fill(xcb_ctx); } if (unlock_indicator && @@ -329,7 +331,18 @@ xcb_pixmap_t draw_image(uint32_t *resolution) { cairo_surface_destroy(output); cairo_destroy(ctx); cairo_destroy(xcb_ctx); - return bg_pixmap; +} + +static xcb_pixmap_t bg_pixmap = XCB_NONE; + +/* + * Releases the current background pixmap so that the next redraw_screen() call + * will allocate a new one with the updated resolution. + * + */ +void free_bg_pixmap(void) { + xcb_free_pixmap(conn, bg_pixmap); + bg_pixmap = XCB_NONE; } /* @@ -338,12 +351,16 @@ xcb_pixmap_t draw_image(uint32_t *resolution) { */ void redraw_screen(void) { DEBUG("redraw_screen(unlock_state = %d, auth_state = %d)\n", unlock_state, auth_state); - xcb_pixmap_t bg_pixmap = draw_image(last_resolution); + if (bg_pixmap == XCB_NONE) { + DEBUG("allocating pixmap for %d x %d px\n", last_resolution[0], last_resolution[1]); + bg_pixmap = create_bg_pixmap(conn, screen, last_resolution, color); + } + + draw_image(bg_pixmap, last_resolution); xcb_change_window_attributes(conn, win, XCB_CW_BACK_PIXMAP, (uint32_t[1]){bg_pixmap}); /* XXX: Possible optimization: Only update the area in the middle of the * screen instead of the whole screen. */ xcb_clear_area(conn, 0, win, 0, 0, last_resolution[0], last_resolution[1]); - xcb_free_pixmap(conn, bg_pixmap); xcb_flush(conn); } diff --git a/unlock_indicator.h b/unlock_indicator.h index 93c1de8b..581d028d 100644 --- a/unlock_indicator.h +++ b/unlock_indicator.h @@ -1,6 +1,8 @@ #ifndef _UNLOCK_INDICATOR_H #define _UNLOCK_INDICATOR_H +#include + typedef enum { STATE_STARTED = 0, /* default state */ STATE_KEY_PRESSED = 1, /* key was pressed, show unlock indicator */ @@ -19,7 +21,8 @@ typedef enum { STATE_I3LOCK_LOCK_FAILED = 4, /* i3lock failed to load */ } auth_state_t; -xcb_pixmap_t draw_image(uint32_t* resolution); +void free_bg_pixmap(void); +void draw_image(xcb_pixmap_t bg_pixmap, uint32_t* resolution); void redraw_screen(void); void clear_indicator(void); From cd7172d41585986569cc8b1974cf583633edd45e Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 5 Jul 2020 09:24:18 +0200 Subject: [PATCH 013/183] make --debug output go to stderr (#279) --- i3lock.h | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/i3lock.h b/i3lock.h index 57190e5b..1858325a 100644 --- a/i3lock.h +++ b/i3lock.h @@ -5,10 +5,11 @@ * This is important because xautolock (for example) closes stdout/stderr by * default, so just printing something to stdout will lead to the data ending * up on the X11 socket (!). */ -#define DEBUG(fmt, ...) \ - do { \ - if (debug_mode) \ - printf("[i3lock-debug] " fmt, ##__VA_ARGS__); \ +#define DEBUG(fmt, ...) \ + do { \ + if (debug_mode) { \ + fprintf(stderr, "[i3lock-debug] " fmt, ##__VA_ARGS__); \ + } \ } while (0) #endif From eff3bf0c5e783ad9c61d83172bf933e169bc87d0 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 5 Jul 2020 09:08:43 +0200 Subject: [PATCH 014/183] clang-format: disable header re-ordering --- .clang-format | 1 + 1 file changed, 1 insertion(+) diff --git a/.clang-format b/.clang-format index 1d840132..6e49d835 100644 --- a/.clang-format +++ b/.clang-format @@ -8,3 +8,4 @@ IndentWidth: 4 PointerBindsToType: false ColumnLimit: 0 SpaceBeforeParens: ControlStatements +SortIncludes: false From 8a0156cec69e85bf0e8c21f1f589334ec7466684 Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Sun, 5 Jul 2020 09:32:58 +0200 Subject: [PATCH 015/183] travis: switch to clang-format-9 (now also in Docker) --- .travis.yml | 6 +----- travis/Dockerfile | 4 ++-- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index 15ad1e4d..6e929e68 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,11 +7,7 @@ language: c compiler: - gcc - clang -addons: - apt: - packages: - - clang-format-3.5 script: - - clang-format-3.5 -i *.[ch] && git diff --exit-code || (echo 'Code was not formatted using clang-format!'; false) - docker build --pull --no-cache --rm -t=i3lock -f travis/Dockerfile . + - docker run -e CC=$CC -v $PWD:/usr/src:rw i3lock /bin/sh -c 'clang-format-9 -i *.[ch] && git diff --exit-code || (echo "Code was not formatted using clang-format!"; false)' - docker run -e CC=$CC -v $PWD:/usr/src:rw i3lock /bin/sh -c 'autoreconf -fi && mkdir -p build && cd build && (../configure || (cat config.log; false)) && make -j V=1 CFLAGS="-Wformat -Wformat-security -Wextra -Wno-unused-parameter -Werror"' diff --git a/travis/Dockerfile b/travis/Dockerfile index 53812763..cc2dd7d9 100644 --- a/travis/Dockerfile +++ b/travis/Dockerfile @@ -11,7 +11,7 @@ RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80retry # (3608 kB/s)). Hence, let’s stick with httpredir.debian.org (default) for now. # Install mk-build-deps (for installing the i3 build dependencies), -# clang and clang-format-3.8 (for checking formatting and building with clang), +# clang and clang-format-9 (for checking formatting and building with clang), # lintian (for checking spelling errors), # test suite dependencies (for running tests) RUN apt-get update && \ @@ -19,7 +19,7 @@ RUN apt-get update && \ build-essential clang git autoconf automake libxcb-randr0-dev pkg-config libpam0g-dev \ libcairo2-dev libxcb1-dev libxcb-dpms0-dev libxcb-image0-dev libxcb-util0-dev \ libxcb-xrm-dev libev-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev \ - libxkbcommon-x11-dev && \ + libxkbcommon-x11-dev clang-format-9 && \ rm -rf /var/lib/apt/lists/* WORKDIR /usr/src From 526c743369453c6565f67cb91a24adc807d185b3 Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Wed, 15 Jul 2020 02:02:57 +0200 Subject: [PATCH 016/183] Make 2 more functions static --- i3lock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index bd5008d2..bab41e08 100644 --- a/i3lock.c +++ b/i3lock.c @@ -105,7 +105,7 @@ bool skip_repeated_empty_password = false; * Decrements i to point to the previous unicode glyph * */ -void u8_dec(char *s, int *i) { +static void u8_dec(char *s, int *i) { (void)(isutf(s[--(*i)]) || isutf(s[--(*i)]) || isutf(s[--(*i)]) || --(*i)); } @@ -613,7 +613,7 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { * and also redraw the image, if any. * */ -void handle_screen_resize(void) { +static void handle_screen_resize(void) { xcb_get_geometry_cookie_t geomc; xcb_get_geometry_reply_t *geom; geomc = xcb_get_geometry(conn, screen->root); From 9f675b8a850031138c8408a54fd14769461c4e4b Mon Sep 17 00:00:00 2001 From: Michael Ortmann <41313082+michaelortmann@users.noreply.github.com> Date: Wed, 15 Jul 2020 23:53:19 +0200 Subject: [PATCH 017/183] Use explicit_bzero() where available, not just on OpenBSD (#282) --- configure.ac | 1 + i3lock.c | 5 ++--- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/configure.ac b/configure.ac index 474f750e..397bda49 100644 --- a/configure.ac +++ b/configure.ac @@ -66,6 +66,7 @@ AC_FUNC_FORK AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_STRNLEN AC_CHECK_FUNCS([atexit dup2 ftruncate getcwd gettimeofday localtime_r memchr memset mkdir rmdir setlocale socket strcasecmp strchr strdup strerror strncasecmp strndup strrchr strspn strstr strtol strtoul], , [AC_MSG_FAILURE([cannot find the $ac_func function, which i3lock requires])]) +AC_CHECK_FUNCS([explicit_bzero]) # Checks for libraries. diff --git a/i3lock.c b/i3lock.c index bab41e08..0c3f5b65 100644 --- a/i3lock.c +++ b/i3lock.c @@ -27,7 +27,6 @@ #include #endif #include -#include #include #include #include @@ -35,7 +34,7 @@ #include #include #include -#ifdef __OpenBSD__ +#ifdef HAVE_EXPLICIT_BZERO #include /* explicit_bzero(3) */ #endif #include @@ -175,7 +174,7 @@ static bool load_compose_table(const char *locale) { * */ static void clear_password_memory(void) { -#ifdef __OpenBSD__ +#ifdef HAVE_EXPLICIT_BZERO /* Use explicit_bzero(3) which was explicitly designed not to be * optimized out by the compiler. */ explicit_bzero(password, strlen(password)); From 79a9eacaeded9aea74e710e7caa8ccf572ecf30c Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 18 Jul 2020 21:59:04 -0400 Subject: [PATCH 018/183] Merge everything from upstream except PR i3#280 --- .clang-format | 1 + .travis.yml | 6 +----- configure.ac | 1 + i3lock.c | 7 +++---- i3lock.h | 9 +++++---- travis/Dockerfile | 4 ++-- 6 files changed, 13 insertions(+), 15 deletions(-) diff --git a/.clang-format b/.clang-format index 1d840132..6e49d835 100644 --- a/.clang-format +++ b/.clang-format @@ -8,3 +8,4 @@ IndentWidth: 4 PointerBindsToType: false ColumnLimit: 0 SpaceBeforeParens: ControlStatements +SortIncludes: false diff --git a/.travis.yml b/.travis.yml index 15ad1e4d..6e929e68 100644 --- a/.travis.yml +++ b/.travis.yml @@ -7,11 +7,7 @@ language: c compiler: - gcc - clang -addons: - apt: - packages: - - clang-format-3.5 script: - - clang-format-3.5 -i *.[ch] && git diff --exit-code || (echo 'Code was not formatted using clang-format!'; false) - docker build --pull --no-cache --rm -t=i3lock -f travis/Dockerfile . + - docker run -e CC=$CC -v $PWD:/usr/src:rw i3lock /bin/sh -c 'clang-format-9 -i *.[ch] && git diff --exit-code || (echo "Code was not formatted using clang-format!"; false)' - docker run -e CC=$CC -v $PWD:/usr/src:rw i3lock /bin/sh -c 'autoreconf -fi && mkdir -p build && cd build && (../configure || (cat config.log; false)) && make -j V=1 CFLAGS="-Wformat -Wformat-security -Wextra -Wno-unused-parameter -Werror"' diff --git a/configure.ac b/configure.ac index 4b924db6..904b5aed 100644 --- a/configure.ac +++ b/configure.ac @@ -66,6 +66,7 @@ AC_FUNC_FORK AC_FUNC_LSTAT_FOLLOWS_SLASHED_SYMLINK AC_FUNC_STRNLEN AC_CHECK_FUNCS([atexit dup2 ftruncate getcwd gettimeofday localtime_r memchr memset mkdir rmdir setlocale socket strcasecmp strchr strdup strerror strncasecmp strndup strrchr strspn strstr strtol strtoul], , [AC_MSG_FAILURE([cannot find the $ac_func function, which i3lock requires])]) +AC_CHECK_FUNCS([explicit_bzero]) # Checks for libraries. diff --git a/i3lock.c b/i3lock.c index 0ba3f9a5..c6004e02 100644 --- a/i3lock.c +++ b/i3lock.c @@ -18,7 +18,6 @@ #include #include #include -#include #include #include #include @@ -29,7 +28,7 @@ #include #include #include -#ifdef __OpenBSD__ +#ifdef HAVE_EXPLICIT_BZERO #include #else #include @@ -45,7 +44,7 @@ #include #include #include -#ifdef __OpenBSD__ +#ifdef HAVE_EXPLICIT_BZERO #include /* explicit_bzero(3) */ #endif #include @@ -906,7 +905,7 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { * and also redraw the image, if any. * */ -void handle_screen_resize(void) { +static void handle_screen_resize(void) { xcb_get_geometry_cookie_t geomc; xcb_get_geometry_reply_t *geom; geomc = xcb_get_geometry(conn, screen->root); diff --git a/i3lock.h b/i3lock.h index 4352ff5b..2d20ad15 100644 --- a/i3lock.h +++ b/i3lock.h @@ -8,10 +8,11 @@ * This is important because xautolock (for example) closes stdout/stderr by * default, so just printing something to stdout will lead to the data ending * up on the X11 socket (!). */ -#define DEBUG(fmt, ...) \ - do { \ - if (debug_mode) \ - printf("[i3lock-debug] " fmt, ##__VA_ARGS__); \ + #define DEBUG(fmt, ...) \ + do { \ + if (debug_mode) { \ + fprintf(stderr, "[i3lock-debug] " fmt, ##__VA_ARGS__); \ + } \ } while (0) #endif diff --git a/travis/Dockerfile b/travis/Dockerfile index 53812763..cc2dd7d9 100644 --- a/travis/Dockerfile +++ b/travis/Dockerfile @@ -11,7 +11,7 @@ RUN echo 'APT::Acquire::Retries "5";' > /etc/apt/apt.conf.d/80retry # (3608 kB/s)). Hence, let’s stick with httpredir.debian.org (default) for now. # Install mk-build-deps (for installing the i3 build dependencies), -# clang and clang-format-3.8 (for checking formatting and building with clang), +# clang and clang-format-9 (for checking formatting and building with clang), # lintian (for checking spelling errors), # test suite dependencies (for running tests) RUN apt-get update && \ @@ -19,7 +19,7 @@ RUN apt-get update && \ build-essential clang git autoconf automake libxcb-randr0-dev pkg-config libpam0g-dev \ libcairo2-dev libxcb1-dev libxcb-dpms0-dev libxcb-image0-dev libxcb-util0-dev \ libxcb-xrm-dev libev-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev \ - libxkbcommon-x11-dev && \ + libxkbcommon-x11-dev clang-format-9 && \ rm -rf /var/lib/apt/lists/* WORKDIR /usr/src From 83c27890e4bef6840eaa70e529fe9ce8d2fb1827 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 18 Jul 2020 22:08:12 -0400 Subject: [PATCH 019/183] Fix wrong spot --- i3lock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index c6004e02..deecf7c8 100644 --- a/i3lock.c +++ b/i3lock.c @@ -28,7 +28,7 @@ #include #include #include -#ifdef HAVE_EXPLICIT_BZERO +#ifdef __OpenBSD__ #include #else #include @@ -404,7 +404,7 @@ static bool load_compose_table(const char *locale) { * */ static void clear_password_memory(void) { -#ifdef __OpenBSD__ +#ifdef HAVE_EXPLICIT_BZERO /* Use explicit_bzero(3) which was explicitly designed not to be * optimized out by the compiler. */ explicit_bzero(password, strlen(password)); From 0350d065b1e84a225b5cfa0986022cd2223a1433 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 21 Jul 2020 13:03:22 -0400 Subject: [PATCH 020/183] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index f9a6e50e..4822be59 100644 --- a/README.md +++ b/README.md @@ -18,6 +18,7 @@ ![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color) ![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color) ![Maintenance](https://img.shields.io/maintenance/yes/2020) +[![HitCount](http://hits.dwyl.com/Raymo111/i3lock-color.svg)](http://hits.dwyl.com/Raymo111/i3lock-color) **A modern version of i3lock with color functionality by [eBrnd](https://github.com/eBrnd/i3lock-color), maintained for a few years by [PandorasFox](https://github.com/PandorasFox) and now maintained and being developed by [Raymo111](https://github.com/Raymo111).** From 9e5c3769f3a0d0847b6abfa08d423543a46f66ae Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 21 Jul 2020 21:13:03 -0400 Subject: [PATCH 021/183] Fix options -B and -S --- i3lock.1 | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 44f7727f..9d8aa31c 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -8,7 +8,7 @@ .fi .. -.TH i3lock-color 1 "JUNE 2020" Linux "User Manuals" +.TH i3lock-color 1 "JULY 2020" Linux "User Manuals" .SH NAME i3lock-color \- improved screen locker @@ -148,12 +148,12 @@ Note, that this will log the password used for authentication to stdout. .SH i3lock-color options .TP -.B \-S=number, \-\-screen=number +.B \-S number, \-\-screen=number Specifies which display to draw the unlock indicator and clock on. By default, they'll be placed on every screen. Note that this number is zero indexed. The ordering is dependent on libxinerama. .TP -.B \-B=sigma, \-\-blur=sigma +.B \-B sigma, \-\-blur=sigma Captures the screen and blurs it using the given sigma (radius). Images may still be overlaid over the blurred screenshot. As an alternative to this option, you could specify a translucent background color From 50589e5652af5b2a5817d24a6a0ca6d010196368 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 21 Jul 2020 22:28:40 -0400 Subject: [PATCH 022/183] Insert debug statement to investigate 173 --- unlock_indicator.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/unlock_indicator.c b/unlock_indicator.c index cb3f33f8..543864c2 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -897,6 +897,8 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { screen_number = 0; } + DEBUG("Drawing indicator on %d screens\n", screen_number); + int current_screen = screen_number == 0 ? 0 : screen_number - 1; const int end_screen = screen_number == 0 ? xr_screens : screen_number; for (; current_screen < end_screen; current_screen++) { From 6b34624e74ec17e421e00d94bef956671d327e1e Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 22 Jul 2020 15:03:18 -0400 Subject: [PATCH 023/183] Fix pam issue --- pam/i3lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pam/i3lock b/pam/i3lock index 6eb8e687..5011a123 100644 --- a/pam/i3lock +++ b/pam/i3lock @@ -1,6 +1,7 @@ # -# PAM configuration file for the i3lock screen locker. By default, it includes -# the 'login' configuration file (see /etc/pam.d/login) +# PAM configuration file for the i3lock-color screen locker. By default, it includes +# the 'system-auth' configuration file (see /etc/pam.d/system-auth) +# Note that i3lock uses 'login' instead of 'system-auth', but this poses an issue on Arch and Gentoo # -auth include login +auth include system-auth From f64527d162de686c67ff47333b0a813b02f0d573 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 22 Jul 2020 15:07:07 -0400 Subject: [PATCH 024/183] New version for new release --- I3LOCK_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/I3LOCK_VERSION b/I3LOCK_VERSION index 8e2f0af2..ff183fe7 100644 --- a/I3LOCK_VERSION +++ b/I3LOCK_VERSION @@ -1 +1 @@ -2.12.c.4 +2.12.c.5 From c456097d2dbc44ada279cf3e5e7c07a2b1219736 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 25 Jul 2020 00:22:32 -0400 Subject: [PATCH 025/183] Fix whitespace --- unlock_indicator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index 543864c2..6a0e71e6 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -897,7 +897,7 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { screen_number = 0; } - DEBUG("Drawing indicator on %d screens\n", screen_number); + DEBUG("Drawing indicator on %d screens\n", screen_number); int current_screen = screen_number == 0 ? 0 : screen_number - 1; const int end_screen = screen_number == 0 ? xr_screens : screen_number; From 1aa73841ad42db9f64b542c3bf180229080b072a Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 25 Jul 2020 18:34:34 -0400 Subject: [PATCH 026/183] Hitcount is definitely broken --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 4822be59..f9a6e50e 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,6 @@ ![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color) ![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color) ![Maintenance](https://img.shields.io/maintenance/yes/2020) -[![HitCount](http://hits.dwyl.com/Raymo111/i3lock-color.svg)](http://hits.dwyl.com/Raymo111/i3lock-color) **A modern version of i3lock with color functionality by [eBrnd](https://github.com/eBrnd/i3lock-color), maintained for a few years by [PandorasFox](https://github.com/PandorasFox) and now maintained and being developed by [Raymo111](https://github.com/Raymo111).** From 7e41929e867e953fd91a775c7a8c426ecb8dfaff Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 29 Jul 2020 23:52:50 -0400 Subject: [PATCH 027/183] Make install file executable --- install-i3lock-color.sh | 0 1 file changed, 0 insertions(+), 0 deletions(-) mode change 100644 => 100755 install-i3lock-color.sh diff --git a/install-i3lock-color.sh b/install-i3lock-color.sh old mode 100644 new mode 100755 From 22a6534946724b1453d90d33b1c3d9bc8f00c94d Mon Sep 17 00:00:00 2001 From: Simon Puente Date: Sat, 1 Aug 2020 20:07:01 -0700 Subject: [PATCH 028/183] Update build.sh Just a little suggestion --- build.sh | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index 5526a48f..1b9a9fec 100755 --- a/build.sh +++ b/build.sh @@ -1,8 +1,9 @@ #!/bin/bash autoreconf -fiv -rm -rf build/ -mkdir -p build && cd build/ +BUILD_DIR=build/ +rm -rf $BUILD_DIR +mkdir -vp $BUILD_DIR && cd $BUILD_DIR || { echo "cd $BUILD_DIR"; exit 127; } ../configure --prefix=/usr --sysconfdir=/etc From a15620084e3f0f41e9739694e99ab4d526dbb024 Mon Sep 17 00:00:00 2001 From: Simon Puente Date: Sat, 1 Aug 2020 20:38:30 -0700 Subject: [PATCH 029/183] Update build.sh forget this --- build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 1b9a9fec..cbec96c7 100755 --- a/build.sh +++ b/build.sh @@ -3,7 +3,8 @@ autoreconf -fiv BUILD_DIR=build/ rm -rf $BUILD_DIR -mkdir -vp $BUILD_DIR && cd $BUILD_DIR || { echo "cd $BUILD_DIR"; exit 127; } +mkdir -vp $BUILD_DIR +cd $BUILD_DIR || { echo "cd $BUILD_DIR"; exit 127; } ../configure --prefix=/usr --sysconfdir=/etc From 63af0b6d1dd9372eb1e5b0b5a851a034485f5875 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 4 Aug 2020 17:20:07 -0400 Subject: [PATCH 030/183] Update i3lock --- pam/i3lock | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/pam/i3lock b/pam/i3lock index 5011a123..e9e4e841 100644 --- a/pam/i3lock +++ b/pam/i3lock @@ -1,7 +1,8 @@ # # PAM configuration file for the i3lock-color screen locker. By default, it includes -# the 'system-auth' configuration file (see /etc/pam.d/system-auth) -# Note that i3lock uses 'login' instead of 'system-auth', but this poses an issue on Arch and Gentoo +# the 'system-auth' configuration file (see /etc/pam.d/system-auth) for Arch and Gentoo +# and 'login' for Debian. Note that vanilla i3lock upstream uses 'login' instead. # -auth include system-auth +auth include system-auth # For Arch/Gentoo +#auth include login # For Debian From eb6c9412e99731d284b000315776d021bad2458f Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 4 Aug 2020 17:23:28 -0400 Subject: [PATCH 031/183] Update install-i3lock-color.sh --- install-i3lock-color.sh | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/install-i3lock-color.sh b/install-i3lock-color.sh index f478e287..e92d46a9 100755 --- a/install-i3lock-color.sh +++ b/install-i3lock-color.sh @@ -1,10 +1,5 @@ #!/bin/bash -autoreconf -fiv - -rm -rf build/ -mkdir -p build && cd build/ - -../configure --prefix=/usr --sysconfdir=/etc +./build.sh sudo make install From eefd457317d3cd083c0801871fb9163f5d7d6fc2 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 4 Aug 2020 17:29:25 -0400 Subject: [PATCH 032/183] Update build.sh --- build.sh | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/build.sh b/build.sh index cbec96c7..88dbb1e8 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,11 @@ #!/bin/bash autoreconf -fiv +if + sed -i "/^auth include system-auth/c\#auth include system-auth" pam/i3lock + sed -i "/^#auth include login/c\auth include login" pam/i3lock +fi + BUILD_DIR=build/ rm -rf $BUILD_DIR mkdir -vp $BUILD_DIR From a8744d76ebd7192aa78fd41d51bff64cce66f82f Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 4 Aug 2020 17:35:54 -0400 Subject: [PATCH 033/183] Update i3lock --- pam/i3lock | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/pam/i3lock b/pam/i3lock index e9e4e841..49451393 100644 --- a/pam/i3lock +++ b/pam/i3lock @@ -4,5 +4,5 @@ # and 'login' for Debian. Note that vanilla i3lock upstream uses 'login' instead. # -auth include system-auth # For Arch/Gentoo -#auth include login # For Debian +#auth include system-auth # For Arch/Gentoo +auth include login # For Debian From 770006421e3fe52f42afe343d024138b81c91bcf Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 4 Aug 2020 17:36:09 -0400 Subject: [PATCH 034/183] Update build.sh --- build.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index 88dbb1e8..007b3543 100755 --- a/build.sh +++ b/build.sh @@ -1,9 +1,9 @@ #!/bin/bash autoreconf -fiv -if - sed -i "/^auth include system-auth/c\#auth include system-auth" pam/i3lock - sed -i "/^#auth include login/c\auth include login" pam/i3lock +if [[ -f /etc/arch-release ]] + sed -i "/^#auth include system-auth/auth include system-auth" pam/i3lock + sed -i "/^auth include login/#auth include login" pam/i3lock fi BUILD_DIR=build/ From 02334d35ae279b67a50ba55af612d01c68095f34 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 4 Aug 2020 17:55:51 -0400 Subject: [PATCH 035/183] Fix for Arch --- .gitignore | 1 + build.sh | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/.gitignore b/.gitignore index 692eeae7..26e322c1 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,7 @@ i3lock tags *.swp *.gz +/pam/i3lock ################################################################################ # https://raw.githubusercontent.com/github/gitignore/master/Autotools.gitignore diff --git a/build.sh b/build.sh index 007b3543..922c173d 100755 --- a/build.sh +++ b/build.sh @@ -1,9 +1,9 @@ #!/bin/bash autoreconf -fiv -if [[ -f /etc/arch-release ]] - sed -i "/^#auth include system-auth/auth include system-auth" pam/i3lock - sed -i "/^auth include login/#auth include login" pam/i3lock +if [[ -f /etc/arch-release ]]; then + sed -i "s/^#auth include system-auth/auth include system-auth/g" pam/i3lock + sed -i "s/^auth include login/#auth include login/g" pam/i3lock fi BUILD_DIR=build/ From e3ffaba058186e4e83a8e4122f58f220bfbe4bc0 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 4 Aug 2020 22:32:22 -0400 Subject: [PATCH 036/183] Move Arch check to configure.ac --- README.md | 3 ++- build.sh | 5 ----- configure.ac | 6 ++++++ 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f9a6e50e..baed9861 100644 --- a/README.md +++ b/README.md @@ -61,13 +61,14 @@ The following dependencies will need to be installed for a successful build, dep ### Ubuntu 18.04 LTS Run this command to install all dependencies: ``` -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 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 ``` ## Arch Linux - autoconf - cairo - fontconfig +- gcc - libev - libjpeg-turbo - libxinerama diff --git a/build.sh b/build.sh index 922c173d..cbec96c7 100755 --- a/build.sh +++ b/build.sh @@ -1,11 +1,6 @@ #!/bin/bash autoreconf -fiv -if [[ -f /etc/arch-release ]]; then - sed -i "s/^#auth include system-auth/auth include system-auth/g" pam/i3lock - sed -i "s/^auth include login/#auth include login/g" pam/i3lock -fi - BUILD_DIR=build/ rm -rf $BUILD_DIR mkdir -vp $BUILD_DIR diff --git a/configure.ac b/configure.ac index 904b5aed..eb90507d 100644 --- a/configure.ac +++ b/configure.ac @@ -87,6 +87,12 @@ case "$host" in ;; esac +# Use system-auth instead of login on Arch (TODO: Implement Gentoo as well) +if [[ -f /etc/arch-release ]]; then + sed -i "s/^#auth include system-auth/auth include system-auth/g" pam/i3lock + sed -i "s/^auth include login/#auth include login/g" pam/i3lock +fi + AC_SEARCH_LIBS([iconv_open], [iconv], , [AC_MSG_FAILURE([cannot find the required iconv_open() function despite trying to link with -liconv])]) dnl Each prefix corresponds to a source tarball which users might have From 03832398f8ce24ff5c9c4ddf52c29b38a26d0052 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 5 Aug 2020 00:57:41 -0400 Subject: [PATCH 037/183] Fix PAM for Arch --- .gitignore | 1 + configure.ac | 13 +++++++------ 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/.gitignore b/.gitignore index 26e322c1..deb12a6c 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ Makefile.in /missing /stamp-h1 *.in~ +pam/i3lock diff --git a/configure.ac b/configure.ac index eb90507d..f909ea64 100644 --- a/configure.ac +++ b/configure.ac @@ -77,6 +77,13 @@ AC_SEARCH_LIBS([ev_run], [ev], , [AC_MSG_FAILURE([cannot find the required ev_ru AC_SEARCH_LIBS([shm_open], [rt]) +# Use system-auth instead of login on Arch (TODO: Implement Gentoo as well) +if [[ -f /etc/arch-release ]]; then + echo "Using PAM for Arch" + sed -i "s/^#auth include system-auth/auth include system-auth/g" ../pam/i3lock + sed -i "s/^auth include login/#auth include login/g" ../pam/i3lock +fi + # Only disable PAM on OpenBSD where i3lock uses BSD Auth instead case "$host" in *-openbsd*) @@ -87,12 +94,6 @@ case "$host" in ;; esac -# Use system-auth instead of login on Arch (TODO: Implement Gentoo as well) -if [[ -f /etc/arch-release ]]; then - sed -i "s/^#auth include system-auth/auth include system-auth/g" pam/i3lock - sed -i "s/^auth include login/#auth include login/g" pam/i3lock -fi - AC_SEARCH_LIBS([iconv_open], [iconv], , [AC_MSG_FAILURE([cannot find the required iconv_open() function despite trying to link with -liconv])]) dnl Each prefix corresponds to a source tarball which users might have From 8a932aa30a5b1e5de69caed3efc2ece5c849df6d Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 30 Aug 2020 12:07:17 -0400 Subject: [PATCH 038/183] Update README.md --- README.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index baed9861..f483ccb5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,6 @@ -# i3lock - improved screen locker - +# i3lock-color +### The world's most popular non- +default lockscreen ![Language count](https://img.shields.io/github/languages/count/Raymo111/i3lock-color) ![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color) ![Repo size](https://img.shields.io/github/repo-size/Raymo111/i3lock-color) From b2c1024e365546bd3e53c3a0f0dfba35491f2596 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 30 Aug 2020 12:07:35 -0400 Subject: [PATCH 039/183] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index f483ccb5..20cd09c4 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # i3lock-color -### The world's most popular non- -default lockscreen +### The world's most popular non-default lockscreen + ![Language count](https://img.shields.io/github/languages/count/Raymo111/i3lock-color) ![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color) ![Repo size](https://img.shields.io/github/repo-size/Raymo111/i3lock-color) From 9a1793de4743e7fe6dec2f7c4ee6829c3bdde094 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 13 Sep 2020 19:17:30 -0400 Subject: [PATCH 040/183] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 20cd09c4..5b5e5150 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@ # i3lock-color -### The world's most popular non-default lockscreen +### The world's most popular non-default lockscreen. ![Language count](https://img.shields.io/github/languages/count/Raymo111/i3lock-color) ![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color) From ed7185dca8b01a33d238866854ac6ec3ad4e0114 Mon Sep 17 00:00:00 2001 From: felipe stival Date: Fri, 2 Oct 2020 09:49:39 -0300 Subject: [PATCH 041/183] Throw error when trying to start on Wayland (#290) --- i3lock.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i3lock.c b/i3lock.c index 0c3f5b65..e855a751 100644 --- a/i3lock.c +++ b/i3lock.c @@ -1038,6 +1038,8 @@ int main(int argc, char *argv[]) { err(EXIT_FAILURE, "getpwuid() failed"); if ((username = pw->pw_name) == NULL) errx(EXIT_FAILURE, "pw->pw_name is NULL."); + if (getenv("WAYLAND_DISPLAY") != NULL) + errx(EXIT_FAILURE, "i3lock is a program for X11 and does not work on Wayland. Try https://github.com/swaywm/swaylock instead"); char *optstring = "hvnbdc:p:ui:teI:f"; while ((o = getopt_long(argc, argv, optstring, longopts, &longoptind)) != -1) { From 59b8e8ed0ae26ab553fdd266499806e257eef6d7 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 9 Oct 2020 14:12:27 -0400 Subject: [PATCH 042/183] Fix install script --- install-i3lock-color.sh | 2 ++ 1 file changed, 2 insertions(+) diff --git a/install-i3lock-color.sh b/install-i3lock-color.sh index e92d46a9..1ba24a7b 100755 --- a/install-i3lock-color.sh +++ b/install-i3lock-color.sh @@ -1,6 +1,8 @@ #!/bin/bash ./build.sh +cd build + sudo make install sudo install -Dm644 ../LICENSE "/usr/share/licenses/i3lock-color/LICENSE" From f745450cb6369fdd044808a3392c435053bc0ca7 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 9 Oct 2020 14:18:25 -0400 Subject: [PATCH 043/183] Test install script as well --- .github/workflows/Build Test.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/Build Test.yml b/.github/workflows/Build Test.yml index 70371629..f173fde0 100644 --- a/.github/workflows/Build Test.yml +++ b/.github/workflows/Build Test.yml @@ -17,3 +17,4 @@ jobs: with: name: i3lock path: /home/runner/work/i3lock-color/i3lock-color/build/i3lock + - run: ./install-i3lock-color.sh From cc243a22eb1ee860fecdd6beff2b746ca5f04f6d Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 14 Oct 2020 00:16:19 -0400 Subject: [PATCH 044/183] Create codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 70 +++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) create mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 00000000..16246461 --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,70 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +name: "CodeQL" + +on: + push: + branches: [master] + pull_request: + # The branches below must be a subset of the branches above + branches: [master] + schedule: + - cron: '0 16 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + # Override automatic language detection by changing the below list + # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] + language: ['cpp'] + # Learn more... + # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + with: + # We must fetch at least the immediate parents so that if this is + # a pull request then we can checkout the head. + fetch-depth: 2 + + # If this run was triggered by a pull request event, then checkout + # the head of the pull request instead of the merge commit. + - run: git checkout HEAD^2 + if: ${{ github.event_name == 'pull_request' }} + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + #- name: Autobuild + # uses: github/codeql-action/autobuild@v1 + + # ℹ️ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # ✏️ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + - run: | + ./build.sh + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 From e76420250213f88e6fab7bb418011e1425106f17 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 14 Oct 2020 00:18:53 -0400 Subject: [PATCH 045/183] Fix codeql --- .github/workflows/codeql-analysis.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 16246461..bb7df8a2 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -64,6 +64,7 @@ jobs: # uses a compiled language - run: | + 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 ./build.sh - name: Perform CodeQL Analysis From d525ad9c79db0d0c555361da9ea2baffcf077dfe Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 14 Oct 2020 00:23:56 -0400 Subject: [PATCH 046/183] Update README.md --- README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 5b5e5150..81a22499 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,4 @@ # i3lock-color -### The world's most popular non-default lockscreen. ![Language count](https://img.shields.io/github/languages/count/Raymo111/i3lock-color) ![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color) @@ -20,7 +19,8 @@ ![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color) ![Maintenance](https://img.shields.io/maintenance/yes/2020) -**A modern version of i3lock with color functionality by [eBrnd](https://github.com/eBrnd/i3lock-color), maintained for a few years by [PandorasFox](https://github.com/PandorasFox) and now maintained and being developed by [Raymo111](https://github.com/Raymo111).** +### The world's most popular non-default lockscreen. +**A modern version of i3lock with color functionality and other features.** ![i3lock-color in action](screenshot.png "Screenshot sample") @@ -119,5 +119,8 @@ A [sample script](lock.sh) is included in this repository. [See the script in ac On OpenBSD the `i3lock` binary needs to be setgid `auth` to call the authentication helpers, e.g. `/usr/libexec/auth/login_passwd`. +## Contributors +This project was started by [eBrnd](https://github.com/eBrnd/i3lock-color), maintained for a few years by [PandorasFox](https://github.com/PandorasFox) and now maintained and being developed by [Raymo111](https://github.com/Raymo111). The full list of contributors can be found [here](https://github.com/Raymo111/i3lock-color/graphs/contributors). + ## Upstream Please submit pull requests for i3lock things to https://github.com/i3/i3lock and pull requests for additional features on top of regular i3lock at https://github.com/Raymo111/i3lock-color. From 1150dcefefac437aa1a72a85b388c251c6428fa4 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 15 Oct 2020 12:35:56 -0400 Subject: [PATCH 047/183] Create SECURITY.md --- SECURITY.md | 81 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..86cc5071 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,81 @@ +# Security Policy + +## Supported Versions + +Use this section to tell people about which versions of your project are +currently being supported with security updates. + +| Version | Supported | +| ---------- | ------------------ | +| 2.12.c.5 | :white_check_mark: | +| < 2.12.c.5 | :x: | + +## Reporting a Vulnerability + +If there's a severe security vulnerability in the latest version of i3lock-color, don't post a public issue. Either email me directly at [i3lock@raymond.li](mailto:i3lock@raymond.li?subject=i3lock-color%20security%20vulnerability), or encrypt the issue text with my PGP public key: +``` +-----BEGIN PGP PUBLIC KEY BLOCK----- + +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 +=HNQH +-----END PGP PUBLIC KEY BLOCK----- +``` +You can also get my key directly from the [GNUPG keyserver](http://keys.gnupg.net/pks/lookup?op=vindex&fingerprint=on&search=0xF058DF982DB42F9D). From fbca77df60039bd19031ebfe9b219955500217bd Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 18 Oct 2020 19:54:10 -0400 Subject: [PATCH 048/183] Free layout_text and standardize exit codes --- i3lock.c | 14 ++++++++++---- unlock_indicator.c | 2 +- 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/i3lock.c b/i3lock.c index 5d596fc5..5767e9bc 100644 --- a/i3lock.c +++ b/i3lock.c @@ -893,6 +893,10 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { event->state_notify.baseGroup, event->state_notify.latchedGroup, event->state_notify.lockedGroup); + if (layout_text != NULL) { + free(layout_text); + layout_text = NULL; + } layout_text = get_keylayoutname(keylayout_mode, conn); redraw_screen(); break; @@ -1217,7 +1221,7 @@ static void xcb_check_cb(EV_P_ ev_check *w, int revents) { /* In the parent process, we exit */ if (fork() != 0) - exit(0); + exit(EXIT_SUCCESS); ev_loop_fork(EV_DEFAULT); } @@ -1344,7 +1348,7 @@ static void load_slideshow_images(const char *path, char *image_raw_format) { d = opendir(path); if (d == NULL) { printf("Could not open directory: %s\n", path); - exit(0); + exit(EXIT_SUCCESS); } while ((dir = readdir(d)) != NULL) { @@ -2100,8 +2104,6 @@ int main(int argc, char *argv[]) { xcb_connection_has_error(conn)) errx(EXIT_FAILURE, "Could not connect to X11, maybe you need to set DISPLAY?"); - - if (xkb_x11_setup_xkb_extension(conn, XKB_X11_MIN_MAJOR_XKB_VERSION, XKB_X11_MIN_MINOR_XKB_VERSION, @@ -2326,6 +2328,10 @@ int main(int argc, char *argv[]) { pam_end(pam_handle, PAM_SUCCESS); } #endif + if (layout_text != NULL) { + free(layout_text); + layout_text = NULL; + } if (stolen_focus == XCB_NONE) { return 0; diff --git a/unlock_indicator.c b/unlock_indicator.c index 6a0e71e6..c1679e29 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -610,7 +610,7 @@ static te_expr *compile_expression(const char *const from, const char *expressio te_expr *expr = te_compile(expression, variables, var_count, &te_err); if (te_err) { fprintf(stderr, "Failed to reason about '%s' given by '%s'\n", expression, from); - exit(1); + exit(EXIT_FAILURE); } return expr; } From 0489daa5990db9d9ef88589df39f3ddef9d02191 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 18 Oct 2020 23:38:16 -0400 Subject: [PATCH 049/183] Ensure LF EOL --- .gitattributes | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 .gitattributes diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..d2281953 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +# Auto detect text files and perform LF normalization +* text=auto + +text eol=lf From 3df046122a4f8502cf6d0100ecbb91ac8af3471c Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 19 Oct 2020 00:22:39 -0400 Subject: [PATCH 050/183] Free when layout mode is 1 TODO: 2 still throws an error --- i3lock.c | 38 ++++++++++++++++++++++++++++++-------- 1 file changed, 30 insertions(+), 8 deletions(-) diff --git a/i3lock.c b/i3lock.c index 5767e9bc..addffefe 100644 --- a/i3lock.c +++ b/i3lock.c @@ -893,10 +893,36 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { event->state_notify.baseGroup, event->state_notify.latchedGroup, event->state_notify.lockedGroup); - if (layout_text != NULL) { - free(layout_text); - layout_text = NULL; - } + /* TODO: freeing layout_text when mode is 2 throws: + ================================================================= + ==2600==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x602000000919 in thread T0 + #0 0x7f3065b0e7cf in __interceptor_free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf) + #1 0x55c93c97e736 in process_xkb_event ../../i3lock-color/i3lock.c:898 + #2 0x55c93c980458 in xcb_check_cb ../../i3lock-color/i3lock.c:1237 + #3 0x7f306512bbc2 in ev_invoke_pending (/lib/x86_64-linux-gnu/libev.so.4+0x5bc2) + #4 0x7f306512fb92 in ev_run (/lib/x86_64-linux-gnu/libev.so.4+0x9b92) + #5 0x55c93c97c00c in ev_loop /usr/include/ev.h:842 + #6 0x55c93c986762 in main ../../i3lock-color/i3lock.c:2325 + #7 0x7f3064de70b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) + #8 0x55c93c97920d in _start (/mnt/c/Users/raymo/Git/i3lock-color/build/i3lock+0x1520d) + + 0x602000000919 is located 9 bytes inside of 13-byte region [0x602000000910,0x60200000091d) + allocated by thread T0 here: + #0 0x7f3065b0ebc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8) + #1 0x55c93c99b20f in get_atom_name ../../i3lock-color/xcb.c:531 + #2 0x55c93c99b9c2 in xcb_get_key_group_names ../../i3lock-color/xcb.c:607 + #3 0x55c93c97c389 in get_keylayoutname ../../i3lock-color/i3lock.c:299 + #4 0x55c93c984e44 in main ../../i3lock-color/i3lock.c:2118 + #5 0x7f3064de70b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) + + SUMMARY: AddressSanitizer: bad-free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf) in __interceptor_free + ==2600==ABORTING + Not freeing results in memory leak. + */ + if (keylayout_mode == 1 && layout_text) { + free(layout_text); + layout_text = 0; + } layout_text = get_keylayoutname(keylayout_mode, conn); redraw_screen(); break; @@ -2328,10 +2354,6 @@ int main(int argc, char *argv[]) { pam_end(pam_handle, PAM_SUCCESS); } #endif - if (layout_text != NULL) { - free(layout_text); - layout_text = NULL; - } if (stolen_focus == XCB_NONE) { return 0; From 38a768d7bd4d6dda9222f5c42e9de6882e907a77 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 19 Oct 2020 00:33:10 -0400 Subject: [PATCH 051/183] Change keylayout to 1 Because #184 is half-patched and there's still a memleak for keylayout mode 2 --- lock.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lock.sh b/lock.sh index a8aeec42..430f257b 100755 --- a/lock.sh +++ b/lock.sh @@ -33,7 +33,7 @@ V='#bb00bbbb' # verifying --indicator \ --timestr="%H:%M:%S" \ --datestr="%A, %m %Y" \ ---keylayout 2 \ +--keylayout 1 \ # --veriftext="Drinking verification can..." # --wrongtext="Nope!" From 0f73d971e84b801f41db90009373e49c3228d56f Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 19 Oct 2020 12:34:57 -0400 Subject: [PATCH 052/183] Cleanup code and fix TODO error output --- i3lock.c | 42 +++++++++++++++++++++--------------------- unlock_indicator.c | 1 - 2 files changed, 21 insertions(+), 22 deletions(-) diff --git a/i3lock.c b/i3lock.c index addffefe..2950d2b5 100644 --- a/i3lock.c +++ b/i3lock.c @@ -296,7 +296,7 @@ static void u8_dec(char *s, int *i) { */ static char* get_keylayoutname(int mode, xcb_connection_t* conn) { if (mode < 0 || mode > 2) return NULL; - char* newans = NULL, *answer = xcb_get_key_group_names(conn); + char *newans = NULL, *answer = xcb_get_key_group_names(conn); DEBUG("keylayout answer is: [%s]\n", answer); switch (mode) { case 1: @@ -895,33 +895,33 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { event->state_notify.lockedGroup); /* TODO: freeing layout_text when mode is 2 throws: ================================================================= - ==2600==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x602000000919 in thread T0 - #0 0x7f3065b0e7cf in __interceptor_free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf) - #1 0x55c93c97e736 in process_xkb_event ../../i3lock-color/i3lock.c:898 - #2 0x55c93c980458 in xcb_check_cb ../../i3lock-color/i3lock.c:1237 - #3 0x7f306512bbc2 in ev_invoke_pending (/lib/x86_64-linux-gnu/libev.so.4+0x5bc2) - #4 0x7f306512fb92 in ev_run (/lib/x86_64-linux-gnu/libev.so.4+0x9b92) - #5 0x55c93c97c00c in ev_loop /usr/include/ev.h:842 - #6 0x55c93c986762 in main ../../i3lock-color/i3lock.c:2325 - #7 0x7f3064de70b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) - #8 0x55c93c97920d in _start (/mnt/c/Users/raymo/Git/i3lock-color/build/i3lock+0x1520d) + ==25882==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x602000000919 in thread T0 + #0 0x7fe34ddeb7cf in __interceptor_free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf) + #1 0x55c43cbb372b in process_xkb_event ../../i3lock-color/i3lock.c:923 + #2 0x55c43cbb544d in xcb_check_cb ../../i3lock-color/i3lock.c:1262 + #3 0x7fe34d408bc2 in ev_invoke_pending (/lib/x86_64-linux-gnu/libev.so.4+0x5bc2) + #4 0x7fe34d40cb92 in ev_run (/lib/x86_64-linux-gnu/libev.so.4+0x9b92) + #5 0x55c43cbb100c in ev_loop /usr/include/ev.h:842 + #6 0x55c43cbbb757 in main ../../i3lock-color/i3lock.c:2350 + #7 0x7fe34d0c40b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) + #8 0x55c43cbae20d in _start (/mnt/c/Users/raymo/Git/i3lock-color/build/i3lock+0x1520d) 0x602000000919 is located 9 bytes inside of 13-byte region [0x602000000910,0x60200000091d) allocated by thread T0 here: - #0 0x7f3065b0ebc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8) - #1 0x55c93c99b20f in get_atom_name ../../i3lock-color/xcb.c:531 - #2 0x55c93c99b9c2 in xcb_get_key_group_names ../../i3lock-color/xcb.c:607 - #3 0x55c93c97c389 in get_keylayoutname ../../i3lock-color/i3lock.c:299 - #4 0x55c93c984e44 in main ../../i3lock-color/i3lock.c:2118 - #5 0x7f3064de70b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) + #0 0x7fe34ddebbc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8) + #1 0x55c43cbd0204 in get_atom_name ../../i3lock-color/xcb.c:531 + #2 0x55c43cbd09b7 in xcb_get_key_group_names ../../i3lock-color/xcb.c:607 + #3 0x55c43cbb1389 in get_keylayoutname ../../i3lock-color/i3lock.c:299 + #4 0x55c43cbb9e39 in main ../../i3lock-color/i3lock.c:2143 + #5 0x7fe34d0c40b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) SUMMARY: AddressSanitizer: bad-free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf) in __interceptor_free - ==2600==ABORTING - Not freeing results in memory leak. + ==25882==ABORTING + Not freeing it results in a memory leak. */ - if (keylayout_mode == 1 && layout_text) { + if (keylayout_mode == 1 && layout_text != NULL) { free(layout_text); - layout_text = 0; + layout_text = NULL; } layout_text = get_keylayoutname(keylayout_mode, conn); redraw_screen(); diff --git a/unlock_indicator.c b/unlock_indicator.c index c1679e29..f0283b4e 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -794,7 +794,6 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.mod_text.size = modifier_size; draw_data.mod_text.font = get_font_face(WRONG_FONT); draw_data.mod_text.align = modif_align; - draw_data.mod_text.color = wrong16; } From 4f76d51a3f79082e01b319e9031aad868d89449d Mon Sep 17 00:00:00 2001 From: Michael Stapelberg Date: Tue, 27 Oct 2020 08:37:27 +0100 Subject: [PATCH 053/183] release v2.13 --- CHANGELOG | 10 ++++++++++ I3LOCK_VERSION | 2 +- configure.ac | 2 +- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b9de06aa..3d387b54 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,13 @@ +2020-10-27 i3lock 2.13 + + • Throw error when trying to start on Wayland + • Use explicit_bzero() where available, not just on OpenBSD + • avoid pixmap allocations in the redraw path + • make --debug output go to stderr + • unlock_indicator.c: fix build failure against gcc-10 + • fix: call pam_end in cleanup in main, not in event loop + • set _NET_WM_BYPASS_COMPOSITOR hint to avoid flickering + 2019-07-21 i3lock 2.12 • remove stray \n from error messages diff --git a/I3LOCK_VERSION b/I3LOCK_VERSION index 19462c20..5a051351 100644 --- a/I3LOCK_VERSION +++ b/I3LOCK_VERSION @@ -1 +1 @@ -2.12-non-git +2.13-non-git diff --git a/configure.ac b/configure.ac index 397bda49..32ab0b3b 100644 --- a/configure.ac +++ b/configure.ac @@ -2,7 +2,7 @@ # Run autoreconf -fi to generate a configure script from this file. AC_PREREQ([2.69]) -AC_INIT([i3lock], [2.12], [https://github.com/i3/i3lock/issues]) +AC_INIT([i3lock], [2.13], [https://github.com/i3/i3lock/issues]) # For AX_EXTEND_SRCDIR AX_ENABLE_BUILDDIR AM_INIT_AUTOMAKE([foreign subdir-objects -Wall no-dist-gzip dist-bzip2]) From 1127e2a27f5d11d31009dad4503915b02917ded3 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 28 Oct 2020 23:58:50 -0400 Subject: [PATCH 054/183] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 81a22499..173d1202 100644 --- a/README.md +++ b/README.md @@ -19,7 +19,7 @@ ![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color) ![Maintenance](https://img.shields.io/maintenance/yes/2020) -### The world's most popular non-default lockscreen. +### The world's most popular non-default computer lockscreen. **A modern version of i3lock with color functionality and other features.** ![i3lock-color in action](screenshot.png "Screenshot sample") From bc78eabca7a436a3ce64c4b6aad5503b3b3ef1b9 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 28 Nov 2020 14:20:00 -0500 Subject: [PATCH 055/183] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 173d1202..175b4634 100644 --- a/README.md +++ b/README.md @@ -65,7 +65,7 @@ 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 ``` -## Arch Linux +### Arch Linux - autoconf - cairo - fontconfig From e36b7c37dc4c958e6f9e5a17ee3b61de6186d8dd Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 28 Nov 2020 14:22:28 -0500 Subject: [PATCH 056/183] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 175b4634..cbc01c97 100644 --- a/README.md +++ b/README.md @@ -59,7 +59,7 @@ You can also specify additional options, as detailed in the manpage. This includ ## Dependencies The following dependencies will need to be installed for a successful build, depending on your OS/distro. -### Ubuntu 18.04 LTS +### 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 From 2448c18c8c96fe6dfaa76fa8c8bddc9491724d63 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 28 Nov 2020 14:25:42 -0500 Subject: [PATCH 057/183] Update README.md --- README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/README.md b/README.md index cbc01c97..7c209c62 100644 --- a/README.md +++ b/README.md @@ -65,6 +65,12 @@ 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 ``` +### Debian +Replace `libxcb-util-dev` with `libxcb-util0-dev` in the Ubuntu installation command: +``` +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 +``` + ### Arch Linux - autoconf - cairo From e7073a64449ebcd973dd9f15350571227050ce1e Mon Sep 17 00:00:00 2001 From: sportluffi <2623906+sportluffi@users.noreply.github.com> Date: Fri, 4 Dec 2020 17:10:16 +0100 Subject: [PATCH 058/183] Add Fedora dependency list (#188) * Add Fedora dependency list * Change Fedora command to one-liner --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/README.md b/README.md index 7c209c62..94d5587f 100644 --- a/README.md +++ b/README.md @@ -86,6 +86,13 @@ sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfont - xcb-util-image - xcb-util-xrm +### Fedora +Run this command to install all dependencies: + +```sh +sudo dnf install -y autoconf automake cairo-devel fontconfig gcc libev-devel libjpeg-turbo-devel libXinerama libxkbcommon-devel libxkbcommon-x11-devel libXrandr pam-devel pkgconf xcb-util-image-devel xcb-util-xrm-devel +``` + ## Building i3lock-color Before you build - check and see if there's a packaged version available for your distro (there usually is, either in a community repo/PPA). From 2bd34e03d4e79e7e9e2b6acc5ff07b8fd83192ce Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 8 Dec 2020 22:33:33 -0500 Subject: [PATCH 059/183] Set theme jekyll-theme-midnight --- _config.yml | 1 + 1 file changed, 1 insertion(+) create mode 100644 _config.yml diff --git a/_config.yml b/_config.yml new file mode 100644 index 00000000..18854876 --- /dev/null +++ b/_config.yml @@ -0,0 +1 @@ +theme: jekyll-theme-midnight \ No newline at end of file From 47b3305fd66b5b076172aba96213a3f8da20f8e4 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 17 Dec 2020 13:04:33 -0500 Subject: [PATCH 060/183] Create FUNDING.yml --- .github/FUNDING.yml | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 .github/FUNDING.yml diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml new file mode 100644 index 00000000..f5896ab6 --- /dev/null +++ b/.github/FUNDING.yml @@ -0,0 +1,3 @@ +# These are supported funding model platforms + +github: [Raymo111] From cd8f286aa1fa7a9d45c0e55f938aa47652cd92f7 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 20 Dec 2020 15:31:31 -0500 Subject: [PATCH 061/183] Free on layoutmode 2 as well --- i3lock.c | 46 ++++++++++++++-------------------------------- 1 file changed, 14 insertions(+), 32 deletions(-) diff --git a/i3lock.c b/i3lock.c index 2950d2b5..2494384a 100644 --- a/i3lock.c +++ b/i3lock.c @@ -296,12 +296,13 @@ static void u8_dec(char *s, int *i) { */ static char* get_keylayoutname(int mode, xcb_connection_t* conn) { if (mode < 0 || mode > 2) return NULL; - char *newans = NULL, *answer = xcb_get_key_group_names(conn); + char *newans = NULL, *newans2 = NULL, *answer = xcb_get_key_group_names(conn); + int substringStart = 0, substringEnd = 0, size = 0; DEBUG("keylayout answer is: [%s]\n", answer); switch (mode) { case 1: // truncate the string at the first parens - for(int i = 0; answer[i] != '\0'; ++i) { + for (int i = 0; answer[i] != '\0'; ++i) { if (answer[i] == '(') { if (i != 0 && answer[i - 1] == ' ') { answer[i - 1] = '\0'; @@ -314,16 +315,23 @@ static char* get_keylayoutname(int mode, xcb_connection_t* conn) { } break; case 2: - for(int i = 0; answer[i] != '\0'; ++i) { + for (int i = 0; answer[i] != '\0'; ++i) { if (answer[i] == '(') { newans = &answer[i + 1]; + substringStart = i + 1; } else if (answer[i] == ')' && newans != NULL) { answer[i] = '\0'; + substringEnd = i; break; } } - if (newans != NULL) - answer = newans; + if (newans != NULL) { + size = sizeof(char) * (substringEnd - substringStart + 1); + newans2 = malloc(size); + memcpy(newans2, newans, size); + free(answer); + answer = newans2; + } break; case 0: // fall through @@ -893,33 +901,7 @@ static void process_xkb_event(xcb_generic_event_t *gevent) { event->state_notify.baseGroup, event->state_notify.latchedGroup, event->state_notify.lockedGroup); - /* TODO: freeing layout_text when mode is 2 throws: - ================================================================= - ==25882==ERROR: AddressSanitizer: attempting free on address which was not malloc()-ed: 0x602000000919 in thread T0 - #0 0x7fe34ddeb7cf in __interceptor_free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf) - #1 0x55c43cbb372b in process_xkb_event ../../i3lock-color/i3lock.c:923 - #2 0x55c43cbb544d in xcb_check_cb ../../i3lock-color/i3lock.c:1262 - #3 0x7fe34d408bc2 in ev_invoke_pending (/lib/x86_64-linux-gnu/libev.so.4+0x5bc2) - #4 0x7fe34d40cb92 in ev_run (/lib/x86_64-linux-gnu/libev.so.4+0x9b92) - #5 0x55c43cbb100c in ev_loop /usr/include/ev.h:842 - #6 0x55c43cbbb757 in main ../../i3lock-color/i3lock.c:2350 - #7 0x7fe34d0c40b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) - #8 0x55c43cbae20d in _start (/mnt/c/Users/raymo/Git/i3lock-color/build/i3lock+0x1520d) - - 0x602000000919 is located 9 bytes inside of 13-byte region [0x602000000910,0x60200000091d) - allocated by thread T0 here: - #0 0x7fe34ddebbc8 in malloc (/lib/x86_64-linux-gnu/libasan.so.5+0x10dbc8) - #1 0x55c43cbd0204 in get_atom_name ../../i3lock-color/xcb.c:531 - #2 0x55c43cbd09b7 in xcb_get_key_group_names ../../i3lock-color/xcb.c:607 - #3 0x55c43cbb1389 in get_keylayoutname ../../i3lock-color/i3lock.c:299 - #4 0x55c43cbb9e39 in main ../../i3lock-color/i3lock.c:2143 - #5 0x7fe34d0c40b2 in __libc_start_main (/lib/x86_64-linux-gnu/libc.so.6+0x270b2) - - SUMMARY: AddressSanitizer: bad-free (/lib/x86_64-linux-gnu/libasan.so.5+0x10d7cf) in __interceptor_free - ==25882==ABORTING - Not freeing it results in a memory leak. - */ - if (keylayout_mode == 1 && layout_text != NULL) { + if (layout_text != NULL) { free(layout_text); layout_text = NULL; } From 1bc64e843102a92f0dab4848fd43b72da3cc66d1 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 21 Dec 2020 19:26:43 -0500 Subject: [PATCH 062/183] Update README.md --- README.md | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 94d5587f..57010098 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,8 @@ ![GitHub Release Date](https://img.shields.io/github/release-date/Raymo111/i3lock-color?label=latest%20release) ![Commits](https://img.shields.io/github/commits-since/Raymo111/i3lock-color/latest?include_prereleases&sort=semver) ![Latest commit](https://img.shields.io/github/last-commit/Raymo111/i3lock-color) -![Arch Linux package](https://img.shields.io/archlinux/v/community/x86_64/i3lock-color?logo=arch%20linux&label=Community%20version) + +![AUR release ver](https://img.shields.io/aur/version/i3lock-color?label=AUR%20release%20ver) ![AUR git ver](https://img.shields.io/aur/version/i3lock-color-git?label=AUR%20git%20ver) ![AUR votes](https://img.shields.io/aur/votes/i3lock-color-git) ![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color) @@ -118,7 +119,11 @@ chmod +x install-i3lock-color.sh You may choose to modify the script based on your needs/OS/distro. ## Arch Linux Packages -[Stable version in Community](https://www.archlinux.org/packages/community/x86_64/i3lock-color/) +~~[Stable version in Community](https://www.archlinux.org/packages/community/x86_64/i3lock-color/)~~ + +Unfortunately the previous maintainer left, and the package got dumped back into the AUR where I'm now maintaining it. I'm looking for a TU to sponsor it back into Community, but for now, get it on AUR: + +[Release Version on AUR](https://aur.archlinux.org/packages/i3lock-color/) [Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/) From a6f04f14ac64909809b32ae5abec09623a6a5b73 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 21 Dec 2020 20:50:17 -0500 Subject: [PATCH 063/183] Add GURU and order distro deps by alpha --- README.md | 27 +++++++++++++++------------ 1 file changed, 15 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 57010098..6b36a799 100644 --- a/README.md +++ b/README.md @@ -60,18 +60,6 @@ You can also specify additional options, as detailed in the manpage. This includ ## Dependencies The following dependencies will need to be installed for a successful build, depending on your OS/distro. -### 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 -``` - -### Debian -Replace `libxcb-util-dev` with `libxcb-util0-dev` in the Ubuntu installation command: -``` -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 -``` - ### Arch Linux - autoconf - cairo @@ -87,6 +75,12 @@ sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfont - xcb-util-image - xcb-util-xrm +### 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 +``` + ### Fedora Run this command to install all dependencies: @@ -94,6 +88,12 @@ Run this command to install all dependencies: sudo dnf install -y autoconf automake cairo-devel fontconfig gcc libev-devel libjpeg-turbo-devel libXinerama libxkbcommon-devel libxkbcommon-x11-devel libXrandr pam-devel pkgconf xcb-util-image-devel xcb-util-xrm-devel ``` +### 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 +``` + ## Building i3lock-color Before you build - check and see if there's a packaged version available for your distro (there usually is, either in a community repo/PPA). @@ -123,6 +123,9 @@ You may choose to modify the script based on your needs/OS/distro. Unfortunately the previous maintainer left, and the package got dumped back into the AUR where I'm now maintaining it. I'm looking for a TU to sponsor it back into Community, but for now, get it on AUR: +## Gentoo Package +i3lock-color is available on **GURU**, under `x11-misc/i3lock-color` (https://github.com/gentoo/guru/tree/master/x11-misc/i3lock-color). + [Release Version on AUR](https://aur.archlinux.org/packages/i3lock-color/) [Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/) From 439dc0b0250ea38bf174e492511eeaee955756f4 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 21 Dec 2020 20:58:37 -0500 Subject: [PATCH 064/183] Update README.md --- README.md | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 6b36a799..3f890894 100644 --- a/README.md +++ b/README.md @@ -122,14 +122,12 @@ You may choose to modify the script based on your needs/OS/distro. ~~[Stable version in Community](https://www.archlinux.org/packages/community/x86_64/i3lock-color/)~~ Unfortunately the previous maintainer left, and the package got dumped back into the AUR where I'm now maintaining it. I'm looking for a TU to sponsor it back into Community, but for now, get it on AUR: +- [Release Version on AUR](https://aur.archlinux.org/packages/i3lock-color/) +- [Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/) ## Gentoo Package i3lock-color is available on **GURU**, under `x11-misc/i3lock-color` (https://github.com/gentoo/guru/tree/master/x11-misc/i3lock-color). -[Release Version on AUR](https://aur.archlinux.org/packages/i3lock-color/) - -[Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/) - ## FreeBSD port [i3lock-color-port](https://github.com/rkashapov/i3lock-color-port/) From 3e4cee04d5006b1ea82bb212db0d988d38019cc4 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 6 Jan 2021 20:53:49 -0500 Subject: [PATCH 065/183] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 3f890894..745cc279 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color) ![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color) ![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color) -![Maintenance](https://img.shields.io/maintenance/yes/2020) +![Maintenance](https://img.shields.io/maintenance/yes) ### The world's most popular non-default computer lockscreen. **A modern version of i3lock with color functionality and other features.** From 0a588d8d5d2ec33209bc1e0ad7789b3e0464f435 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 6 Jan 2021 20:54:13 -0500 Subject: [PATCH 066/183] Update maintained status --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 745cc279..805b5564 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ ![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color) ![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color) ![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color) -![Maintenance](https://img.shields.io/maintenance/yes) +![Maintenance](https://img.shields.io/maintenance/yes/2021) ### The world's most popular non-default computer lockscreen. **A modern version of i3lock with color functionality and other features.** From b4b985ab27e3dabf06cbe5dc5beeea0169808bc0 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 8 Jan 2021 20:49:04 -0500 Subject: [PATCH 067/183] Fix PAM for Gentoo --- configure.ac | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/configure.ac b/configure.ac index f909ea64..164bbd3f 100644 --- a/configure.ac +++ b/configure.ac @@ -77,9 +77,16 @@ AC_SEARCH_LIBS([ev_run], [ev], , [AC_MSG_FAILURE([cannot find the required ev_ru AC_SEARCH_LIBS([shm_open], [rt]) -# Use system-auth instead of login on Arch (TODO: Implement Gentoo as well) +# Use system-auth instead of login on Arch if [[ -f /etc/arch-release ]]; then - echo "Using PAM for Arch" + echo "Using PAM for Arch" + sed -i "s/^#auth include system-auth/auth include system-auth/g" ../pam/i3lock + sed -i "s/^auth include login/#auth include login/g" ../pam/i3lock +fi + +# Use system-auth instead of login on Gentoo +if [[ -f /etc/arch-release ]]; then + echo "Using PAM for Gentoo" sed -i "s/^#auth include system-auth/auth include system-auth/g" ../pam/i3lock sed -i "s/^auth include login/#auth include login/g" ../pam/i3lock fi From d8d816d8066f1aea49c441f2ae82d3802c446a50 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 8 Jan 2021 21:03:23 -0500 Subject: [PATCH 068/183] Fix typo --- configure.ac | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure.ac b/configure.ac index 164bbd3f..7a657940 100644 --- a/configure.ac +++ b/configure.ac @@ -85,7 +85,7 @@ if [[ -f /etc/arch-release ]]; then fi # Use system-auth instead of login on Gentoo -if [[ -f /etc/arch-release ]]; then +if [[ -f /etc/gentoo-release ]]; then echo "Using PAM for Gentoo" sed -i "s/^#auth include system-auth/auth include system-auth/g" ../pam/i3lock sed -i "s/^auth include login/#auth include login/g" ../pam/i3lock From e565e207faf35f07e303e9da8e5da521c1f8040b Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 8 Jan 2021 21:24:50 -0500 Subject: [PATCH 069/183] Update README.md --- README.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 805b5564..fd4687c3 100644 --- a/README.md +++ b/README.md @@ -97,11 +97,13 @@ sudo apt install autoconf gcc make pkg-config libpam0g-dev libcairo2-dev libfont ## Building i3lock-color Before you build - check and see if there's a packaged version available for your distro (there usually is, either in a community repo/PPA). -If there's no packaged version available - think carefully, since you're using a forked screen locker at your own risk. +**If you want to build a non-debug version, you should tag your build before configuring.** -**If you want to build a non-debug version, you should tag your build before configuring.** For example: `git tag -f "git-$(git rev-parse --short HEAD)"` will add a tag with the short commit ID, which will be used for the version info. Issues asking about ASAN/complaints about i3lock-color being slow / etc will likely be closed. i3lock-color uses GNU autotools for building. +For example: `git tag -f "git-$(git rev-parse --short HEAD)"` will add a tag with the short commit ID, which will be used for the version info. -To use i3lock-color, first install the dependencies listed above, then clone the repo: +i3lock-color uses GNU autotools for building. + +To build/install i3lock-color, first install the dependencies listed above, then clone the repo: ``` git clone https://github.com/Raymo111/i3lock-color.git cd i3lock-color @@ -111,7 +113,7 @@ To build without installing, run: chmod +x build.sh ./build.sh ``` -To install after building, run: +To build AND install, run: ``` chmod +x install-i3lock-color.sh ./install-i3lock-color.sh From 9f774c84bee64a9ab9210c9f364ce3116bf08050 Mon Sep 17 00:00:00 2001 From: Alexis Coudert Date: Fri, 15 Jan 2021 03:08:38 +0100 Subject: [PATCH 070/183] Add option to hide modkey text (#194) * adds option to hide modkeys text * Update i3lock.1 * Rename variable to `show_modkey_text` * Keep style consistent Co-authored-by: Raymond Li --- i3lock.1 | 4 ++++ i3lock.c | 26 ++++++++++++++++++-------- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 9d8aa31c..362a1776 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -369,6 +369,10 @@ Sets the string to be shown while acquiring pointer and keyboard focus. Defaults .B \-\-lockfailedtext="text" Sets the string to be shown after failing to acquire pointer and keyboard focus. Defaults to "lock failed!". +.TP +.B \-\-no-modkeytext +Hides the modkey indicator (Num, Caps Lock ...) + .TP .B \-\-radius The radius of the circle. Defaults to 90. diff --git a/i3lock.c b/i3lock.c index 2494384a..33a04a89 100644 --- a/i3lock.c +++ b/i3lock.c @@ -92,14 +92,18 @@ char greetercolor[9] = "000000ff"; /* int defining which display the lock indicator should be shown on. If -1, then show on all displays.*/ int screen_number = 0; + /* default is to use the supplied line color, 1 will be ring color, 2 will be to use the inside color for ver/wrong/etc */ int internal_line_source = 0; -/* bool for showing the clock; why am I commenting this? */ + +/* refresh rate in seconds, default to 1s */ +float refresh_rate = 1.0; + bool show_clock = false; bool slideshow_enabled = false; bool always_show_clock = false; bool show_indicator = false; -float refresh_rate = 1.0; +bool show_modkey_text = true; /* there's some issues with compositing - upstream removed support for this, but we'll allow people to supply an arg to enable it */ bool composite = false; @@ -576,13 +580,15 @@ static void input_done(void) { else if (strcmp(mod_name, XKB_MOD_NAME_LOGO) == 0) mod_name = "Super"; - char *tmp; - if (modifier_string == NULL) { - if (asprintf(&tmp, "%s", mod_name) != -1) + if (show_modkey_text) { + char *tmp; + if (modifier_string == NULL) { + if (asprintf(&tmp, "%s", mod_name) != -1) + modifier_string = tmp; + } else if (asprintf(&tmp, "%s, %s", modifier_string, mod_name) != -1) { + free(modifier_string); modifier_string = tmp; - } else if (asprintf(&tmp, "%s, %s", modifier_string, mod_name) != -1) { - free(modifier_string); - modifier_string = tmp; + } } } @@ -1459,6 +1465,7 @@ int main(int argc, char *argv[]) { {"locktext", required_argument, NULL, 516}, {"lockfailedtext", required_argument, NULL, 517}, {"greetertext", required_argument, NULL, 518}, + {"no-modkeytext", no_argument, NULL, 519}, // fonts {"time-font", required_argument, NULL, 520}, @@ -1768,6 +1775,9 @@ int main(int argc, char *argv[]) { break; case 518: greeter_text = optarg; + break; + case 519: + show_modkey_text = false; break; // Font stuff From 4bc07d8ea5f767a914a513bb3ee5f71ae82358b2 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 24 Jan 2021 01:09:10 -0500 Subject: [PATCH 071/183] Implement bar-count to replace bar-width And tried to make draw_bar less messy --- i3lock.c | 29 ++++--- lock_bar.sh | 11 +-- unlock_indicator.c | 190 +++++++++++++++++---------------------------- unlock_indicator.h | 2 +- 4 files changed, 95 insertions(+), 137 deletions(-) diff --git a/i3lock.c b/i3lock.c index 33a04a89..d412c52d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -252,6 +252,7 @@ bool redraw_thread = false; #define BAR_DEFAULT 0 #define BAR_REVERSED 1 #define BAR_BIDIRECTIONAL 2 +#define BAR_MAX_COUNT 65536 // experimental bar stuff bool bar_enabled = false; double *bar_heights = NULL; @@ -259,8 +260,8 @@ double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; double max_bar_height = 25; -int num_bars = 0; -int bar_width = 150; +int bar_count = 10; +int bar_width = 0; int bar_orientation = BAR_FLAT; char bar_base_color[9] = "000000ff"; @@ -1512,6 +1513,7 @@ int main(int argc, char *argv[]) { {"bar-color", required_argument, NULL, 707}, {"bar-periodic-step", required_argument, NULL, 708}, {"bar-position", required_argument, NULL, 709}, + {"bar-count", required_argument, NULL, 710}, // misc. {"redraw-thread", no_argument, NULL, 900}, @@ -2006,7 +2008,7 @@ int main(int argc, char *argv[]) { case 702: bar_width = atoi(optarg); if (bar_width < 1) bar_width = 150; - // num_bars and bar_heights* initialized later when we grab display info + // bar_count and bar_heights* initialized later when we grab display info break; case 703: arg = optarg; @@ -2047,6 +2049,10 @@ int main(int argc, char *argv[]) { if (sscanf(arg, "%31s", bar_expr) != 1) { errx(1, "bar-position must be of the form [pos] with a max length of 31\n"); } + break; + case 710: + bar_count = atoi(optarg); + if (bar_count > BAR_MAX_COUNT) bar_count = BAR_MAX_COUNT; break; // Misc @@ -2194,13 +2200,18 @@ int main(int argc, char *argv[]) { last_resolution[0] = screen->width_in_pixels; last_resolution[1] = screen->height_in_pixels; - if (bar_enabled && bar_width > 0) { - int tmp = screen->width_in_pixels; - if (bar_orientation == BAR_VERT) tmp = screen->height_in_pixels; - num_bars = tmp / bar_width; - if (tmp % bar_width != 0) ++num_bars; + if (bar_width > 0) { + fprintf(stderr, "Warning: --bar-width is deprecated, use --bar-count instead\n"); + if (bar_orientation == BAR_VERT) + bar_count = screen->height_in_pixels / bar_width; + else + bar_count = screen->width_in_pixels / bar_width; + } - bar_heights = (double*) calloc(num_bars, sizeof(double)); + if (bar_enabled && bar_count > 0) { + bar_heights = (double*) calloc(bar_count, sizeof(double)); + } else { + bar_enabled = false; } xcb_change_window_attributes(conn, screen->root, XCB_CW_EVENT_MASK, diff --git a/lock_bar.sh b/lock_bar.sh index 3214ff35..38fa1853 100755 --- a/lock_bar.sh +++ b/lock_bar.sh @@ -10,7 +10,7 @@ V='#bb00bbbb' # verifying ./x86_64-pc-linux-gnu/i3lock \ --blur 5 \ --bar-indicator \ ---bar-position h \ +--bar-position y+h \ --bar-direction 1 \ --bar-max-height 50 \ --bar-base-width 50 \ @@ -18,12 +18,11 @@ V='#bb00bbbb' # verifying --keyhlcolor 880088cc \ --bar-periodic-step 50 \ --bar-step 50 \ ---bar-width 250 \ --redraw-thread \ \ --clock \ --force-clock \ ---timepos 5:h-80 \ +--timepos x+5:y+h-80 \ --timecolor 880088ff \ --datepos tx:ty+15 \ --datecolor 990099ff \ @@ -31,11 +30,9 @@ V='#bb00bbbb' # verifying --time-align 1 \ --ringvercolor 8800ff88 \ --ringwrongcolor ff008888 \ ---statuspos 5:h-16 \ +--statuspos x+5:y+h-16 \ --verif-align 1 \ --wrong-align 1 \ --verifcolor ffffffff \ --wrongcolor ffffffff \ ---modifpos -50:-50 \ -\ ---screen 1 +--modifpos -50:-50 diff --git a/unlock_indicator.c b/unlock_indicator.c index f0283b4e..58095654 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -206,8 +206,7 @@ extern double bar_base_height; extern double bar_periodic_step; extern double max_bar_height; extern double bar_position; -extern int num_bars; -extern int bar_width; +extern int bar_count; extern int bar_orientation; extern char bar_base_color[9]; @@ -316,118 +315,65 @@ static void draw_text(cairo_t *ctx, text_t text) { cairo_stroke(ctx); } -static void draw_bar(cairo_t *ctx, double x, double y, double bar_offset) { - // oh boy, here we go! - // TODO: get this to play nicely with multiple monitors - // ideally it'd intelligently span both monitors - double width, height; - double back_x = 0, back_y = 0, back_x2 = 0, back_y2 = 0, back_width = 0, back_height = 0; - for (int i = 0; i < num_bars; ++i) { - double cur_bar_height = bar_heights[i]; - - if (cur_bar_height > 0) { - if (unlock_state == STATE_BACKSPACE_ACTIVE) { - cairo_set_source_rgba(ctx, bshl16.red, bshl16.green, bshl16.blue, bshl16.alpha); - } else { - cairo_set_source_rgba(ctx, keyhl16.red, keyhl16.green, keyhl16.blue, keyhl16.alpha); - } - } else { - switch (auth_state) { - case STATE_AUTH_VERIFY: - case STATE_AUTH_LOCK: - cairo_set_source_rgba(ctx, ringver16.red, ringver16.green, ringver16.blue, ringver16.alpha); - break; - case STATE_AUTH_WRONG: - case STATE_I3LOCK_LOCK_FAILED: - cairo_set_source_rgba(ctx, ringwrong16.red, ringwrong16.green, ringwrong16.blue, ringwrong16.alpha); - break; - default: - cairo_set_source_rgba(ctx, bar16.red, bar16.green, bar16.blue, bar16.alpha); - break; - } - } +static void draw_single_bar(cairo_t *ctx, double pos, double offset, double width, double height) { + if (bar_reversed) { + offset -= height; + } else if (bar_bidirectional) { + offset -= height; + height *= 2; + } - if (bar_orientation == BAR_VERT) { - width = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height); - height = bar_width; - x = bar_offset; - y = i * bar_width; - if (bar_reversed) { - x -= width; - } else if (bar_bidirectional) { - width = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height * 2); - x = bar_offset - (width / 2) + (bar_base_height / 2); - } - } else { - width = bar_width; - height = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height); - x = i * bar_width; - y = bar_offset; - if (bar_reversed) { - y -= height; - } else if (bar_bidirectional) { - height = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height * 2); - y = bar_offset - (height / 2) + (bar_base_height / 2); - } - } + if (bar_orientation == BAR_VERT) + cairo_rectangle(ctx, offset, pos, height, width); + else + cairo_rectangle(ctx, pos, offset, width, height); + cairo_fill(ctx); +} - if (cur_bar_height < bar_base_height && cur_bar_height > 0) { - if (bar_orientation == BAR_VERT) { - back_x = bar_offset + cur_bar_height; - back_y = y; - back_width = bar_base_height - cur_bar_height; - back_height = height; - if (bar_reversed) { - back_x = bar_offset - bar_base_height; - } else if (bar_bidirectional) { - back_x = bar_offset; - back_y2 = y; - back_width = (bar_base_height - (cur_bar_height * 2)) / 2; - back_x2 = bar_offset + (cur_bar_height * 2) + back_width; - } - } else { - back_x = x; - back_y = bar_offset + cur_bar_height; - back_width = width; - back_height = bar_base_height - cur_bar_height; - if (bar_reversed) { - back_y = bar_offset - bar_base_height; - } else if (bar_bidirectional) { - back_x2 = x; - back_y = bar_offset; - back_height = (bar_base_height - (cur_bar_height * 2)) / 2; - back_y2 = bar_offset + (cur_bar_height * 2) + back_height; - } - } - } - cairo_rectangle(ctx, x, y, width, height); - cairo_fill(ctx); - switch (auth_state) { - case STATE_AUTH_VERIFY: - case STATE_AUTH_LOCK: - cairo_set_source_rgba(ctx, ringver16.red, ringver16.green, ringver16.blue, ringver16.alpha); - break; - case STATE_AUTH_WRONG: - case STATE_I3LOCK_LOCK_FAILED: - cairo_set_source_rgba(ctx, ringwrong16.red, ringwrong16.green, ringwrong16.blue, ringwrong16.alpha); - break; - default: - cairo_set_source_rgba(ctx, bar16.red, bar16.green, bar16.blue, bar16.alpha); - break; - } +static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double screen_y, double screen_w, double screen_h) { - if (cur_bar_height > 0 && cur_bar_height < bar_base_height && ((bar_bidirectional && ((cur_bar_height * 2) < bar_base_height)) || (!bar_bidirectional && (cur_bar_height < bar_base_height)))) { - cairo_rectangle(ctx, back_x, back_y, back_width, back_height); - cairo_fill(ctx); - if (bar_bidirectional) { - cairo_rectangle(ctx, back_x2, back_y2, back_width, back_height); - cairo_fill(ctx); - } - } + switch (auth_state) { + case STATE_AUTH_VERIFY: + case STATE_AUTH_LOCK: + cairo_set_source_rgba(ctx, ringver16.red, ringver16.green, ringver16.blue, ringver16.alpha); + break; + case STATE_AUTH_WRONG: + case STATE_I3LOCK_LOCK_FAILED: + cairo_set_source_rgba(ctx, ringwrong16.red, ringwrong16.green, ringwrong16.blue, ringwrong16.alpha); + break; + default: + cairo_set_source_rgba(ctx, bar16.red, bar16.green, bar16.blue, bar16.alpha); + break; } - for (int i = 0; i < num_bars; ++i) { - if (bar_heights[i] > 0) + + if (bar_orientation == BAR_VERT) + draw_single_bar(ctx, screen_y, bar_offset, screen_h, bar_base_height); + else + draw_single_bar(ctx, screen_x, bar_offset, screen_w, bar_base_height); + + if (unlock_state == STATE_BACKSPACE_ACTIVE) + cairo_set_source_rgba(ctx, bshl16.red, bshl16.green, bshl16.blue, bshl16.alpha); + else + cairo_set_source_rgba(ctx, keyhl16.red, keyhl16.green, keyhl16.blue, keyhl16.alpha); + + double bar_width, screen_pos; + if (bar_orientation == BAR_VERT) { + bar_width = screen_h / bar_count; + screen_pos = screen_y; + } else { + bar_width = screen_w / bar_count; + screen_pos = screen_x; + } + + for (int i = 0; i < bar_count; ++i) { + double bar_height = bar_heights[i]; + draw_single_bar(ctx, screen_pos + i * bar_width, bar_offset, bar_width, bar_height); + } + + for (int i = 0; i < bar_count; ++i) { + if (bar_heights[i] > 0) { bar_heights[i] -= bar_periodic_step; + } } } @@ -630,15 +576,15 @@ static void draw_elements(cairo_t *const ctx, DrawData const *const draw_data) { if (unlock_state == STATE_KEY_ACTIVE || unlock_state == STATE_BACKSPACE_ACTIVE) { // note: might be biased to cause more hits on lower indices - // maybe see about doing ((double) rand() / RAND_MAX) * num_bars - int index = rand() % num_bars; + // maybe see about doing ((double) rand() / RAND_MAX) * bar_count + int index = rand() % bar_count; bar_heights[index] = max_bar_height; for (int i = 0; i < ((max_bar_height / bar_step) + 1); ++i) { int low_ind = index - i; while (low_ind < 0) { - low_ind += num_bars; + low_ind += bar_count; } - int high_ind = (index + i) % num_bars; + int high_ind = (index + i) % bar_count; int tmp_height = max_bar_height - (bar_step * i); if (tmp_height < 0) tmp_height = 0; @@ -650,7 +596,7 @@ static void draw_elements(cairo_t *const ctx, DrawData const *const draw_data) { break; } } - draw_bar(ctx, draw_data->bar_x, draw_data->bar_y, draw_data->bar_offset); + draw_bar(ctx, draw_data->bar_offset, draw_data->screen_x, draw_data->screen_y, draw_data->screen_w, draw_data->screen_h); } draw_text(ctx, draw_data->status_text); @@ -914,6 +860,10 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { height = xr_resolutions[current_screen].height / scaling_factor; screen_x = xr_resolutions[current_screen].x / scaling_factor; screen_y = xr_resolutions[current_screen].y / scaling_factor; + draw_data.screen_w = width; + draw_data.screen_h = height; + draw_data.screen_x = screen_x; + draw_data.screen_y = screen_y; if (te_ind_x_expr && te_ind_y_expr) { draw_data.indicator_x = te_eval(te_ind_x_expr); draw_data.indicator_y = te_eval(te_ind_y_expr); @@ -921,8 +871,6 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.indicator_x = screen_x + width / 2; draw_data.indicator_y = screen_y + height / 2; } - draw_data.bar_x = draw_data.indicator_x - (button_diameter_physical / 2); - draw_data.bar_y = draw_data.indicator_y - (button_diameter_physical / 2); draw_data.bar_offset = te_eval(te_bar_expr); draw_data.time_text.x = te_eval(te_time_x_expr); draw_data.time_text.y = te_eval(te_time_y_expr); @@ -954,7 +902,7 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.mod_text.y = te_eval(te_modif_y_expr); DEBUG("Indicator at %fx%f on screen %d\n", draw_data.indicator_x, draw_data.indicator_y, current_screen + 1); - DEBUG("Bar at %fx%f on screen %d\n", draw_data.bar_x, draw_data.bar_y, current_screen + 1); + DEBUG("Bar at %f on screen %d\n", draw_data.bar_offset, current_screen + 1); DEBUG("Time at %fx%f on screen %d\n", draw_data.time_text.x, draw_data.time_text.y, current_screen + 1); DEBUG("Date at %fx%f on screen %d\n", draw_data.date_text.x, draw_data.date_text.y, current_screen + 1); DEBUG("Layout at %fx%f on screen %d\n", draw_data.keylayout_text.x, draw_data.keylayout_text.y, current_screen + 1); @@ -969,10 +917,12 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { * hope for the best. */ width = last_resolution[0] / scaling_factor; height = last_resolution[1] / scaling_factor; + draw_data.screen_w = width; + draw_data.screen_h = height; + draw_data.screen_x = 0; + draw_data.screen_y = 0; draw_data.indicator_x = width / 2; draw_data.indicator_y = height / 2; - draw_data.bar_x = draw_data.indicator_x - (button_diameter_physical / 2); - draw_data.bar_y = draw_data.indicator_y - (button_diameter_physical / 2); draw_data.time_text.x = te_eval(te_time_x_expr); draw_data.time_text.y = te_eval(te_time_y_expr); @@ -1002,7 +952,7 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.mod_text.y = te_eval(te_modif_y_expr); DEBUG("Indicator at %fx%f\n", draw_data.indicator_x, draw_data.indicator_y); - DEBUG("Bar at %fx%f\n", draw_data.bar_x, draw_data.bar_y); + DEBUG("Bar at %f\n", draw_data.bar_offset); DEBUG("Time at %fx%f\n", draw_data.time_text.x, draw_data.time_text.y); DEBUG("Date at %fx%f\n", draw_data.date_text.x, draw_data.date_text.y); DEBUG("Layout at %fx%f\n", draw_data.keylayout_text.x, draw_data.keylayout_text.y); diff --git a/unlock_indicator.h b/unlock_indicator.h index eef3d968..c12a16a5 100644 --- a/unlock_indicator.h +++ b/unlock_indicator.h @@ -34,7 +34,7 @@ typedef struct { double indicator_x, indicator_y; - double bar_x, bar_y; + double screen_x, screen_y, screen_w, screen_h; double bar_offset; } DrawData; From 7b7bb5db7d6946f6f8707db87363c04484d6b878 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 24 Jan 2021 01:19:01 -0500 Subject: [PATCH 072/183] Update man page --- i3lock.1 | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/i3lock.1 b/i3lock.1 index 362a1776..3944ca15 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -396,6 +396,8 @@ Sets the direction the bars grow in. 0 is the default (downwards, or rightwards, .TP .B \-\-bar\-width=15 +Deprecated, use \-\-bar\-count instead. + Sets the width of the minibars in the bar. .TP @@ -430,6 +432,10 @@ The value by which the bars decrease each time the screen is redrawn. Works similarly to the time/date/indicator expressions. If the bar is horizontal, this sets the vertical offset from the top edge. If it's vertically oriented, this sets the horizontal offset from the left edge. +.TP +.B \-\-bar\-count=10 +Sets the number of minibars to draw on each screen. + .TP .B \-\-no\-verify Do not verify the password entered by the user and unlock immediately. From 0075b07aac2d544845d5d18ba65773270fc3c279 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 24 Jan 2021 13:07:14 -0500 Subject: [PATCH 073/183] Improve bar params parsing --- i3lock.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/i3lock.c b/i3lock.c index d412c52d..af84f3bf 100644 --- a/i3lock.c +++ b/i3lock.c @@ -2008,7 +2008,6 @@ int main(int argc, char *argv[]) { case 702: bar_width = atoi(optarg); if (bar_width < 1) bar_width = 150; - // bar_count and bar_heights* initialized later when we grab display info break; case 703: arg = optarg; @@ -2053,6 +2052,7 @@ int main(int argc, char *argv[]) { case 710: bar_count = atoi(optarg); if (bar_count > BAR_MAX_COUNT) bar_count = BAR_MAX_COUNT; + if (bar_count < 1) bar_count = 10; break; // Misc @@ -2200,18 +2200,20 @@ int main(int argc, char *argv[]) { last_resolution[0] = screen->width_in_pixels; last_resolution[1] = screen->height_in_pixels; - if (bar_width > 0) { - fprintf(stderr, "Warning: --bar-width is deprecated, use --bar-count instead\n"); - if (bar_orientation == BAR_VERT) - bar_count = screen->height_in_pixels / bar_width; - else - bar_count = screen->width_in_pixels / bar_width; - } + if (bar_enabled) { + if (bar_width > 0) { + fprintf(stderr, "Warning: --bar-width is deprecated, use --bar-count instead\n"); + int tmp = screen->width_in_pixels; + if (bar_orientation == BAR_VERT) tmp = screen->height_in_pixels; + bar_count = tmp / bar_width; + if (tmp % bar_width != 0) ++bar_count; + } - if (bar_enabled && bar_count > 0) { - bar_heights = (double*) calloc(bar_count, sizeof(double)); - } else { - bar_enabled = false; + if (bar_count > 0) { + bar_heights = (double*) calloc(bar_count, sizeof(double)); + } else { + bar_enabled = false; + } } xcb_change_window_attributes(conn, screen->root, XCB_CW_EVENT_MASK, From 663b34e4e032efe783cebcba6e0802a7e23356bb Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 24 Jan 2021 14:24:25 -0500 Subject: [PATCH 074/183] Don't draw height that's <0 --- unlock_indicator.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index 58095654..beddff29 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -367,7 +367,9 @@ static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double sc for (int i = 0; i < bar_count; ++i) { double bar_height = bar_heights[i]; - draw_single_bar(ctx, screen_pos + i * bar_width, bar_offset, bar_width, bar_height); + if (bar_height > 0) { + draw_single_bar(ctx, screen_pos + i * bar_width, bar_offset, bar_width, bar_height); + } } for (int i = 0; i < bar_count; ++i) { From 5300d9cac2b8568c29f8898f04f2bc115adf7f11 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 24 Jan 2021 15:17:29 -0500 Subject: [PATCH 075/183] Update draw_bar to match old behaviour --- unlock_indicator.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index beddff29..1175b9f8 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -319,8 +319,7 @@ static void draw_single_bar(cairo_t *ctx, double pos, double offset, double widt if (bar_reversed) { offset -= height; } else if (bar_bidirectional) { - offset -= height; - height *= 2; + offset -= height / 2; } if (bar_orientation == BAR_VERT) @@ -332,6 +331,8 @@ static void draw_single_bar(cairo_t *ctx, double pos, double offset, double widt static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double screen_y, double screen_w, double screen_h) { + cairo_save(ctx); + switch (auth_state) { case STATE_AUTH_VERIFY: case STATE_AUTH_LOCK: @@ -356,6 +357,8 @@ static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double sc else cairo_set_source_rgba(ctx, keyhl16.red, keyhl16.green, keyhl16.blue, keyhl16.alpha); + cairo_set_operator(ctx, CAIRO_OPERATOR_SOURCE); + double bar_width, screen_pos; if (bar_orientation == BAR_VERT) { bar_width = screen_h / bar_count; @@ -367,6 +370,7 @@ static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double sc for (int i = 0; i < bar_count; ++i) { double bar_height = bar_heights[i]; + if (bar_bidirectional) bar_height *= 2; if (bar_height > 0) { draw_single_bar(ctx, screen_pos + i * bar_width, bar_offset, bar_width, bar_height); } @@ -377,6 +381,8 @@ static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double sc bar_heights[i] -= bar_periodic_step; } } + + cairo_restore(ctx); } static void draw_indic(cairo_t *ctx, double ind_x, double ind_y) { From e4802e8d177243797d9664145cb549e7ea845e1c Mon Sep 17 00:00:00 2001 From: julio-b Date: Tue, 26 Jan 2021 03:49:05 +0000 Subject: [PATCH 076/183] Add outline color and width for every text element (#198) * Add outline color and width for every text element Define outline colors, i.e. --timeoutlinecolor=FFFF00FF Define outline width, i.e. --timeoutlinewidth=0.75 New arguments: --verifoutlinecolor --wrongoutlinecolor --layoutoutlinecolor --timeoutlinecolor --dateoutlinecolor --greeteroutlinecolor --timeoutlinewidth --dateoutlinewidth --verifoutlinewidth --wrongoutlinewidth --modifieroutlinewidth --layoutoutlinewidth --greeteroutlinewidth * Separate the variable definitions Co-authored-by: Raymond Li --- fonts.h | 2 ++ i3lock.1 | 8 +++++ i3lock.c | 84 ++++++++++++++++++++++++++++++++++++++++++++++ unlock_indicator.c | 59 +++++++++++++++++++++++++++++++- 4 files changed, 152 insertions(+), 1 deletion(-) diff --git a/fonts.h b/fonts.h index 0246cb83..845832b2 100644 --- a/fonts.h +++ b/fonts.h @@ -19,10 +19,12 @@ typedef struct text { char str[512]; double size; + double outline_width; cairo_font_face_t *font; rgba_t color; + rgba_t outline_color; double x, y; int align; diff --git a/i3lock.1 b/i3lock.1 index 362a1776..648fe50c 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -322,6 +322,14 @@ Sets the font used to render various strings. .B \-\-{time, date, layout, verif, wrong, greeter}size=number Sets the font size used to render various strings. +.TP +.B \-\-{time, date, layout, verif, wrong, greeter}outlinecolor=rrggbbaa +Sets the color of the outline. + +.TP +.B \-\-{time, date, layout, verif, wrong, greeter, modifier}outlinewidth=number +Sets the width of the outline. + .TP .B \-\-datepos="x position:y position" Sets the position for the date string. All the variables from \-\-indpos and \-\-timepos may be used, in addition to: diff --git a/i3lock.c b/i3lock.c index 33a04a89..d7464e98 100644 --- a/i3lock.c +++ b/i3lock.c @@ -90,6 +90,13 @@ char bshlcolor[9] = "db3300ff"; char separatorcolor[9] = "000000ff"; char greetercolor[9] = "000000ff"; +char verifoutlinecolor[9] = "00000000"; +char wrongoutlinecolor[9] = "00000000"; +char layoutoutlinecolor[9] = "00000000"; +char timeoutlinecolor[9] = "00000000"; +char dateoutlinecolor[9] = "00000000"; +char greeteroutlinecolor[9] = "00000000"; + /* int defining which display the lock indicator should be shown on. If -1, then show on all displays.*/ int screen_number = 0; @@ -172,6 +179,14 @@ double circle_radius = 90.0; double ring_width = 7.0; double greeter_size = 32.0; +double timeoutlinewidth = 0; +double dateoutlinewidth = 0; +double verifoutlinewidth = 0; +double wrongoutlinewidth = 0; +double modifieroutlinewidth = 0; +double layoutoutlinewidth = 0; +double greeteroutlinewidth = 0; + char* verif_text = "verifying…"; char* wrong_text = "wrong!"; char* noinput_text = "no input"; @@ -1435,6 +1450,14 @@ int main(int argc, char *argv[]) { {"separatorcolor", required_argument, NULL, 314}, {"greetercolor", required_argument, NULL, 315}, + // text outline colors + {"verifoutlinecolor", required_argument, NULL, 316}, + {"wrongoutlinecolor", required_argument, NULL, 317}, + {"layoutoutlinecolor", required_argument, NULL, 318}, + {"timeoutlinecolor", required_argument, NULL, 319}, + {"dateoutlinecolor", required_argument, NULL, 320}, + {"greeteroutlinecolor", required_argument, NULL, 321}, + {"line-uses-ring", no_argument, NULL, 'r'}, {"line-uses-inside", no_argument, NULL, 's'}, @@ -1495,6 +1518,15 @@ int main(int argc, char *argv[]) { {"indpos", required_argument, NULL, 547}, {"greeterpos", required_argument, NULL, 548}, + // text outline width + {"timeoutlinewidth", required_argument, NULL, 560}, + {"dateoutlinewidth", required_argument, NULL, 561}, + {"verifoutlinewidth", required_argument, NULL, 562}, + {"wrongoutlinewidth", required_argument, NULL, 563}, + {"modifieroutlinewidth", required_argument, NULL, 564}, + {"layoutoutlinewidth", required_argument, NULL, 565}, + {"greeteroutlinewidth", required_argument, NULL, 566}, + // pass keys {"pass-media-keys", no_argument, NULL, 601}, {"pass-screen-keys", no_argument, NULL, 602}, @@ -1548,6 +1580,15 @@ int main(int argc, char *argv[]) { if (strlen(arg) != 8 || sscanf(arg, "%08[0-9a-fA-F]", acolor) != 1)\ errx(1, #acolor " is invalid, color must be given in 3 or 4-byte format: rrggbb[aa]\n"); +#define parse_outline_width(awidth)\ + arg = optarg;\ + if (sscanf(arg, "%lf", &awidth) != 1)\ + errx(1, #awidth " must be a number\n");\ + if (awidth < 0) {\ + fprintf(stderr, #awidth " must be a positive double; ignoring...\n");\ + awidth = 0;\ + } + while ((o = getopt_long(argc, argv, optstring, longopts, &longoptind)) != -1) { switch (o) { case 'v': @@ -1674,6 +1715,25 @@ int main(int argc, char *argv[]) { case 315: parse_color(greetercolor); break; + case 316: + parse_color(verifoutlinecolor); + break; + case 317: + parse_color(wrongoutlinecolor); + break; + case 318: + parse_color(layoutoutlinecolor); + break; + case 319: + parse_color(timeoutlinecolor); + break; + case 320: + parse_color(dateoutlinecolor); + break; + case 321: + parse_color(greeteroutlinecolor); + break; + // General indicator opts case 400: @@ -1971,6 +2031,30 @@ int main(int argc, char *argv[]) { } break; + // text outline width + case 560: + parse_outline_width(timeoutlinewidth); + break; + case 561: + parse_outline_width(dateoutlinewidth); + break; + case 562: + parse_outline_width(verifoutlinewidth); + break; + case 563: + parse_outline_width(wrongoutlinewidth); + break; + case 564: + parse_outline_width(modifieroutlinewidth); + break; + case 565: + parse_outline_width(layoutoutlinewidth); + break; + case 566: + parse_outline_width(greeteroutlinewidth); + break; + + // Pass keys case 601: pass_media_keys = true; diff --git a/unlock_indicator.c b/unlock_indicator.c index f0283b4e..3fb7b985 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -94,6 +94,13 @@ extern char separatorcolor[9]; extern char greetercolor[9]; extern int internal_line_source; +extern char verifoutlinecolor[9]; +extern char wrongoutlinecolor[9]; +extern char layoutoutlinecolor[9]; +extern char timeoutlinecolor[9]; +extern char dateoutlinecolor[9]; +extern char greeteroutlinecolor[9]; + extern int screen_number; extern float refresh_rate; @@ -137,6 +144,14 @@ extern double modifier_size; extern double layout_size; extern double greeter_size; +extern double timeoutlinewidth; +extern double dateoutlinewidth; +extern double verifoutlinewidth; +extern double wrongoutlinewidth; +extern double modifieroutlinewidth; +extern double layoutoutlinewidth; +extern double greeteroutlinewidth; + extern char *verif_text; extern char *wrong_text; extern char *noinput_text; @@ -194,6 +209,13 @@ rgba_t bar16; rgba_t greeter16; rgba_t background; +rgba_t verifoutline16; +rgba_t wrongoutline16; +rgba_t layoutoutline16; +rgba_t timeoutline16; +rgba_t dateoutline16; +rgba_t greeteroutline16; + // experimental bar stuff #define BAR_VERT 0 @@ -311,8 +333,12 @@ static void draw_text(cairo_t *ctx, text_t text) { cairo_set_source_rgba(ctx, text.color.red, text.color.green, text.color.blue, text.color.alpha); cairo_move_to(ctx, x, text.y); - cairo_show_text(ctx, text.str); + cairo_text_path(ctx, text.str); + cairo_fill_preserve(ctx); + + cairo_set_source_rgba(ctx, text.outline_color.red, text.outline_color.green, text.outline_color.blue, text.outline_color.alpha); + cairo_set_line_width(ctx, text.outline_width); cairo_stroke(ctx); } @@ -603,6 +629,13 @@ void init_colors_once(void) { colorgen(&tmp, bar_base_color, &bar16); colorgen(&tmp, greetercolor, &greeter16); colorgen(&tmp, color, &background); + + colorgen(&tmp, verifoutlinecolor, &verifoutline16); + colorgen(&tmp, wrongoutlinecolor, &wrongoutline16); + colorgen(&tmp, layoutoutlinecolor, &layoutoutline16); + colorgen(&tmp, timeoutlinecolor, &timeoutline16); + colorgen(&tmp, dateoutlinecolor, &dateoutline16); + colorgen(&tmp, greeteroutlinecolor, &greeteroutline16); } static te_expr *compile_expression(const char *const from, const char *expression, const te_variable *variables, int var_count) { @@ -733,7 +766,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { strncpy(draw_data.status_text.str, verif_text, sizeof(draw_data.status_text.str) - 1); draw_data.status_text.font = get_font_face(VERIF_FONT); draw_data.status_text.color = verif16; + draw_data.status_text.outline_color = verifoutline16; draw_data.status_text.size = verif_size; + draw_data.status_text.outline_width = verifoutlinewidth; draw_data.status_text.align = verif_align; break; case STATE_AUTH_LOCK: @@ -741,7 +776,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { strncpy(draw_data.status_text.str, lock_text, sizeof(draw_data.status_text.str) - 1); draw_data.status_text.font = get_font_face(VERIF_FONT); draw_data.status_text.color = verif16; + draw_data.status_text.outline_color = verifoutline16; draw_data.status_text.size = verif_size; + draw_data.status_text.outline_width = verifoutlinewidth; draw_data.status_text.align = verif_align; break; case STATE_AUTH_WRONG: @@ -749,7 +786,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { strncpy(draw_data.status_text.str, wrong_text, sizeof(draw_data.status_text.str) - 1); draw_data.status_text.font = get_font_face(WRONG_FONT); draw_data.status_text.color = wrong16; + draw_data.status_text.outline_color = wrongoutline16; draw_data.status_text.size = wrong_size; + draw_data.status_text.outline_width = wrongoutlinewidth; draw_data.status_text.align = wrong_align; break; case STATE_I3LOCK_LOCK_FAILED: @@ -757,7 +796,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { strncpy(draw_data.status_text.str, lock_failed_text, sizeof(draw_data.status_text.str) - 1); draw_data.status_text.font = get_font_face(WRONG_FONT); draw_data.status_text.color = wrong16; + draw_data.status_text.outline_color = wrongoutline16; draw_data.status_text.size = wrong_size; + draw_data.status_text.outline_width = wrongoutlinewidth; draw_data.status_text.align = wrong_align; break; default: @@ -766,7 +807,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { strncpy(draw_data.status_text.str, noinput_text, sizeof(draw_data.status_text.str) - 1); draw_data.status_text.font = get_font_face(WRONG_FONT); draw_data.status_text.color = wrong16; + draw_data.status_text.outline_color = wrongoutline16; draw_data.status_text.size = wrong_size; + draw_data.status_text.outline_width = wrongoutlinewidth; draw_data.status_text.align = wrong_align; break; } @@ -774,7 +817,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.status_text.show = true; draw_data.status_text.font = get_font_face(WRONG_FONT); draw_data.status_text.color = wrong16; + draw_data.status_text.outline_color = wrongoutline16; draw_data.status_text.size = wrong_size; + draw_data.status_text.outline_width = wrongoutlinewidth; draw_data.status_text.align = wrong_align; // TODO: variable for this draw_data.status_text.size = 32.0; @@ -792,17 +837,21 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.mod_text.show = true; strncpy(draw_data.mod_text.str, modifier_string, sizeof(draw_data.mod_text.str) - 1); draw_data.mod_text.size = modifier_size; + draw_data.mod_text.outline_width = modifieroutlinewidth; draw_data.mod_text.font = get_font_face(WRONG_FONT); draw_data.mod_text.align = modif_align; draw_data.mod_text.color = wrong16; + draw_data.mod_text.outline_color = wrongoutline16; } if (layout_text) { draw_data.keylayout_text.show = true; strncpy(draw_data.keylayout_text.str, layout_text, sizeof(draw_data.keylayout_text.str) - 1); draw_data.keylayout_text.size = layout_size; + draw_data.keylayout_text.outline_width = layoutoutlinewidth; draw_data.keylayout_text.font = get_font_face(LAYOUT_FONT); draw_data.keylayout_text.color = layout16; + draw_data.keylayout_text.outline_color = layoutoutline16; draw_data.keylayout_text.align = layout_align; } @@ -810,8 +859,10 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.greeter_text.show = true; strncpy(draw_data.greeter_text.str, greeter_text, sizeof(draw_data.greeter_text.str) - 1); draw_data.greeter_text.size = greeter_size; + draw_data.greeter_text.outline_width = greeteroutlinewidth; draw_data.greeter_text.font = get_font_face(GREETER_FONT); draw_data.greeter_text.color = greeter16; + draw_data.greeter_text.outline_color = greeteroutline16; draw_data.greeter_text.align = greeter_align; } @@ -825,7 +876,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { if (*draw_data.time_text.str) { draw_data.time_text.show = true; draw_data.time_text.size = time_size; + draw_data.time_text.outline_width = timeoutlinewidth; draw_data.time_text.color = time16; + draw_data.time_text.outline_color = timeoutline16; draw_data.time_text.font = get_font_face(TIME_FONT); draw_data.time_text.align = time_align; } @@ -833,7 +886,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { if (*draw_data.date_text.str) { draw_data.date_text.show = true; draw_data.date_text.size = date_size; + draw_data.date_text.outline_width = dateoutlinewidth; draw_data.date_text.color = date16; + draw_data.date_text.outline_color = dateoutline16; draw_data.date_text.font = get_font_face(DATE_FONT); draw_data.date_text.align = date_align; } @@ -841,7 +896,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { if (*draw_data.greeter_text.str) { draw_data.greeter_text.show = true; draw_data.greeter_text.size = greeter_size; + draw_data.greeter_text.outline_width = greeteroutlinewidth; draw_data.greeter_text.color = greeter16; + draw_data.greeter_text.outline_color = greeteroutline16; draw_data.greeter_text.font = get_font_face(GREETER_FONT); draw_data.greeter_text.align = greeter_align; } From 06d93dc7b0b2150fea08676c971f8ba21a1c72ab Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 22:49:25 -0500 Subject: [PATCH 077/183] Let codeql autodetect language cpp -> auto in case it ever supports C specifically --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index bb7df8a2..26990ecf 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -24,7 +24,7 @@ jobs: matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] - language: ['cpp'] + # language: ['cpp'] # Learn more... # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection From 9436bab829f901deafdadc443193a7baaba40321 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 22:53:42 -0500 Subject: [PATCH 078/183] Comment the matrix line as well --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 26990ecf..f6af226c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -21,7 +21,7 @@ jobs: strategy: fail-fast: false - matrix: + # matrix: # Override automatic language detection by changing the below list # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python'] # language: ['cpp'] From a318ff3d071cdff0e324f129ced3afa67f72e314 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 22:57:33 -0500 Subject: [PATCH 079/183] CodeQL scan merge commit instead of PR head Removes runtime warning --- .github/workflows/codeql-analysis.yml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f6af226c..2cf36092 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -38,8 +38,9 @@ jobs: # If this run was triggered by a pull request event, then checkout # the head of the pull request instead of the merge commit. - - run: git checkout HEAD^2 - if: ${{ github.event_name == 'pull_request' }} + # CodeQL apparently deprecated this feature and now warns on running this command + # - run: git checkout HEAD^2 + # if: ${{ github.event_name == 'pull_request' }} # Initializes the CodeQL tools for scanning. - name: Initialize CodeQL From c73a65fd9d35c2672832116018e021c6f2b5ace6 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:14:40 -0500 Subject: [PATCH 080/183] Set max bar count to 65535 Note: This is simply an arbitrarily large value. --- i3lock.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index 31fa6645..4c129e9c 100644 --- a/i3lock.c +++ b/i3lock.c @@ -262,13 +262,14 @@ pthread_t draw_thread; // allow you to disable. handy if you use bar with lots of crap. bool redraw_thread = false; +// experimental bar stuff #define BAR_VERT 0 #define BAR_FLAT 1 #define BAR_DEFAULT 0 #define BAR_REVERSED 1 #define BAR_BIDIRECTIONAL 2 -#define BAR_MAX_COUNT 65536 -// experimental bar stuff +#define BAR_MAX_COUNT 65535 + bool bar_enabled = false; double *bar_heights = NULL; double bar_step = 15; From 45b8c7ee3131086054b778adac2141b1bf49cc1a Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:17:14 -0500 Subject: [PATCH 081/183] Use a BAR_MIN_COUNT and set it to 2 --- i3lock.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/i3lock.c b/i3lock.c index 4c129e9c..7bc981b8 100644 --- a/i3lock.c +++ b/i3lock.c @@ -269,6 +269,7 @@ bool redraw_thread = false; #define BAR_REVERSED 1 #define BAR_BIDIRECTIONAL 2 #define BAR_MAX_COUNT 65535 +#define BAR_MIN_COUNT 2 bool bar_enabled = false; double *bar_heights = NULL; @@ -276,7 +277,7 @@ double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; double max_bar_height = 25; -int bar_count = 10; +int bar_count = BAR_MIN_COUNT; int bar_width = 0; int bar_orientation = BAR_FLAT; @@ -2136,8 +2137,12 @@ int main(int argc, char *argv[]) { break; case 710: bar_count = atoi(optarg); - if (bar_count > BAR_MAX_COUNT) bar_count = BAR_MAX_COUNT; - if (bar_count < 1) bar_count = 10; + if (bar_count > BAR_MAX_COUNT) { + bar_count = BAR_MAX_COUNT; + } + if (bar_count < BAR_MIN_COUNT) { + bar_count = BAR_MIN_COUNT; + } break; // Misc From ff2eba3c4c7ea56203e904dc00bf8fc2f52b7ce1 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:18:26 -0500 Subject: [PATCH 082/183] Fix whitespace --- i3lock.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i3lock.c b/i3lock.c index 7bc981b8..f3f41f3d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -2138,11 +2138,11 @@ int main(int argc, char *argv[]) { case 710: bar_count = atoi(optarg); if (bar_count > BAR_MAX_COUNT) { - bar_count = BAR_MAX_COUNT; - } + bar_count = BAR_MAX_COUNT; + } if (bar_count < BAR_MIN_COUNT) { - bar_count = BAR_MIN_COUNT; - } + bar_count = BAR_MIN_COUNT; + } break; // Misc From b7070ffafc8ef090652fc7d3c95f3d574d0cc6ee Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:34:43 -0500 Subject: [PATCH 083/183] Clean up new bar code in i3lock.c --- i3lock.c | 27 ++++++++++++--------------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/i3lock.c b/i3lock.c index f3f41f3d..e5762e7c 100644 --- a/i3lock.c +++ b/i3lock.c @@ -268,8 +268,6 @@ bool redraw_thread = false; #define BAR_DEFAULT 0 #define BAR_REVERSED 1 #define BAR_BIDIRECTIONAL 2 -#define BAR_MAX_COUNT 65535 -#define BAR_MIN_COUNT 2 bool bar_enabled = false; double *bar_heights = NULL; @@ -277,7 +275,9 @@ double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; double max_bar_height = 25; -int bar_count = BAR_MIN_COUNT; +int max_bar_count = 65535; +int min_bar_count = 1; +int bar_count = min_bar_count; int bar_width = 0; int bar_orientation = BAR_FLAT; @@ -2137,11 +2137,8 @@ int main(int argc, char *argv[]) { break; case 710: bar_count = atoi(optarg); - if (bar_count > BAR_MAX_COUNT) { - bar_count = BAR_MAX_COUNT; - } - if (bar_count < BAR_MIN_COUNT) { - bar_count = BAR_MIN_COUNT; + if (bar_count > max_bar_count || bar_count < min_bar_count) { + errx(1, "bar-count must be between %d and %d\n", min_bar_count, max_bar_count); } break; @@ -2296,14 +2293,14 @@ int main(int argc, char *argv[]) { int tmp = screen->width_in_pixels; if (bar_orientation == BAR_VERT) tmp = screen->height_in_pixels; bar_count = tmp / bar_width; - if (tmp % bar_width != 0) ++bar_count; - } - - if (bar_count > 0) { - bar_heights = (double*) calloc(bar_count, sizeof(double)); - } else { - bar_enabled = false; + if (tmp % bar_width != 0) { + ++bar_count; + } + if (bar_count < min_bar_count) { + bar_enabled = false; + } } + bar_heights = (double*) calloc(bar_count, sizeof(double)); } xcb_change_window_attributes(conn, screen->root, XCB_CW_EVENT_MASK, From a4e3bb93cb35229b38ec0796cde8c5d6d5a489b7 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:38:56 -0500 Subject: [PATCH 084/183] Make min/max constants --- i3lock.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i3lock.c b/i3lock.c index e5762e7c..6f09a40d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -274,9 +274,9 @@ double *bar_heights = NULL; double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; -double max_bar_height = 25; -int max_bar_count = 65535; -int min_bar_count = 1; +const double max_bar_height = 25; +const int max_bar_count = 65535; +const int min_bar_count = 1; int bar_count = min_bar_count; int bar_width = 0; int bar_orientation = BAR_FLAT; From 6a6a93a4f7f54c7b6661887617bdee744f8389d4 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:40:48 -0500 Subject: [PATCH 085/183] Revert max_bar_height to variable Why is a max value being assigned to?? --- i3lock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock.c b/i3lock.c index 6f09a40d..eb459426 100644 --- a/i3lock.c +++ b/i3lock.c @@ -274,7 +274,7 @@ double *bar_heights = NULL; double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; -const double max_bar_height = 25; +double max_bar_height = 25; const int max_bar_count = 65535; const int min_bar_count = 1; int bar_count = min_bar_count; From 1d3fb5639152a27288e82481effdf8bfd9ad5f53 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:44:52 -0500 Subject: [PATCH 086/183] C stop making me use #define for constants --- i3lock.c | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i3lock.c b/i3lock.c index eb459426..b4df246b 100644 --- a/i3lock.c +++ b/i3lock.c @@ -268,6 +268,8 @@ bool redraw_thread = false; #define BAR_DEFAULT 0 #define BAR_REVERSED 1 #define BAR_BIDIRECTIONAL 2 +#define MAX_BAR_COUNT = 65535; +#define MIN_BAR_COUNT = 1; bool bar_enabled = false; double *bar_heights = NULL; @@ -275,9 +277,7 @@ double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; double max_bar_height = 25; -const int max_bar_count = 65535; -const int min_bar_count = 1; -int bar_count = min_bar_count; +int bar_count = MIN_BAR_COUNT; int bar_width = 0; int bar_orientation = BAR_FLAT; @@ -2137,8 +2137,8 @@ int main(int argc, char *argv[]) { break; case 710: bar_count = atoi(optarg); - if (bar_count > max_bar_count || bar_count < min_bar_count) { - errx(1, "bar-count must be between %d and %d\n", min_bar_count, max_bar_count); + if (bar_count > MAX_BAR_COUNT || bar_count < MIN_BAR_COUNT) { + errx(1, "bar-count must be between %d and %d\n", MIN_BAR_COUNT, MAX_BAR_COUNT); } break; @@ -2296,7 +2296,7 @@ int main(int argc, char *argv[]) { if (tmp % bar_width != 0) { ++bar_count; } - if (bar_count < min_bar_count) { + if (bar_count < MIN_BAR_COUNT) { bar_enabled = false; } } From a46f2c8a4ce8f2b498e37ee6998652fce9d9d682 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:48:03 -0500 Subject: [PATCH 087/183] Update i3lock.c --- i3lock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index b4df246b..f7df682f 100644 --- a/i3lock.c +++ b/i3lock.c @@ -268,8 +268,8 @@ bool redraw_thread = false; #define BAR_DEFAULT 0 #define BAR_REVERSED 1 #define BAR_BIDIRECTIONAL 2 -#define MAX_BAR_COUNT = 65535; -#define MIN_BAR_COUNT = 1; +#define MAX_BAR_COUNT 65535; +#define MIN_BAR_COUNT 1; bool bar_enabled = false; double *bar_heights = NULL; From a6e33348eaea7716507fc72d42116d1b9b208f6c Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 25 Jan 2021 23:49:25 -0500 Subject: [PATCH 088/183] Update i3lock.c --- i3lock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index f7df682f..feb0a07c 100644 --- a/i3lock.c +++ b/i3lock.c @@ -268,8 +268,8 @@ bool redraw_thread = false; #define BAR_DEFAULT 0 #define BAR_REVERSED 1 #define BAR_BIDIRECTIONAL 2 -#define MAX_BAR_COUNT 65535; -#define MIN_BAR_COUNT 1; +#define MAX_BAR_COUNT 65535 +#define MIN_BAR_COUNT 1 bool bar_enabled = false; double *bar_heights = NULL; From 8de94d87c3b3340501adc24fb47424727e565115 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Tue, 26 Jan 2021 00:54:43 -0500 Subject: [PATCH 089/183] Error out when both bar-count and bar-width are specified. and set default bar count to 10 --- i3lock.c | 32 ++++++++++++++++++++------------ 1 file changed, 20 insertions(+), 12 deletions(-) diff --git a/i3lock.c b/i3lock.c index feb0a07c..5f705063 100644 --- a/i3lock.c +++ b/i3lock.c @@ -277,7 +277,7 @@ double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; double max_bar_height = 25; -int bar_count = MIN_BAR_COUNT; +int bar_count = 0; int bar_width = 0; int bar_orientation = BAR_FLAT; @@ -2288,19 +2288,27 @@ int main(int argc, char *argv[]) { last_resolution[1] = screen->height_in_pixels; if (bar_enabled) { - if (bar_width > 0) { - fprintf(stderr, "Warning: --bar-width is deprecated, use --bar-count instead\n"); - int tmp = screen->width_in_pixels; - if (bar_orientation == BAR_VERT) tmp = screen->height_in_pixels; - bar_count = tmp / bar_width; - if (tmp % bar_width != 0) { - ++bar_count; - } - if (bar_count < MIN_BAR_COUNT) { - bar_enabled = false; + if (bar_count == 0) { + if (bar_width != 0) { + fprintf(stderr, "Warning: bar-width is deprecated, use bar-count instead\n"); + int tmp = screen->width_in_pixels; + if (bar_orientation == BAR_VERT) tmp = screen->height_in_pixels; + bar_count = tmp / bar_width; + if (tmp % bar_width != 0) { + ++bar_count; + } + } else { + bar_count = 10; } + } else if (bar_width != 0) { + errx(EXIT_FAILURE, "bar-width and bar-count cannot be used at the same time"); + } + + if (bar_count >= MIN_BAR_COUNT && bar_count <= MAX_BAR_COUNT) { + bar_heights = (double*) calloc(bar_count, sizeof(double)); + } else { + bar_enabled = false; } - bar_heights = (double*) calloc(bar_count, sizeof(double)); } xcb_change_window_attributes(conn, screen->root, XCB_CW_EVENT_MASK, From bbd5af2a7a2603e36274585d9be724b5e1a3a4d3 Mon Sep 17 00:00:00 2001 From: Mohamad Safadieh Date: Sun, 14 Feb 2021 04:33:48 -0500 Subject: [PATCH 090/183] Use system-local-login for PAM on Arch/Gentoo --- configure.ac | 8 ++++---- pam/i3lock | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index 7a657940..17e1e83e 100644 --- a/configure.ac +++ b/configure.ac @@ -77,17 +77,17 @@ AC_SEARCH_LIBS([ev_run], [ev], , [AC_MSG_FAILURE([cannot find the required ev_ru AC_SEARCH_LIBS([shm_open], [rt]) -# Use system-auth instead of login on Arch +# Use system-local-login instead of login on Arch if [[ -f /etc/arch-release ]]; then echo "Using PAM for Arch" - sed -i "s/^#auth include system-auth/auth include system-auth/g" ../pam/i3lock + sed -i "s/^#auth include system-local-login/auth include system-local-login/g" ../pam/i3lock sed -i "s/^auth include login/#auth include login/g" ../pam/i3lock fi -# Use system-auth instead of login on Gentoo +# Use system-local-login instead of login on Gentoo if [[ -f /etc/gentoo-release ]]; then echo "Using PAM for Gentoo" - sed -i "s/^#auth include system-auth/auth include system-auth/g" ../pam/i3lock + sed -i "s/^#auth include system-local-login/auth include system-local-login/g" ../pam/i3lock sed -i "s/^auth include login/#auth include login/g" ../pam/i3lock fi diff --git a/pam/i3lock b/pam/i3lock index 49451393..fe025944 100644 --- a/pam/i3lock +++ b/pam/i3lock @@ -4,5 +4,5 @@ # and 'login' for Debian. Note that vanilla i3lock upstream uses 'login' instead. # -#auth include system-auth # For Arch/Gentoo +#auth include system-local-login # For Arch/Gentoo auth include login # For Debian From 85b7438787a54bfc13b3c7ef58423181cd63d8b9 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 14 Feb 2021 15:19:29 -0500 Subject: [PATCH 091/183] CRLF -> LF --- .github/ISSUE_TEMPLATE.md | 2 +- .github/pull_request_template.md | 2 +- .github/workflows/codeql-analysis.yml | 2 +- blur.c | 1 - blur.h | 2 -- 5 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 66b98047..6dbcbb41 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -24,7 +24,7 @@ For other kinds of issues, you can remove this section, or add any aditional inf ## Environment Output of `i3lock --version`:
-i3lock version: 
+i3lock version:
 
Where'd you get i3lock-color from? diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index af2f5e7d..f6621726 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -4,7 +4,7 @@ Closes #[issue number] ## Description - - + - ### Screenshots/screencaps -![AUR release ver](https://img.shields.io/aur/version/i3lock-color?label=AUR%20release%20ver) -![AUR git ver](https://img.shields.io/aur/version/i3lock-color-git?label=AUR%20git%20ver) +[![AUR release ver](https://img.shields.io/aur/version/i3lock-color?label=AUR%20release%20ver)](https://aur.archlinux.org/packages/i3lock-color/) +[![AUR git ver](https://img.shields.io/aur/version/i3lock-color-git?label=AUR%20git%20ver)](https://aur.archlinux.org/packages/i3lock-color-git/) ![AUR votes](https://img.shields.io/aur/votes/i3lock-color-git) -![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color) -![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color) -![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color) -![Maintenance](https://img.shields.io/maintenance/yes/2021) +[![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/network/members) +[![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/stargazers) +[![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/watchers) +![Maintained](https://img.shields.io/maintenance/yes/2021) ### The world's most popular non-default computer lockscreen. **A modern version of i3lock with color functionality and other features.** @@ -128,15 +128,15 @@ Unfortunately the previous maintainer left, and the package got dumped back into - [Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/) ## Gentoo Package -i3lock-color is available on **GURU**, under `x11-misc/i3lock-color` (https://github.com/gentoo/guru/tree/master/x11-misc/i3lock-color). +i3lock-color is available on **GURU**, under [`x11-misc/i3lock-color`](https://github.com/gentoo/guru/tree/master/x11-misc/i3lock-color). ## FreeBSD port -[i3lock-color-port](https://github.com/rkashapov/i3lock-color-port/) +~~[i3lock-color-port](https://github.com/rkashapov/i3lock-color-port/)~~ (severely out of date). ## Running i3lock-color Simply invoke the 'i3lock' command. To get out of it, enter your password and press enter. -A [sample script](lock.sh) is included in this repository. [See the script in action](https://streamable.com/fpl46) +A [sample script](examples/lock.sh) is included in this repository. [See the script in action](https://streamable.com/fpl46) On OpenBSD the `i3lock` binary needs to be setgid `auth` to call the authentication helpers, e.g. `/usr/libexec/auth/login_passwd`. @@ -144,4 +144,4 @@ On OpenBSD the `i3lock` binary needs to be setgid `auth` to call the authenticat This project was started by [eBrnd](https://github.com/eBrnd/i3lock-color), maintained for a few years by [PandorasFox](https://github.com/PandorasFox) and now maintained and being developed by [Raymo111](https://github.com/Raymo111). The full list of contributors can be found [here](https://github.com/Raymo111/i3lock-color/graphs/contributors). ## Upstream -Please submit pull requests for i3lock things to https://github.com/i3/i3lock and pull requests for additional features on top of regular i3lock at https://github.com/Raymo111/i3lock-color. +Please submit pull requests for i3lock things to [https://github.com/i3/i3lock](https://github.com/i3/i3lock) and pull requests for additional features on top of regular i3lock at [https://github.com/Raymo111/i3lock-color](https://github.com/Raymo111/i3lock-color). From e30b41f4c46395c71f335574c715559058a1872b Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 15 Feb 2021 01:42:31 -0500 Subject: [PATCH 106/183] Add links to more badges --- README.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 39563ac8..67d7a2d7 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,14 @@ # i3lock-color ![Language count](https://img.shields.io/github/languages/count/Raymo111/i3lock-color) -![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color) +[![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/search?l=c) ![Repo size](https://img.shields.io/github/repo-size/Raymo111/i3lock-color) -![Open issues](https://img.shields.io/github/issues-raw/Raymo111/i3lock-color) -![Closed issues](https://img.shields.io/github/issues-closed-raw/Raymo111/i3lock-color?color=brightgreen) -![Open PRs](https://img.shields.io/github/issues-pr-raw/Raymo111/i3lock-color?label=open%20PRs) -![Closed PRs](https://img.shields.io/github/issues-pr-closed-raw/Raymo111/i3lock-color?color=brightgreen&label=closed%20PRs) -![Contributor count](https://img.shields.io/github/contributors/Raymo111/i3lock-color) -![GitHub Release Date](https://img.shields.io/github/release-date/Raymo111/i3lock-color?label=latest%20release) +[![Open issues](https://img.shields.io/github/issues-raw/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/issues?q=is%3Aopen+is%3Aissue) +[![Closed issues](https://img.shields.io/github/issues-closed-raw/Raymo111/i3lock-color?color=brightgreen)](https://github.com/Raymo111/i3lock-color/issues?q=is%3Aissue+is%3Aclosed) +[![Open PRs](https://img.shields.io/github/issues-pr-raw/Raymo111/i3lock-color?label=open%20PRs)](https://github.com/Raymo111/i3lock-color/pulls?q=is%3Aopen+is%3Apr) +[![Closed PRs](https://img.shields.io/github/issues-pr-closed-raw/Raymo111/i3lock-color?color=brightgreen&label=closed%20PRs)](https://github.com/Raymo111/i3lock-color/pulls?q=is%3Apr+is%3Aclosed) +[![Contributors](https://img.shields.io/github/contributors/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/graphs/contributors) +[![Latest release](https://img.shields.io/github/release-date/Raymo111/i3lock-color?label=latest%20release)](https://github.com/Raymo111/i3lock-color/releases/latest) [![Commits](https://img.shields.io/github/commits-since/Raymo111/i3lock-color/latest?include_prereleases&sort=semver)](https://github.com/Raymo111/i3lock-color/commits/master) ![Latest commit](https://img.shields.io/github/last-commit/Raymo111/i3lock-color) From 5afc5c01a48750780576c0724d49170d5964ab23 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 15 Feb 2021 01:45:26 -0500 Subject: [PATCH 107/183] Add to feature list --- README.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 67d7a2d7..b13f555a 100644 --- a/README.md +++ b/README.md @@ -47,15 +47,18 @@ You can also specify additional options, as detailed in the manpage. This includ - Key highlight color - Backspace highlight color - Text colors for most/all strings + - Outline colors - Changing all of the above depending on PAM's authentication status - Blurring the current screen and using that as the lock background - Showing a clock in the indicator - Refreshing on a timer, instead of on each keypress - Positioning the various UI elements - Changing the ring radius and thickness, as well as text size -- Passthrough media keys +- Options for passwordless auth, removing modkey indicator +- Passing through media keys - A new bar indicator, which replaces the ring indicator with its own set of options - An experimental thread for driving the redraw ticks, so that things like the bar/clock still update when PAM is blocking +- Any other feature you want (add it yourself through a PR or make a feature request issue!) ## Dependencies The following dependencies will need to be installed for a successful build, depending on your OS/distro. From 4e088f243726d9862e71dd61da068f8e15e67ee6 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 15 Feb 2021 13:37:01 -0500 Subject: [PATCH 108/183] Update man page date --- i3lock.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock.1 b/i3lock.1 index 65c06aa3..2af06417 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -8,7 +8,7 @@ .fi .. -.TH i3lock-color 1 "JULY 2020" Linux "User Manuals" +.TH i3lock-color 1 "FEBRUARY 2021" Linux "User Manuals" .SH NAME i3lock-color \- improved screen locker From 085df46f429fd5643ac800a53dd410f187dd9df4 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Thu, 18 Feb 2021 11:14:55 -0800 Subject: [PATCH 109/183] Add --bar-total-width option (#206) * Add adjustable total bar width and bar position * Update parameter name and documentation * Fix option name in error message * Reword error message Co-authored-by: Raymond Li --- i3lock.1 | 11 ++++-- i3lock.c | 20 ++++++---- unlock_indicator.c | 95 +++++++++++++++++++++++++++++++++------------- unlock_indicator.h | 4 +- 4 files changed, 90 insertions(+), 40 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 2af06417..7883189f 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -437,13 +437,18 @@ The value by which the bars decrease each time the screen is redrawn. .TP .B \-\-bar\-position -Works similarly to the time/date/indicator expressions. If the bar is horizontal, this sets the vertical offset from the top edge. -If it's vertically oriented, this sets the horizontal offset from the left edge. +Works similarly to the time/date/indicator expressions. If only one number is provided, this sets +the vertical offset from the top or left edge. If two numbers are provided in the form of x:y, sets +the starting position of the bar. .TP -.B \-\-bar\-count=10 +.B \-\-bar\-count Sets the number of minibars to draw on each screen. +.TP +.B \-\-bar\-total\-width +The total width of the bar. Can be an expression. + .TP .B \-\-no\-verify Do not verify the password entered by the user and unlock immediately. diff --git a/i3lock.c b/i3lock.c index 5f705063..49345b0d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -282,7 +282,9 @@ int bar_width = 0; int bar_orientation = BAR_FLAT; char bar_base_color[9] = "000000ff"; -char bar_expr[32] = "0\0"; +char bar_x_expr[32] = "0"; +char bar_y_expr[32] = ""; // empty string on y means use x as offset based on orientation +char bar_width_expr[32] = ""; // empty string means full width based on bar orientation bool bar_bidirectional = false; bool bar_reversed = false; @@ -1548,6 +1550,7 @@ int main(int argc, char *argv[]) { {"bar-periodic-step", required_argument, NULL, 708}, {"bar-position", required_argument, NULL, 709}, {"bar-count", required_argument, NULL, 710}, + {"bar-total-width", required_argument, NULL, 711}, // misc. {"redraw-thread", no_argument, NULL, 900}, @@ -2125,14 +2128,9 @@ int main(int argc, char *argv[]) { bar_periodic_step = opt; break; case 709: - //read in to ind_x_expr and ind_y_expr - if (strlen(optarg) > 31) { - // this is overly restrictive since both the x and y string buffers have size 32, but it's easier to check. - errx(1, "indicator position string can be at most 31 characters\n"); - } arg = optarg; - if (sscanf(arg, "%31s", bar_expr) != 1) { - errx(1, "bar-position must be of the form [pos] with a max length of 31\n"); + if (sscanf(arg, "%31[^:]:%31[^:]", bar_x_expr, bar_y_expr) < 1) { + errx(1, "bar-position must be a single number or of the form x:y with a max length of 31\n"); } break; case 710: @@ -2140,6 +2138,12 @@ int main(int argc, char *argv[]) { if (bar_count > MAX_BAR_COUNT || bar_count < MIN_BAR_COUNT) { errx(1, "bar-count must be between %d and %d\n", MIN_BAR_COUNT, MAX_BAR_COUNT); } + break; + case 711: + arg = optarg; + if (sscanf(arg, "%31s", bar_width_expr) != 1) { + errx(1, "missing argument for bar-total-width\n"); + } break; // Misc diff --git a/unlock_indicator.c b/unlock_indicator.c index 9333a6b2..08deaab5 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -232,7 +232,9 @@ extern int bar_count; extern int bar_orientation; extern char bar_base_color[9]; -extern char bar_expr[32]; +extern char bar_x_expr[32]; +extern char bar_y_expr[32]; +extern char bar_width_expr[32]; extern bool bar_bidirectional; extern bool bar_reversed; @@ -355,7 +357,7 @@ static void draw_single_bar(cairo_t *ctx, double pos, double offset, double widt cairo_fill(ctx); } -static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double screen_y, double screen_w, double screen_h) { +static void draw_bar(cairo_t *ctx, double bar_x, double bar_y, double bar_width, double screen_x, double screen_y) { cairo_save(ctx); @@ -374,9 +376,9 @@ static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double sc } if (bar_orientation == BAR_VERT) - draw_single_bar(ctx, screen_y, bar_offset, screen_h, bar_base_height); + draw_single_bar(ctx, bar_y, bar_x, bar_width, bar_base_height); else - draw_single_bar(ctx, screen_x, bar_offset, screen_w, bar_base_height); + draw_single_bar(ctx, bar_x, bar_y, bar_width, bar_base_height); if (unlock_state == STATE_BACKSPACE_ACTIVE) cairo_set_source_rgba(ctx, bshl16.red, bshl16.green, bshl16.blue, bshl16.alpha); @@ -385,20 +387,21 @@ static void draw_bar(cairo_t *ctx, double bar_offset, double screen_x, double sc cairo_set_operator(ctx, CAIRO_OPERATOR_SOURCE); - double bar_width, screen_pos; + double base_width = bar_width / bar_count; + double bar_pos, bar_offset; if (bar_orientation == BAR_VERT) { - bar_width = screen_h / bar_count; - screen_pos = screen_y; + bar_pos = bar_y; + bar_offset = bar_x; } else { - bar_width = screen_w / bar_count; - screen_pos = screen_x; + bar_pos = bar_x; + bar_offset = bar_y; } for (int i = 0; i < bar_count; ++i) { double bar_height = bar_heights[i]; if (bar_bidirectional) bar_height *= 2; if (bar_height > 0) { - draw_single_bar(ctx, screen_pos + i * bar_width, bar_offset, bar_width, bar_height); + draw_single_bar(ctx, bar_pos + i * base_width, bar_offset, base_width, bar_height); } } @@ -637,7 +640,7 @@ static void draw_elements(cairo_t *const ctx, DrawData const *const draw_data) { break; } } - draw_bar(ctx, draw_data->bar_offset, draw_data->screen_x, draw_data->screen_y, draw_data->screen_w, draw_data->screen_h); + draw_bar(ctx, draw_data->bar_x, draw_data->bar_y, draw_data->bar_width, draw_data->screen_x, draw_data->screen_y); } draw_text(ctx, draw_data->status_text); @@ -879,6 +882,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { {"ty", &draw_data.time_text.y}, {"dx", &draw_data.date_text.x}, {"dy", &draw_data.date_text.y}, + {"bw", &draw_data.bar_width}, + {"bx", &draw_data.bar_x}, + {"by", &draw_data.bar_y}, {"r", &radius}}; te_expr *te_ind_x_expr = compile_expression("--indpos", ind_x_expr, vars, vars_size); @@ -897,7 +903,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { te_expr *te_wrong_y_expr = compile_expression("--wrongpos", wrong_y_expr, vars, vars_size); te_expr *te_modif_x_expr = compile_expression("--modifpos", modif_x_expr, vars, vars_size); te_expr *te_modif_y_expr = compile_expression("--modifpos", modif_y_expr, vars, vars_size); - te_expr *te_bar_expr = compile_expression("--bar-position", bar_expr, vars, vars_size); + te_expr *te_bar_x_expr = compile_expression("--bar-position", bar_x_expr, vars, vars_size); + te_expr *te_bar_y_expr = strlen(bar_y_expr) ? compile_expression("--bar-position", bar_y_expr, vars, vars_size) : NULL; + te_expr *te_bar_width_expr = strlen(bar_width_expr) ? compile_expression("--bar-width", bar_width_expr, vars, vars_size) : NULL; te_expr *te_greeter_x_expr = compile_expression("--greeterpos", greeter_x_expr, vars, vars_size); te_expr *te_greeter_y_expr = compile_expression("--greeterpos", greeter_y_expr, vars, vars_size); @@ -925,18 +933,10 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { height = xr_resolutions[current_screen].height / scaling_factor; screen_x = xr_resolutions[current_screen].x / scaling_factor; screen_y = xr_resolutions[current_screen].y / scaling_factor; - draw_data.screen_w = width; - draw_data.screen_h = height; draw_data.screen_x = screen_x; draw_data.screen_y = screen_y; - if (te_ind_x_expr && te_ind_y_expr) { - draw_data.indicator_x = te_eval(te_ind_x_expr); - draw_data.indicator_y = te_eval(te_ind_y_expr); - } else { - draw_data.indicator_x = screen_x + width / 2; - draw_data.indicator_y = screen_y + height / 2; - } - draw_data.bar_offset = te_eval(te_bar_expr); + draw_data.indicator_x = te_eval(te_ind_x_expr); + draw_data.indicator_y = te_eval(te_ind_y_expr); draw_data.time_text.x = te_eval(te_time_x_expr); draw_data.time_text.y = te_eval(te_time_y_expr); draw_data.date_text.x = te_eval(te_date_x_expr); @@ -966,8 +966,29 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.mod_text.x = te_eval(te_modif_x_expr); draw_data.mod_text.y = te_eval(te_modif_y_expr); + if (te_bar_y_expr) { + draw_data.bar_x = te_eval(te_bar_x_expr); + draw_data.bar_y = te_eval(te_bar_y_expr); + } else { + double bar_offset = te_eval(te_bar_x_expr); + if (bar_orientation == BAR_VERT) { + draw_data.bar_x = bar_offset; + draw_data.bar_y = screen_y; + } else { + draw_data.bar_x = screen_x; + draw_data.bar_y = bar_offset; + } + } + if (te_bar_width_expr) + draw_data.bar_width = te_eval(te_bar_width_expr); + else if (bar_orientation == BAR_VERT) + draw_data.bar_width = height; + else + draw_data.bar_width = width; + + DEBUG("Indicator at %fx%f on screen %d\n", draw_data.indicator_x, draw_data.indicator_y, current_screen + 1); - DEBUG("Bar at %f on screen %d\n", draw_data.bar_offset, current_screen + 1); + DEBUG("Bar at %fx%f with width %f on screen %d\n", draw_data.bar_x, draw_data.bar_y, draw_data.bar_width, current_screen + 1); DEBUG("Time at %fx%f on screen %d\n", draw_data.time_text.x, draw_data.time_text.y, current_screen + 1); DEBUG("Date at %fx%f on screen %d\n", draw_data.date_text.x, draw_data.date_text.y, current_screen + 1); DEBUG("Layout at %fx%f on screen %d\n", draw_data.keylayout_text.x, draw_data.keylayout_text.y, current_screen + 1); @@ -982,8 +1003,6 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { * hope for the best. */ width = last_resolution[0] / scaling_factor; height = last_resolution[1] / scaling_factor; - draw_data.screen_w = width; - draw_data.screen_h = height; draw_data.screen_x = 0; draw_data.screen_y = 0; draw_data.indicator_x = width / 2; @@ -1016,8 +1035,28 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.mod_text.x = te_eval(te_modif_x_expr); draw_data.mod_text.y = te_eval(te_modif_y_expr); + if (te_bar_y_expr) { + draw_data.bar_x = te_eval(te_bar_x_expr); + draw_data.bar_y = te_eval(te_bar_y_expr); + } else { + double bar_offset = te_eval(te_bar_x_expr); + if (bar_orientation == BAR_VERT) { + draw_data.bar_x = bar_offset; + draw_data.bar_y = screen_y; + } else { + draw_data.bar_x = screen_x; + draw_data.bar_y = bar_offset; + } + } + if (te_bar_width_expr) + draw_data.bar_width = te_eval(te_bar_width_expr); + else if (bar_orientation == BAR_VERT) + draw_data.bar_width = height; + else + draw_data.bar_width = width; + DEBUG("Indicator at %fx%f\n", draw_data.indicator_x, draw_data.indicator_y); - DEBUG("Bar at %f\n", draw_data.bar_offset); + DEBUG("Bar at %fx%f with width %f\n", draw_data.bar_x, draw_data.bar_y, draw_data.bar_width); DEBUG("Time at %fx%f\n", draw_data.time_text.x, draw_data.time_text.y); DEBUG("Date at %fx%f\n", draw_data.date_text.x, draw_data.date_text.y); DEBUG("Layout at %fx%f\n", draw_data.keylayout_text.x, draw_data.keylayout_text.y); @@ -1043,7 +1082,9 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { te_free(te_wrong_y_expr); te_free(te_modif_x_expr); te_free(te_modif_y_expr); - te_free(te_bar_expr); + te_free(te_bar_x_expr); + te_free(te_bar_y_expr); + te_free(te_bar_width_expr); te_free(te_greeter_x_expr); te_free(te_greeter_y_expr); diff --git a/unlock_indicator.h b/unlock_indicator.h index c12a16a5..15aa905b 100644 --- a/unlock_indicator.h +++ b/unlock_indicator.h @@ -34,8 +34,8 @@ typedef struct { double indicator_x, indicator_y; - double screen_x, screen_y, screen_w, screen_h; - double bar_offset; + double screen_x, screen_y; + double bar_x, bar_y, bar_width; } DrawData; void render_lock(uint32_t* resolution, xcb_drawable_t drawable); From 24e0799c77ce620d985b8a0cb0aea1951e194f07 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 30 Mar 2021 17:16:02 -0400 Subject: [PATCH 110/183] Default to disable-sanitizers --- build.sh | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/build.sh b/build.sh index cbec96c7..26c5b695 100755 --- a/build.sh +++ b/build.sh @@ -1,4 +1,20 @@ -#!/bin/bash +#!/bin/sh -x + +configureOpts="--disable-sanitizers" + +while getopts ":hd" opt; do + case ${opt} in + h ) echo "Use -d to turn on sanitizers (for debugging only)" + exit;; + d ) configureOpts="" + ;; + \? ) echo "Usage: $0 [-h] [-d]" + exit;; + esac +done + +configureOpts="${configureOpts} --prefix=/usr --sysconfdir=/etc" + autoreconf -fiv BUILD_DIR=build/ @@ -6,6 +22,6 @@ rm -rf $BUILD_DIR mkdir -vp $BUILD_DIR cd $BUILD_DIR || { echo "cd $BUILD_DIR"; exit 127; } -../configure --prefix=/usr --sysconfdir=/etc +../configure ${configureOpts} make From 4c45ff17c3c4991ab55c8a4dde5d73089f4ca163 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 30 Mar 2021 17:16:50 -0400 Subject: [PATCH 111/183] chmod shouldn't be needed --- README.md | 2 -- 1 file changed, 2 deletions(-) diff --git a/README.md b/README.md index b13f555a..e009af21 100644 --- a/README.md +++ b/README.md @@ -113,12 +113,10 @@ cd i3lock-color ``` To build without installing, run: ``` -chmod +x build.sh ./build.sh ``` To build AND install, run: ``` -chmod +x install-i3lock-color.sh ./install-i3lock-color.sh ``` You may choose to modify the script based on your needs/OS/distro. From 73a793d41952fedecde73bd348fc14a04e9427fb Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 30 Mar 2021 17:25:02 -0400 Subject: [PATCH 112/183] Skip printing compile instructions since make follows configure immediately in the build script that users should be using --- configure.ac | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/configure.ac b/configure.ac index ebf97e62..67414dd2 100644 --- a/configure.ac +++ b/configure.ac @@ -159,9 +159,10 @@ AS_HELP_STRING([is release version:], [${is_release}]) AS_HELP_STRING([enable debug flags:], [${ax_enable_debug}]) AS_HELP_STRING([code coverage:], [${CODE_COVERAGE_ENABLED}]) -AS_HELP_STRING([enabled sanitizers:], [${ax_enabled_sanitizers}]) +AS_HELP_STRING([enabled sanitizers:], [${ax_enabled_sanitizers}])" -To compile, run: - - cd `pwd` && make ---------------------------------------------------------------------------------" +#To compile, run: +# +# cd `pwd` && make +echo \ +"--------------------------------------------------------------------------------" From 72a4a063c72a8ebb3b3720feb120d60603e84c1a Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 30 Mar 2021 17:30:30 -0400 Subject: [PATCH 113/183] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index e009af21..a0456819 100644 --- a/README.md +++ b/README.md @@ -83,6 +83,7 @@ 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 ``` +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). ### Fedora Run this command to install all dependencies: From eb761b16ad54396aa62a250039d9f0c47cfe7a00 Mon Sep 17 00:00:00 2001 From: Panagiotis Vasilopoulos Date: Thu, 20 May 2021 15:35:26 +0000 Subject: [PATCH 114/183] Changed background color to #a3a3a3 (#300) --- i3lock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock.c b/i3lock.c index e855a751..3ab93979 100644 --- a/i3lock.c +++ b/i3lock.c @@ -57,7 +57,7 @@ typedef void (*ev_callback_t)(EV_P_ ev_timer *w, int revents); static void input_done(void); -char color[7] = "ffffff"; +char color[7] = "a3a3a3"; uint32_t last_resolution[2]; xcb_window_t win; static xcb_cursor_t cursor; From 4d0ef7871682c2a91d72eb7e4525bb231c5d5825 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 27 May 2021 18:00:06 -0400 Subject: [PATCH 115/183] Update codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 4c452317..f962f4d9 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -65,7 +65,7 @@ jobs: # uses a compiled language - run: | - 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 --fix-missing 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 ./build.sh - name: Perform CodeQL Analysis From 2e34ff216bce6259b82d25a59cc147b957842276 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 27 May 2021 18:03:57 -0400 Subject: [PATCH 116/183] Update codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index f962f4d9..52090baa 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -65,7 +65,8 @@ jobs: # uses a compiled language - run: | - sudo apt install --fix-missing 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-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 ./build.sh - name: Perform CodeQL Analysis From 600bd04323c36ac1f89b127dc573df4e57365bb4 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 27 May 2021 18:10:58 -0400 Subject: [PATCH 117/183] Revamp CI --- .github/workflows/Build Test.yml | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/.github/workflows/Build Test.yml b/.github/workflows/Build Test.yml index f173fde0..5bd4dd55 100644 --- a/.github/workflows/Build Test.yml +++ b/.github/workflows/Build Test.yml @@ -7,11 +7,16 @@ jobs: steps: - uses: actions/checkout@v2 - name: Install deps - run: 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 - - run: chmod +x build.sh + 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 + - name: Build - run: ./build.sh - - run: cd build && make check - - run: cd build && make distcheck + - name: Check and distcheck + - run: | + cd build + make check + make distcheck - name: Upload binary artifact uses: actions/upload-artifact@v2 with: From dc4dee70ae3cffe34b4d638c0380b2713fcb213b Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 27 May 2021 19:51:09 -0400 Subject: [PATCH 118/183] Redo manpage --- i3lock.1 | 391 +++++++++++++++++++++++++------------------------------ i3lock.c | 118 ++++++++--------- 2 files changed, 239 insertions(+), 270 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 7883189f..3627af85 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -8,7 +8,7 @@ .fi .. -.TH i3lock-color 1 "FEBRUARY 2021" Linux "User Manuals" +.TH i3lock-color 1 "MAY 2021" Linux "User Manuals" .SH NAME i3lock-color \- improved screen locker @@ -31,17 +31,19 @@ i3lock-color \- improved screen locker .RB [\|\-m\|] .SH DESCRIPTION -.B i3lock-color +.B i3lock\-color is a simple screen locker like slock. After starting it, you will see a white screen (you can configure the color/an image). You can return to your screen by entering your password. -.SH IMPROVEMENTS +.SH FEATURES .IP \[bu] 2 i3lock forks, so you can combine it with an alias to suspend to RAM -(run "i3lock && echo mem > /sys/power/state" to get a locked screen after waking up your computer from suspend to RAM) +(run "i3lock && echo mem > /sys/power/state" to get a locked screen after waking +up your computer from suspend to RAM) .IP \[bu] -You can specify either a background color or a PNG image which will be displayed while your screen is locked. +You can specify either a background color or a PNG image which will be displayed +while your screen is locked. .IP \[bu] You can specify whether i3lock should bell upon a wrong password. .IP \[bu] @@ -75,12 +77,13 @@ Display the given PNG image instead of a blank screen. .TP .BI \fB\-\-raw= format -Read the image given by \-\-image as a raw image instead of PNG. The argument is the image's format -as x:. The supported pixel formats are: +Read the image given by \-\-image as a raw image instead of PNG. The argument is +the image's format as x:. +The supported pixel formats are: \'native', 'rgb', 'xrgb', 'rgbx', 'bgr', 'xbgr', and 'bgrx'. The "native" pixel format expects a pixel as a 32-bit (4-byte) integer in -the machine's native endianness, with the upper 8 bits unused. Red, green and blue are stored in -the remaining bits, in that order. +the machine's native endianness, with the upper 8 bits unused. +Red, green and blue are stored in the remaining bits, in that order. .BR Example: .Vb 6 @@ -105,19 +108,21 @@ gets you the current screen dimensions in the wxh (e.g. 1920x1080) format. .TP .BI \-c\ rrggbbaa \fR,\ \fB\-\-color= rrggbbaa -Turn the screen into the given color instead of white. Color must be given in 4-byte -format: rrggbbaa (i.e. ff0000ff is opaque red). -Use the last byte for alpha. Setting this below FF (i.e. ff000088) will allow your screen to be shown translucently if you use a compositor (e.g. compton, xcompmgr). +Turn the screen into the given color instead of white. Color must be given in +4-byte format: rrggbbaa (i.e. ff0000ff is opaque red). +Use the last byte for alpha. Setting this below FF (i.e. ff000088) will allow +your screen to be shown translucently if you use a compositor (e.g. compton, +xcompmgr). .TP .B \-t, \-\-tiling -If an image is specified (via \-i) it will display the image tiled all over the screen -(with a multi-monitor setup, the image is visible on all screens). +If an image is specified (via \-i) it will display the image tiled all over the +screen (with a multi-monitor setup, the image is visible on all screens). .TP .B \-C, \-\-centered -If an image is specified (via \-i) it will display the image centered on the screen -(with a multi-monitor setup, the image is visible on all screens). +If an image is specified (via \-i) it will display the image centered on the +screen (with a multi-monitor setup, the image is visible on all screens). .TP .BI \-p\ win|default \fR,\ \fB\-\-pointer= win|default @@ -130,12 +135,11 @@ friends by using a screenshot of a Windows desktop as a locking-screen). .TP .B \-e, \-\-ignore\-empty\-password -When an empty password is provided by the user, do not validate -it. Without this option, the empty password will be provided to PAM -and, if invalid, the user will have to wait a few seconds before -another try. This can be useful if the XF86ScreenSaver key is used to -put a laptop to sleep and bounce on resume or if you happen to wake up -your computer with the enter key. +When an empty password is provided by the user, do not validate it. Without this +option, the empty password will be provided to PAM and, if invalid, the user +will have to wait a few seconds before another try. This can be useful if the +XF86ScreenSaver key is used to put a laptop to sleep and bounce on resume or if +you happen to wake up your computer with the enter key. .TP .B \-f, \-\-show\-failed\-attempts @@ -146,158 +150,128 @@ Show the number of failed attempts, if any. Enables debug logging. Note, that this will log the password used for authentication to stdout. -.SH i3lock-color options +.SH i3lock-color OPTIONS .TP .B \-S number, \-\-screen=number -Specifies which display to draw the unlock indicator and clock on. By default, they'll be placed on every screen. +Specifies which display to draw the unlock indicator and clock on. By default, +they'll be placed on every screen. Note that this number is zero indexed. The ordering is dependent on libxinerama. .TP .B \-B sigma, \-\-blur=sigma Captures the screen and blurs it using the given sigma (radius). Images may still be overlaid over the blurred screenshot. -As an alternative to this option, you could specify a translucent background color -(-c option) with a fully transparent or translucent color, and use a compositor to perform blurring (e.g. compton, picom). - -.TP -.B \-\-indicator -Forces the indicator to always be visible, instead of only showing on activity. - -.TP -.B \-\-keylayout mode -Displays the keylayout. Positionable similar to date, time, and indicator. Modes are as follows: -.RS -.RS -0 - Displays the full string returned by the query, i.e. "English (US)" -1 - Displays up until the first parenthesis, i.e. "English" -2 - Displays just the contents of the parenthesis, i.e. "US" -.RE -.RE +As an alternative to this option, you could specify a translucent background +color (-c option) with a fully transparent or translucent color, and use a +compositor to perform blurring (e.g. compton, picom). .TP .B \-k, \-\-clock, \-\-force\-clock -Displays the clock. \-\-force\-clock also displays the clock when there's indicator text -(useful for when the clock is not positioned with the indicator). +Displays the clock. \-\-force\-clock also displays the clock when there's +indicator text (useful for when the clock is not positioned with the indicator). .TP -.B \-\-composite -Some compositors have problems with i3lock trying to render over them, so this argument is disabled by default. -However, some will work properly with it, so it's been left enabled. - -.TP -.B \-\-pass\-media\-keys -Allow the following keys to be used while the screen is locked by passing them through: -XF86AudioPlay, XF86AudioPause, XF86AudioStop, XF86AudioPrev, XF86AudioNext, XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume. - -.TP -.B \-\-pass\-screen\-keys -Allow the following keys to be used while the screen is locked by passing them through: -XF86MonBrightnessUp, XF86MonBrightnessDown. - -.TP -.B \-\-pass\-power\-keys -Allow the following keys to be used while the screen is locked by passing them through: -XF86PowerDown, XF86PowerOff, XF86Sleep. - -.TP -.B \-\-pass\-volume\-keys -Allow the following keys to be used while the screen is locked by passing them through: -XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume. +.B \-\-indicator +Forces the indicator to always be visible, instead of only showing on activity. .TP -.B \-\-insidevercolor=rrggbbaa -Sets the interior circle color while the password is being verified. +.B \-\-radius +The radius of the circle. Defaults to 90. .TP -.B \-\-insidewrongcolor=rrggbbaa -Sets the interior circle color for during flash for an incorrect password. +.B \-\-ring\-width +The width of the ring unlock indicator. Defaults to 7.0. .TP -.B \-\-insidecolor=rrggbbaa -Sets the default "resting" color for the interior circle. +.B \-\-{inside, ring}\-color=rrggbbaa +Sets the idle color for the interior circle and ring. .TP -.B \-\-ringvercolor=rrggbbaa -Sets the ring color while the password is being verified. +.B \-\-{inside, ring}ver\-color=rrggbbaa +Sets the interior circle and ring color while the password is being verified. .TP -.B \-\-ringwrongcolor=rrggbbaa -Sets the ring color during the flash for an incorrect password. +.B \-\-{inside, ring}wrong\-color=rrggbbaa +Sets the interior circle and ring color for during incorrect password flashes. .TP -.B \-\-ringcolor=rrggbbaa -Sets the default ring color. +.B \-\-line\-color=rrggbbaa +Sets the color for the line separating the inside circle and the outer ring. .TP -.B \-\-linecolor=rrggbbaa -Sets the color for the line separating the inside circle, and the outer ring. +.B \-\-line\-uses\-{inside, ring} +Overrides \-\-linecolor. The line will match the {inside, ring} color. +Note: these two options conflict with each other. .TP -.B \-\-line\-uses\-ring -Conflicts with \-\-line\-uses\-inside. Overrides \-\-linecolor. The line will match the ring color. +.B \-\-{key, bs}hl\-color=rrggbbaa +Sets the color of highlight arcs on the ring upon keypress and backspace. .TP -.B \-\-line\-uses\-inside -Conflicts with \-\-line\-uses\-ring. Overrides \-\-linecolor; the line will match the inside color. +.B \-\-separator\-color=rrggbbaa +Sets the color of the seperators at both ends of the highlight arcs on the ring. .TP -.B \-\-keyhlcolor=rrggbbaa -Sets the color of the ring 'highlight' strokes that appear upon keypress. +.B \-\-{verif, wrong}\-color=rrggbbaa +Sets the color of the status text while verifying and when password is wrong. .TP -.B \-\-bshlcolor=rrggbbaa -Sets the color of the ring 'highlight' strokes that appear upon backspace. +.B \-\-{layout, time, date, greeter}\-color=rrggbbaa +Sets text colors. .TP -.B \-\-separatorcolor=rrggbbaa -Sets the color of the 'separtor', which is at both ends of the ring highlights. +.B \-\-time\-str="%H:%M:%S" +Sets the format used for generating the time string. +See strftime(3) for a full list of format specifiers. .TP -.B \-\-verifcolor=rrggbbaa -Sets the color of the status text while verifying. +.B \-\-date\-str="%A, %m %Y" +Sets the format used for generating the date string. .TP -.B \-\-wrongcolor=rrggbbaa -Sets the color of the status text when "wrong". +.B \-\-verif\-text="verifying…" +Sets the string to be shown while verifying the password/input/key/etc. .TP -.B \-\-layoutcolor=rrggbbaa -Sets the color of the keyboard layout text. +.B \-\-wrong\-text="wrong!" +Sets the string to be shown upon entering an incorrect password. .TP -.B \-\-indpos="x position:y position" -Sets the position for the unlock indicator. Valid variables include: +.B \-\-keylayout mode +Displays the keylayout. Positionable similar to date, time, and indicator. +Modes are as follows: .RS .RS -x - x position of the current display. Corresponds to the leftmost row of pixels on that display. -y - y position of the current display. Corresponds to the topmost row of pixels on that display. -w - width of the current display. -h - height of the current display. -r - the unlock indicator radius. +0 - Displays the full string returned by the query, i.e. "English (US)" +1 - Displays up until the first parenthesis, i.e. "English" +2 - Displays just the contents of the parenthesis, i.e. "US" .RE .RE .TP -.B \-\-timecolor=rrggbbaa -Sets the color of the time in the clock. +.B \-\-noinput\-text="no input" +Sets the string to be shown upon pressing backspace without anything to delete. .TP -.B \-\-timestr="%H:%M:%S" -Sets the format used for generating the time string. See strftime(3) for a full list of format specifiers. +.B \-\-lock\-text="locking…" +Sets the string to be shown while acquiring pointer and keyboard focus. .TP -.B \-\-timepos="x position:y position" -Sets the position for the time string. All the variables from \-\-indpos may be used, in addition to: -.RS -.RS -ix - the x value of the indicator on the current display. -iy - the y value of the indicator on the current display. -.RE -.RE +.B \-\-lockfailed\-text="lock failed!" +Sets the string to be shown after failing to acquire pointer and keyboard focus. .TP -.B \-\-time\-align, \-\-date\-align, \-\-layout\-align, \-\-verif\-align, \-\-wrong\-align, \-\-modif\-align, \-\-greeter\-align -Sets the text alignment of the time, date, keylayout, verification text, wrong text, modifier text and greeter text. +.B \-\-greeter\-text="" +Sets the greeter text. + +.TP +.B \-\-no\-modkey\-text +Hides the modkey indicator (Num, Caps Lock ...) + +.TP +.B \-\-{time, date, layout, verif, wrong, modif, greeter}\-align +Sets the text alignment of the time, date, keylayout, verification, wrong, +modifier and greeter texts. .RS .RS 0 - centered (default) @@ -307,100 +281,85 @@ Sets the text alignment of the time, date, keylayout, verification text, wrong t .RE .TP -.B \-\-datecolor=rrggbbaa -Sets the color of the date in the clock. - -.TP -.B \-\-datestr="%A, %m %Y" -Sets the format used for generating the date string. See strftime(3) for a full list of format specifiers. +.B \-\-{time, date, layout, verif, wrong, greeter}outline\-color=rrggbbaa +Sets the color of the outlines. .TP .B \-\-{time, date, layout, verif, wrong, greeter}\-font=sans\-serif Sets the font used to render various strings. .TP -.B \-\-{time, date, layout, verif, wrong, greeter}size=number +.B \-\-{time, date, layout, verif, wrong, greeter}\-size=number Sets the font size used to render various strings. .TP -.B \-\-{time, date, layout, verif, wrong, greeter}outlinecolor=rrggbbaa -Sets the color of the outline. - -.TP -.B \-\-{time, date, layout, verif, wrong, greeter, modifier}outlinewidth=number +.B \-\-{time, date, layout, verif, wrong, greeter, modifier}outline\-width=number Sets the width of the outline. .TP -.B \-\-datepos="x position:y position" -Sets the position for the date string. All the variables from \-\-indpos and \-\-timepos may be used, in addition to: +.B \-\-ind\-pos="x\-position:y\-position" +Sets the position for the unlock indicator. Valid variables include: .RS .RS -tx - the computed x value of the timestring, for the current display. -ty - the computed y value of the timestring, for the current display. +x - x position of the current display. + Corresponds to the leftmost column of pixels on that display. +y - y position of the current display. + Corresponds to the topmost row of pixels on that display. +w - width of the current display. +h - height of the current display. +r - the unlock indicator radius. .RE .RE .TP -.B \-\-greetertext="text" -Sets the greeter text. Defaults to "". - -.TP -.B \-\-greetercolor=rrggbbaa -Sets the color of the greeter text. - -.TP -.B \-\-greeterpos="x position:y position" -Sets the position for the greeter string. All the variables from \-\-indpos and \-\-timepos may be used. - -.TP -.B \-\-refresh\-rate=seconds\-as\-double -The refresh rate of the indicator, given in seconds. This should automatically align itself, but is somewhat buggy currently. -Values less than one will work, but may result in poor system performance. - -.TP -.B \-\-veriftext="text" -Sets the string to be shown while verifying the password/input/key/etc. Defaults to "verifying…". - -.TP -.B \-\-wrongtext="text" -Sets the string to be shown upon entering an incorrect password. Defaults to "wrong!". - -.TP -.B \-\-noinputtext="text" -Sets the string to be shown upon pressing backspace without anything to delete. Defaults to "no input". - -.TP -.B \-\-locktext="text" -Sets the string to be shown while acquiring pointer and keyboard focus. Defaults to "locking…". - -.TP -.B \-\-lockfailedtext="text" -Sets the string to be shown after failing to acquire pointer and keyboard focus. Defaults to "lock failed!". +.B \-\-time\-pos="x\-position:y\-position" +Sets the position for the time string. All the variables from \-\-indpos may be +used, in addition to: +.RS +.RS +ix - the x value of the indicator on the current display. +iy - the y value of the indicator on the current display. +.RE +.RE .TP -.B \-\-no-modkeytext -Hides the modkey indicator (Num, Caps Lock ...) +.B \-\-date\-pos="x\-position:y\-position" +Sets the position for the date string. All the variables from \-\-indpos and +\-\-timepos may be used, in addition to: +.RS +.RS +tx - the computed x value of the timestring, for the current display. +ty - the computed y value of the timestring, for the current display. +.RE +.RE .TP -.B \-\-radius -The radius of the circle. Defaults to 90. +.B \-\-greeter\-pos="x\-position:y\-position" +Sets the position for the greeter string. All the variables from \-\-indpos and +\-\-timepos may be used. .TP -.B \-\-ring\-width -The width of the ring unlock indicator. Defaults to 7.0. +.B \-\-pass\-{media, screen, power, volume}\-keys +Allow the following keys to be used normally while the screen is locked by +passing them through: +.RS +.RS +media - XF86AudioPlay, XF86AudioPause, XF86AudioStop, XF86AudioPrev, + XF86AudioNext, XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume +screen - XF86MonBrightnessUp, XF86MonBrightnessDown +power - XF86PowerDown, XF86PowerOff, XF86Sleep +volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume +.RE +.RE .TP .B \-\-bar\-indicator -Replaces the usual ring indicator with a bar indicator, with a variety of options. - -.TP -.B \-\-redraw\-thread -Starts a separate thread for redrawing the screen. Potentially worse for security, but makes the bar indicator still do -its usual periodic redraws when PAM is authenticating. +Replaces the usual ring indicator with a bar indicator. Comes with perks. .TP .B \-\-bar\-direction={0, 1, 2} -Sets the direction the bars grow in. 0 is the default (downwards, or rightwards, depending on the bar orientation). 1 is the reverse, and 2 is both. +Sets the direction the bars grow in. 0 is the default (downwards, or rightwards, +depending on the bar orientation). 1 is the reverse, and 2 is both. .TP .B \-\-bar\-width=15 @@ -410,22 +369,24 @@ Sets the width of the minibars in the bar. .TP .B \-\-bar\-orientation={vertical,horizontal} -Sets whether the bar is vertically or horizontally oriented. Defaults to horizontal. +Sets whether the bar is vertically or horizontally oriented. +Defaults to horizontal. .TP .B \-\-bar\-step -Sets the step that each bar decreases by when a key is pressed. A random bar is set to its max height, -and then each neighbor is set to (height - step*distance). +Sets the step that each bar decreases by when a key is pressed. A random bar is +set to its max height, then each neighbor is set to (height - step*distance). .TP .B \-\-bar\-max\-height -The maximum height a bar can get to. When a key is pressed, a random bar is set to this value, -and then its neighbors are set to its height, minus the step value. +The maximum height a bar can get to. When a key is pressed, a random bar is set +to this value, then its neighbors are set to its height, minus the step value. .TP .B \-\-bar\-base\-width The thickness of the "base" bar that all the bars originate from. -This bar also takes on the ring verif and wrong colors to give authentication feedback. +This bar also takes on the ring verification and wrong colors to give +authentication feedback. .TP .B \-\-bar\-color @@ -436,10 +397,10 @@ Sets the default color of the bar base. The value by which the bars decrease each time the screen is redrawn. .TP -.B \-\-bar\-position -Works similarly to the time/date/indicator expressions. If only one number is provided, this sets -the vertical offset from the top or left edge. If two numbers are provided in the form of x:y, sets -the starting position of the bar. +.B \-\-bar\-pos +Works similarly to the time/date/indicator expressions. If only one number is +provided, this sets the vertical offset from the top or left edge. If two +numbers are provided in the form of x:y, sets the starting position of the bar. .TP .B \-\-bar\-count @@ -449,29 +410,37 @@ Sets the number of minibars to draw on each screen. .B \-\-bar\-total\-width The total width of the bar. Can be an expression. +.TP +.B \-\-redraw\-thread +Starts a separate thread for redrawing the screen. Potentially worse from a +security standpoint, but makes the bar indicator still do its usual periodic +redraws when PAM is authenticating. + +.TP +.B \-\-refresh\-rate=seconds\-as\-double +The refresh rate of the indicator, given in seconds. This should automatically +align itself, but is somewhat buggy currently. +Values less than one will work, but may result in poor system performance. + +.TP +.B \-\-composite +Some compositors have problems with i3lock trying to render over them, so this +argument is disabled by default. However, some will work properly with it, so +it's been left enabled. + .TP .B \-\-no\-verify Do not verify the password entered by the user and unlock immediately. -.B Use only for quickly testing new configurations and remember to remove to actually lock your screen! - -.SH DPMS -The \-d (\-\-dpms) option was removed from i3lock in version 2.8. There were -plenty of use-cases that were not properly addressed, and plenty of bugs -surrounding that feature. While features are not normally removed from i3 and -its tools, we felt the need to make an exception in this case. -Users who wish to explicitly enable DPMS only when their screen is locked can -use a wrapper script around i3lock like the following: -.Vb 6 -\& #!/bin/sh -\& revert() { -\& xset dpms 0 0 0 -\& } -\& trap revert HUP INT TERM -\& xset +dpms dpms 5 5 5 -\& i3lock -n -\& revert -.Ve -The \-I (\-\-inactivity\-timeout=seconds) was removed because it only makes sense with DPMS. +.B Use only for quickly testing new configurations and remember to remove to +.B actually lock your screen! + +.TP +.B \-\-slideshow\-interval +The interval to wait until switching to the next image. + +.TP +.B \-\-slideshow\-random\-selection +Randomize the order of the images. .SH SEE ALSO .IR xautolock(1) diff --git a/i3lock.c b/i3lock.c index 899778e6..c1a24f23 100644 --- a/i3lock.c +++ b/i3lock.c @@ -3,7 +3,7 @@ * * © 2010 Michael Stapelberg * © 2015 Cassandra Fox - * © 2020 Raymond Li + * © 2021 Raymond Li * * See LICENSE for licensing information * @@ -1436,38 +1436,38 @@ int main(int argc, char *argv[]) { {"ignore-empty-password", no_argument, NULL, 'e'}, {"inactivity-timeout", required_argument, NULL, 'I'}, {"show-failed-attempts", no_argument, NULL, 'f'}, + {"screen", required_argument, NULL, 'S'}, + {"blur", required_argument, NULL, 'B'}, // options for unlock indicator colors - {"insidevercolor", required_argument, NULL, 300}, - {"insidewrongcolor", required_argument, NULL, 301}, - {"insidecolor", required_argument, NULL, 302}, - {"ringvercolor", required_argument, NULL, 303}, - {"ringwrongcolor", required_argument, NULL, 304}, - {"ringcolor", required_argument, NULL, 305}, - {"linecolor", required_argument, NULL, 306}, - {"verifcolor", required_argument, NULL, 307}, - {"wrongcolor", required_argument, NULL, 308}, - {"layoutcolor", required_argument, NULL, 309}, - {"timecolor", required_argument, NULL, 310}, - {"datecolor", required_argument, NULL, 311}, - {"keyhlcolor", required_argument, NULL, 312}, - {"bshlcolor", required_argument, NULL, 313}, - {"separatorcolor", required_argument, NULL, 314}, - {"greetercolor", required_argument, NULL, 315}, + {"insidever-color", required_argument, NULL, 300}, + {"insidewrong-color", required_argument, NULL, 301}, + {"inside-color", required_argument, NULL, 302}, + {"ringver-color", required_argument, NULL, 303}, + {"ringwrong-color", required_argument, NULL, 304}, + {"ring-color", required_argument, NULL, 305}, + {"line-color", required_argument, NULL, 306}, + {"verif-color", required_argument, NULL, 307}, + {"wrong-color", required_argument, NULL, 308}, + {"layout-color", required_argument, NULL, 309}, + {"time-color", required_argument, NULL, 310}, + {"date-color", required_argument, NULL, 311}, + {"keyhl-color", required_argument, NULL, 312}, + {"bshl-color", required_argument, NULL, 313}, + {"separator-color", required_argument, NULL, 314}, + {"greeter-color", required_argument, NULL, 315}, // text outline colors - {"verifoutlinecolor", required_argument, NULL, 316}, - {"wrongoutlinecolor", required_argument, NULL, 317}, - {"layoutoutlinecolor", required_argument, NULL, 318}, - {"timeoutlinecolor", required_argument, NULL, 319}, - {"dateoutlinecolor", required_argument, NULL, 320}, - {"greeteroutlinecolor", required_argument, NULL, 321}, + {"verifoutline-color", required_argument, NULL, 316}, + {"wrongoutline-color", required_argument, NULL, 317}, + {"layoutoutline-color", required_argument, NULL, 318}, + {"timeoutline-color", required_argument, NULL, 319}, + {"dateoutline-color", required_argument, NULL, 320}, + {"greeteroutline-color", required_argument, NULL, 321}, {"line-uses-ring", no_argument, NULL, 'r'}, {"line-uses-inside", no_argument, NULL, 's'}, - {"screen", required_argument, NULL, 'S'}, - {"blur", required_argument, NULL, 'B'}, {"clock", no_argument, NULL, 'k'}, {"force-clock", no_argument, NULL, 400}, {"indicator", no_argument, NULL, 401}, @@ -1484,16 +1484,16 @@ int main(int argc, char *argv[]) { {"greeter-align", required_argument, NULL, 506}, // string stuff - {"timestr", required_argument, NULL, 510}, - {"datestr", required_argument, NULL, 511}, - {"veriftext", required_argument, NULL, 512}, - {"wrongtext", required_argument, NULL, 513}, + {"time-str", required_argument, NULL, 510}, + {"date-str", required_argument, NULL, 511}, + {"verif-text", required_argument, NULL, 512}, + {"wrong-text", required_argument, NULL, 513}, {"keylayout", required_argument, NULL, 514}, - {"noinputtext", required_argument, NULL, 515}, - {"locktext", required_argument, NULL, 516}, - {"lockfailedtext", required_argument, NULL, 517}, - {"greetertext", required_argument, NULL, 518}, - {"no-modkeytext", no_argument, NULL, 519}, + {"noinput-text", required_argument, NULL, 515}, + {"lock-text", required_argument, NULL, 516}, + {"lockfailed-text", required_argument, NULL, 517}, + {"greeter-text", required_argument, NULL, 518}, + {"no-modkey-text", no_argument, NULL, 519}, // fonts {"time-font", required_argument, NULL, 520}, @@ -1504,33 +1504,33 @@ int main(int argc, char *argv[]) { {"greeter-font", required_argument, NULL, 525}, // text size - {"timesize", required_argument, NULL, 530}, - {"datesize", required_argument, NULL, 531}, - {"verifsize", required_argument, NULL, 532}, - {"wrongsize", required_argument, NULL, 533}, - {"layoutsize", required_argument, NULL, 534}, - {"modsize", required_argument, NULL, 535}, - {"greetersize", required_argument, NULL, 536}, + {"time-size", required_argument, NULL, 530}, + {"date-size", required_argument, NULL, 531}, + {"verif-size", required_argument, NULL, 532}, + {"wrong-size", required_argument, NULL, 533}, + {"layout-size", required_argument, NULL, 534}, + {"modif-size", required_argument, NULL, 535}, + {"greeter-size", required_argument, NULL, 536}, // text/indicator positioning - {"timepos", required_argument, NULL, 540}, - {"datepos", required_argument, NULL, 541}, - {"verifpos", required_argument, NULL, 542}, - {"wrongpos", required_argument, NULL, 543}, - {"layoutpos", required_argument, NULL, 544}, - {"statuspos", required_argument, NULL, 545}, - {"modifpos", required_argument, NULL, 546}, - {"indpos", required_argument, NULL, 547}, - {"greeterpos", required_argument, NULL, 548}, + {"time-pos", required_argument, NULL, 540}, + {"date-pos", required_argument, NULL, 541}, + {"verif-pos", required_argument, NULL, 542}, + {"wrong-pos", required_argument, NULL, 543}, + {"layout-pos", required_argument, NULL, 544}, + {"status-pos", required_argument, NULL, 545}, + {"modif-pos", required_argument, NULL, 546}, + {"ind-pos", required_argument, NULL, 547}, + {"greeter-pos", required_argument, NULL, 548}, // text outline width - {"timeoutlinewidth", required_argument, NULL, 560}, - {"dateoutlinewidth", required_argument, NULL, 561}, - {"verifoutlinewidth", required_argument, NULL, 562}, - {"wrongoutlinewidth", required_argument, NULL, 563}, - {"modifieroutlinewidth", required_argument, NULL, 564}, - {"layoutoutlinewidth", required_argument, NULL, 565}, - {"greeteroutlinewidth", required_argument, NULL, 566}, + {"timeoutline-width", required_argument, NULL, 560}, + {"dateoutline-width", required_argument, NULL, 561}, + {"verifoutline-width", required_argument, NULL, 562}, + {"wrongoutline-width", required_argument, NULL, 563}, + {"modifieroutline-width", required_argument, NULL, 564}, + {"layoutoutline-width", required_argument, NULL, 565}, + {"greeteroutline-width", required_argument, NULL, 566}, // pass keys {"pass-media-keys", no_argument, NULL, 601}, @@ -1548,7 +1548,7 @@ int main(int argc, char *argv[]) { {"bar-base-width", required_argument, NULL, 706}, {"bar-color", required_argument, NULL, 707}, {"bar-periodic-step", required_argument, NULL, 708}, - {"bar-position", required_argument, NULL, 709}, + {"bar-pos", required_argument, NULL, 709}, {"bar-count", required_argument, NULL, 710}, {"bar-total-width", required_argument, NULL, 711}, @@ -1599,7 +1599,7 @@ int main(int argc, char *argv[]) { while ((o = getopt_long(argc, argv, optstring, longopts, &longoptind)) != -1) { switch (o) { case 'v': - errx(EXIT_SUCCESS, "version " I3LOCK_VERSION " © 2010 Michael Stapelberg, © 2015 Cassandra Fox, © 2020 Raymond Li"); + errx(EXIT_SUCCESS, "version " I3LOCK_VERSION " © 2010 Michael Stapelberg, © 2015 Cassandra Fox, © 2021 Raymond Li"); case 'n': dont_fork = true; break; From 8a97f7c620f8e0907fc0b2c579006ad1e3c879b0 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 27 May 2021 19:52:59 -0400 Subject: [PATCH 119/183] Update copyright --- LICENSE | 2 +- m4/ax_extend_srcdir.m4 | 2 +- m4/ax_sanitizers.m4 | 2 +- randr.c | 2 +- unlock_indicator.c | 2 +- xcb.c | 4 ++-- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/LICENSE b/LICENSE index b6172fe7..f05cafe5 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ Copyright © 2010-2011, Michael Stapelberg Copyright © 2015, Cassandra Fox -Copyright © 2020, Raymond Li +Copyright © 2021, Raymond Li All rights reserved. Redistribution and use in source and binary forms, with or without diff --git a/m4/ax_extend_srcdir.m4 b/m4/ax_extend_srcdir.m4 index 5b219c59..d3fdc5d5 100644 --- a/m4/ax_extend_srcdir.m4 +++ b/m4/ax_extend_srcdir.m4 @@ -63,7 +63,7 @@ # LICENSE # # Copyright (c) 2016 Michael Stapelberg -# Copyright (c) 2020 Raymond Li +# Copyright (c) 2021 Raymond Li # # Copying and distribution of this file, with or without modification, are # permitted in any medium without royalty provided the copyright notice diff --git a/m4/ax_sanitizers.m4 b/m4/ax_sanitizers.m4 index 7d277079..0a37835b 100644 --- a/m4/ax_sanitizers.m4 +++ b/m4/ax_sanitizers.m4 @@ -69,7 +69,7 @@ # LICENSE # # Copyright (c) 2016 Michael Stapelberg -# Copyright (c) 2020 Raymond Li +# Copyright (c) 2021 Raymond Li # # Copying and distribution of this file, with or without modification, # are permitted in any medium without royalty provided the copyright diff --git a/randr.c b/randr.c index 3d783dc0..1a8c194d 100644 --- a/randr.c +++ b/randr.c @@ -2,7 +2,7 @@ * vim:ts=4:sw=4:expandtab * * © 2010 Michael Stapelberg - * © 2020 Raymond Li + * © 2021 Raymond Li * * See LICENSE for licensing information * diff --git a/unlock_indicator.c b/unlock_indicator.c index 08deaab5..ee6bb26e 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -3,7 +3,7 @@ * * © 2010 Michael Stapelberg * © 2015 Cassandra Fox - * © 2020 Raymond Li + * © 2021 Raymond Li * * See LICENSE for licensing information * diff --git a/xcb.c b/xcb.c index adafb76e..ae462b08 100644 --- a/xcb.c +++ b/xcb.c @@ -1,8 +1,8 @@ /* * vim:ts=4:sw=4:expandtab * - * © 2010 Michael - * @ © 2020 Raymond Li + * © 2010 Michael Stapelberg + * © 2021 Raymond Li * * xcb.c: contains all functions which use XCB to talk to X11. Mostly wrappers * around the rather complicated/ugly parts of the XCB API. From e56912aa2c1cc2dd5cbc6066783799851926fb20 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 27 May 2021 19:55:13 -0400 Subject: [PATCH 120/183] Fix build test --- .github/workflows/Build Test.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/Build Test.yml b/.github/workflows/Build Test.yml index 5bd4dd55..a3ecf16b 100644 --- a/.github/workflows/Build Test.yml +++ b/.github/workflows/Build Test.yml @@ -11,9 +11,9 @@ jobs: 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 - name: Build - - run: ./build.sh + run: ./build.sh - name: Check and distcheck - - run: | + run: | cd build make check make distcheck From a0984eb826ff5649dd3bb1f16884e8854c1f8263 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 27 May 2021 19:56:27 -0400 Subject: [PATCH 121/183] Release 2.13.c.3 --- I3LOCK_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/I3LOCK_VERSION b/I3LOCK_VERSION index 23512788..86245041 100644 --- a/I3LOCK_VERSION +++ b/I3LOCK_VERSION @@ -1 +1 @@ -2.13.c.2 +2.13.c.3 From 6378494e970bc6548a4c30900b7849efd9ad5798 Mon Sep 17 00:00:00 2001 From: souravdas142 Date: Fri, 28 May 2021 17:37:47 +0530 Subject: [PATCH 122/183] Support added for --modif-color, --modifoutline-color Previously modifier colors are effected only with `--wrong-color` and `--wrongoutline-color` options. Which is quite inconvient for modifier keys. So I separate them which make it more flexible to color the modifier text. --- i3lock.c | 10 ++++++++++ unlock_indicator.c | 10 ++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index c1a24f23..8b22feb8 100644 --- a/i3lock.c +++ b/i3lock.c @@ -85,6 +85,7 @@ char wrongcolor[9] = "000000ff"; char layoutcolor[9] = "000000ff"; char timecolor[9] = "000000ff"; char datecolor[9] = "000000ff"; +char modifcolor[9] = "ffffffff"; char keyhlcolor[9] = "33db00ff"; char bshlcolor[9] = "db3300ff"; char separatorcolor[9] = "000000ff"; @@ -95,6 +96,7 @@ char wrongoutlinecolor[9] = "00000000"; char layoutoutlinecolor[9] = "00000000"; char timeoutlinecolor[9] = "00000000"; char dateoutlinecolor[9] = "00000000"; +char modifoutlinecolor[9] = "00000000"; char greeteroutlinecolor[9] = "00000000"; /* int defining which display the lock indicator should be shown on. If -1, then show on all displays.*/ @@ -1452,6 +1454,7 @@ int main(int argc, char *argv[]) { {"layout-color", required_argument, NULL, 309}, {"time-color", required_argument, NULL, 310}, {"date-color", required_argument, NULL, 311}, + {"modif-color", required_argument, NULL, 322}, {"keyhl-color", required_argument, NULL, 312}, {"bshl-color", required_argument, NULL, 313}, {"separator-color", required_argument, NULL, 314}, @@ -1463,6 +1466,7 @@ int main(int argc, char *argv[]) { {"layoutoutline-color", required_argument, NULL, 318}, {"timeoutline-color", required_argument, NULL, 319}, {"dateoutline-color", required_argument, NULL, 320}, + {"modifoutline-color", required_argument, NULL, 323}, {"greeteroutline-color", required_argument, NULL, 321}, {"line-uses-ring", no_argument, NULL, 'r'}, @@ -1739,6 +1743,12 @@ int main(int argc, char *argv[]) { break; case 321: parse_color(greeteroutlinecolor); + break; + case 322: + parse_color(modifcolor); + break; + case 323: + parse_color(modifoutlinecolor); break; diff --git a/unlock_indicator.c b/unlock_indicator.c index ee6bb26e..4af6e078 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -88,6 +88,7 @@ extern char wrongcolor[9]; extern char layoutcolor[9]; extern char timecolor[9]; extern char datecolor[9]; +extern char modifcolor[9]; extern char keyhlcolor[9]; extern char bshlcolor[9]; extern char separatorcolor[9]; @@ -99,6 +100,7 @@ extern char wrongoutlinecolor[9]; extern char layoutoutlinecolor[9]; extern char timeoutlinecolor[9]; extern char dateoutlinecolor[9]; +extern char modifoutlinecolor[9]; extern char greeteroutlinecolor[9]; extern int screen_number; @@ -202,6 +204,7 @@ rgba_t wrong16; rgba_t layout16; rgba_t time16; rgba_t date16; +rgba_t modif16; rgba_t keyhl16; rgba_t bshl16; rgba_t sep16; @@ -214,6 +217,7 @@ rgba_t wrongoutline16; rgba_t layoutoutline16; rgba_t timeoutline16; rgba_t dateoutline16; +rgba_t modifoutline16; rgba_t greeteroutline16; // experimental bar stuff @@ -580,6 +584,7 @@ void init_colors_once(void) { colorgen(&tmp, layoutcolor, &layout16); colorgen(&tmp, timecolor, &time16); colorgen(&tmp, datecolor, &date16); + colorgen(&tmp, modifcolor, &modif16); colorgen(&tmp, keyhlcolor, &keyhl16); colorgen(&tmp, bshlcolor, &bshl16); colorgen(&tmp, separatorcolor, &sep16); @@ -592,6 +597,7 @@ void init_colors_once(void) { colorgen(&tmp, layoutoutlinecolor, &layoutoutline16); colorgen(&tmp, timeoutlinecolor, &timeoutline16); colorgen(&tmp, dateoutlinecolor, &dateoutline16); + colorgen(&tmp, modifoutlinecolor, &modifoutline16); colorgen(&tmp, greeteroutlinecolor, &greeteroutline16); } @@ -797,8 +803,8 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { draw_data.mod_text.outline_width = modifieroutlinewidth; draw_data.mod_text.font = get_font_face(WRONG_FONT); draw_data.mod_text.align = modif_align; - draw_data.mod_text.color = wrong16; - draw_data.mod_text.outline_color = wrongoutline16; + draw_data.mod_text.color = modif16; + draw_data.mod_text.outline_color = modifoutline16; } if (layout_text) { From 1eba26c25b8bd160b16f8d35de86cf61a1684c66 Mon Sep 17 00:00:00 2001 From: souravdas142 Date: Fri, 28 May 2021 17:59:12 +0530 Subject: [PATCH 123/183] man page: Added --modif-color, --modifoutline-color --- i3lock.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 3627af85..973c3f47 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -212,7 +212,7 @@ Sets the color of highlight arcs on the ring upon keypress and backspace. Sets the color of the seperators at both ends of the highlight arcs on the ring. .TP -.B \-\-{verif, wrong}\-color=rrggbbaa +.B \-\-{verif, wrong, modif}\-color=rrggbbaa Sets the color of the status text while verifying and when password is wrong. .TP @@ -281,7 +281,7 @@ modifier and greeter texts. .RE .TP -.B \-\-{time, date, layout, verif, wrong, greeter}outline\-color=rrggbbaa +.B \-\-{time, date, layout, verif, wrong, greeter, modif}outline\-color=rrggbbaa Sets the color of the outlines. .TP From 50eccdc24e4d227d994167304238c1234b2adc21 Mon Sep 17 00:00:00 2001 From: JeppeX Date: Fri, 28 May 2021 16:54:27 +0300 Subject: [PATCH 124/183] Updated examples (#214) * Updated examples * Removed excess newline from the bottom --- examples/lock.sh | 34 +++++++++++++++++----------------- examples/lock_bar.sh | 24 ++++++++++++------------ 2 files changed, 29 insertions(+), 29 deletions(-) diff --git a/examples/lock.sh b/examples/lock.sh index 14e84024..cb0a18b9 100644 --- a/examples/lock.sh +++ b/examples/lock.sh @@ -8,29 +8,29 @@ W='#880000bb' # wrong V='#bb00bbbb' # verifying i3lock \ ---insidevercolor=$C \ ---ringvercolor=$V \ +--insidever-color=$C \ +--ringver-color=$V \ \ ---insidewrongcolor=$C \ ---ringwrongcolor=$W \ +--insidewrong-color=$C \ +--ringwrong-color=$W \ \ ---insidecolor=$B \ ---ringcolor=$D \ ---linecolor=$B \ ---separatorcolor=$D \ +--inside-color=$B \ +--ring-color=$D \ +--line-color=$B \ +--separator-color=$D \ \ ---verifcolor=$T \ ---wrongcolor=$T \ ---timecolor=$T \ ---datecolor=$T \ ---layoutcolor=$T \ ---keyhlcolor=$W \ ---bshlcolor=$W \ +--verif-color=$T \ +--wrong-color=$T \ +--time-color=$T \ +--date-color=$T \ +--layout-color=$T \ +--keyhl-color=$W \ +--bshl-color=$W \ \ --screen 1 \ --blur 5 \ --clock \ --indicator \ ---timestr="%H:%M:%S" \ ---datestr="%A, %m %Y" \ +--time-str="%H:%M:%S" \ +--date-str="%A, %m %Y" \ --keylayout 1 \ diff --git a/examples/lock_bar.sh b/examples/lock_bar.sh index db1de453..019a4574 100644 --- a/examples/lock_bar.sh +++ b/examples/lock_bar.sh @@ -10,29 +10,29 @@ V='#bb00bbbb' # verifying i3lock \ --blur 5 \ --bar-indicator \ ---bar-position y+h \ +--bar-pos y+h \ --bar-direction 1 \ --bar-max-height 50 \ --bar-base-width 50 \ --bar-color 000000cc \ ---keyhlcolor 880088cc \ +--keyhl-color 880088cc \ --bar-periodic-step 50 \ --bar-step 50 \ --redraw-thread \ \ --clock \ --force-clock \ ---timepos x+5:y+h-80 \ ---timecolor 880088ff \ ---datepos tx:ty+15 \ ---datecolor 990099ff \ +--time-pos x+5:y+h-80 \ +--time-color 880088ff \ +--date-pos tx:ty+15 \ +--date-color 990099ff \ --date-align 1 \ --time-align 1 \ ---ringvercolor 8800ff88 \ ---ringwrongcolor ff008888 \ ---statuspos x+5:y+h-16 \ +--ringver-color 8800ff88 \ +--ringwrong-color ff008888 \ +--status-pos x+5:y+h-16 \ --verif-align 1 \ --wrong-align 1 \ ---verifcolor ffffffff \ ---wrongcolor ffffffff \ ---modifpos -50:-50 +--verif-color ffffffff \ +--wrong-color ffffffff \ +--modif-pos -50:-50 From fab80ce51eb179290062478fdae664e2e8616791 Mon Sep 17 00:00:00 2001 From: Benjamin Betti Date: Fri, 28 May 2021 16:11:35 +0200 Subject: [PATCH 125/183] Fix old options still present in manpage (#216) Fix references to some now-removed pre #208 options in the manpage Co-authored-by: Raymond Li --- i3lock.1 | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 3627af85..88fc7df5 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -200,7 +200,7 @@ Sets the color for the line separating the inside circle and the outer ring. .TP .B \-\-line\-uses\-{inside, ring} -Overrides \-\-linecolor. The line will match the {inside, ring} color. +Overrides \-\-line\-color. The line will match the {inside, ring} color. Note: these two options conflict with each other. .TP @@ -313,7 +313,7 @@ r - the unlock indicator radius. .TP .B \-\-time\-pos="x\-position:y\-position" -Sets the position for the time string. All the variables from \-\-indpos may be +Sets the position for the time string. All the variables from \-\-ind\-pos may be used, in addition to: .RS .RS @@ -324,8 +324,8 @@ iy - the y value of the indicator on the current display. .TP .B \-\-date\-pos="x\-position:y\-position" -Sets the position for the date string. All the variables from \-\-indpos and -\-\-timepos may be used, in addition to: +Sets the position for the date string. All the variables from \-\-ind\-pos and +\-\-time\-pos may be used, in addition to: .RS .RS tx - the computed x value of the timestring, for the current display. @@ -335,8 +335,8 @@ ty - the computed y value of the timestring, for the current display. .TP .B \-\-greeter\-pos="x\-position:y\-position" -Sets the position for the greeter string. All the variables from \-\-indpos and -\-\-timepos may be used. +Sets the position for the greeter string. All the variables from \-\-ind\-pos and +\-\-time\-pos may be used. .TP .B \-\-pass\-{media, screen, power, volume}\-keys From a52a7c333912d241105ff9d8315e2f127c925884 Mon Sep 17 00:00:00 2001 From: Swarth <70660340+Swarthe@users.noreply.github.com> Date: Sat, 29 May 2021 00:08:48 +0200 Subject: [PATCH 126/183] Clarify brace behaviour (#217) (#218) * Clarify brace behaviour (#217) * Add comment Co-authored-by: Raymond Li --- i3lock.1 | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/i3lock.1 b/i3lock.1 index 88fc7df5..43795ade 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -184,7 +184,9 @@ The width of the ring unlock indicator. Defaults to 7.0. .TP .B \-\-{inside, ring}\-color=rrggbbaa -Sets the idle color for the interior circle and ring. +Sets the idle color for the interior circle and ring. Note: use individual +options per element unless the shell supports brace expansion (in which case +remove the spaces inside the curly braces). .TP .B \-\-{inside, ring}ver\-color=rrggbbaa From 0c442b197327d7d53c03337f188b76cc8f454867 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 28 May 2021 18:11:56 -0400 Subject: [PATCH 127/183] Make default color the same as other text --- i3lock.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/i3lock.c b/i3lock.c index 8b22feb8..3ad92f2d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -85,7 +85,7 @@ char wrongcolor[9] = "000000ff"; char layoutcolor[9] = "000000ff"; char timecolor[9] = "000000ff"; char datecolor[9] = "000000ff"; -char modifcolor[9] = "ffffffff"; +char modifcolor[9] = "000000ff"; char keyhlcolor[9] = "33db00ff"; char bshlcolor[9] = "db3300ff"; char separatorcolor[9] = "000000ff"; @@ -96,8 +96,8 @@ char wrongoutlinecolor[9] = "00000000"; char layoutoutlinecolor[9] = "00000000"; char timeoutlinecolor[9] = "00000000"; char dateoutlinecolor[9] = "00000000"; -char modifoutlinecolor[9] = "00000000"; char greeteroutlinecolor[9] = "00000000"; +char modifoutlinecolor[9] = "00000000"; /* int defining which display the lock indicator should be shown on. If -1, then show on all displays.*/ int screen_number = 0; @@ -1466,8 +1466,8 @@ int main(int argc, char *argv[]) { {"layoutoutline-color", required_argument, NULL, 318}, {"timeoutline-color", required_argument, NULL, 319}, {"dateoutline-color", required_argument, NULL, 320}, - {"modifoutline-color", required_argument, NULL, 323}, {"greeteroutline-color", required_argument, NULL, 321}, + {"modifoutline-color", required_argument, NULL, 323}, {"line-uses-ring", no_argument, NULL, 'r'}, {"line-uses-inside", no_argument, NULL, 's'}, From 176e75ef9a40708010c55968718b28a7ca1f577d Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 28 May 2021 18:13:40 -0400 Subject: [PATCH 128/183] Standardize arg order --- unlock_indicator.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index 4af6e078..eb6b7682 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -100,8 +100,8 @@ extern char wrongoutlinecolor[9]; extern char layoutoutlinecolor[9]; extern char timeoutlinecolor[9]; extern char dateoutlinecolor[9]; -extern char modifoutlinecolor[9]; extern char greeteroutlinecolor[9]; +extern char modifoutlinecolor[9]; extern int screen_number; extern float refresh_rate; @@ -217,8 +217,8 @@ rgba_t wrongoutline16; rgba_t layoutoutline16; rgba_t timeoutline16; rgba_t dateoutline16; -rgba_t modifoutline16; rgba_t greeteroutline16; +rgba_t modifoutline16; // experimental bar stuff @@ -597,8 +597,8 @@ void init_colors_once(void) { colorgen(&tmp, layoutoutlinecolor, &layoutoutline16); colorgen(&tmp, timeoutlinecolor, &timeoutline16); colorgen(&tmp, dateoutlinecolor, &dateoutline16); - colorgen(&tmp, modifoutlinecolor, &modifoutline16); colorgen(&tmp, greeteroutlinecolor, &greeteroutline16); + colorgen(&tmp, modifoutlinecolor, &modifoutline16); } static te_expr *compile_expression(const char *const from, const char *expression, const te_variable *variables, int var_count) { From 91092a1bf1c24a9ea82f169f3d4502ad3bc5fdeb Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sat, 29 May 2021 00:27:15 -0400 Subject: [PATCH 129/183] refactor background types to use enum --- i3lock.c | 46 +++++++++++++++------ unlock_indicator.c | 99 +++++++++++++++++++++------------------------- unlock_indicator.h | 11 +++++- 3 files changed, 87 insertions(+), 69 deletions(-) diff --git a/i3lock.c b/i3lock.c index 3ad92f2d..1ce5fcc6 100644 --- a/i3lock.c +++ b/i3lock.c @@ -243,14 +243,13 @@ static uint8_t xkb_base_error; static int randr_base = -1; cairo_surface_t *img = NULL; -cairo_surface_t *blur_img = NULL; cairo_surface_t *img_slideshow[256]; int slideshow_image_count = 0; int slideshow_interval = 10; bool slideshow_random_selection = false; -bool tile = false; -bool centered = false; +background_type_t bg_type = NONE; + bool ignore_empty_password = false; bool skip_repeated_empty_password = false; bool pass_media_keys = false; @@ -1435,6 +1434,9 @@ int main(int argc, char *argv[]) { {"raw", required_argument, NULL, 998}, {"tiling", no_argument, NULL, 't'}, {"centered", no_argument, NULL, 'C'}, + {"fill", no_argument, NULL, 'F'}, + {"scale", no_argument, NULL, 'L'}, + {"scale", no_argument, NULL, 'M'}, {"ignore-empty-password", no_argument, NULL, 'e'}, {"inactivity-timeout", required_argument, NULL, 'I'}, {"show-failed-attempts", no_argument, NULL, 'f'}, @@ -1624,16 +1626,33 @@ int main(int argc, char *argv[]) { image_path = strdup(optarg); break; case 't': - if(centered) { - errx(EXIT_FAILURE, "i3lock-color: Options tiling and centered conflict."); + if(bg_type != NONE) { + errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); } - tile = true; + bg_type = TILE; break; case 'C': - if(tile) { - errx(EXIT_FAILURE, "i3lock-color: Options tiling and centered conflict."); + if(bg_type != NONE) { + errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + } + bg_type = CENTER; + break; + case 'F': + if(bg_type != NONE) { + errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + } + bg_type = FILL; + case 'L': + if(bg_type != NONE) { + errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); } - centered = true; + bg_type = SCALE; + break; + case 'M': + if(bg_type != NONE) { + errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + } + bg_type = MAX; break; case 'p': if (!strcmp(optarg, "win")) { @@ -2349,20 +2368,21 @@ int main(int argc, char *argv[]) { *blur_pixmap = capture_bg_pixmap(conn, screen, last_resolution); cairo_surface_t *xcb_img = cairo_xcb_surface_create(conn, *blur_pixmap, vistype, last_resolution[0], last_resolution[1]); - blur_img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, last_resolution[0], last_resolution[1]); + cairo_surface_t *blur_img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, last_resolution[0], last_resolution[1]); cairo_t *ctx = cairo_create(blur_img); cairo_set_source_surface(ctx, xcb_img, 0, 0); cairo_paint(ctx); blur_image_surface(blur_img, blur_sigma); if (img) { - // Display image centered on all outputs. - draw_image(last_resolution, ctx); + // Display image on all outputs. + draw_image(last_resolution, img, ctx); cairo_surface_destroy(img); - img = NULL; } cairo_destroy(ctx); cairo_surface_destroy(xcb_img); + + img = blur_img; } xcb_window_t stolen_focus = find_focused_window(conn, screen->root); diff --git a/unlock_indicator.c b/unlock_indicator.c index eb6b7682..35375be2 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -62,7 +62,6 @@ extern char *modifier_string; /* A Cairo surface containing the specified image (-i), if any. */ extern cairo_surface_t *img; -extern cairo_surface_t *blur_img; extern cairo_surface_t *img_slideshow[256]; extern int slideshow_image_count; extern int slideshow_interval; @@ -70,9 +69,8 @@ extern bool slideshow_random_selection; unsigned long lastCheck; -/* Whether the image should be tiled or centered. */ -extern bool centered; -extern bool tile; +/* How the background image should be displayed */ +extern background_type_t bg_type; /* The background color to use (in hex). */ extern char color[9]; /* indicator color options */ @@ -699,13 +697,8 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { } } - if (blur_img || img) { - if (blur_img) { - cairo_set_source_surface(xcb_ctx, blur_img, 0, 0); - cairo_paint(xcb_ctx); - } else { // img can no longer be non-NULL if blur_img is not null - draw_image(resolution, xcb_ctx); - } + if (img) { + draw_image(resolution, img, xcb_ctx); } else { cairo_set_source_rgba(xcb_ctx, background.red, background.green, background.blue, background.alpha); cairo_rectangle(xcb_ctx, 0, 0, resolution[0], resolution[1]); @@ -1108,54 +1101,50 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { * Draws the configured image on the provided context. The image is drawn centered on all monitors, tiled, or just * painted starting from 0,0. */ -void draw_image(uint32_t* resolution, cairo_t* xcb_ctx) { - if (centered) { - double image_width = cairo_image_surface_get_width(img); - double image_height = cairo_image_surface_get_height(img); - - xcb_randr_get_screen_resources_current_reply_t *reply = xcb_randr_get_screen_resources_current_reply( - conn, xcb_randr_get_screen_resources_current(conn, screen->root), NULL); - - xcb_timestamp_t timestamp = reply->config_timestamp; - int len = xcb_randr_get_screen_resources_current_outputs_length(reply); - xcb_randr_output_t *randr_outputs = xcb_randr_get_screen_resources_current_outputs(reply); - - // For every output - for (int i = 0; i < len; i++) { - xcb_randr_get_output_info_reply_t *output = xcb_randr_get_output_info_reply( - conn, xcb_randr_get_output_info(conn, randr_outputs[i], timestamp), NULL); - if (output == NULL) - continue; - - if (output->crtc == XCB_NONE || output->connection == XCB_RANDR_CONNECTION_DISCONNECTED) - continue; +void draw_image(uint32_t* root_resolution, cairo_surface_t *img, cairo_t* xcb_ctx) { + double image_width = cairo_image_surface_get_width(img); + double image_height = cairo_image_surface_get_height(img); + + switch (bg_type) { + case CENTER: + case FILL: + case SCALE: + case MAX: + cairo_save(xcb_ctx); + for (int i = 0; i < xr_screens; i++) { + // Paint around center of monitor + double origin_x = xr_resolutions[i].x + (xr_resolutions[i].width / 2.0 - image_width / 2.0); + double origin_y = xr_resolutions[i].y + (xr_resolutions[i].height / 2.0 - image_height / 2.0); + + if (bg_type == SCALE) { + cairo_scale(xcb_ctx, + (double) xr_resolutions[i].width / image_width, + (double) xr_resolutions[i].height / image_height); + } - xcb_randr_get_crtc_info_cookie_t infoCookie = xcb_randr_get_crtc_info(conn, output->crtc, - timestamp); - xcb_randr_get_crtc_info_reply_t *crtc = xcb_randr_get_crtc_info_reply(conn, infoCookie, NULL); + cairo_set_source_surface(xcb_ctx, img, origin_x, origin_y); + cairo_paint(xcb_ctx); + } + cairo_restore(xcb_ctx); + break; - // Paint around center of monitor - double origin_x = crtc->x + (crtc->width / 2.0 - image_width / 2.0); - double origin_y = crtc->y + (crtc->height / 2.0 - image_height / 2.0); + case TILE: + { + /* create a pattern and fill a rectangle as big as the screen */ + cairo_pattern_t *pattern; + pattern = cairo_pattern_create_for_surface(img); + cairo_set_source(xcb_ctx, pattern); + cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); + cairo_rectangle(xcb_ctx, 0, 0, root_resolution[0], root_resolution[1]); + cairo_fill(xcb_ctx); + cairo_pattern_destroy(pattern); + break; + } - cairo_set_source_surface(xcb_ctx, img, origin_x, origin_y); + default: + cairo_set_source_surface(xcb_ctx, img, 0, 0); cairo_paint(xcb_ctx); - - free(crtc); - free(output); - } - } else if (tile) { - /* create a pattern and fill a rectangle as big as the screen */ - cairo_pattern_t *pattern; - pattern = cairo_pattern_create_for_surface(img); - cairo_set_source(xcb_ctx, pattern); - cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); - cairo_rectangle(xcb_ctx, 0, 0, resolution[0], resolution[1]); - cairo_fill(xcb_ctx); - cairo_pattern_destroy(pattern); - } else { - cairo_set_source_surface(xcb_ctx, img, 0, 0); - cairo_paint(xcb_ctx); + break; } } diff --git a/unlock_indicator.h b/unlock_indicator.h index 15aa905b..3c07243d 100644 --- a/unlock_indicator.h +++ b/unlock_indicator.h @@ -38,8 +38,17 @@ typedef struct { double bar_x, bar_y, bar_width; } DrawData; +typedef enum { + NONE, + TILE, + CENTER, + FILL, + SCALE, + MAX, +} background_type_t; + void render_lock(uint32_t* resolution, xcb_drawable_t drawable); -void draw_image(uint32_t* resolution, cairo_t* xcb_ctx); +void draw_image(uint32_t* resolution, cairo_surface_t* img, cairo_t* xcb_ctx); void init_colors_once(void); void redraw_screen(void); void clear_indicator(void); From 10546fcd722e5c04c67118972b5ffa3851a2c322 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 30 May 2021 01:37:26 -0400 Subject: [PATCH 130/183] implement bg scaling --- i3lock.c | 13 +++++++------ unlock_indicator.c | 30 ++++++++++++++++++++++-------- 2 files changed, 29 insertions(+), 14 deletions(-) diff --git a/i3lock.c b/i3lock.c index 1ce5fcc6..45e08a78 100644 --- a/i3lock.c +++ b/i3lock.c @@ -1436,7 +1436,7 @@ int main(int argc, char *argv[]) { {"centered", no_argument, NULL, 'C'}, {"fill", no_argument, NULL, 'F'}, {"scale", no_argument, NULL, 'L'}, - {"scale", no_argument, NULL, 'M'}, + {"max", no_argument, NULL, 'M'}, {"ignore-empty-password", no_argument, NULL, 'e'}, {"inactivity-timeout", required_argument, NULL, 'I'}, {"show-failed-attempts", no_argument, NULL, 'f'}, @@ -1627,30 +1627,31 @@ int main(int argc, char *argv[]) { break; case 't': if(bg_type != NONE) { - errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used."); } bg_type = TILE; break; case 'C': if(bg_type != NONE) { - errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used."); } bg_type = CENTER; break; case 'F': if(bg_type != NONE) { - errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used."); } bg_type = FILL; + break; case 'L': if(bg_type != NONE) { - errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used."); } bg_type = SCALE; break; case 'M': if(bg_type != NONE) { - errx(EXIT_FAILURE, "i3lock-color: Options tiling, centered, and fill conflict."); + errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used."); } bg_type = MAX; break; diff --git a/unlock_indicator.c b/unlock_indicator.c index 35375be2..a7e9b672 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -1110,22 +1110,36 @@ void draw_image(uint32_t* root_resolution, cairo_surface_t *img, cairo_t* xcb_ct case FILL: case SCALE: case MAX: - cairo_save(xcb_ctx); for (int i = 0; i < xr_screens; i++) { - // Paint around center of monitor - double origin_x = xr_resolutions[i].x + (xr_resolutions[i].width / 2.0 - image_width / 2.0); - double origin_y = xr_resolutions[i].y + (xr_resolutions[i].height / 2.0 - image_height / 2.0); + cairo_save(xcb_ctx); + // Scale image according to bg_type and aspect ratios + double scale_x = 1, scale_y = 1; if (bg_type == SCALE) { - cairo_scale(xcb_ctx, - (double) xr_resolutions[i].width / image_width, - (double) xr_resolutions[i].height / image_height); + scale_x = xr_resolutions[i].width / image_width; + scale_y = xr_resolutions[i].height / image_height; + } else { + double aspect_diff = (double) xr_resolutions[i].height / xr_resolutions[i].width - image_height / image_width; + if((bg_type == MAX && aspect_diff > 0) || (bg_type == FILL && aspect_diff < 0)) { + scale_x = scale_y = xr_resolutions[i].width / image_width; + } else if ((bg_type == MAX && aspect_diff < 0) || (bg_type == FILL && aspect_diff > 0)) { + scale_x = scale_y = xr_resolutions[i].height / image_height; + } + } + + if (scale_x != 0 || scale_y != 0) { + cairo_scale(xcb_ctx, scale_x, scale_y); } + // Place image in the middle + double origin_x = (xr_resolutions[i].x + xr_resolutions[i].width / 2) / scale_x - image_width / 2; + double origin_y = (xr_resolutions[i].y + xr_resolutions[i].height / 2) / scale_y - image_height / 2; + cairo_set_source_surface(xcb_ctx, img, origin_x, origin_y); cairo_paint(xcb_ctx); + + cairo_restore(xcb_ctx); } - cairo_restore(xcb_ctx); break; case TILE: From cdf33e60fd2b521d8a0db4630ac68b7005f53228 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 30 May 2021 01:51:27 -0400 Subject: [PATCH 131/183] update optstring --- i3lock.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock.c b/i3lock.c index 45e08a78..c46066b9 100644 --- a/i3lock.c +++ b/i3lock.c @@ -1577,7 +1577,7 @@ int main(int argc, char *argv[]) { if (getenv("WAYLAND_DISPLAY") != NULL) errx(EXIT_FAILURE, "i3lock is a program for X11 and does not work on Wayland. Try https://github.com/swaywm/swaylock instead"); - char *optstring = "hvnbdc:p:ui:tCeI:frsS:kB:m"; + char *optstring = "hvnbdc:p:ui:tCFLMeI:frsS:kB:m"; char *arg = NULL; int opt = 0; char padded[9] = "ffffffff"; \ From c50a1a27efac5caea9edf91f02b80b30ebb95662 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 30 May 2021 02:14:19 -0400 Subject: [PATCH 132/183] fix blurred background position and memorylerak warning --- i3lock.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/i3lock.c b/i3lock.c index c46066b9..0cb59beb 100644 --- a/i3lock.c +++ b/i3lock.c @@ -1357,6 +1357,7 @@ static cairo_surface_t* load_image(char* image_path, char* image_raw_format) { img = cairo_image_surface_create_for_data(jpg_data, CAIRO_FORMAT_ARGB32, jpg_info.width, jpg_info.height, jpg_info.stride); + free(jpg_data); } } @@ -2384,6 +2385,7 @@ int main(int argc, char *argv[]) { cairo_surface_destroy(xcb_img); img = blur_img; + bg_type = NONE; } xcb_window_t stolen_focus = find_focused_window(conn, screen->root); From d0644a31ce8215a0b6411f25bac8827bf34c42a0 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sun, 30 May 2021 15:08:04 -0400 Subject: [PATCH 133/183] Standardize email --- SECURITY.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SECURITY.md b/SECURITY.md index 86cc5071..56f3a42d 100644 --- a/SECURITY.md +++ b/SECURITY.md @@ -12,7 +12,7 @@ currently being supported with security updates. ## Reporting a Vulnerability -If there's a severe security vulnerability in the latest version of i3lock-color, don't post a public issue. Either email me directly at [i3lock@raymond.li](mailto:i3lock@raymond.li?subject=i3lock-color%20security%20vulnerability), or encrypt the issue text with my PGP public key: +If there's a severe security vulnerability in the latest version of i3lock-color, don't post a public issue. Either email me directly at [i3lock-color@raymond.li](mailto:i3lock@raymond.li?subject=i3lock-color%20security%20vulnerability), or encrypt the issue text with my PGP public key: ``` -----BEGIN PGP PUBLIC KEY BLOCK----- From 09d6f3b03d748e0861922132703c4bea7deabdbc Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 30 May 2021 15:17:26 -0400 Subject: [PATCH 134/183] don't free jpg_data --- i3lock.c | 1 - 1 file changed, 1 deletion(-) diff --git a/i3lock.c b/i3lock.c index 0cb59beb..473ea157 100644 --- a/i3lock.c +++ b/i3lock.c @@ -1357,7 +1357,6 @@ static cairo_surface_t* load_image(char* image_path, char* image_raw_format) { img = cairo_image_surface_create_for_data(jpg_data, CAIRO_FORMAT_ARGB32, jpg_info.width, jpg_info.height, jpg_info.stride); - free(jpg_data); } } From e390bb68fa0977897fc560f854e3581777c6562c Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 30 May 2021 15:31:31 -0400 Subject: [PATCH 135/183] improve background tiling on multimonitor setup --- unlock_indicator.c | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index a7e9b672..4b4c8118 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -1144,13 +1144,19 @@ void draw_image(uint32_t* root_resolution, cairo_surface_t *img, cairo_t* xcb_ct case TILE: { - /* create a pattern and fill a rectangle as big as the screen */ - cairo_pattern_t *pattern; - pattern = cairo_pattern_create_for_surface(img); + cairo_pattern_t *pattern = cairo_pattern_create_for_surface(img); cairo_set_source(xcb_ctx, pattern); cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); - cairo_rectangle(xcb_ctx, 0, 0, root_resolution[0], root_resolution[1]); - cairo_fill(xcb_ctx); + + for (int i = 0; i < xr_screens; i++) { + cairo_matrix_t matrix; + cairo_matrix_init_translate(&matrix, -xr_resolutions[i].x, -xr_resolutions[i].y); + cairo_pattern_set_matrix(pattern, &matrix); + + cairo_rectangle(xcb_ctx, xr_resolutions[i].x, xr_resolutions[i].y, xr_resolutions[i].width, xr_resolutions[i].height); + cairo_fill(xcb_ctx); + } + cairo_pattern_destroy(pattern); break; } From 63645401e4fec31f0d22c00ba403e2a59b84e1e5 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 30 May 2021 18:41:44 -0400 Subject: [PATCH 136/183] add new background options to man page --- i3lock.1 | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/i3lock.1 b/i3lock.1 index 77877df3..863b72b9 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -124,6 +124,24 @@ screen (with a multi-monitor setup, the image is visible on all screens). If an image is specified (via \-i) it will display the image centered on the screen (with a multi-monitor setup, the image is visible on all screens). +.TP +.B \-F, \-\-fill +If an image is specified (via \-i) it will scale the image until it fills the +screen. A portion of the image will be cropped. +(with a multi-monitor setup, the image is visible on all screens). + +.TP +.B \-M, \-\-max +If an image is specified (via \-i) it will scale the image until either the +width or the height fits the screen without being cropped. The border color +can be set via \-c. (with a multi-monitor setup, the image is visible on all screens). + +.TP +.B \-L, \-\-scale +If an image is specified (via \-i) it will stretch the image until both the +width and the height fits the screen. +(with a multi-monitor setup, the image is visible on all screens). + .TP .BI \-p\ win|default \fR,\ \fB\-\-pointer= win|default If you specify "default", From c39ccc70c79791d229ce585a99f1a4f1e0048139 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Mon, 31 May 2021 01:43:02 -0400 Subject: [PATCH 137/183] Allow slideshow and blur be used together --- i3lock.c | 31 ++++++++----------------------- unlock_indicator.c | 10 ++++++++-- 2 files changed, 16 insertions(+), 25 deletions(-) diff --git a/i3lock.c b/i3lock.c index 473ea157..8f66129d 100644 --- a/i3lock.c +++ b/i3lock.c @@ -244,6 +244,7 @@ static int randr_base = -1; cairo_surface_t *img = NULL; cairo_surface_t *img_slideshow[256]; +cairo_surface_t *blur_bg_img = NULL; int slideshow_image_count = 0; int slideshow_interval = 10; bool slideshow_random_selection = false; @@ -2362,29 +2363,20 @@ int main(int argc, char *argv[]) { free(image_raw_format); - xcb_pixmap_t* blur_pixmap = NULL; if (blur) { - blur_pixmap = malloc(sizeof(xcb_pixmap_t)); - xcb_visualtype_t *vistype = get_root_visual_type(screen); - *blur_pixmap = capture_bg_pixmap(conn, screen, last_resolution); - cairo_surface_t *xcb_img = cairo_xcb_surface_create(conn, *blur_pixmap, vistype, last_resolution[0], last_resolution[1]); + xcb_pixmap_t bg_pixmap = capture_bg_pixmap(conn, screen, last_resolution); + cairo_surface_t *xcb_img = cairo_xcb_surface_create(conn, bg_pixmap, get_root_visual_type(screen), last_resolution[0], last_resolution[1]); + + blur_bg_img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, last_resolution[0], last_resolution[1]); + cairo_t *ctx = cairo_create(blur_bg_img); - cairo_surface_t *blur_img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, last_resolution[0], last_resolution[1]); - cairo_t *ctx = cairo_create(blur_img); cairo_set_source_surface(ctx, xcb_img, 0, 0); cairo_paint(ctx); + blur_image_surface(blur_bg_img, blur_sigma); - blur_image_surface(blur_img, blur_sigma); - if (img) { - // Display image on all outputs. - draw_image(last_resolution, img, ctx); - cairo_surface_destroy(img); - } cairo_destroy(ctx); cairo_surface_destroy(xcb_img); - - img = blur_img; - bg_type = NONE; + xcb_free_pixmap(conn, bg_pixmap); } xcb_window_t stolen_focus = find_focused_window(conn, screen->root); @@ -2395,14 +2387,7 @@ int main(int argc, char *argv[]) { xcb_pixmap_t pixmap = create_bg_pixmap(conn, win, last_resolution, color); render_lock(last_resolution, pixmap); xcb_change_window_attributes(conn, win, XCB_CW_BACK_PIXMAP, (uint32_t[]){pixmap}); - xcb_free_pixmap(conn, pixmap); - if (blur_pixmap) { - xcb_free_pixmap(conn, *blur_pixmap); - free(blur_pixmap); - blur_pixmap = NULL; - } - cursor = create_cursor(conn, screen, win, curs_choice); diff --git a/unlock_indicator.c b/unlock_indicator.c index 4b4c8118..4028bcd1 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -63,6 +63,7 @@ extern char *modifier_string; /* A Cairo surface containing the specified image (-i), if any. */ extern cairo_surface_t *img; extern cairo_surface_t *img_slideshow[256]; +extern cairo_surface_t *blur_bg_img; extern int slideshow_image_count; extern int slideshow_interval; extern bool slideshow_random_selection; @@ -697,14 +698,19 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { } } - if (img) { - draw_image(resolution, img, xcb_ctx); + if (blur_bg_img) { + cairo_set_source_surface(xcb_ctx, blur_bg_img, 0, 0); + cairo_paint(xcb_ctx); } else { cairo_set_source_rgba(xcb_ctx, background.red, background.green, background.blue, background.alpha); cairo_rectangle(xcb_ctx, 0, 0, resolution[0], resolution[1]); cairo_fill(xcb_ctx); } + if (img) { + draw_image(resolution, img, xcb_ctx); + } + /* * gen text * calc vars From d75eb3106e4bc3f143476b1cec522cf5020cf967 Mon Sep 17 00:00:00 2001 From: Rin Takanashi Date: Mon, 31 May 2021 21:57:35 +0200 Subject: [PATCH 138/183] Adjust the value of vars_size to account for the variables added in commit 085df46 --- unlock_indicator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index a7e9b672..5babfba9 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -869,7 +869,7 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { scaling_factor, button_diameter_physical); // variable mapping for evaluating the clock position expression - const unsigned int vars_size = 11; + const unsigned int vars_size = 14; te_variable vars[] = {{"w", &width}, {"h", &height}, From 567dd8ea3d9236f06d987e9d7e17efa1eed6d551 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Fri, 4 Jun 2021 17:08:24 -0400 Subject: [PATCH 139/183] Refactor background drawing and fix --fill image overlapping across monitors --- unlock_indicator.c | 98 ++++++++++++++++++++-------------------------- 1 file changed, 43 insertions(+), 55 deletions(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index e5cfedab..04d75b61 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -1105,74 +1105,62 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { /** * Draws the configured image on the provided context. The image is drawn centered on all monitors, tiled, or just - * painted starting from 0,0. + * painted starting from 0,0. It is also scaled if bg_type is FILL, MAX, or SCALE. */ void draw_image(uint32_t* root_resolution, cairo_surface_t *img, cairo_t* xcb_ctx) { - double image_width = cairo_image_surface_get_width(img); - double image_height = cairo_image_surface_get_height(img); - - switch (bg_type) { - case CENTER: - case FILL: - case SCALE: - case MAX: - for (int i = 0; i < xr_screens; i++) { - cairo_save(xcb_ctx); - - // Scale image according to bg_type and aspect ratios - double scale_x = 1, scale_y = 1; - if (bg_type == SCALE) { - scale_x = xr_resolutions[i].width / image_width; - scale_y = xr_resolutions[i].height / image_height; - } else { - double aspect_diff = (double) xr_resolutions[i].height / xr_resolutions[i].width - image_height / image_width; - if((bg_type == MAX && aspect_diff > 0) || (bg_type == FILL && aspect_diff < 0)) { - scale_x = scale_y = xr_resolutions[i].width / image_width; - } else if ((bg_type == MAX && aspect_diff < 0) || (bg_type == FILL && aspect_diff > 0)) { - scale_x = scale_y = xr_resolutions[i].height / image_height; - } - } - if (scale_x != 0 || scale_y != 0) { - cairo_scale(xcb_ctx, scale_x, scale_y); - } + if (bg_type == NONE) { + // Don't do any image manipulation + cairo_set_source_surface(xcb_ctx, img, 0, 0); + cairo_paint(xcb_ctx); + return; + } - // Place image in the middle - double origin_x = (xr_resolutions[i].x + xr_resolutions[i].width / 2) / scale_x - image_width / 2; - double origin_y = (xr_resolutions[i].y + xr_resolutions[i].height / 2) / scale_y - image_height / 2; + cairo_pattern_t *pattern = cairo_pattern_create_for_surface(img); + cairo_pattern_set_extend(pattern, bg_type == TILE ? CAIRO_EXTEND_REPEAT : CAIRO_EXTEND_NONE); + cairo_set_source(xcb_ctx, pattern); - cairo_set_source_surface(xcb_ctx, img, origin_x, origin_y); - cairo_paint(xcb_ctx); + double image_width = cairo_image_surface_get_width(img); + double image_height = cairo_image_surface_get_height(img); - cairo_restore(xcb_ctx); + for (int i = 0; i < xr_screens; i++) { + // Find out scaling factors using bg_type and aspect ratios + double scale_x = 1, scale_y = 1; + if (bg_type == SCALE) { + scale_x = xr_resolutions[i].width / image_width; + scale_y = xr_resolutions[i].height / image_height; + + } else if (bg_type == MAX || bg_type == FILL) { + double aspect_diff = (double) xr_resolutions[i].height / xr_resolutions[i].width - image_height / image_width; + if((bg_type == MAX && aspect_diff > 0) || (bg_type == FILL && aspect_diff < 0)) { + scale_x = scale_y = xr_resolutions[i].width / image_width; + } else if ((bg_type == MAX && aspect_diff < 0) || (bg_type == FILL && aspect_diff > 0)) { + scale_x = scale_y = xr_resolutions[i].height / image_height; } - break; + } - case TILE: - { - cairo_pattern_t *pattern = cairo_pattern_create_for_surface(img); - cairo_set_source(xcb_ctx, pattern); - cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT); + // Scale and translate the pattern + cairo_matrix_t matrix; + cairo_matrix_init_scale(&matrix, 1/scale_x, 1/scale_y); - for (int i = 0; i < xr_screens; i++) { - cairo_matrix_t matrix; - cairo_matrix_init_translate(&matrix, -xr_resolutions[i].x, -xr_resolutions[i].y); - cairo_pattern_set_matrix(pattern, &matrix); + if (bg_type == TILE) { + // Start image from top-left corner + cairo_matrix_translate(&matrix, -xr_resolutions[i].x, -xr_resolutions[i].y); + } else { + // Draw image in the center of the screen + cairo_matrix_translate(&matrix, + (image_width * scale_x - xr_resolutions[i].width ) / 2 - xr_resolutions[i].x, + (image_height * scale_y - xr_resolutions[i].height) / 2 - xr_resolutions[i].y); + } - cairo_rectangle(xcb_ctx, xr_resolutions[i].x, xr_resolutions[i].y, xr_resolutions[i].width, xr_resolutions[i].height); - cairo_fill(xcb_ctx); - } + cairo_pattern_set_matrix(pattern, &matrix); - cairo_pattern_destroy(pattern); - break; - } - - default: - cairo_set_source_surface(xcb_ctx, img, 0, 0); - cairo_paint(xcb_ctx); - break; + // Draw to screen + cairo_rectangle(xcb_ctx, xr_resolutions[i].x, xr_resolutions[i].y, xr_resolutions[i].width, xr_resolutions[i].height); + cairo_fill(xcb_ctx); } + cairo_pattern_destroy(pattern); } /* From c4f4cf6d29ad38d7bdc0543fdb97d5284a8b6e86 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Fri, 4 Jun 2021 15:41:13 -0700 Subject: [PATCH 140/183] Remove deprecated bar-width option (#226) * remove deprecated bar-width option * restore default bar-count --- i3lock.c | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/i3lock.c b/i3lock.c index 8f66129d..e9f1ce97 100644 --- a/i3lock.c +++ b/i3lock.c @@ -279,8 +279,7 @@ double bar_step = 15; double bar_base_height = 25; double bar_periodic_step = 15; double max_bar_height = 25; -int bar_count = 0; -int bar_width = 0; +int bar_count = 10; int bar_orientation = BAR_FLAT; char bar_base_color[9] = "000000ff"; @@ -1548,7 +1547,6 @@ int main(int argc, char *argv[]) { // bar indicator stuff {"bar-indicator", no_argument, NULL, 700}, {"bar-direction", required_argument, NULL, 701}, - {"bar-width", required_argument, NULL, 702}, {"bar-orientation", required_argument, NULL, 703}, {"bar-step", required_argument, NULL, 704}, {"bar-max-height", required_argument, NULL, 705}, @@ -2125,10 +2123,6 @@ int main(int argc, char *argv[]) { break; } break; - case 702: - bar_width = atoi(optarg); - if (bar_width < 1) bar_width = 150; - break; case 703: arg = optarg; if (strcmp(arg, "vertical") == 0) @@ -2323,27 +2317,7 @@ int main(int argc, char *argv[]) { last_resolution[1] = screen->height_in_pixels; if (bar_enabled) { - if (bar_count == 0) { - if (bar_width != 0) { - fprintf(stderr, "Warning: bar-width is deprecated, use bar-count instead\n"); - int tmp = screen->width_in_pixels; - if (bar_orientation == BAR_VERT) tmp = screen->height_in_pixels; - bar_count = tmp / bar_width; - if (tmp % bar_width != 0) { - ++bar_count; - } - } else { - bar_count = 10; - } - } else if (bar_width != 0) { - errx(EXIT_FAILURE, "bar-width and bar-count cannot be used at the same time"); - } - - if (bar_count >= MIN_BAR_COUNT && bar_count <= MAX_BAR_COUNT) { - bar_heights = (double*) calloc(bar_count, sizeof(double)); - } else { - bar_enabled = false; - } + bar_heights = (double*) calloc(bar_count, sizeof(double)); } xcb_change_window_attributes(conn, screen->root, XCB_CW_EVENT_MASK, From e8e4dbdd7e7852695793511f43fc15c47b31240a Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 4 Jun 2021 18:46:01 -0400 Subject: [PATCH 141/183] Bump version to 2.13.c.5 --- I3LOCK_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/I3LOCK_VERSION b/I3LOCK_VERSION index 86245041..16e98730 100644 --- a/I3LOCK_VERSION +++ b/I3LOCK_VERSION @@ -1 +1 @@ -2.13.c.3 +2.13.c.4 From 47a0ed222c99f0e618620f4862cb0778a074691e Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 4 Jun 2021 18:59:35 -0400 Subject: [PATCH 142/183] Remove bar-width from manpage --- i3lock.1 | 6 ------ 1 file changed, 6 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 863b72b9..823189a8 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -381,12 +381,6 @@ Replaces the usual ring indicator with a bar indicator. Comes with perks. Sets the direction the bars grow in. 0 is the default (downwards, or rightwards, depending on the bar orientation). 1 is the reverse, and 2 is both. -.TP -.B \-\-bar\-width=15 -Deprecated, use \-\-bar\-count instead. - -Sets the width of the minibars in the bar. - .TP .B \-\-bar\-orientation={vertical,horizontal} Sets whether the bar is vertically or horizontally oriented. From bc7a0fcaa39ae63bf5d5047d95eb33d7c6f1b311 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 4 Jun 2021 19:00:03 -0400 Subject: [PATCH 143/183] Update i3lock.1 --- i3lock.1 | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock.1 b/i3lock.1 index 823189a8..3c239e89 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -8,7 +8,7 @@ .fi .. -.TH i3lock-color 1 "MAY 2021" Linux "User Manuals" +.TH i3lock-color 1 "JUN 2021" Linux "User Manuals" .SH NAME i3lock-color \- improved screen locker From aa2091ae6ac45c96a98d004d157e6c2176f5d210 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 4 Jun 2021 19:29:03 -0400 Subject: [PATCH 144/183] Document bw, bx and by options --- i3lock.1 | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 3c239e89..20a21d4c 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -327,7 +327,7 @@ y - y position of the current display. Corresponds to the topmost row of pixels on that display. w - width of the current display. h - height of the current display. -r - the unlock indicator radius. +r - unlock indicator radius. .RE .RE @@ -337,10 +337,14 @@ Sets the position for the time string. All the variables from \-\-ind\-pos may b used, in addition to: .RS .RS -ix - the x value of the indicator on the current display. -iy - the y value of the indicator on the current display. +ix - x position of the indicator on the current display. +iy - y position of the indicator on the current display. .RE .RE +If the \-\-bar\-indicator option is used, the following variables may be used: +bw - width of the bar indicator. +bx - x position of the bar indicator on the current display. +by - y position of the bar indicator on the current display. .TP .B \-\-date\-pos="x\-position:y\-position" @@ -348,8 +352,8 @@ Sets the position for the date string. All the variables from \-\-ind\-pos and \-\-time\-pos may be used, in addition to: .RS .RS -tx - the computed x value of the timestring, for the current display. -ty - the computed y value of the timestring, for the current display. +tx - x position of the timestring on the current display. +ty - y position of the timestring on the current display. .RE .RE From fc59f5bccef4235cc17046c9a074ce3a71a5b85e Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 4 Jun 2021 19:48:23 -0400 Subject: [PATCH 145/183] Further clean up manpage with proper lists --- .gitignore | 1 + i3lock.1 | 52 ++++++++++++++++++++++++++++++++-------------------- 2 files changed, 33 insertions(+), 20 deletions(-) diff --git a/.gitignore b/.gitignore index a281a746..f5d25b19 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ tags *.swp *.gz *~ +x86_64-pc-linux-gnu ################################################################################ # https://raw.githubusercontent.com/github/gitignore/master/Autotools.gitignore diff --git a/i3lock.1 b/i3lock.1 index 20a21d4c..775f43cc 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -117,30 +117,31 @@ xcompmgr). .TP .B \-t, \-\-tiling If an image is specified (via \-i) it will display the image tiled all over the -screen (with a multi-monitor setup, the image is visible on all screens). +screen. + +Note: For all image options, with a multi-monitor setup, the image is visible on +all screens. .TP .B \-C, \-\-centered If an image is specified (via \-i) it will display the image centered on the -screen (with a multi-monitor setup, the image is visible on all screens). +screen. .TP .B \-F, \-\-fill If an image is specified (via \-i) it will scale the image until it fills the screen. A portion of the image will be cropped. -(with a multi-monitor setup, the image is visible on all screens). .TP .B \-M, \-\-max If an image is specified (via \-i) it will scale the image until either the width or the height fits the screen without being cropped. The border color -can be set via \-c. (with a multi-monitor setup, the image is visible on all screens). +can be set via \-c. .TP .B \-L, \-\-scale If an image is specified (via \-i) it will stretch the image until both the width and the height fits the screen. -(with a multi-monitor setup, the image is visible on all screens). .TP .BI \-p\ win|default \fR,\ \fB\-\-pointer= win|default @@ -261,12 +262,13 @@ Sets the string to be shown upon entering an incorrect password. Displays the keylayout. Positionable similar to date, time, and indicator. Modes are as follows: .RS -.RS +.IP \[bu] 2 0 - Displays the full string returned by the query, i.e. "English (US)" +.IP \[bu] 1 - Displays up until the first parenthesis, i.e. "English" +.IP \[bu] 2 - Displays just the contents of the parenthesis, i.e. "US" .RE -.RE .TP .B \-\-noinput\-text="no input" @@ -293,12 +295,13 @@ Hides the modkey indicator (Num, Caps Lock ...) Sets the text alignment of the time, date, keylayout, verification, wrong, modifier and greeter texts. .RS -.RS +.IP \[bu] 2 0 - centered (default) +.IP \[bu] 1 - left aligned +.IP \[bu] 2 - right aligned .RE -.RE .TP .B \-\-{time, date, layout, verif, wrong, greeter, modif}outline\-color=rrggbbaa @@ -320,42 +323,49 @@ Sets the width of the outline. .B \-\-ind\-pos="x\-position:y\-position" Sets the position for the unlock indicator. Valid variables include: .RS -.RS +.IP \[bu] 2 x - x position of the current display. Corresponds to the leftmost column of pixels on that display. +.IP \[bu] y - y position of the current display. Corresponds to the topmost row of pixels on that display. +.IP \[bu] w - width of the current display. +.IP \[bu] h - height of the current display. +.IP \[bu] r - unlock indicator radius. .RE -.RE .TP .B \-\-time\-pos="x\-position:y\-position" -Sets the position for the time string. All the variables from \-\-ind\-pos may be -used, in addition to: -.RS +Sets the position for the time string. All the variables from \-\-ind\-pos may +be used, in addition to: .RS +.IP \[bu] 2 ix - x position of the indicator on the current display. +.IP \[bu] iy - y position of the indicator on the current display. -.RE -.RE + If the \-\-bar\-indicator option is used, the following variables may be used: +.IP \[bu] 2 bw - width of the bar indicator. +.IP \[bu] bx - x position of the bar indicator on the current display. +.IP \[bu] by - y position of the bar indicator on the current display. +.RE .TP .B \-\-date\-pos="x\-position:y\-position" Sets the position for the date string. All the variables from \-\-ind\-pos and \-\-time\-pos may be used, in addition to: .RS -.RS +.IP \[bu] 2 tx - x position of the timestring on the current display. +.IP \[bu] ty - y position of the timestring on the current display. .RE -.RE .TP .B \-\-greeter\-pos="x\-position:y\-position" @@ -367,14 +377,16 @@ Sets the position for the greeter string. All the variables from \-\-ind\-pos an Allow the following keys to be used normally while the screen is locked by passing them through: .RS -.RS +.IP \[bu] 2 media - XF86AudioPlay, XF86AudioPause, XF86AudioStop, XF86AudioPrev, XF86AudioNext, XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume +.IP \[bu] screen - XF86MonBrightnessUp, XF86MonBrightnessDown +.IP \[bu] power - XF86PowerDown, XF86PowerOff, XF86Sleep +.IP \[bu] volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume .RE -.RE .TP .B \-\-bar\-indicator From b0f64a61699febd4721f728cd7b474a53526a656 Mon Sep 17 00:00:00 2001 From: Rio6 Date: Sun, 6 Jun 2021 20:17:42 -0400 Subject: [PATCH 146/183] fix --max and --fill not scaling image when the image has the same aspect ratio as the screen --- unlock_indicator.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/unlock_indicator.c b/unlock_indicator.c index 04d75b61..9fc07f05 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -1132,7 +1132,7 @@ void draw_image(uint32_t* root_resolution, cairo_surface_t *img, cairo_t* xcb_ct } else if (bg_type == MAX || bg_type == FILL) { double aspect_diff = (double) xr_resolutions[i].height / xr_resolutions[i].width - image_height / image_width; - if((bg_type == MAX && aspect_diff > 0) || (bg_type == FILL && aspect_diff < 0)) { + if((bg_type == MAX && aspect_diff >= 0) || (bg_type == FILL && aspect_diff <= 0)) { scale_x = scale_y = xr_resolutions[i].width / image_width; } else if ((bg_type == MAX && aspect_diff < 0) || (bg_type == FILL && aspect_diff > 0)) { scale_x = scale_y = xr_resolutions[i].height / image_height; From 415b9872025409c55c25cdf15ce421cdfba7a323 Mon Sep 17 00:00:00 2001 From: graves501 Date: Tue, 22 Jun 2021 23:07:45 +0200 Subject: [PATCH 147/183] chore: rename variables for examples, remove unused variables --- examples/lock.sh | 56 ++++++++++++++++++++++---------------------- examples/lock_bar.sh | 7 ------ 2 files changed, 28 insertions(+), 35 deletions(-) diff --git a/examples/lock.sh b/examples/lock.sh index cb0a18b9..a41d0256 100644 --- a/examples/lock.sh +++ b/examples/lock.sh @@ -1,36 +1,36 @@ #!/bin/sh -B='#00000000' # blank -C='#ffffff22' # clear ish -D='#ff00ffcc' # default -T='#ee00eeee' # text -W='#880000bb' # wrong -V='#bb00bbbb' # verifying +BLANK='#00000000' +CLEAR='#ffffff22' +DEFAULT='#ff00ffcc' +TEXT='#ee00eeee' +WRONG='#880000bb' +VERIFYING='#bb00bbbb' i3lock \ ---insidever-color=$C \ ---ringver-color=$V \ +--insidever-color=$CLEAR \ +--ringver-color=$VERIFYING \ \ ---insidewrong-color=$C \ ---ringwrong-color=$W \ +--insidewrong-color=$CLEAR \ +--ringwrong-color=$WRONG \ \ ---inside-color=$B \ ---ring-color=$D \ ---line-color=$B \ ---separator-color=$D \ +--inside-color=$BLANK \ +--ring-color=$DEFAULT \ +--line-color=$BLANK \ +--separator-color=$DEFAULT \ \ ---verif-color=$T \ ---wrong-color=$T \ ---time-color=$T \ ---date-color=$T \ ---layout-color=$T \ ---keyhl-color=$W \ ---bshl-color=$W \ +--verif-color=$TEXT \ +--wrong-color=$TEXT \ +--time-color=$TEXT \ +--date-color=$TEXT \ +--layout-color=$TEXT \ +--keyhl-color=$WRONG \ +--bshl-color=$WRONG \ \ ---screen 1 \ ---blur 5 \ ---clock \ ---indicator \ ---time-str="%H:%M:%S" \ ---date-str="%A, %m %Y" \ ---keylayout 1 \ +--screen 1 \ +--blur 5 \ +--clock \ +--indicator \ +--time-str="%H:%M:%S" \ +--date-str="%A, %m %Y" \ +--keylayout 1 \ diff --git a/examples/lock_bar.sh b/examples/lock_bar.sh index 019a4574..f80a5ebe 100644 --- a/examples/lock_bar.sh +++ b/examples/lock_bar.sh @@ -1,12 +1,5 @@ #!/bin/sh -B='#00000000' # blank -C='#ffffff22' # clear ish -D='#ff00ffcc' # default -T='#ee00eeee' # text -W='#880000bb' # wrong -V='#bb00bbbb' # verifying - i3lock \ --blur 5 \ --bar-indicator \ From 327be421ae8d925d4ea592bfd56d6ea1d75b5493 Mon Sep 17 00:00:00 2001 From: JezerM Date: Sat, 10 Jul 2021 12:33:17 -0600 Subject: [PATCH 148/183] pass keys with fake input --- README.md | 4 ++-- configure.ac | 2 +- i3lock.c | 31 +++++++++++++++++++++++++++---- 3 files changed, 30 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index a0456819..09af8530 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/configure.ac b/configure.ac index 67414dd2..a1eda4c4 100644 --- a/configure.ac +++ b/configure.ac @@ -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]) diff --git a/i3lock.c b/i3lock.c index e9f1ce97..c88a531b 100644 --- a/i3lock.c +++ b/i3lock.c @@ -49,6 +49,8 @@ #endif #include #include +#include +#include #include "i3lock.h" #include "xcb.h" @@ -650,6 +652,27 @@ 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) { + xcb_ungrab_keyboard(conn, XCB_CURRENT_TIME); + /*xcb_ungrab_key(conn, event->detail, screen->root, XCB_MOD_MASK_ANY);*/ + 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); +} + /* * 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 +732,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 +742,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 +753,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 +764,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; } } From c323f8963f28e9fda7b2faa7a070cbea71b5c882 Mon Sep 17 00:00:00 2001 From: JezerM Date: Wed, 14 Jul 2021 23:27:09 -0600 Subject: [PATCH 149/183] Set focus after sending event --- i3lock.c | 1 + 1 file changed, 1 insertion(+) diff --git a/i3lock.c b/i3lock.c index c88a531b..20cca613 100644 --- a/i3lock.c +++ b/i3lock.c @@ -671,6 +671,7 @@ static void send_key_to_root(xcb_key_press_event_t *event, bool twice) { } 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 /* revert_to */, win, XCB_CURRENT_TIME); } /* From 17dcaf8f71059a936eb1e7c8ce2a64bfef8d85ec Mon Sep 17 00:00:00 2001 From: Kai Lyons Date: Mon, 9 Aug 2021 07:17:23 -0600 Subject: [PATCH 150/183] Update README.md --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index a0456819..fa200cac 100644 --- a/README.md +++ b/README.md @@ -134,6 +134,7 @@ i3lock-color is available on **GURU**, under [`x11-misc/i3lock-color`](https://g ## FreeBSD port ~~[i3lock-color-port](https://github.com/rkashapov/i3lock-color-port/)~~ (severely out of date). +[i3lock-color](https://www.freshports.org/x11/i3lock-color/) (up-to-date port) ## Running i3lock-color Simply invoke the 'i3lock' command. To get out of it, enter your password and press enter. From ea4f49c6adbbc3edd49d72d59338f80b2c44fe85 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 9 Aug 2021 09:47:55 -0400 Subject: [PATCH 151/183] Get rid of the old link --- README.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/README.md b/README.md index fa200cac..21af894a 100644 --- a/README.md +++ b/README.md @@ -133,8 +133,7 @@ Unfortunately the previous maintainer left, and the package got dumped back into i3lock-color is available on **GURU**, under [`x11-misc/i3lock-color`](https://github.com/gentoo/guru/tree/master/x11-misc/i3lock-color). ## FreeBSD port -~~[i3lock-color-port](https://github.com/rkashapov/i3lock-color-port/)~~ (severely out of date). -[i3lock-color](https://www.freshports.org/x11/i3lock-color/) (up-to-date port) +New 2021 port on freshports: [x11/i3lock-color/](https://www.freshports.org/x11/i3lock-color/) ## Running i3lock-color Simply invoke the 'i3lock' command. To get out of it, enter your password and press enter. From a0564ae0b5d5a6e0f9cddd8dac09428a16f14c5e Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 9 Aug 2021 10:06:45 -0400 Subject: [PATCH 152/183] Update Build Test.yml --- .github/workflows/Build Test.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/Build Test.yml b/.github/workflows/Build Test.yml index a3ecf16b..96585f16 100644 --- a/.github/workflows/Build Test.yml +++ b/.github/workflows/Build Test.yml @@ -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 From 372bfe694f1f41a04786c5181925fb401433a5bf Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 9 Aug 2021 10:08:53 -0400 Subject: [PATCH 153/183] Update codeql-analysis.yml --- .github/workflows/codeql-analysis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 52090baa..db8fd16c 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -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 From c3eac23e199186484d91cc6ceef9f3b29cd0253d Mon Sep 17 00:00:00 2001 From: JezerM Date: Mon, 9 Aug 2021 14:54:35 -0600 Subject: [PATCH 154/183] Added --special-passthrough flag, manpage updated --- i3lock.1 | 7 +++++++ i3lock.c | 13 +++++++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 775f43cc..1f626184 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -388,6 +388,13 @@ power - XF86PowerDown, XF86PowerOff, XF86Sleep volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume .RE +.TP +.B \-\-special\-passthrough +Allowed keys to pass through the locked screen, with \-\-pass\-{media, screen, +power, volume}\-keys, are forcibly sent to the window manager or desktop +environment in three steps: release keyboard, send key, and grab the keyboard. +No other keys will be sent to the WM/DE. + .TP .B \-\-bar\-indicator Replaces the usual ring indicator with a bar indicator. Comes with perks. diff --git a/i3lock.c b/i3lock.c index 20cca613..d5918631 100644 --- a/i3lock.c +++ b/i3lock.c @@ -259,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; @@ -658,8 +659,12 @@ static bool skip_without_validation(void) { * 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); - /*xcb_ungrab_key(conn, event->detail, screen->root, XCB_MOD_MASK_ANY);*/ 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); @@ -671,7 +676,7 @@ static void send_key_to_root(xcb_key_press_event_t *event, bool twice) { } 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 /* revert_to */, win, XCB_CURRENT_TIME); + xcb_set_input_focus(conn, XCB_INPUT_FOCUS_PARENT, win, XCB_CURRENT_TIME); } /* @@ -1567,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}, @@ -2128,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: From 50364e73ba5b77dc8f230e95c0e6c11fee82653e Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 9 Aug 2021 17:15:59 -0400 Subject: [PATCH 155/183] Add a note to the manpage --- i3lock.1 | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/i3lock.1 b/i3lock.1 index 1f626184..570ddabb 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -390,11 +390,16 @@ volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume .TP .B \-\-special\-passthrough -Allowed keys to pass through the locked screen, with \-\-pass\-{media, screen, +Allows special keys to pass through the locked screen, with \-\-pass\-{media, screen, power, volume}\-keys, are forcibly sent to the window manager or desktop environment in three steps: release keyboard, send key, and 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. From 6784bec7ca108381a642b1f6bf0a425691bdb273 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 9 Aug 2021 17:23:07 -0400 Subject: [PATCH 156/183] Fix grammar --- i3lock.1 | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 570ddabb..88aa16cd 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -391,8 +391,8 @@ volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume .TP .B \-\-special\-passthrough Allows special keys to pass through the locked screen, with \-\-pass\-{media, screen, -power, volume}\-keys, are forcibly sent to the window manager or desktop -environment in three steps: release keyboard, send key, and grab the keyboard. +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. From adcea0770ba5a2e2d8d68131bb7b2e8cd419b5c6 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 21 Aug 2021 00:12:11 -0400 Subject: [PATCH 157/183] Add Discord link and badge --- README.md | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e8ec9d54..bb71ab9a 100644 --- a/README.md +++ b/README.md @@ -11,20 +11,23 @@ [![Latest release](https://img.shields.io/github/release-date/Raymo111/i3lock-color?label=latest%20release)](https://github.com/Raymo111/i3lock-color/releases/latest) [![Commits](https://img.shields.io/github/commits-since/Raymo111/i3lock-color/latest?include_prereleases&sort=semver)](https://github.com/Raymo111/i3lock-color/commits/master) ![Latest commit](https://img.shields.io/github/last-commit/Raymo111/i3lock-color) - -[![AUR release ver](https://img.shields.io/aur/version/i3lock-color?label=AUR%20release%20ver)](https://aur.archlinux.org/packages/i3lock-color/) -[![AUR git ver](https://img.shields.io/aur/version/i3lock-color-git?label=AUR%20git%20ver)](https://aur.archlinux.org/packages/i3lock-color-git/) -![AUR votes](https://img.shields.io/aur/votes/i3lock-color-git) -[![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/network/members) -[![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/stargazers) -[![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/watchers) +[![AUR release ver](https://img.shields.io/aur/version/i3lock-color?label=AUR%20release%20ver&logo=ArchLinux)](https://aur.archlinux.org/packages/i3lock-color/) +[![AUR git ver](https://img.shields.io/aur/version/i3lock-color-git?label=AUR%20git%20ver&logo=ArchLinux)](https://aur.archlinux.org/packages/i3lock-color-git/) +![AUR votes](https://img.shields.io/aur/votes/i3lock-color-git?logo=ArchLinux) +[![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color?logo=GitHub)](https://github.com/Raymo111/i3lock-color/network/members) +[![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color?logo=GitHub)](https://github.com/Raymo111/i3lock-color/stargazers) +[![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color?logo=GitHub)](https://github.com/Raymo111/i3lock-color/watchers) +[![Discord server](https://img.shields.io/discord/878461145197977630?label=Discord&logo=Discord)](https://discord.gg/FzVPghyDt2) ![Maintained](https://img.shields.io/maintenance/yes/2021) + ### The world's most popular non-default computer lockscreen. **A modern version of i3lock with color functionality and other features.** ![i3lock-color in action](examples/screenshot.png "Screenshot sample") +**NEW: Official Discord server at https://discord.gg/FzVPghyDt2** + i3lock is a simple screen locker like slock. After starting it, you will see a white screen (you can configure the color/an image). You can return to your screen by entering your password. Many little improvements have been made to i3lock over time: From 2a54971cd8a0f24d80d8dcc1b18bad98db4c0cc2 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 21 Aug 2021 19:38:29 -0400 Subject: [PATCH 158/183] Update install-i3lock-color.sh --- install-i3lock-color.sh | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/install-i3lock-color.sh b/install-i3lock-color.sh index 1ba24a7b..55893f68 100755 --- a/install-i3lock-color.sh +++ b/install-i3lock-color.sh @@ -1,8 +1,13 @@ #!/bin/bash -./build.sh -cd build +LICENSE='/usr/share/licenses/i3lock-color/LICENSE' +./build.sh +cd build sudo make install +sudo install -Dm644 ../LICENSE "$LICENSE" -sudo install -Dm644 ../LICENSE "/usr/share/licenses/i3lock-color/LICENSE" +echo "i3lock-color installed. The binary and manpage listing are `i3lock`. +The license can be found at $LICENSE +GitHub repo: https://github.com/Raymo111/i3lock-color +Discord server: https://discord.gg/FzVPghyDt2" From 305da376f578fc9d5cc89904b4fdcd68b69d89ea Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Sat, 21 Aug 2021 19:59:44 -0400 Subject: [PATCH 159/183] Fix quotes --- install-i3lock-color.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/install-i3lock-color.sh b/install-i3lock-color.sh index 55893f68..7dcb6682 100755 --- a/install-i3lock-color.sh +++ b/install-i3lock-color.sh @@ -7,7 +7,7 @@ cd build sudo make install sudo install -Dm644 ../LICENSE "$LICENSE" -echo "i3lock-color installed. The binary and manpage listing are `i3lock`. +echo "i3lock-color installed. The binary and manpage listing are \`i3lock'. The license can be found at $LICENSE GitHub repo: https://github.com/Raymo111/i3lock-color Discord server: https://discord.gg/FzVPghyDt2" From 73358ffde9485c72d141f7f1e6ec61ad0715ab0c Mon Sep 17 00:00:00 2001 From: cmsxbc Date: Sat, 11 Sep 2021 01:13:14 +0800 Subject: [PATCH 160/183] fix(typo): fix typo in greeter_y_expr, error message of greeter-pos and wrong-pos --- i3lock.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/i3lock.c b/i3lock.c index d5918631..98034633 100644 --- a/i3lock.c +++ b/i3lock.c @@ -171,7 +171,7 @@ char verif_y_expr[32] = "iy\0"; char wrong_x_expr[32] = "ix\0"; char wrong_y_expr[32] = "iy\0"; char greeter_x_expr[32] = "ix\0"; -char greeter_y_expr[32] = "ix\0"; +char greeter_y_expr[32] = "iy\0"; double time_size = 32.0; double date_size = 14.0; @@ -2044,7 +2044,7 @@ int main(int argc, char *argv[]) { } arg = optarg; if (sscanf(arg, "%30[^:]:%30[^:]", wrong_x_expr, wrong_y_expr) != 2) { - errx(1, "verifpos must be of the form x:y\n"); + errx(1, "wrongpos must be of the form x:y\n"); } break; case 544: @@ -2089,11 +2089,11 @@ int main(int argc, char *argv[]) { case 548: if (strlen(optarg) > 31) { // this is overly restrictive since both the x and y string buffers have size 32, but it's easier to check. - errx(1, "indicator position string can be at most 31 characters\n"); + errx(1, "greeter position string can be at most 31 characters\n"); } arg = optarg; if (sscanf(arg, "%30[^:]:%30[^:]", greeter_x_expr, greeter_y_expr) != 2) { - errx(1, "indpos must be of the form x:y\n"); + errx(1, "greeterpos must be of the form x:y\n"); } break; From 995f58dc7323d53095f1687ae157bfade1d00542 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jezer=20Mej=C3=ADa?= <59768785+JezerM@users.noreply.github.com> Date: Sat, 18 Sep 2021 22:44:07 -0600 Subject: [PATCH 161/183] Tab completion (#204) (#230) * Tab completion * Added --special-passthrough flag * Integration with autotools * Fixed build test * Update completions * Indent Co-authored-by: Raymond Li --- Makefile.am | 27 ++++++ configure.ac | 3 + i3lock-bash | 113 ++++++++++++++++++++++ i3lock-zsh | 171 +++++++++++++++++++++++++++++++++ m4/ax_check_bash_completion.m4 | 34 +++++++ m4/ax_check_zsh_completion.m4 | 37 +++++++ 6 files changed, 385 insertions(+) create mode 100644 i3lock-bash create mode 100644 i3lock-zsh create mode 100644 m4/ax_check_bash_completion.m4 create mode 100644 m4/ax_check_zsh_completion.m4 diff --git a/Makefile.am b/Makefile.am index c2e723ea..dbbaa4d1 100644 --- a/Makefile.am +++ b/Makefile.am @@ -13,6 +13,33 @@ pamddir = $(sysconfdir)/pam.d pamd_files = pam/i3lock pamd_DATA = $(pamd_files) +if ENABLE_BASH_COMPLETION + bashcompletiondir = $(BASH_COMPLETION_DIR) + dist_bashcompletion_DATA = i3lock-bash +endif + +if ENABLE_ZSH_COMPLETION + zshcompletiondir = $(ZSH_COMPLETION_DIR) + dist_zshcompletion_DATA = i3lock-zsh +endif + +install-data-hook: +if ENABLE_BASH_COMPLETION + test -f "${BASH_COMPLETION_DIR}/i3lock-bash" && mv -f "${BASH_COMPLETION_DIR}/i3lock-bash" "${BASH_COMPLETION_DIR}/i3lock" || true +endif +if ENABLE_ZSH_COMPLETION + test -f "${ZSH_COMPLETION_DIR}/i3lock-zsh" && mv -f "${ZSH_COMPLETION_DIR}/i3lock-zsh" "${ZSH_COMPLETION_DIR}/_i3lock" || true +endif + +uninstall-hook: +if ENABLE_BASH_COMPLETION + rm -f ${BASH_COMPLETION_DIR}/i3lock +endif +if ENABLE_ZSH_COMPLETION + rm -f ${ZSH_COMPLETION_DIR}/_i3lock +endif + + AM_CPPFLAGS = \ @AX_EXTEND_SRCDIR_CPPFLAGS@ diff --git a/configure.ac b/configure.ac index a1eda4c4..c74cc322 100644 --- a/configure.ac +++ b/configure.ac @@ -124,6 +124,9 @@ AX_APPEND_FLAG([-pthread], [AM_CFLAGS]) AX_CHECK_COMPILE_FLAG([-Wunused-value], [AX_APPEND_FLAG([-Wunused-value], [AM_CFLAGS])]) AC_SUBST(AM_CFLAGS) +AX_CHECK_BASH_COMPLETION +AX_CHECK_ZSH_COMPLETION + # Checks for header files. AC_CHECK_HEADERS([fcntl.h float.h inttypes.h limits.h locale.h netinet/in.h paths.h stddef.h stdint.h stdlib.h string.h sys/param.h sys/socket.h sys/time.h unistd.h], , [AC_MSG_FAILURE([cannot find the $ac_header header, which i3lock requires])]) diff --git a/i3lock-bash b/i3lock-bash new file mode 100644 index 00000000..cab812e0 --- /dev/null +++ b/i3lock-bash @@ -0,0 +1,113 @@ +#!/usr/bin/env bash +# bash completion for i3lock-color + +_i3lock() { + local cur="${COMP_WORDS[COMP_CWORD]}" + local last="${COMP_WORDS[COMP_CWORD - 1]}" + local -a options=( + "--version -v" + "--nofork -n" + "--beep -b" + "--no-unlock-indicator -u" + "--image -i" + "--raw" + "--color -c" + "--tiling -t" + "--centered -C" + "--fill -F" + "--max -M" + "--scale -L" + "--pointer -p" + "--ignore-empty-password -e" + "--show-failed-attempts" + "--debug" + + # i3lock-color OPTIONS + + "--screen -S" + "--blur -B" + "--clock --force-clocl -k" + "--indicator" + "--radius" + "--ring-width" + # Colors + "--inside-color" + "--ring-color" + "--insidever-color" + "--ringver-color" + "--insidewrong-color" + "--ringwrong-color" + "--line-color" + "--line-uses-inside" + "--line-uses-ring" + "--keyhl-color" + "--bshl-color" + "--separator-color" + "--verif-color" + "--wrong-color" + "--modif-color" + "--layout-color" + "--time-color" + "--date-color" + "--greeter-color" + # Text + "--time-str" + "--date-str" + "--verif-text" + "--wrong-text" + "--keylayout" + "--noinput-text" + "--lock-text" + "--lockfailed-text" + "--greeter-text" + "--no-modkey-text" + # Align + "--time-align --date-align --layout-align --verif-align --wrong-algin --modif-align --greeter-align" + # Outline + "--timeoutlinecolor --dateoutlinecolor --layoutoutlinecolor --verifoutlinecolor --wrongoutlinecolor --modifoutline-color --greeteroutlinecolor" + # Fonts + "--time-font --date-font --layout-font --verif-font --wrong-font --greeter-font" + # Size + "--timesize --datesize --layoutsize --verifsize --wrongsize --greetersize" + # Outline width + "--timeoutlinewidth --dateoutlinewidth --layoutoutlinewidth --verifoutlinewidth --wrongoutlinewidth --modifieroutline-width --greeteroutlinewidth" + # Position + "--ind-pos" + "--time-pos" + "--date-pos" + "--greeter-pos" + # Media keys + "--pass-media-keys" + "--pass-screen-keys" + "--pass-power-keys" + "--pass-volume-keys" + "--special-passthrough" + # Bar mode + "--bar-indicator" + "--bar-direction" + "--bar-orientation" + "--bar-step" + "--bar-max-height" + "--bar-base-width" + "--bar-color" + "--bar-periodic-step" + "--bar-pos" + "--bar-count" + "--bar-total-width" + # Extra configs + "--redraw-thread" + "--refresh-rate" + "--composite" + "--no-verify" + "--slideshow-interval" + "--slideshow-random-selection" +) + local args="" + for i in "${options[@]}"; do + args+="$i " + done + COMPREPLY=( $(compgen -W "${args}" -- ${cur}) ) + +} + +complete -F _i3lock i3lock diff --git a/i3lock-zsh b/i3lock-zsh new file mode 100644 index 00000000..baf64033 --- /dev/null +++ b/i3lock-zsh @@ -0,0 +1,171 @@ +#compdef i3lock + +_i3lock() { + integer ret=1 + local -a args + zstyle ':completion:*:*:i3lock:*:descriptions' format '' + args+=( + "(--version -v)"{--version,-v}"[Display the version of i3lock]" + "(--nofork -n)"{--nofork,-n}"[Don't fork after starting]" + "(--beep -b)"{--beeping,-b}"[Enable beeping]" + "(--no-unlock-indicator -u)"{--no-unlock-indicator,-u}"[Disable the unlock indicator]" + "(--image -i)"{--image,-i}"[Display the given PNG image instead of a blank screen]:filename:_files -g '*.(png|jpg)'" + "--raw[Read the image given by --image as a raw image instead of PNG]:raw:" + "(--color -c)"{--color,-c}"[Turn the screen into the given hex color]:hex:->hex" + "(--tiling -t)"{--tiling,-t}"[Image will be displayed tiled all over the screen]" + "(--centered -C)"{--centered,-C}"[Image will be displayed centered on the screen]" + "(--fill -F)"{--fill,-F}"[Image will fill all over the screen]" + "(--max -M)"{--max,-M}"[Image will fit the screen at width or height]" + "(--scale -L)"{--scale,-L}"[Image will be stretched on the screen]" + "(--pointer -p)"{--pointer,-p}"[Sets mouse pointer type]:pointer:(win default)" + "(--ignore-empty-password -e)"{--ignore-empty-password,-e}"[Do not validate empty password]" + "(--show-failed-attempts -f)"{--show-failed-attempts,-f}"[Show the number of failed attemps]" + "--debug[Enables debug logging.]" + + # i3lock-color OPTIONS + + "(--screen -S)"{--screen,-S}"[Specifies which display to draw the unlock indicator]:int:" + "(--blur -B)"{--blur,-B}"[Captures the screen and blurs it using the given sigma]:sigma:" + "(--clock --force-clock -k)"{--clock,--force-clock,-k}"[Displays the clock]" + "--indicator[Forces the indicator to always be visible]" + "--radius[The radius of the circle]:float:" + "--ring-width[The width of the ring unlock indicator]:float:" + # Colors + "--inside-color[Sets the default \"resting\" color for the interior circle]:hex:->hex" + "--ring-color[Sets the default ring color]:hex:->hex" + "--insidever-color[Sets the interior circle color while the password is being verified]:hex:->hex" + "--ringver-color[Sets the ring color while the password is being verified]:hex:->hex" + "--insidewrong-color[Sets the interior circle color for suring flash for an incorrect password]:hex:->hex" + "--ringwrong-color[Sets the ring color during the flas for an incorrect password]:hex:->hex" + "--line-color[Sets the color for the line separating the inside circle, and the outer ring]:hex:->hex" + "--line-uses-inside[Conflicts with --line-uses-ring. Overrides --linecolor; the line will match the inside color]" + "--line-uses-ring[Conflicts with --line-uses-inside. Overrides --linecolor; The line will match the ring color]" + "--keyhl-color[Sets the color of the ring 'highlight' strokes that appear upon keypress]:hex:->hex" + "--bshl-color[Sets the color of the ring 'highlight' strokes that appear upon backspace]:hex:->hex" + "--separator-color[Sets the color of the 'separator', which is at both ends of the ring highlights]:hex:->hex" + "--verif-color[Sets the color of the status text while verifying]:hex:->hex" + "--wrong-color[Sets the color of the status when \"wrong\"]:hex:->hex" + "--modif-color[Sets the color of the status text while verifying]:hex:->hex" + "--layout-color[Sets the color of the keyboard layout text]:hex:->hex" + "--time-color[Sets te color of the time in the clock]:hex:->hex" + "--date-color[Sets the color of the date in the clock]:hex:->hex" + "--greeter-color[Sets the color of the greeter text]:hex:->hex" + # Text + "--time-str[Sets the format used for generating the time string]:str:" + "--date-str[Sets the format used for generating the date string]:str:" + "--verif-text[Sets the string to be shown while verifying]:str:" + "--wrong-text[Sets the string to be shown upon entering an incorrect password]:str:" + "--keylayout[Displays the keylayout]:mode:((0\:'Displays the full string returned by the query, i.e. English (US)' 1\:'Displays up until the first parenthesis, i.e. English' 2\:'Displays just the contents of the parenthesis, i.e US'))" + "--noinput-text[Sets the string to be shown upon pressing backspace whithout anything to delete]:str:" + "--lock-text[Sets the string to be shown while acquiring pointer and keyboard focus]:str:" + "--lockfailed-text[Sets the string to be shown after failing to acquire pointer and keyboard focus]:str:" + "--greeter-text[Sets the greeter text]:str:" + "--no-modkey-text[Hides the modkey indicator]" + # Align + "(--time-align --date-align --layout-align --verif-align --wrong-align --modif-align --greeter-align)"{--time-align,--date-align,--layout-align,--verif-align,--wrong-align,--modif-align,--greeter-align}"[Sets the text alignment]:alignment:((0\:'default' 1\:'left aligned' 2\:'right aligned'))" + # Outline color + "(--timeoutline-color --dateoutline-color --layoutoutline-color --verifoutline-color --wrongoutline-color --modifoutline-color --greeteroutline-color)"{--timeoutline-color,--dateoutline-color,--layoutoutline-color,--verifoutline-color,--wrongoutline-color,--modifoutline-color,--greeteroutline-color}"[Sets the color of the outline]:hex:->hex" + # Fonts + "(--time-font --date-font --layout-font --verif-font --wrong-font --greeter-font)"{--time-font,--date-font,--layout-font,--verif-font,--wrong-font,--greeter-font}"[Sets the font used to render various strings]:str:" + # Size + "(--time-size --date-size --layout-size --verif-size --wrong-size --greeter-size)"{--time-size,--date-size,--layout-size,--verif-size,--wrong-size,--greeter-size}"[Sets the font size used to render various strings]:int:" + # Outline width + "(--timeoutline-width --dateoutline-width --layoutoutline-width --verifoutline-width --wrongoutline-width --modifieroutline-width --greeteroutline-width)"{--timeoutline-width,--dateoutline-width,--layoutoutline-width,--verifoutline-width,--wrongoutline-width,--modifieroutline-width,--greeteroutline-width}"[Sets the width of the outline]:float:" + # Position + "--ind-pos[Sets the position for the unlock indicator]:pos:->ind_pos" + "--time-pos[Sets the position for the time string]:pos:->time_pos" + "--date-pos[Sets the position for the date string]:pos:->date_pos" + "--greeter-pos[Sets the position for the greeter string]:pos:->greeter_pos" + # Media keys + "--pass-media-keys[Allow media keys to be used while the screen is locked]" + "--pass-screen-keys[Allow screen keys to be used while the screen is locked]" + "--pass-power-keys[Allow power keys to be used while the screen is locked]" + "--pass-volume-keys[Allow volume keys to be used while the screen is locked]" + "--special-passthrough[Force allowed key to be sent to wm/de]" + # Bar mode + "--bar-indicator[Replaces the usual ring indicator with a bar indicator]" + "--bar-direction[Sets the direction the bars grow in]:direction:((0\:'default' 1\:'reverse' 2\:'both'))" + "--bar-orientation[Sets whether the bar is vertically or horizontally oriented]:orientation:(vertical horizontal)" + "--bar-step[Sets the step that each bar decreases by when a key is pressed]:int:" + "--bar-max-height[The maximum height a bar can get to]:float:" + "--bar-base-width[The thickness of the \"base\" bar that all the bar originate from]:float:" + "--bar-color[Sets the default color of the bar base]:hex:->hex" + "--bar-periodic-step[The value by which the bars decrease each time the screen is redrawn]:int:" + "--bar-pos[Sets the bar position]:pos:->bar_pos" + "--bar-count[Sets the number of minibars to draw on each screen]:int:" + "--bar-total-width[The total width of the bar]:float:" + # Extra configs + "--redraw-thread[Starts a separate thread for redrawing the screen]" + "--refresh-rate[The refresh rate of the indicator]:double:" + "--composite" + "--no-verify[Do not verify the password provided by the user and unlock inmediately]" + # Slideshow + "--slideshow-interval[The interval to wait until switching to the nex image]:double:" + "--slideshow-random-selection[Randomize the order of the images]" + + + ) + _arguments $args[@] && ret=0 + + case "$state" in + hex) + zstyle ':completion:*:*:i3lock:*:descriptions' format '%d' + _message "Color in hexadecimal rrggbbaa, like #ff0000ff or #354F9AFF" + ;; + ind_pos) + zstyle ':completion:*:*:i3lock:*:normal' format '%d' + zstyle ':completion:*:*:i3lock:*:descriptions' format '%B%d%b' + + _message "\"x position:y position\"" + _message -e "normal" "'x' - x position of the current display. Corresponds to the left-most row of pixels" + _message -e "normal" "'y' - y position of the current display. Corresponds to the topmost row of pixels" + _message -e "normal" "'w' - width of the current display" + _message -e "normal" "'w' - height of the current display" + _message -e "normal" "'r' - unlock indicator radius" + ;; + time_pos) + zstyle ':completion:*:*:i3lock:*:normal' format '%d' + zstyle ':completion:*:*:i3lock:*:descriptions' format '%B%d%b' + + _message "\"x position:y position\"" + _message -e "normal" "All the variables from --ind-pos may be used, in addition to:" + _message -e "normal" "'ix' - x position of the indicator on the current display" + _message -e "normal" "'iy' - y position of the indicator on the current display" + _message -e "normal" "If the --bar-indicator option is used, the following may be used" + _message -e "normal" "'bw' - width od the bar indicator" + _message -e "normal" "'bx' - x position of the bar indicator on the current display" + _message -e "normal" "'by' - y position of the bar indicator on the current display" + ;; + date_pos) + zstyle ':completion:*:*:i3lock:*:normal' format '%d' + zstyle ':completion:*:*:i3lock:*:descriptions' format '%B%d%b' + + _message "\"x position:y position\"" + _message -e "normal" "All the variables from --ind-pos and --time-pos may be used, in addition to:" + _message -e "normal" "'tx' - x position of the timestring on the current display" + _message -e "normal" "'ty' - y position of the timestring on the current display" + ;; + greeter_pos) + zstyle ':completion:*:*:i3lock:*:normal' format '%d' + zstyle ':completion:*:*:i3lock:*:descriptions' format '%B%d%b' + + _message "\"x position:y position\"" + _message -e "normal" "All the variables from --ind-pos and --time-pos may be used" + ;; + bar_pos) + zstyle ':completion:*:*:i3lock:*:normal' format '%d' + zstyle ':completion:*:*:i3lock:*:descriptions' format '%B%d%b' + + _message "\"x position:y position\"" + _message -e "normal" "All the variables from --ind-pos and --time-pos may be used" + _message -e "normal" "If only one number is provided, sets the vertical offset from the top or left edge" + _message -e "normal" "If two numbers are provided, sets the starting position of the bar" + ;; + + + esac + + return ret +} + +_i3lock diff --git a/m4/ax_check_bash_completion.m4 b/m4/ax_check_bash_completion.m4 new file mode 100644 index 00000000..b98317c3 --- /dev/null +++ b/m4/ax_check_bash_completion.m4 @@ -0,0 +1,34 @@ +# SYNOPSIS +# +# AX_CHECK_BASH_COMPLETION() +# +# DESCRIPTION +# +# Checks for the presence of an --with-bash-completion-dir option to set a +# custom path to bash completions. If no specified, it will use the default +# path as long as bash-completion is available. +# + +#serial 1 + +AC_DEFUN([AX_CHECK_BASH_COMPLETION], [ + AC_ARG_WITH([bash-completion-dir], + AS_HELP_STRING([--with-bash-completion-dir[=PATH]], + [Install the bash auto-completion script in this directory. @<:@default=yes@:>@]), + [], + [with_bash_completion_dir=yes]) + +# Check bash-completion + if test "x$with_bash_completion_dir" = "xyes"; then + PKG_CHECK_MODULES([BASH_COMPLETION], [bash-completion >= 2.0], [ + BASH_COMPLETION_DIR="$datadir/bash-completion/completions" + ], [ + BASH_COMPLETION_DIR="" + ]) + else + BASH_COMPLETION_DIR="$with_bash_completion_dir" + fi + AC_SUBST([BASH_COMPLETION_DIR]) + AM_CONDITIONAL([ENABLE_BASH_COMPLETION], [test "x$with_bash_completion_dir" != "xno" && test "$BASH_COMPLETION_DIR" != ""]) +]) + diff --git a/m4/ax_check_zsh_completion.m4 b/m4/ax_check_zsh_completion.m4 new file mode 100644 index 00000000..f4029748 --- /dev/null +++ b/m4/ax_check_zsh_completion.m4 @@ -0,0 +1,37 @@ +# SYNOPSIS +# +# AX_CHECK_ZSH_COMPLETION() +# +# DESCRIPTION +# +# Checks for the presence of an --with-zsh-completion-dir option to set a +# custom path to zsh completions. If no specified, it will use the default +# path as long as zsh is available. +# + +#serial 1 + +AC_DEFUN([AX_CHECK_ZSH_COMPLETION], [ + AC_ARG_WITH([zsh-completion-dir], + AS_HELP_STRING([--with-zsh-completion-dir[=PATH]], + [Install the zsh auto-completion script in this directory. @<:@default=yes@:>@]), + [], + [with_zsh_completion_dir=yes]) + +# Check zsh-completion + if test "x$with_zsh_completion_dir" = "xyes"; then + AC_ARG_VAR([ZSH_AVAILABLE], []) + AC_CHECK_PROG([ZSH_AVAILABLE], [zsh], [yes], [no]) + + AS_IF([test "$ZSH_AVAILABLE" = "yes"], [ + ZSH_COMPLETION_DIR="$datadir/zsh/vendor-completions" + ], [ + ZSH_COMPLETION_DIR="" + ]) + else + ZSH_COMPLETION_DIR="$with_zsh_completion_dir" + fi + AC_SUBST([ZSH_COMPLETION_DIR]) + AM_CONDITIONAL([ENABLE_ZSH_COMPLETION], [test "x$with_zsh_completion_dir" != "xno" && test "$ZSH_COMPLETION_DIR" != ""]) +]) + From 1b192597a0adfd33333f5d81153edd24d789d0d3 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 8 Dec 2021 17:36:06 -0500 Subject: [PATCH 162/183] Update .gitignore --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index f5d25b19..040b7749 100644 --- a/.gitignore +++ b/.gitignore @@ -32,3 +32,4 @@ Makefile.in /install-sh /missing /stamp-h1 +aminclude_static.am From 63435c5fed2dbdf22e97c350d1cdac749da12057 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 10 Jan 2022 11:30:14 -0500 Subject: [PATCH 163/183] Add distros that package i3lock-color --- README.md | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index bb71ab9a..5967f8c2 100644 --- a/README.md +++ b/README.md @@ -125,18 +125,35 @@ To build AND install, run: ``` You may choose to modify the script based on your needs/OS/distro. +## Alpine Linux Packages +Alpine packages i3lock-color for a variety of architectures. A full list can be found on [pkgs.alpinelinux.org](https://pkgs.alpinelinux.org/packages?name=i3lock-color&branch=edge). + ## Arch Linux Packages ~~[Stable version in Community](https://www.archlinux.org/packages/community/x86_64/i3lock-color/)~~ -Unfortunately the previous maintainer left, and the package got dumped back into the AUR where I'm now maintaining it. I'm looking for a TU to sponsor it back into Community, but for now, get it on AUR: +Unfortunately the previous maintainer left, and the package got dumped back into the AUR where I'm now maintaining it. You can get it on AUR: - [Release Version on AUR](https://aur.archlinux.org/packages/i3lock-color/) - [Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/) -## Gentoo Package +If you're an Arch TU and you're reading this please consider sponsoring it into Community again! + +## Gentoo Linux Package i3lock-color is available on **GURU**, under [`x11-misc/i3lock-color`](https://github.com/gentoo/guru/tree/master/x11-misc/i3lock-color). +## Kali Linux Package +A Debian/Kali package is available: https://gitlab.com/kalilinux/packages/i3lock-color. + +## NixOS Package +A NixOS package is available. To install, run +``` +nix-env -iA nixos.i3lock-color +``` + +## Void Linux Package +A Void Linux package is available at https://github.com/void-linux/void-packages/tree/master/srcpkgs/i3lock-color. + ## FreeBSD port -New 2021 port on freshports: [x11/i3lock-color/](https://www.freshports.org/x11/i3lock-color/) +A FreeBSD port is available on freshports: [x11/i3lock-color/](https://www.freshports.org/x11/i3lock-color/). ## Running i3lock-color Simply invoke the 'i3lock' command. To get out of it, enter your password and press enter. From 501caf46019a8c24603f170e1132e9a8afd48ff8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jezer=20Mej=C3=ADa?= <59768785+JezerM@users.noreply.github.com> Date: Mon, 10 Jan 2022 10:35:18 -0600 Subject: [PATCH 164/183] Slideshow images loaded when needed (#241) (#242) * Slideshow images are now loaded when needed * Required slideshow images are loaded randomly as well Co-authored-by: Raymond Li --- i3lock.c | 44 ++++++++++++++++++++++++++++++-------------- unlock_indicator.c | 21 ++++++++++++++------- 2 files changed, 44 insertions(+), 21 deletions(-) diff --git a/i3lock.c b/i3lock.c index 98034633..23180398 100644 --- a/i3lock.c +++ b/i3lock.c @@ -28,6 +28,7 @@ #include #include #include +#include #ifdef __OpenBSD__ #include #else @@ -244,8 +245,12 @@ static uint8_t xkb_base_event; static uint8_t xkb_base_error; static int randr_base = -1; +char *image_path = NULL; +char *image_raw_format = NULL; +char *slideshow_path = NULL; + cairo_surface_t *img = NULL; -cairo_surface_t *img_slideshow[256]; +char *img_slideshow[256]; cairo_surface_t *blur_bg_img = NULL; int slideshow_image_count = 0; int slideshow_interval = 10; @@ -1368,7 +1373,7 @@ static void raise_loop(xcb_window_t window) { /* * Loads an image from the given path. Handles JPEG and PNG. Returns NULL in case of error. */ -static cairo_surface_t* load_image(char* image_path, char* image_raw_format) { +cairo_surface_t* load_image(char* image_path) { cairo_surface_t *img = NULL; JPEG_INFO jpg_info; @@ -1400,32 +1405,42 @@ static cairo_surface_t* load_image(char* image_path, char* image_raw_format) { } /* - * Loads the images from the provided directory and stores them in the pointer array + * Reads the provided directory and stores the images path in the pointer array * img_slideshow */ -static void load_slideshow_images(const char *path, char *image_raw_format) { +bool load_slideshow_images(const char *path) { slideshow_enabled = true; DIR *d; struct dirent *dir; int file_count = 0; + slideshow_image_count = 0; + + DEBUG("Loading slideshow images at \"%s\"\n", path); d = opendir(path); if (d == NULL) { printf("Could not open directory: %s\n", path); - exit(EXIT_SUCCESS); + return false; + } + + regex_t reg; + + if (regcomp(®, ".*\\.(jpe?g|png)", REG_EXTENDED)) { + printf("Could not compile regex\n"); + return false; } while ((dir = readdir(d)) != NULL) { - if (file_count >= 256) { - break; - } + if (file_count >= 256) break; + int result = regexec(®, dir->d_name, 0, NULL, 0); + if (result) continue; char path_to_image[256]; strcpy(path_to_image, path); strcat(path_to_image, "/"); strcat(path_to_image, dir->d_name); - img_slideshow[file_count] = load_image(path_to_image, image_raw_format); + img_slideshow[file_count] = strdup(path_to_image); if (img_slideshow[file_count] != NULL) { ++file_count; @@ -1433,15 +1448,14 @@ static void load_slideshow_images(const char *path, char *image_raw_format) { } slideshow_image_count = file_count; - + regfree(®); closedir(d); + return true; } int main(int argc, char *argv[]) { struct passwd *pw; char *username; - char *image_path = NULL; - char *image_raw_format = NULL; #ifndef __OpenBSD__ int ret; struct pam_conv conv = {conv_callback, NULL}; @@ -2359,10 +2373,12 @@ int main(int argc, char *argv[]) { init_colors_once(); if (image_path != NULL) { if (!is_directory(image_path)) { - img = load_image(image_path, image_raw_format); + img = load_image(image_path); } else { /* Path to a directory is provided -> use slideshow mode */ - load_slideshow_images(image_path, image_raw_format); + slideshow_path = strdup(image_path); + if (!load_slideshow_images(slideshow_path)) exit(EXIT_FAILURE); + img = load_image(img_slideshow[0]); } free(image_path); diff --git a/unlock_indicator.c b/unlock_indicator.c index 9fc07f05..b254c0f2 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -62,11 +62,14 @@ extern char *modifier_string; /* A Cairo surface containing the specified image (-i), if any. */ extern cairo_surface_t *img; -extern cairo_surface_t *img_slideshow[256]; +extern char *image_path; +extern char *slideshow_path; +extern char *img_slideshow[256]; extern cairo_surface_t *blur_bg_img; extern int slideshow_image_count; extern int slideshow_interval; extern bool slideshow_random_selection; +int slideshow_image_now = 0; unsigned long lastCheck; @@ -161,6 +164,9 @@ extern char *lock_failed_text; extern char *layout_text; extern char *greeter_text; +bool load_slideshow_images(const char *path); +cairo_surface_t* load_image(char* image_path); + /* Whether the failed attempts should be displayed. */ extern bool show_failed_attempts; /* Number of failed unlock attempts. */ @@ -686,13 +692,14 @@ void render_lock(uint32_t *resolution, xcb_drawable_t drawable) { unsigned long now = (unsigned long)time(NULL); if (img == NULL || now - lastCheck >= slideshow_interval) { if (slideshow_random_selection) { - img = img_slideshow[rand() % slideshow_image_count]; + img = load_image(img_slideshow[rand() % slideshow_image_count]); } else { - img = img_slideshow[current_slideshow_index++]; - - if (current_slideshow_index >= slideshow_image_count) { - current_slideshow_index = 0; - } + img = load_image(img_slideshow[current_slideshow_index]); + } + current_slideshow_index++; + if (current_slideshow_index >= slideshow_image_count) { + current_slideshow_index = 0; + load_slideshow_images(slideshow_path); } lastCheck = now; } From fbf109178c1c098a8dbe3888e27ad46b436c5c8e Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Mon, 10 Jan 2022 11:38:13 -0500 Subject: [PATCH 165/183] Bump year --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 5967f8c2..2330c9c1 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ [![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color?logo=GitHub)](https://github.com/Raymo111/i3lock-color/stargazers) [![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color?logo=GitHub)](https://github.com/Raymo111/i3lock-color/watchers) [![Discord server](https://img.shields.io/discord/878461145197977630?label=Discord&logo=Discord)](https://discord.gg/FzVPghyDt2) -![Maintained](https://img.shields.io/maintenance/yes/2021) +![Maintained](https://img.shields.io/maintenance/yes/2022) ### The world's most popular non-default computer lockscreen. From 1e284b9488e46266b66d1c5031f7e815e889f7c0 Mon Sep 17 00:00:00 2001 From: SuperDJY Date: Tue, 11 Jan 2022 01:34:12 +0800 Subject: [PATCH 166/183] feat(control char): add basic control char support (#238) * feat(control char): add basic control char support * feat(control char): fix wrong x when \n after \b * feat(control char): add `\t` support, same behavior as `\t` in c printf * Gonna go with 4 spaces per tab to be safer * fix(control chars): leading control chars run into 'out of bounds memory acessing', and render at wrong position * doc(control chars): describe the control chars behavior and declare the influenced options and bump date to SEP 2021. * update to NOV * Bump years * Redo manpage Co-authored-by: Raymond Li --- i3lock.1 | 60 +++++++++++++++++++++------- unlock_indicator.c | 99 +++++++++++++++++++++++++++++++++++++++++++++- unlock_indicator.h | 16 ++++++++ 3 files changed, 158 insertions(+), 17 deletions(-) diff --git a/i3lock.1 b/i3lock.1 index 88aa16cd..1ce7606c 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -8,7 +8,7 @@ .fi .. -.TH i3lock-color 1 "JUN 2021" Linux "User Manuals" +.TH i3lock-color 1 "JAN 2022" Linux "User Manuals" .SH NAME i3lock-color \- improved screen locker @@ -240,6 +240,23 @@ Sets the color of the status text while verifying and when password is wrong. .B \-\-{layout, time, date, greeter}\-color=rrggbbaa Sets text colors. +.TP +.B \-\-keylayout mode +Displays the keylayout. Positionable similar to date, time, and indicator. +Modes are as follows: +.RS +.IP \[bu] 2 +0 - Displays the full string returned by the query, i.e. "English (US)" +.IP \[bu] +1 - Displays up until the first parenthesis, i.e. "English" +.IP \[bu] +2 - Displays just the contents of the parenthesis, i.e. "US" +.RE + +.B For all following -str or -text options, some control characters +.B (i.e. \\\\n, \\\\t) are supported. See \fBCONTROL CHARACTERS\fR +.B for more details. + .TP .B \-\-time\-str="%H:%M:%S" Sets the format used for generating the time string. @@ -257,19 +274,6 @@ Sets the string to be shown while verifying the password/input/key/etc. .B \-\-wrong\-text="wrong!" Sets the string to be shown upon entering an incorrect password. -.TP -.B \-\-keylayout mode -Displays the keylayout. Positionable similar to date, time, and indicator. -Modes are as follows: -.RS -.IP \[bu] 2 -0 - Displays the full string returned by the query, i.e. "English (US)" -.IP \[bu] -1 - Displays up until the first parenthesis, i.e. "English" -.IP \[bu] -2 - Displays just the contents of the parenthesis, i.e. "US" -.RE - .TP .B \-\-noinput\-text="no input" Sets the string to be shown upon pressing backspace without anything to delete. @@ -484,6 +488,25 @@ The interval to wait until switching to the next image. .B \-\-slideshow\-random\-selection Randomize the order of the images. +.SH CONTROL CHARACTERS +Control characters (\\r \\n \\b \\t) are supported in text OPTIONS. Their behavior +are almost as same as anywhere else. +.TP +.B Carriage Return(\\\\r) +Move to the start of line (left edge). +Notes: The rendered characters would still live there. +.TP +.B Line Feed(\\\\n) +Move to start of next line (left edge). +.TP +.B Backspace(\\\\b) +Overwrite last one char if exists. +Notes: The rendered character would still live there. +.TP +.B Tab(\\\\t) +Move to next tab stop position.The width of one character for moving is as same as character 'a'. +Note: The width may be strange if the font is not mono-spaced. + .SH SEE ALSO .IR xautolock(1) \- use i3lock as your screen saver @@ -491,7 +514,14 @@ Randomize the order of the images. .IR convert(1) \- feed a wide variety of image formats to i3lock -.SH AUTHOR +.SH HOMEPAGE +https://github.com/Raymo111/i3lock-color + +Please report bugs and submit pull-requests as follows: +For i3lock (upstream): https://github.com/i3/i3lock +For i3lock-color (enhancements on top of i3lock): https://github.com/Raymo111/i3lock-color + +.SH AUTHORS Michael Stapelberg Jan-Erik Rediger diff --git a/unlock_indicator.c b/unlock_indicator.c index b254c0f2..e10984a6 100644 --- a/unlock_indicator.c +++ b/unlock_indicator.c @@ -256,6 +256,14 @@ static cairo_font_face_t *font_faces[6] = { NULL, }; +static control_char_config_t control_characters[] = { + {'\n', CC_POS_RESET, 0, CC_POS_CHANGE, 1}, + {'\b', CC_POS_CHANGE, -1, CC_POS_KEEP, 0}, + {'\r', CC_POS_RESET, 0, CC_POS_KEEP, 0}, + {'\t', CC_POS_TAB, 4, CC_POS_KEEP, 0}, +}; +size_t control_char_count = sizeof control_characters / sizeof(control_char_config_t); + static cairo_font_face_t *get_font_face(int which) { if (font_faces[which]) { return font_faces[which]; @@ -314,6 +322,94 @@ static cairo_font_face_t *get_font_face(int which) { return face; } +/* + * Splits the given text by "control chars", + * And then draws the given text onto the cairo context. + */ +static void draw_text_with_cc(cairo_t *ctx, text_t text, double start_x) { + // get scaled_font + cairo_scaled_font_t *sft; + cairo_matrix_t fm, ctm; + cairo_matrix_init_scale(&fm, text.size, text.size); + cairo_get_matrix(ctx, &ctm); + cairo_font_options_t *opts; + opts = cairo_font_options_create(); + sft = cairo_scaled_font_create(text.font, &fm, &ctm, opts); + cairo_font_options_destroy(opts); + /* use `a` to represent common character width, using in `\t` */ + cairo_text_extents_t te; + cairo_text_extents(ctx, "a", &te); + + // convert text to glyphs. + cairo_status_t status; + cairo_glyph_t* glyphs; + int nglyphs = 0, + len = 0, + start = 0, + lineno = 0, + x = start_x, + y = text.y; + size_t cur_cc; + + while (text.str[start + len] != '\0') { + char is_cc = 0; + do { + for (cur_cc = 0; cur_cc < control_char_count; cur_cc++) { + if (text.str[start+len] == control_characters[cur_cc].character) { + is_cc = 1; + break; + } + } + } while (text.str[start+(len++)] != '\0' && !is_cc); + if (len > is_cc) { + status = cairo_scaled_font_text_to_glyphs( + sft, x, y, text.str + start, is_cc ? len - 1: len, + &glyphs, &nglyphs, + NULL, NULL, NULL + ); + if (status == CAIRO_STATUS_SUCCESS) { + cairo_glyph_path(ctx, glyphs, nglyphs); + } else { + DEBUG("draw %c failed\n", text.str[start]); + } + } + if (is_cc && (cur_cc < control_char_count)) { + if (control_characters[cur_cc].x_behavior == CC_POS_CHANGE) { + char x_offset = control_characters[cur_cc].x_behavior_arg; + if (x_offset < 0 && x_offset > -nglyphs) { + x = glyphs[nglyphs+x_offset].x; + } else if (x_offset > 0) { + if (nglyphs >= 1) { // the case is some leading control chars.(although there is none now) + x = glyphs[nglyphs - 1].x + x_offset * te.x_advance; + } else { // deal the leading control chars. + x += x_offset * te.x_advance; + } + } + } else if (control_characters[cur_cc].x_behavior == CC_POS_RESET) { + x = start_x; + } else if (control_characters[cur_cc].x_behavior == CC_POS_TAB) { + if (nglyphs > 0) { // there may be leading tab, such as '\t\t' or '\n\t' + int advance = control_characters[cur_cc].x_behavior_arg - ((nglyphs - 1) % control_characters[cur_cc].x_behavior_arg); + x = glyphs[nglyphs - 1].x + advance * te.x_advance; + } else { // deal the leading tab. + x += control_characters[cur_cc].x_behavior_arg * te.x_advance; + } + } + if (control_characters[cur_cc].y_behavior == CC_POS_CHANGE) { + lineno += control_characters[cur_cc].y_behavior_arg; + } // CC_POS_KEEP is default for y + } + y = text.y + text.size * lineno; + if (len > is_cc) { + cairo_glyph_free(glyphs); + } + nglyphs = 0; + start += len; + len = 0; + } + cairo_scaled_font_destroy(sft); +} + /* * Draws the given text onto the cairo context */ @@ -342,9 +438,8 @@ static void draw_text(cairo_t *ctx, text_t text) { } cairo_set_source_rgba(ctx, text.color.red, text.color.green, text.color.blue, text.color.alpha); - cairo_move_to(ctx, x, text.y); - cairo_text_path(ctx, text.str); + draw_text_with_cc(ctx, text, x); cairo_fill_preserve(ctx); cairo_set_source_rgba(ctx, text.outline_color.red, text.outline_color.green, text.outline_color.blue, text.outline_color.alpha); diff --git a/unlock_indicator.h b/unlock_indicator.h index 3c07243d..8a16ec1c 100644 --- a/unlock_indicator.h +++ b/unlock_indicator.h @@ -47,6 +47,22 @@ typedef enum { MAX, } background_type_t; + +typedef enum { + CC_POS_RESET, + CC_POS_CHANGE, + CC_POS_KEEP, + CC_POS_TAB +} control_char_pos_t; + +typedef struct { + char character; + control_char_pos_t x_behavior; + int x_behavior_arg; + control_char_pos_t y_behavior; + int y_behavior_arg; +} control_char_config_t; + void render_lock(uint32_t* resolution, xcb_drawable_t drawable); void draw_image(uint32_t* resolution, cairo_surface_t* img, cairo_t* xcb_ctx); void init_colors_once(void); From 16856ac4c19966b3efc1ea5febc8abe2d47e41e9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jezer=20Mej=C3=ADa?= <59768785+JezerM@users.noreply.github.com> Date: Mon, 10 Jan 2022 14:35:52 -0600 Subject: [PATCH 167/183] Revert indent (#250) --- Makefile.am | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Makefile.am b/Makefile.am index dbbaa4d1..2d3fed66 100644 --- a/Makefile.am +++ b/Makefile.am @@ -14,13 +14,13 @@ pamd_files = pam/i3lock pamd_DATA = $(pamd_files) if ENABLE_BASH_COMPLETION - bashcompletiondir = $(BASH_COMPLETION_DIR) - dist_bashcompletion_DATA = i3lock-bash +bashcompletiondir = $(BASH_COMPLETION_DIR) +dist_bashcompletion_DATA = i3lock-bash endif if ENABLE_ZSH_COMPLETION - zshcompletiondir = $(ZSH_COMPLETION_DIR) - dist_zshcompletion_DATA = i3lock-zsh +zshcompletiondir = $(ZSH_COMPLETION_DIR) +dist_zshcompletion_DATA = i3lock-zsh endif install-data-hook: From 32a14379f14eda5913d8fcdbbb68974aa6bb24d3 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 20 Jan 2022 17:19:08 -0500 Subject: [PATCH 168/183] Fix badges --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 2330c9c1..f1e7687b 100644 --- a/README.md +++ b/README.md @@ -18,7 +18,7 @@ [![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color?logo=GitHub)](https://github.com/Raymo111/i3lock-color/stargazers) [![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color?logo=GitHub)](https://github.com/Raymo111/i3lock-color/watchers) [![Discord server](https://img.shields.io/discord/878461145197977630?label=Discord&logo=Discord)](https://discord.gg/FzVPghyDt2) -![Maintained](https://img.shields.io/maintenance/yes/2022) +![Maintained](https://img.shields.io/maintenance/yes/9999) ### The world's most popular non-default computer lockscreen. From 37eecf221ee64b89044fc63bc70e67c168a6b38f Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Tue, 25 Jan 2022 00:34:43 -0500 Subject: [PATCH 169/183] Disable debug by default --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 26c5b695..cf577eac 100755 --- a/build.sh +++ b/build.sh @@ -1,6 +1,6 @@ #!/bin/sh -x -configureOpts="--disable-sanitizers" +configureOpts="--disable-sanitizers --disable-debug" while getopts ":hd" opt; do case ${opt} in From ac6b471a49ec18ef4b089552186579eb4a75e0e4 Mon Sep 17 00:00:00 2001 From: Alan Swanson Date: Tue, 25 Jan 2022 19:47:19 +0000 Subject: [PATCH 170/183] build: disable debug and sanitizers by default (#251) Debug builds should never be the default. Change debug option to default to off and link it to sanitizer usage (rather than whether being built from git tree). Address sanitizers can cause a program to run twice as slow on top of the debug "-O0" non-optimisation. Also remove some unused macro variables. --- build.sh | 4 ++-- configure.ac | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/build.sh b/build.sh index cf577eac..6f252b38 100755 --- a/build.sh +++ b/build.sh @@ -1,12 +1,12 @@ #!/bin/sh -x -configureOpts="--disable-sanitizers --disable-debug" +configureOpts="" while getopts ":hd" opt; do case ${opt} in h ) echo "Use -d to turn on sanitizers (for debugging only)" exit;; - d ) configureOpts="" + d ) configureOpts="--enable-debug" ;; \? ) echo "Usage: $0 [-h] [-d]" exit;; diff --git a/configure.ac b/configure.ac index c74cc322..d38324d0 100644 --- a/configure.ac +++ b/configure.ac @@ -48,7 +48,7 @@ AX_CODE_COVERAGE dnl is_release must be lowercase because AX_CHECK_ENABLE_DEBUG calls m4_tolower dnl on its fourth argument. -AX_CHECK_ENABLE_DEBUG([yes], , [UNUSED_NDEBUG], [$is_release]) +AX_CHECK_ENABLE_DEBUG([no], , , [$is_release]) AC_PROG_CC @@ -132,14 +132,14 @@ AC_CHECK_HEADERS([fcntl.h float.h inttypes.h limits.h locale.h netinet/in.h path AC_CONFIG_FILES([Makefile]) -# Enable address sanitizer for non-release builds. The performance hit is a +# Enable address sanitizer for debug builds. The performance hit is a # 50% increase of wallclock time for the testsuite on my machine. -if test x$is_release = xyes; then - default_sanitizers= -else +if test "x$ax_enable_debug" = "xyes"; then default_sanitizers=address +else + default_sanitizers= fi -AX_SANITIZERS(, [$default_sanitizers], [AC_DEFINE([I3LOCK_ASAN_ENABLED], [], [Enable ASAN])]) +AX_SANITIZERS(, [$default_sanitizers]) AC_OUTPUT From 380a10a90f0dee57f40105a0ac097ba52e8278da Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Thu, 3 Feb 2022 22:41:46 -0500 Subject: [PATCH 171/183] Revert "--pass-*-keys options (#136)" (#253) --- .github/workflows/Build Test.yml | 2 +- .github/workflows/codeql-analysis.yml | 2 +- README.md | 4 +-- configure.ac | 2 +- i3lock.1 | 12 -------- i3lock.c | 41 +++------------------------ 6 files changed, 9 insertions(+), 54 deletions(-) diff --git a/.github/workflows/Build Test.yml b/.github/workflows/Build Test.yml index 96585f16..a3ecf16b 100644 --- a/.github/workflows/Build Test.yml +++ b/.github/workflows/Build Test.yml @@ -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 libxcb-xtest0-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 libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev - name: Build run: ./build.sh - name: Check and distcheck diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index db8fd16c..52090baa 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -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 libxcb-xtest0-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 libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev ./build.sh - name: Perform CodeQL Analysis diff --git a/README.md b/README.md index f1e7687b..e475ef47 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,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 libxcb-xtest0-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 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). @@ -98,7 +98,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 libxcb-xtest0-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 libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev ``` ## Building i3lock-color diff --git a/configure.ac b/configure.ac index d38324d0..f2b43bf9 100644 --- a/configure.ac +++ b/configure.ac @@ -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 xcb-xtest]) +PKG_CHECK_MODULES([XCB], [xcb xcb-xkb xcb-xinerama xcb-randr xcb-composite]) 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]) diff --git a/i3lock.1 b/i3lock.1 index 1ce7606c..2ef335d6 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -392,18 +392,6 @@ 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. diff --git a/i3lock.c b/i3lock.c index 23180398..1435897b 100644 --- a/i3lock.c +++ b/i3lock.c @@ -50,8 +50,6 @@ #endif #include #include -#include -#include #include "i3lock.h" #include "xcb.h" @@ -264,7 +262,6 @@ 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; @@ -658,32 +655,6 @@ 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 @@ -743,7 +714,7 @@ static void handle_key_press(xcb_key_press_event_t *event) { case XKB_KEY_XF86AudioMute: case XKB_KEY_XF86AudioLowerVolume: case XKB_KEY_XF86AudioRaiseVolume: - send_key_to_root(event, true); + xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event); return; } } @@ -753,7 +724,7 @@ static void handle_key_press(xcb_key_press_event_t *event) { switch(ksym) { case XKB_KEY_XF86MonBrightnessUp: case XKB_KEY_XF86MonBrightnessDown: - send_key_to_root(event, false); + xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event); return; } } @@ -764,7 +735,7 @@ static void handle_key_press(xcb_key_press_event_t *event) { case XKB_KEY_XF86PowerDown: case XKB_KEY_XF86PowerOff: case XKB_KEY_XF86Sleep: - send_key_to_root(event, false); + xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event); return; } } @@ -775,7 +746,7 @@ static void handle_key_press(xcb_key_press_event_t *event) { case XKB_KEY_XF86AudioMute: case XKB_KEY_XF86AudioLowerVolume: case XKB_KEY_XF86AudioRaiseVolume: - send_key_to_root(event, true); + xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event); return; } } @@ -1586,7 +1557,6 @@ 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}, @@ -2148,9 +2118,6 @@ int main(int argc, char *argv[]) { case 604: pass_volume_keys = true; break; - case 605: - special_passthrough = true; - break; // Bar indicator case 700: From d846e7ce6917090e6e5f31a053e689b5fa1452f2 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 18 Mar 2022 20:48:54 -0400 Subject: [PATCH 172/183] Update examples --- examples/lock.sh | 2 +- examples/lock_bar.sh | 0 examples/screenshot.png | Bin 125475 -> 266971 bytes examples/screenshot_2017.png | Bin 0 -> 125475 bytes 4 files changed, 1 insertion(+), 1 deletion(-) mode change 100644 => 100755 examples/lock.sh mode change 100644 => 100755 examples/lock_bar.sh create mode 100644 examples/screenshot_2017.png diff --git a/examples/lock.sh b/examples/lock.sh old mode 100644 new mode 100755 index a41d0256..e65eb930 --- a/examples/lock.sh +++ b/examples/lock.sh @@ -32,5 +32,5 @@ i3lock \ --clock \ --indicator \ --time-str="%H:%M:%S" \ ---date-str="%A, %m %Y" \ +--date-str="%A, %Y-%m-%d" \ --keylayout 1 \ diff --git a/examples/lock_bar.sh b/examples/lock_bar.sh old mode 100644 new mode 100755 diff --git a/examples/screenshot.png b/examples/screenshot.png index e7b85e1985bc7a45b4cd0934687dbb16016f242d..94c4ca606b245c2068825a11b83c122ed42add89 100644 GIT binary patch literal 266971 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%0AiX=DF95Xq9VD6aWnxAd$29Z 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Ⓢ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

?fR)&A|U0Aw= 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 JC5mRj{{``hDTDw3 diff --git a/examples/screenshot_2017.png b/examples/screenshot_2017.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b85e1985bc7a45b4cd0934687dbb16016f242d GIT binary patch literal 125475 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 JC5mRj{{``hDTDw3 literal 0 HcmV?d00001 From 7668ccea3b4f73806b676a6864faaf5f7406701f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jezer=20Mej=C3=ADa?= <59768785+JezerM@users.noreply.github.com> Date: Thu, 21 Jul 2022 13:36:32 -0600 Subject: [PATCH 173/183] Remove "--special-passthrough" from bash and zsh completion (#265) --- i3lock-bash | 1 - i3lock-zsh | 1 - 2 files changed, 2 deletions(-) diff --git a/i3lock-bash b/i3lock-bash index cab812e0..ce440740 100644 --- a/i3lock-bash +++ b/i3lock-bash @@ -81,7 +81,6 @@ _i3lock() { "--pass-screen-keys" "--pass-power-keys" "--pass-volume-keys" - "--special-passthrough" # Bar mode "--bar-indicator" "--bar-direction" diff --git a/i3lock-zsh b/i3lock-zsh index baf64033..14327765 100644 --- a/i3lock-zsh +++ b/i3lock-zsh @@ -81,7 +81,6 @@ _i3lock() { "--pass-screen-keys[Allow screen keys to be used while the screen is locked]" "--pass-power-keys[Allow power keys to be used while the screen is locked]" "--pass-volume-keys[Allow volume keys to be used while the screen is locked]" - "--special-passthrough[Force allowed key to be sent to wm/de]" # Bar mode "--bar-indicator[Replaces the usual ring indicator with a bar indicator]" "--bar-direction[Sets the direction the bars grow in]:direction:((0\:'default' 1\:'reverse' 2\:'both'))" From c91afea4f67b0f7972132103697164dc3bb7a755 Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Wed, 27 Jul 2022 12:56:10 -0400 Subject: [PATCH 174/183] Fix inconsistent (date|time)_format length Fixes #266 Caused by f2d155 when I accidentally made these 64 as well when I meant to only do the fonts --- i3lock.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/i3lock.c b/i3lock.c index 1435897b..b7c320a7 100644 --- a/i3lock.c +++ b/i3lock.c @@ -134,8 +134,8 @@ int layout_align = 0; int modif_align = 0; int greeter_align = 0; -char time_format[64] = "%H:%M:%S\0"; -char date_format[64] = "%A, %m %Y\0"; +char time_format[32] = "%H:%M:%S\0"; +char date_format[32] = "%A, %m %Y\0"; char verif_font[64] = "sans-serif\0"; char wrong_font[64] = "sans-serif\0"; From aeb9982ded73b55d317f0323a138bffea4cda3eb Mon Sep 17 00:00:00 2001 From: Jesse R Codling Date: Fri, 26 Aug 2022 02:06:15 -0400 Subject: [PATCH 175/183] Shell command options for media keys (#256) * Shell command options for media keys * Use cmd- prefix for custom shell commands * hotkeys: renumber identifiers for custom commands Adjusted to use 610-660 instead of 650-699 * Remove unnecessary `strdup(optarg)` Per discussion in #256 * Fix PR feedback Co-authored-by: Raymond Li --- i3lock-bash | 15 ++++- i3lock-zsh | 14 +++++ i3lock.1 | 37 ++++++++++++ i3lock.c | 168 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 233 insertions(+), 1 deletion(-) diff --git a/i3lock-bash b/i3lock-bash index ce440740..61d12c06 100644 --- a/i3lock-bash +++ b/i3lock-bash @@ -23,7 +23,6 @@ _i3lock() { "--debug" # i3lock-color OPTIONS - "--screen -S" "--blur -B" "--clock --force-clocl -k" @@ -81,6 +80,20 @@ _i3lock() { "--pass-screen-keys" "--pass-power-keys" "--pass-volume-keys" + "--custom-key-commands" + "--cmd-brightness-up" + "--cmd-brightness-down" + "--cmd-media-play" + "--cmd-media-pause" + "--cmd-media-stop" + "--cmd-media-next" + "--cmd-media-prev" + "--cmd-audio-mute" + "--cmd-volume-up" + "--cmd-volume-down" + "--cmd-power-down" + "--cmd-power-off" + "--cmd-power-sleep" # Bar mode "--bar-indicator" "--bar-direction" diff --git a/i3lock-zsh b/i3lock-zsh index 14327765..5138c736 100644 --- a/i3lock-zsh +++ b/i3lock-zsh @@ -81,6 +81,20 @@ _i3lock() { "--pass-screen-keys[Allow screen keys to be used while the screen is locked]" "--pass-power-keys[Allow power keys to be used while the screen is locked]" "--pass-volume-keys[Allow volume keys to be used while the screen is locked]" + "--custom-key-commands[Enable shell commands for media keys]" + "--cmd-brightness-up[Command for XF86MonBrightnessUp]" + "--cmd-brightness-down[Command for XF86MonBrightnessDown]" + "--cmd-media-play[Command for XF86AudioPlay]" + "--cmd-media-pause[Command for XF86AudioPause]" + "--cmd-media-stop[Command for XF86AudioStop]" + "--cmd-media-next[Command for XF86AudioNext]" + "--cmd-media-prev[Command for XF86AudioPrev]" + "--cmd-audio-mute[Command for XF86AudioMute]" + "--cmd-volume-up[Command for XF86AudioRaiseVolume]" + "--cmd-volume-down[Command for XF86AudioLowerVolume]" + "--cmd-power-down[Command for XF86PowerDown] " + "--cmd-power-off[Command for XF86PowerOff]" + "--cmd-power-sleep[Command for XF86Sleep]" # Bar mode "--bar-indicator[Replaces the usual ring indicator with a bar indicator]" "--bar-direction[Sets the direction the bars grow in]:direction:((0\:'default' 1\:'reverse' 2\:'both'))" diff --git a/i3lock.1 b/i3lock.1 index 2ef335d6..cc97e5ae 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -392,6 +392,43 @@ power - XF86PowerDown, XF86PowerOff, XF86Sleep volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume .RE + +.TP +.B \-\-custom\-key\-commands +Enables custom shell commands for media, screen, power and volume keys. An alternative to \-\-pass\-media\0keys that will work in any environment. + +.TP +.B \-\-cmd\-** +Shell command to run when the corresponding key is pressed. Requires \-\-custom\-key\-commands +.RS +.IP \[bu] 2 +brightness\-up - XF86MonBrightnessUp +.IP \[bu] +brightness\-down - XF86MonBrightnessDown +.IP \[bu] +media\-play - XF86AudioPlay +.IP \[bu] +media\-pause - XF86AudioPause +.IP \[bu] +media\-stop - XF86AudioStop +.IP \[bu] +media\-next - XF86AudioNext +.IP \[bu] +media\-prev - XF86AudioPrev +.IP \[bu] +audio\-mute - XF86AudioMute +.IP \[bu] +volume\-up - XF86AudioRaiseVolume +.IP \[bu] +volume\-down - XF86AudioLowerVolume +.IP \[bu] +power\-down - XF86PowerDown +.IP \[bu] +power\-off - XF86PowerOff +.IP \[bu] +power\-sleep - XF86Sleep +.RE + .TP .B \-\-bar\-indicator Replaces the usual ring indicator with a bar indicator. Comes with perks. diff --git a/i3lock.c b/i3lock.c index b7c320a7..eebef39e 100644 --- a/i3lock.c +++ b/i3lock.c @@ -263,6 +263,24 @@ bool pass_screen_keys = false; bool pass_power_keys = false; bool pass_volume_keys = false; +bool hotkeys = false; +char* cmd_brightness_up = NULL; +char* cmd_brightness_down = NULL; + +char* cmd_media_play = NULL; +char* cmd_media_pause = NULL; +char* cmd_media_stop = NULL; +char* cmd_media_next = NULL; +char* cmd_media_prev = NULL; + +char* cmd_audio_mute = NULL; +char* cmd_volume_up = NULL; +char* cmd_volume_down = NULL; + +char* cmd_power_down = NULL; +char* cmd_power_off = NULL; +char* cmd_power_sleep = NULL; + // for the rendering thread, so we can clean it up pthread_t draw_thread; // main thread still sometimes calls redraw() @@ -703,6 +721,90 @@ static void handle_key_press(xcb_key_press_event_t *event) { n = xkb_keysym_to_utf8(ksym, buffer, sizeof(buffer)); #endif + //custom key commands + if (hotkeys) { + switch(ksym) { + case XKB_KEY_XF86MonBrightnessUp: + if (cmd_brightness_up) { + system(cmd_brightness_up); + return; + } + break; + case XKB_KEY_XF86MonBrightnessDown: + if (cmd_brightness_down) { + system(cmd_brightness_down); + return; + } + break; + case XKB_KEY_XF86AudioPlay: + if (cmd_media_play) { + system(cmd_media_play); + return; + } + break; + case XKB_KEY_XF86AudioPause: + if (cmd_media_pause) { + system(cmd_media_pause); + return; + } + break; + case XKB_KEY_XF86AudioStop: + if (cmd_media_stop) { + system(cmd_media_stop); + return; + } + break; + case XKB_KEY_XF86AudioPrev: + if (cmd_media_prev) { + system(cmd_media_prev); + return; + } + break; + case XKB_KEY_XF86AudioNext: + if (cmd_media_next) { + system(cmd_media_next); + return; + } + break; + case XKB_KEY_XF86AudioMute: + if (cmd_audio_mute) { + system(cmd_audio_mute); + return; + } + break; + case XKB_KEY_XF86AudioLowerVolume: + if (cmd_volume_down) { + system(cmd_volume_down); + return; + } + break; + case XKB_KEY_XF86AudioRaiseVolume: + if (cmd_volume_up) { + system(cmd_volume_up); + return; + } + break; + case XKB_KEY_XF86PowerDown: + if (cmd_power_down) { + system(cmd_power_down); + return; + } + break; + case XKB_KEY_XF86PowerOff: + if (cmd_power_off) { + system(cmd_power_off); + return; + } + break; + case XKB_KEY_XF86Sleep: + if (cmd_power_sleep) { + system(cmd_power_sleep); + return; + } + break; + } + } + // media keys if (pass_media_keys) { switch(ksym) { @@ -1558,6 +1660,25 @@ int main(int argc, char *argv[]) { {"pass-power-keys", no_argument, NULL, 603}, {"pass-volume-keys", no_argument, NULL, 604}, + // custom commands for pass keys + {"custom-key-commands", no_argument, NULL, 610}, + {"cmd-brightness-up", required_argument, NULL, 620}, + {"cmd-brightness-down", required_argument, NULL, 621}, + + {"cmd-media-play", required_argument, NULL, 630}, + {"cmd-media-pause", required_argument, NULL, 631}, + {"cmd-media-stop", required_argument, NULL, 632}, + {"cmd-media-next", required_argument, NULL, 633}, + {"cmd-media-prev", required_argument, NULL, 634}, + + {"cmd-audio-mute", required_argument, NULL, 640}, + {"cmd-volume-up", required_argument, NULL, 641}, + {"cmd-volume-down", required_argument, NULL, 642}, + + {"cmd-power-down", required_argument, NULL, 650}, + {"cmd-power-off", required_argument, NULL, 651}, + {"cmd-power-sleep", required_argument, NULL, 652}, + // bar indicator stuff {"bar-indicator", no_argument, NULL, 700}, {"bar-direction", required_argument, NULL, 701}, @@ -2119,6 +2240,53 @@ int main(int argc, char *argv[]) { pass_volume_keys = true; break; + //custom key commands + case 610: + hotkeys = true; + break; + case 620: + cmd_brightness_up = optarg; + break; + case 621: + cmd_brightness_down = optarg; + break; + + case 630: + cmd_media_play = optarg; + break; + case 631: + cmd_media_pause = optarg; + break; + case 632: + cmd_media_stop = optarg; + break; + case 633: + cmd_media_next = optarg; + break; + case 634: + cmd_media_prev = optarg; + break; + + case 640: + cmd_audio_mute = optarg; + break; + case 641: + cmd_volume_up = optarg; + break; + case 642: + cmd_volume_down = optarg; + break; + + case 650: + cmd_power_down = optarg; + break; + case 651: + cmd_power_off = optarg; + break; + case 652: + cmd_power_sleep = optarg; + break; + // Bar indicator case 700: bar_enabled = true; From f1903bdaf0c822aa6322698bdefc5b4ab4bed512 Mon Sep 17 00:00:00 2001 From: Kyle Westhaus Date: Fri, 31 Mar 2023 00:31:10 -0700 Subject: [PATCH 176/183] Support for XF86AudioMicMute (#273) * Feature: Add XF86AudioMicMute to passed media keys * Feature: Add shell command option for XF86AudioMicMute --- i3lock-bash | 1 + i3lock-zsh | 1 + i3lock.1 | 5 ++++- i3lock.c | 12 ++++++++++++ 4 files changed, 18 insertions(+), 1 deletion(-) diff --git a/i3lock-bash b/i3lock-bash index 61d12c06..addc3955 100644 --- a/i3lock-bash +++ b/i3lock-bash @@ -91,6 +91,7 @@ _i3lock() { "--cmd-audio-mute" "--cmd-volume-up" "--cmd-volume-down" + "--cmd-mic-mute" "--cmd-power-down" "--cmd-power-off" "--cmd-power-sleep" diff --git a/i3lock-zsh b/i3lock-zsh index 5138c736..055a29ae 100644 --- a/i3lock-zsh +++ b/i3lock-zsh @@ -93,6 +93,7 @@ _i3lock() { "--cmd-volume-up[Command for XF86AudioRaiseVolume]" "--cmd-volume-down[Command for XF86AudioLowerVolume]" "--cmd-power-down[Command for XF86PowerDown] " + "--cmd-mic-mute[Command for XF86AudioMicMute]" "--cmd-power-off[Command for XF86PowerOff]" "--cmd-power-sleep[Command for XF86Sleep]" # Bar mode diff --git a/i3lock.1 b/i3lock.1 index cc97e5ae..a04d5977 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -383,7 +383,8 @@ passing them through: .RS .IP \[bu] 2 media - XF86AudioPlay, XF86AudioPause, XF86AudioStop, XF86AudioPrev, - XF86AudioNext, XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume + XF86AudioNext, XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume, + XF86AudioMicMute .IP \[bu] screen - XF86MonBrightnessUp, XF86MonBrightnessDown .IP \[bu] @@ -422,6 +423,8 @@ volume\-up - XF86AudioRaiseVolume .IP \[bu] volume\-down - XF86AudioLowerVolume .IP \[bu] +mic\-mute - XF86AudioMicMute +.IP \[bu] power\-down - XF86PowerDown .IP \[bu] power\-off - XF86PowerOff diff --git a/i3lock.c b/i3lock.c index eebef39e..8406fa67 100644 --- a/i3lock.c +++ b/i3lock.c @@ -276,6 +276,7 @@ char* cmd_media_prev = NULL; char* cmd_audio_mute = NULL; char* cmd_volume_up = NULL; char* cmd_volume_down = NULL; +char* cmd_mic_mute = NULL; char* cmd_power_down = NULL; char* cmd_power_off = NULL; @@ -784,6 +785,12 @@ static void handle_key_press(xcb_key_press_event_t *event) { return; } break; + case XKB_KEY_XF86AudioMicMute: + if (cmd_mic_mute) { + system(cmd_mic_mute); + return; + } + break; case XKB_KEY_XF86PowerDown: if (cmd_power_down) { system(cmd_power_down); @@ -816,6 +823,7 @@ static void handle_key_press(xcb_key_press_event_t *event) { case XKB_KEY_XF86AudioMute: case XKB_KEY_XF86AudioLowerVolume: case XKB_KEY_XF86AudioRaiseVolume: + case XKB_KEY_XF86AudioMicMute: xcb_send_event(conn, true, screen->root, XCB_EVENT_MASK_BUTTON_PRESS, (char *)event); return; } @@ -1674,6 +1682,7 @@ int main(int argc, char *argv[]) { {"cmd-audio-mute", required_argument, NULL, 640}, {"cmd-volume-up", required_argument, NULL, 641}, {"cmd-volume-down", required_argument, NULL, 642}, + {"cmd-mic-mute", required_argument, NULL, 643}, {"cmd-power-down", required_argument, NULL, 650}, {"cmd-power-off", required_argument, NULL, 651}, @@ -2276,6 +2285,9 @@ int main(int argc, char *argv[]) { case 642: cmd_volume_down = optarg; break; + case 643: + cmd_mic_mute = optarg; + break; case 650: cmd_power_down = optarg; From e8b99432b6ea73df26763f5f55b1e5dda92fdeb4 Mon Sep 17 00:00:00 2001 From: Kyle Westhaus Date: Fri, 31 Mar 2023 00:35:03 -0700 Subject: [PATCH 177/183] Fix: Remove breaking space in zsh completion (#274) Co-authored-by: Raymond Li --- i3lock-zsh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/i3lock-zsh b/i3lock-zsh index 055a29ae..e5904693 100644 --- a/i3lock-zsh +++ b/i3lock-zsh @@ -92,8 +92,8 @@ _i3lock() { "--cmd-audio-mute[Command for XF86AudioMute]" "--cmd-volume-up[Command for XF86AudioRaiseVolume]" "--cmd-volume-down[Command for XF86AudioLowerVolume]" - "--cmd-power-down[Command for XF86PowerDown] " "--cmd-mic-mute[Command for XF86AudioMicMute]" + "--cmd-power-down[Command for XF86PowerDown]" "--cmd-power-off[Command for XF86PowerOff]" "--cmd-power-sleep[Command for XF86Sleep]" # Bar mode From 7b2badbb407ef5fce1eb338a98974ad5f70e226e Mon Sep 17 00:00:00 2001 From: Raymond Li Date: Fri, 28 Jul 2023 01:40:06 -0400 Subject: [PATCH 178/183] Bump version to 2.13.0.5 --- I3LOCK_VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/I3LOCK_VERSION b/I3LOCK_VERSION index 16e98730..88d51582 100644 --- a/I3LOCK_VERSION +++ b/I3LOCK_VERSION @@ -1 +1 @@ -2.13.c.4 +2.13.c.5 From 46aa0b37196994433addddd60bb735dd4a388e6b Mon Sep 17 00:00:00 2001 From: James Pilcher <90052874+jamespilcher@users.noreply.github.com> Date: Thu, 18 Jan 2024 14:20:14 +0900 Subject: [PATCH 179/183] Removed dead link from README (#293) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index e475ef47..330b76da 100644 --- a/README.md +++ b/README.md @@ -158,7 +158,7 @@ A FreeBSD port is available on freshports: [x11/i3lock-color/](https://www.fresh ## Running i3lock-color Simply invoke the 'i3lock' command. To get out of it, enter your password and press enter. -A [sample script](examples/lock.sh) is included in this repository. [See the script in action](https://streamable.com/fpl46) +A [sample script](examples/lock.sh) is included in this repository. On OpenBSD the `i3lock` binary needs to be setgid `auth` to call the authentication helpers, e.g. `/usr/libexec/auth/login_passwd`. From 874f26f9244077c38ba656fbc2a261293c35a013 Mon Sep 17 00:00:00 2001 From: Martin <92603563+Malwprotector@users.noreply.github.com> Date: Mon, 24 Feb 2025 19:15:41 +0100 Subject: [PATCH 180/183] fixed typo error README.md (#306) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 330b76da..0277d3fb 100644 --- a/README.md +++ b/README.md @@ -33,7 +33,7 @@ i3lock is a simple screen locker like slock. After starting it, you will see a w Many little improvements have been made to i3lock over time: - i3lock forks, so you can combine it with an alias to suspend to RAM (run "i3lock && echo mem > /sys/power/state" to get a locked screen after waking up your computer from suspend to RAM) -- You can specify either a background color or an image (JPG or PNG), which will be displayed while your screen is locked. Note that i3lock is not an image manipulation software. If you need to resize the image to fill the screen, you can use something like ImageMagick combined wih `xdpyinfo`: +- You can specify either a background color or an image (JPG or PNG), which will be displayed while your screen is locked. Note that i3lock is not an image manipulation software. If you need to resize the image to fill the screen, you can use something like ImageMagick combined with `xdpyinfo`: ```bash convert image.jpg -resize $(xdpyinfo | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/') RGB:- | i3lock --raw $(xdpyinfo | grep dimensions | sed -r 's/^[^0-9]*([0-9]+x[0-9]+).*$/\1/'):rgb --image /dev/stdin ``` From c9022679d0bc0bfaf12d1d52c78c991c74f8e07c Mon Sep 17 00:00:00 2001 From: sh1r4s3 Date: Mon, 10 Mar 2025 03:01:47 +0300 Subject: [PATCH 181/183] Add GIF support for animated lock screen (#262) * Add GIF support for animated lock screen Use gif_lib to read a GIF file [1] and show animated lock screen. Currently it supports only 0-2 disposal methods. [1] https://www.w3.org/Graphics/GIF/spec-gif89a.txt * Add libgif-dev to Dockerfile and check for gif_lib.h in configure * Fix CodeQL error Multiplication result converted to larger type * Add info about GIF and JPG to the man page * Update GH upload-artifact to v4 as v2 is deprecated * Surround * with spaces * Update date in the man-page --- .github/workflows/Build Test.yml | 4 +- .github/workflows/codeql-analysis.yml | 2 +- configure.ac | 3 +- i3lock.1 | 12 +- i3lock.c | 281 ++++++++++++++++++++++---- jpg.c | 16 +- jpg.h | 2 +- travis/Dockerfile | 2 +- 8 files changed, 263 insertions(+), 59 deletions(-) diff --git a/.github/workflows/Build Test.yml b/.github/workflows/Build Test.yml index a3ecf16b..60c250ef 100644 --- a/.github/workflows/Build Test.yml +++ b/.github/workflows/Build Test.yml @@ -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 libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev libgif-dev - name: Build run: ./build.sh - name: Check and distcheck @@ -18,7 +18,7 @@ jobs: make check make distcheck - name: Upload binary artifact - uses: actions/upload-artifact@v2 + uses: actions/upload-artifact@v4 with: name: i3lock path: /home/runner/work/i3lock-color/i3lock-color/build/i3lock diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 52090baa..806128e6 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -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 libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev libgif-dev ./build.sh - name: Perform CodeQL Analysis diff --git a/configure.ac b/configure.ac index f2b43bf9..e51e87c1 100644 --- a/configure.ac +++ b/configure.ac @@ -76,6 +76,7 @@ AC_SEARCH_LIBS([ev_run], [ev], , [AC_MSG_FAILURE([cannot find the required ev_ru AC_SEARCH_LIBS([shm_open], [rt]) +AC_SEARCH_LIBS([DGifOpenFileName], [gif]) # Use system-local-login instead of login on Arch and Gentoo if [[ -f /etc/arch-release ]] || [[ -f /etc/gentoo-release ]]; then echo "Using PAM for Arch/Gentoo" @@ -128,7 +129,7 @@ AX_CHECK_BASH_COMPLETION AX_CHECK_ZSH_COMPLETION # Checks for header files. -AC_CHECK_HEADERS([fcntl.h float.h inttypes.h limits.h locale.h netinet/in.h paths.h stddef.h stdint.h stdlib.h string.h sys/param.h sys/socket.h sys/time.h unistd.h], , [AC_MSG_FAILURE([cannot find the $ac_header header, which i3lock requires])]) +AC_CHECK_HEADERS([fcntl.h float.h inttypes.h limits.h locale.h netinet/in.h paths.h stddef.h stdint.h stdlib.h string.h sys/param.h sys/socket.h sys/time.h unistd.h gif_lib.h], , [AC_MSG_FAILURE([cannot find the $ac_header header, which i3lock requires])]) AC_CONFIG_FILES([Makefile]) diff --git a/i3lock.1 b/i3lock.1 index a04d5977..f1867faf 100644 --- a/i3lock.1 +++ b/i3lock.1 @@ -8,7 +8,7 @@ .fi .. -.TH i3lock-color 1 "JAN 2022" Linux "User Manuals" +.TH i3lock-color 1 "MAR 2025" Linux "User Manuals" .SH NAME i3lock-color \- improved screen locker @@ -42,8 +42,8 @@ i3lock forks, so you can combine it with an alias to suspend to RAM (run "i3lock && echo mem > /sys/power/state" to get a locked screen after waking up your computer from suspend to RAM) .IP \[bu] -You can specify either a background color or a PNG image which will be displayed -while your screen is locked. +You can specify either a PNG or JPG image, a GIF animation or a background +color which will be displayed while your screen is locked. .IP \[bu] You can specify whether i3lock should bell upon a wrong password. .IP \[bu] @@ -73,12 +73,12 @@ verified or whether it is wrong). .TP .BI \-i\ path \fR,\ \fB\-\-image= path -Display the given PNG image instead of a blank screen. +Display the given PNG/JPG image or GIF animation instead of a blank screen. .TP .BI \fB\-\-raw= format -Read the image given by \-\-image as a raw image instead of PNG. The argument is -the image's format as x:. +Read the image given by \-\-image as a raw image instead of PNG/JPG/GIF. The +argument is the image's format as x:. The supported pixel formats are: \'native', 'rgb', 'xrgb', 'rgbx', 'bgr', 'xbgr', and 'bgrx'. The "native" pixel format expects a pixel as a 32-bit (4-byte) integer in diff --git a/i3lock.c b/i3lock.c index 8406fa67..3ab3bdb8 100644 --- a/i3lock.c +++ b/i3lock.c @@ -61,6 +61,8 @@ #include "jpg.h" #include "fonts.h" +#include + #define TSTAMP_N_SECS(n) (n * 1.0) #define TSTAMP_N_MINS(n) (60 * TSTAMP_N_SECS(n)) #define START_TIMER(timer_obj, timeout, callback) \ @@ -247,6 +249,14 @@ char *image_path = NULL; char *image_raw_format = NULL; char *slideshow_path = NULL; +struct gif { + cairo_surface_t *img; + float delay_sec; +}; + +struct gif *gif_img = NULL; +int gif_img_count = 0; + cairo_surface_t *img = NULL; char *img_slideshow[256]; cairo_surface_t *blur_bg_img = NULL; @@ -313,6 +323,14 @@ char bar_width_expr[32] = ""; // empty string means full width based on bar orie bool bar_bidirectional = false; bool bar_reversed = false; +enum IMAGE_FORMAT { + IMAGE_FORMAT_UNKNOWN, + IMAGE_FORMAT_RAW, + IMAGE_FORMAT_PNG, + IMAGE_FORMAT_JPG, + IMAGE_FORMAT_GIF +}; + /* isutf, u8_dec © 2005 Jeff Bezanson, public domain */ #define isutf(c) (((c)&0xC0) != 0x80) @@ -1140,6 +1158,131 @@ static const struct raw_pixel_format raw_fmt_bgr = {3, 2, 1, 0}; static const struct raw_pixel_format raw_fmt_bgrx = {4, 2, 1, 0}; static const struct raw_pixel_format raw_fmt_xbgr = {4, 3, 2, 1}; +static cairo_surface_t *read_gif_image(const char *image_path) { + int err; + int width, stride, height; + int bg_idx; + uint32_t bg_color; + ColorMapObject *cmap; + GraphicsControlBlock gc; + + /* Open and load a GIF file */ + GifFileType *gif = DGifOpenFileName(image_path, &err); + if (!gif) { + fprintf(stderr, "Could not open GIF file, (Error %d)\n", err); + return NULL; + } + if (DGifSlurp(gif) != GIF_OK) { + fprintf(stderr, "Could not read the GIF image, (Error %d)\n", gif->Error); + goto read_gif_image_clean; + } + + /* Load canvas properties */ + width = gif->SWidth; + height = gif->SHeight; + cmap = gif->SColorMap; + bg_idx = gif->SBackGroundColor; + GifColorType *cmap_bg_rgb = cmap->Colors + bg_idx; + bg_color = cmap_bg_rgb->Blue | cmap_bg_rgb->Green << 8 | cmap_bg_rgb->Red << 16; + stride = cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, width) / sizeof(uint32_t); + if (stride < 0) { + fprintf(stderr, "Invalid distance between beginning of rows\n"); + goto read_gif_image_clean; + } + + /* Read the images into the RGB buffers */ + gif_img = malloc(gif->ImageCount * sizeof(struct gif)); + gif_img_count = gif->ImageCount; + if (!gif_img) { + fprintf(stderr, "Could not allocate memory for GIF image buffers\n"); + goto read_gif_image_clean; + } + uint32_t *data_prev = NULL; + for (SavedImage *pimg = gif->SavedImages; pimg < gif->SavedImages + gif->ImageCount; ++pimg) { + int idx = pimg - gif->SavedImages; + /* Create image surface */ + gif_img[idx].img = cairo_image_surface_create(CAIRO_FORMAT_RGB24, width, height); + if (cairo_surface_status(gif_img[idx].img) != CAIRO_STATUS_SUCCESS) { + fprintf(stderr, "Could not create surface: %s\n", + cairo_status_to_string(cairo_surface_status(gif_img[idx].img))); + free(gif_img); + gif_img = NULL; + goto read_gif_image_clean; + } + cairo_surface_flush(gif_img[idx].img); + uint32_t *data = (uint32_t *)cairo_image_surface_get_data(gif_img[idx].img); + + // TODO: Check L,R,W,H && color map? + /* Find Graphics Control extension and delay */ + for (int iext = 0; iext < pimg->ExtensionBlockCount; ++iext) { + ExtensionBlock *pext = pimg->ExtensionBlocks + iext; + switch (pext->Function) { + case GRAPHICS_EXT_FUNC_CODE: + DGifExtensionToGCB(pext->ByteCount, pext->Bytes, &gc); + // Delay time is in [ms]. Scale it to seconds. + gif_img[idx].delay_sec = gc.DelayTime * 0.01; + break; + default: + gif_img[idx].delay_sec = 0; + } + } + + /* Set general image attributes */ + ColorMapObject *cmap_img = pimg->ImageDesc.ColorMap; + if (!cmap_img) cmap_img = cmap; + int img_left = pimg->ImageDesc.Left; + int img_width = pimg->ImageDesc.Width; + int img_right = img_left + img_width; + int img_top = pimg->ImageDesc.Top; + int img_bottom = img_top + pimg->ImageDesc.Height; + + /* Handle disposal mode */ + int data_size = width * height * ((int)sizeof(width)); + switch (gc.DisposalMode) { + case DISPOSE_DO_NOT: + if (data_prev) { + memcpy(data, data_prev, data_size); + } else { + memset(data, 0, data_size); + } + break; + case DISPOSE_BACKGROUND: + memset(data, bg_color, data_size); + break; + default: + memset(data, 0, data_size); + } + + /* Read RGB */ + for (int x = 0; x < width; ++x) { + for (int y = 0; y < height; ++y) { + int color_idx; + if (x < img_left || x >= img_right || y < img_top || y >= img_bottom) { + color_idx = bg_idx; + } else { + color_idx = *(pimg->RasterBits + (x - img_left) + ((y - img_top) * img_width)); + } + + if (color_idx != gc.TransparentColor) { + GifColorType *cmap_rgb = cmap_img->Colors + color_idx; + uint32_t rgb = cmap_rgb->Blue | cmap_rgb->Green << 8 | cmap_rgb->Red << 16; + data[x + (y*width)] = rgb; + } + } + } + data_prev = data; + + cairo_surface_mark_dirty(gif_img[idx].img); + } + +read_gif_image_clean: + if (!DGifCloseFile(gif, &err)) { + DEBUG("DGifCloseFile call failed, (Error %d)\n", err); + } + + return gif_img[0].img; +} + static cairo_surface_t *read_raw_image(const char *image_path, const char *image_raw_format) { cairo_surface_t *img; @@ -1171,7 +1314,7 @@ static cairo_surface_t *read_raw_image(const char *image_path, const char *image uint32_t *data = (uint32_t *)cairo_image_surface_get_data(img); const int pixstride = cairo_image_surface_get_stride(img) / 4; - FILE *f = fopen(image_path, "r"); + FILE *f = fopen(image_path, "rb"); if (f == NULL) { fprintf(stderr, "Could not open image \"%s\": %s\n", image_path, strerror(errno)); @@ -1233,23 +1376,13 @@ static cairo_surface_t *read_raw_image(const char *image_path, const char *image return img; } -static bool verify_png_image(const char *image_path) { - if (!image_path) { - return false; - } - - /* Check file exists and has correct PNG header */ - FILE *png_file = fopen(image_path, "r"); - if (png_file == NULL) { - DEBUG("Image file path \"%s\" cannot be opened: %s\n", image_path, strerror(errno)); - return false; - } +static bool verify_png_image(FILE *png_file) { unsigned char png_header[8]; memset(png_header, '\0', sizeof(png_header)); + fseek(png_file, 0, SEEK_SET); int bytes_read = fread(png_header, 1, sizeof(png_header), png_file); - fclose(png_file); if (bytes_read != sizeof(png_header)) { - DEBUG("Could not read PNG header from \"%s\"\n", image_path); + DEBUG("Could not read PNG header\n"); return false; } @@ -1257,12 +1390,67 @@ static bool verify_png_image(const char *image_path) { // https://www.w3.org/TR/2003/REC-PNG-20031110/#5PNG-file-signature static unsigned char PNG_REFERENCE_HEADER[8] = {137, 80, 78, 71, 13, 10, 26, 10}; if (memcmp(PNG_REFERENCE_HEADER, png_header, sizeof(png_header)) != 0) { - DEBUG("File \"%s\" does not start with a PNG header. i3lock currently only supports loading PNG files.\n", image_path); return false; } + return true; } +static bool verify_gif_image(FILE *gif_file) { + unsigned char gif_header[6] = {0}; + fseek(gif_file, 0, SEEK_SET); + int bytes_read = fread(gif_header, 1, sizeof(gif_header), gif_file); + if (bytes_read != sizeof(gif_header)) { + fprintf(stderr, "Could not read GIF header\n"); + return false; + } + + // Check GIF header according to the specification, available at: + // https://www.w3.org/Graphics/GIF/spec-gif89a.txt + static const unsigned char GIF_REFERENCE_HEADER[] = {'G', 'I', 'F'}; + if (memcmp(GIF_REFERENCE_HEADER, gif_header, sizeof(GIF_REFERENCE_HEADER)) == 0) { + if (gif_header[3] >= '0' && gif_header[3] <= '9' && + gif_header[4] >= '0' && gif_header[4] <= '9' && + gif_header[5] >= 'a' && gif_header[5] <= 'z') { + + return true; + } + } + + return false; +} + +static enum IMAGE_FORMAT verify_image(const char *image_path) { + if (!image_path) { + return false; + } + + if (image_raw_format != NULL) { + return IMAGE_FORMAT_RAW; + } + + /* Check file exists and has correct header */ + FILE *file = fopen(image_path, "rb"); + if (file == NULL) { + fprintf(stderr, "Image file path \"%s\" cannot be opened (Error %s)\n", image_path, strerror(errno)); + return false; + } + + enum IMAGE_FORMAT format = IMAGE_FORMAT_UNKNOWN; + if (image_raw_format != NULL) { + format = IMAGE_FORMAT_RAW; + } else if (verify_png_image(file)) { + format = IMAGE_FORMAT_PNG; + } else if (file_is_jpg(file)) { + format = IMAGE_FORMAT_JPG; + } else if (verify_gif_image(file)) { + format = IMAGE_FORMAT_GIF; + } + + fclose(file); + return format; +} + #ifndef __OpenBSD__ /* * Callback function for PAM. We only react on password request callbacks. @@ -1454,31 +1642,39 @@ static void raise_loop(xcb_window_t window) { /* * Loads an image from the given path. Handles JPEG and PNG. Returns NULL in case of error. */ -cairo_surface_t* load_image(char* image_path) { +cairo_surface_t *load_image(enum IMAGE_FORMAT format) { cairo_surface_t *img = NULL; JPEG_INFO jpg_info; + unsigned char *jpg_data; - if (image_raw_format != NULL && image_path != NULL) { - /* Read image. 'read_raw_image' returns NULL on error, - * so we don't have to handle errors here. */ - img = read_raw_image(image_path, image_raw_format); - } else if (verify_png_image(image_path)) { - /* Create a pixmap to render on, fill it with the background color */ - img = cairo_image_surface_create_from_png(image_path); - } else if (file_is_jpg(image_path)) { - DEBUG("Image looks like a jpeg, decoding\n"); - unsigned char* jpg_data = read_JPEG_file(image_path, &jpg_info); + switch (format) { + case IMAGE_FORMAT_RAW: + /* Read image. 'read_raw_image' returns NULL on error, + * so we don't have to handle errors here. */ + img = read_raw_image(image_path, image_raw_format); + break; + case IMAGE_FORMAT_PNG: + img = cairo_image_surface_create_from_png(image_path); + break; + case IMAGE_FORMAT_JPG: + jpg_data = read_JPEG_file(image_path, &jpg_info); if (jpg_data != NULL) { img = cairo_image_surface_create_for_data(jpg_data, - CAIRO_FORMAT_ARGB32, jpg_info.width, jpg_info.height, - jpg_info.stride); + CAIRO_FORMAT_ARGB32, jpg_info.width, jpg_info.height, + jpg_info.stride); } + break; + case IMAGE_FORMAT_GIF: + img = read_gif_image(image_path); + break; + default: + fprintf(stderr, "Unsupported image file format: %s\n", image_path); } /* In case loading failed, we just pretend no -i was specified. */ if (img && cairo_surface_status(img) != CAIRO_STATUS_SUCCESS) { - fprintf(stderr, "Could not load image \"%s\": %s\n", - image_path, cairo_status_to_string(cairo_surface_status(img))); + fprintf(stderr, "Could not load image, %s\n", + cairo_status_to_string(cairo_surface_status(img))); img = NULL; } @@ -1534,6 +1730,17 @@ bool load_slideshow_images(const char *path) { return true; } +void gif_anim_loop(struct ev_loop *loop, struct ev_timer *timer, int delay) { + static int img_count = 0; + + if (++img_count >= gif_img_count) img_count = 0; + img = gif_img[img_count].img; + ev_timer_stop(loop, timer); + redraw_screen(); + ev_timer_set(timer, gif_img[img_count].delay_sec, 0.); + ev_timer_start(loop, timer); +} + int main(int argc, char *argv[]) { struct passwd *pw; char *username; @@ -2520,17 +2727,17 @@ int main(int argc, char *argv[]) { init_colors_once(); if (image_path != NULL) { if (!is_directory(image_path)) { - img = load_image(image_path); + enum IMAGE_FORMAT image_format = verify_image(image_path); + img = load_image(image_format); } else { /* Path to a directory is provided -> use slideshow mode */ slideshow_path = strdup(image_path); if (!load_slideshow_images(slideshow_path)) exit(EXIT_FAILURE); - img = load_image(img_slideshow[0]); + enum IMAGE_FORMAT image_format = verify_image(img_slideshow[0]); + img = load_image(image_format); } - free(image_path); } - free(image_raw_format); if (blur) { @@ -2611,6 +2818,7 @@ int main(int argc, char *argv[]) { struct ev_io *xcb_watcher = calloc(sizeof(struct ev_io), 1); struct ev_check *xcb_check = calloc(sizeof(struct ev_check), 1); struct ev_prepare *xcb_prepare = calloc(sizeof(struct ev_prepare), 1); + struct ev_timer *xcb_timer = calloc(sizeof(struct ev_timer), 1); ev_io_init(xcb_watcher, xcb_got_event, xcb_get_file_descriptor(conn), EV_READ); ev_io_start(main_loop, xcb_watcher); @@ -2621,6 +2829,11 @@ int main(int argc, char *argv[]) { ev_prepare_init(xcb_prepare, xcb_prepare_cb); ev_prepare_start(main_loop, xcb_prepare); + if (gif_img) { + ev_timer_init(xcb_timer, gif_anim_loop, gif_img[0].delay_sec, 0.); + ev_timer_start(main_loop, xcb_timer); + } + /* Invoke the event callback once to catch all the events which were * received up until now. ev will only pick up new events (when the X11 * file descriptor becomes readable). */ diff --git a/jpg.c b/jpg.c index de66fce6..a0fefd52 100644 --- a/jpg.c +++ b/jpg.c @@ -13,27 +13,17 @@ /* * Checks if the file is a JPEG by looking for a valid JPEG header. */ -bool file_is_jpg(char* file_path) { - if (!file_path) return false; - FILE* image_file; +bool file_is_jpg(FILE* image_file) { uint16_t file_header; size_t read_count; // TODO: Consider endianess on non-x86 platforms uint16_t jpg_magick = 0xd8ff; - image_file = fopen(file_path, "rb"); - if (image_file == NULL) { - int img_err = errno; - fprintf(stderr, "Could not open image file %s: %s\n", - file_path, strerror(img_err)); - return false; - } - + fseek(image_file, 0, SEEK_SET); read_count = fread(&file_header, sizeof(file_header), 1, image_file); - fclose(image_file); if (read_count < 1) { - fprintf(stderr, "Error searching for JPEG header in %s\n", file_path); + fprintf(stderr, "Error searching for JPEG header\n"); return false; } diff --git a/jpg.h b/jpg.h index fb74e78b..16df9a96 100644 --- a/jpg.h +++ b/jpg.h @@ -13,7 +13,7 @@ typedef struct { /* * Checks if the file is a JPEG by looking for a valid JPEG header. */ -bool file_is_jpg(char* file_path); +bool file_is_jpg(FILE* image_file); /* * Reads a JPEG from a file into memory, in a format that Cairo can create a diff --git a/travis/Dockerfile b/travis/Dockerfile index cc2dd7d9..144aac8c 100644 --- a/travis/Dockerfile +++ b/travis/Dockerfile @@ -19,7 +19,7 @@ RUN apt-get update && \ build-essential clang git autoconf automake libxcb-randr0-dev pkg-config libpam0g-dev \ libcairo2-dev libxcb1-dev libxcb-dpms0-dev libxcb-image0-dev libxcb-util0-dev \ libxcb-xrm-dev libev-dev libxcb-xinerama0-dev libxcb-xkb-dev libxkbcommon-dev \ - libxkbcommon-x11-dev clang-format-9 && \ + libxkbcommon-x11-dev clang-format-9 libgif-dev && \ rm -rf /var/lib/apt/lists/* WORKDIR /usr/src From ef8a7c6424b78e99e41fbe5f91c55460187376dd Mon Sep 17 00:00:00 2001 From: "o.le" Date: Fri, 14 Mar 2025 01:19:19 +0100 Subject: [PATCH 182/183] Add libgif-dev as debian dependency (#307) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 0277d3fb..05a37b76 100644 --- a/README.md +++ b/README.md @@ -84,7 +84,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 libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev libgif-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). From 7d337d9133853109d7443a0150ccd26a6b1c02da Mon Sep 17 00:00:00 2001 From: Hemanth Mukesh Date: Tue, 6 May 2025 04:34:26 -0500 Subject: [PATCH 183/183] added libgif-dev as ubuntu dependency (#309) --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 05a37b76..a3f630fb 100644 --- a/README.md +++ b/README.md @@ -98,7 +98,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 libxkbcommon-dev libxkbcommon-x11-dev libjpeg-dev libgif-dev ``` ## Building i3lock-color