Codebase list i3lock-color / c954f5a
Update upstream source from tag 'upstream/2.13.c.4' Update to upstream version '2.13.c.4' with Debian dir 8d71eb9ac1d73c098319dc64edf408c43f3d14d2 Arnaud Rebillout 1 year, 9 months ago
30 changed file(s) with 976 addition(s) and 746 deletion(s). Raw diff Collapse all Expand all
2323 ## Environment
2424 Output of `i3lock --version`:
2525 <pre>
26 i3lock version:
26 i3lock version:
2727 </pre>
2828
2929 Where'd you get i3lock-color from?
33 Closes #[issue number]
44
55 ## Description
6 -
6 -
77
88 ### Screenshots/screencaps
99 <!--
66 steps:
77 - uses: actions/checkout@v2
88 - name: Install deps
9 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
10 - run: chmod +x build.sh
11 - run: ./build.sh
12 - run: cd build && make check
13 - run: cd build && make distcheck
9 run: |
10 sudo apt update
11 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
12 - name: Build
13 run: ./build.sh
14 - name: Check and distcheck
15 run: |
16 cd build
17 make check
18 make distcheck
1419 - name: Upload binary artifact
1520 uses: actions/upload-artifact@v2
1621 with:
2020
2121 strategy:
2222 fail-fast: false
23 matrix:
23 # matrix:
2424 # Override automatic language detection by changing the below list
2525 # Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
26 language: ['cpp']
26 # language: ['cpp']
2727 # Learn more...
2828 # https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
2929
3737
3838 # If this run was triggered by a pull request event, then checkout
3939 # the head of the pull request instead of the merge commit.
40 - run: git checkout HEAD^2
41 if: ${{ github.event_name == 'pull_request' }}
40 # CodeQL apparently deprecated this feature and now warns on running this command
41 # - run: git checkout HEAD^2
42 # if: ${{ github.event_name == 'pull_request' }}
4243
4344 # Initializes the CodeQL tools for scanning.
4445 - name: Initialize CodeQL
4647 with:
4748 languages: ${{ matrix.language }}
4849 # If you wish to specify custom queries, you can do so here or in a config file.
49 # By default, queries listed here will override any specified in a config file.
50 # By default, queries listed here will override any specified in a config file.
5051 # Prefix the list here with "+" to use these queries and those in the config file.
5152 # queries: ./path/to/local/query, your-org/your-repo/queries@main
5253
6364 # uses a compiled language
6465
6566 - run: |
67 sudo apt-get update
6668 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
6769 ./build.sh
6870
22 tags
33 *.swp
44 *.gz
5 /pam/i3lock
5 *~
6 x86_64-pc-linux-gnu
67
78 ################################################################################
89 # https://raw.githubusercontent.com/github/gitignore/master/Autotools.gitignore
3031 /install-sh
3132 /missing
3233 /stamp-h1
33 *.in~
34 pam/i3lock
0 2.13.c.1
0 2.13.c.4
00 Copyright © 2010-2011, Michael Stapelberg
11 Copyright © 2015, Cassandra Fox
2 Copyright © 2020, Raymond Li
2 Copyright © 2021, Raymond Li
33 All rights reserved.
44
55 Redistribution and use in source and binary forms, with or without
00 # i3lock-color
11
22 ![Language count](https://img.shields.io/github/languages/count/Raymo111/i3lock-color)
3 ![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color)
3 [![Top language](https://img.shields.io/github/languages/top/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/search?l=c)
44 ![Repo size](https://img.shields.io/github/repo-size/Raymo111/i3lock-color)
5 ![Open issues](https://img.shields.io/github/issues-raw/Raymo111/i3lock-color)
6 ![Closed issues](https://img.shields.io/github/issues-closed-raw/Raymo111/i3lock-color?color=brightgreen)
7 ![Open PRs](https://img.shields.io/github/issues-pr-raw/Raymo111/i3lock-color?label=open%20PRs)
8 ![Closed PRs](https://img.shields.io/github/issues-pr-closed-raw/Raymo111/i3lock-color?color=brightgreen&label=closed%20PRs)
9 ![Contributor count](https://img.shields.io/github/contributors/Raymo111/i3lock-color)
10 ![GitHub Release Date](https://img.shields.io/github/release-date/Raymo111/i3lock-color?label=latest%20release)
11 ![Commits](https://img.shields.io/github/commits-since/Raymo111/i3lock-color/latest?include_prereleases&sort=semver)
5 [![Open issues](https://img.shields.io/github/issues-raw/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/issues?q=is%3Aopen+is%3Aissue)
6 [![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)
7 [![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)
8 [![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)
9 [![Contributors](https://img.shields.io/github/contributors/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/graphs/contributors)
10 [![Latest release](https://img.shields.io/github/release-date/Raymo111/i3lock-color?label=latest%20release)](https://github.com/Raymo111/i3lock-color/releases/latest)
11 [![Commits](https://img.shields.io/github/commits-since/Raymo111/i3lock-color/latest?include_prereleases&sort=semver)](https://github.com/Raymo111/i3lock-color/commits/master)
1212 ![Latest commit](https://img.shields.io/github/last-commit/Raymo111/i3lock-color)
13 ![Arch Linux package](https://img.shields.io/archlinux/v/community/x86_64/i3lock-color?logo=arch%20linux&label=Community%20version)
14 ![AUR git ver](https://img.shields.io/aur/version/i3lock-color-git?label=AUR%20git%20ver)
13 <!--![Arch Linux package](https://img.shields.io/archlinux/v/community/x86_64/i3lock-color?logo=arch%20linux&label=Community%20version)-->
14 [![AUR release ver](https://img.shields.io/aur/version/i3lock-color?label=AUR%20release%20ver)](https://aur.archlinux.org/packages/i3lock-color/)
15 [![AUR git ver](https://img.shields.io/aur/version/i3lock-color-git?label=AUR%20git%20ver)](https://aur.archlinux.org/packages/i3lock-color-git/)
1516 ![AUR votes](https://img.shields.io/aur/votes/i3lock-color-git)
16 ![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color)
17 ![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color)
18 ![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color)
19 ![Maintenance](https://img.shields.io/maintenance/yes/2020)
17 [![GitHub forks](https://img.shields.io/github/forks/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/network/members)
18 [![GitHub stars](https://img.shields.io/github/stars/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/stargazers)
19 [![GitHub watchers](https://img.shields.io/github/watchers/Raymo111/i3lock-color)](https://github.com/Raymo111/i3lock-color/watchers)
20 ![Maintained](https://img.shields.io/maintenance/yes/2021)
2021
2122 ### The world's most popular non-default computer lockscreen.
2223 **A modern version of i3lock with color functionality and other features.**
2324
24 ![i3lock-color in action](screenshot.png "Screenshot sample")
25 ![i3lock-color in action](examples/screenshot.png "Screenshot sample")
2526
2627 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.
2728
4546 - Key highlight color
4647 - Backspace highlight color
4748 - Text colors for most/all strings
49 - Outline colors
4850 - Changing all of the above depending on PAM's authentication status
4951 - Blurring the current screen and using that as the lock background
5052 - Showing a clock in the indicator
5153 - Refreshing on a timer, instead of on each keypress
5254 - Positioning the various UI elements
5355 - Changing the ring radius and thickness, as well as text size
54 - Passthrough media keys
56 - Options for passwordless auth, removing modkey indicator
57 - Passing through media keys
5558 - A new bar indicator, which replaces the ring indicator with its own set of options
5659 - An experimental thread for driving the redraw ticks, so that things like the bar/clock still update when PAM is blocking
60 - Any other feature you want (add it yourself through a PR or make a feature request issue!)
5761
5862 ## Dependencies
5963 The following dependencies will need to be installed for a successful build, depending on your OS/distro.
60
61 ### Ubuntu 18/20.04 LTS
62 Run this command to install all dependencies:
63 ```
64 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
65 ```
66
67 ### Debian
68 Replace `libxcb-util-dev` with `libxcb-util0-dev` in the Ubuntu installation command:
69 ```
70 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
71 ```
7264
7365 ### Arch Linux
7466 - autoconf
8577 - xcb-util-image
8678 - xcb-util-xrm
8779
80 ### Debian
81 Run this command to install all dependencies:
82 ```
83 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
84 ```
85 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).
86
8887 ### Fedora
8988 Run this command to install all dependencies:
9089
9291 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
9392 ```
9493
94 ### Ubuntu 18/20.04 LTS
95 Run this command to install all dependencies:
96 ```
97 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
98 ```
99
95100 ## Building i3lock-color
96101 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).
97102
98 If there's no packaged version available - think carefully, since you're using a forked screen locker at your own risk.
103 **If you want to build a non-debug version, you should tag your build before configuring.**
99104
100 **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.
105 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.
101106
102 To use i3lock-color, first install the dependencies listed above, then clone the repo:
107 i3lock-color uses GNU autotools for building.
108
109 To build/install i3lock-color, first install the dependencies listed above, then clone the repo:
103110 ```
104111 git clone https://github.com/Raymo111/i3lock-color.git
105112 cd i3lock-color
106113 ```
107114 To build without installing, run:
108115 ```
109 chmod +x build.sh
110116 ./build.sh
111117 ```
112 To install after building, run:
118 To build AND install, run:
113119 ```
114 chmod +x install-i3lock-color.sh
115120 ./install-i3lock-color.sh
116121 ```
117122 You may choose to modify the script based on your needs/OS/distro.
118123
119124 ## Arch Linux Packages
120 [Stable version in Community](https://www.archlinux.org/packages/community/x86_64/i3lock-color/)
125 ~~[Stable version in Community](https://www.archlinux.org/packages/community/x86_64/i3lock-color/)~~
121126
122 [Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/)
127 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:
128 - [Release Version on AUR](https://aur.archlinux.org/packages/i3lock-color/)
129 - [Git Version on AUR](https://aur.archlinux.org/packages/i3lock-color-git/)
130
131 ## Gentoo Package
132 i3lock-color is available on **GURU**, under [`x11-misc/i3lock-color`](https://github.com/gentoo/guru/tree/master/x11-misc/i3lock-color).
123133
124134 ## FreeBSD port
125 [i3lock-color-port](https://github.com/rkashapov/i3lock-color-port/)
135 ~~[i3lock-color-port](https://github.com/rkashapov/i3lock-color-port/)~~ (severely out of date).
126136
127137 ## Running i3lock-color
128138 Simply invoke the 'i3lock' command. To get out of it, enter your password and press enter.
129139
130 A [sample script](lock.sh) is included in this repository. [See the script in action](https://streamable.com/fpl46)
140 A [sample script](examples/lock.sh) is included in this repository. [See the script in action](https://streamable.com/fpl46)
131141
132142 On OpenBSD the `i3lock` binary needs to be setgid `auth` to call the authentication helpers, e.g. `/usr/libexec/auth/login_passwd`.
133143
135145 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).
136146
137147 ## Upstream
138 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.
148 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).
1111
1212 ## Reporting a Vulnerability
1313
14 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 [[email protected]](mailto:[email protected]?subject=i3lock-color%20security%20vulnerability), or encrypt the issue text with my PGP public key:
14 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 [[email protected]](mailto:[email protected]?subject=i3lock-color%20security%20vulnerability), or encrypt the issue text with my PGP public key:
1515 ```
1616 -----BEGIN PGP PUBLIC KEY BLOCK-----
1717
1313 #endif
1414 void blur_impl_horizontal_pass_generic(uint32_t *src, uint32_t *dst, int width, int height);
1515 #endif
16
17
0 #!/bin/bash
0 #!/bin/sh -x
1
2 configureOpts="--disable-sanitizers"
3
4 while getopts ":hd" opt; do
5 case ${opt} in
6 h ) echo "Use -d to turn on sanitizers (for debugging only)"
7 exit;;
8 d ) configureOpts=""
9 ;;
10 \? ) echo "Usage: $0 [-h] [-d]"
11 exit;;
12 esac
13 done
14
15 configureOpts="${configureOpts} --prefix=/usr --sysconfdir=/etc"
16
117 autoreconf -fiv
218
319 BUILD_DIR=build/
521 mkdir -vp $BUILD_DIR
622 cd $BUILD_DIR || { echo "cd $BUILD_DIR"; exit 127; }
723
8 ../configure --prefix=/usr --sysconfdir=/etc
24 ../configure ${configureOpts}
925
1026 make
11 # Run autoreconf -fi to generate a configure script from this file.
22
33 AC_PREREQ([2.69])
4 AC_INIT([i3lock-color], [m4_esyscmd_s([cat I3LOCK_VERSION])], [https://github.com/Raymo11/i3lock-color/issues])
4 AC_INIT([i3lock-color],[m4_esyscmd_s([cat I3LOCK_VERSION])],[https://github.com/Raymo11/i3lock-color/issues])
55 # For AX_EXTEND_SRCDIR
66 AX_ENABLE_BUILDDIR
77 AM_INIT_AUTOMAKE([foreign subdir-objects -Wall no-dist-gzip dist-bzip2])
4949 dnl on its fourth argument.
5050 AX_CHECK_ENABLE_DEBUG([yes], , [UNUSED_NDEBUG], [$is_release])
5151
52 AC_PROG_CC_C99
52 AC_PROG_CC
5353
5454 # For strnlen() and vasprintf().
5555 AC_USE_SYSTEM_EXTENSIONS
6767 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])])
6868 AC_CHECK_FUNCS([explicit_bzero])
6969
70 # Checks for libraries.
71
70 # Check for libraries
7271 AC_SEARCH_LIBS([floor], [m], , [AC_MSG_FAILURE([cannot find the required floor() function despite trying to link with -lm])])
7372
7473 # libev does not ship with a pkg-config file :(.
7675
7776 AC_SEARCH_LIBS([shm_open], [rt])
7877
79 # Use system-auth instead of login on Arch (TODO: Implement Gentoo as well)
80 if [[ -f /etc/arch-release ]]; then
81 echo "Using PAM for Arch"
82 sed -i "s/^#auth include system-auth/auth include system-auth/g" ../pam/i3lock
78 # Use system-local-login instead of login on Arch and Gentoo
79 if [[ -f /etc/arch-release ]] || [[ -f /etc/gentoo-release ]]; then
80 echo "Using PAM for Arch/Gentoo"
81 sed -i "s/^#auth include system-local-login/auth include system-local-login/g" ../pam/i3lock
8382 sed -i "s/^auth include login/#auth include login/g" ../pam/i3lock
8483 fi
8584
159158
160159 AS_HELP_STRING([enable debug flags:], [${ax_enable_debug}])
161160 AS_HELP_STRING([code coverage:], [${CODE_COVERAGE_ENABLED}])
162 AS_HELP_STRING([enabled sanitizers:], [${ax_enabled_sanitizers}])
161 AS_HELP_STRING([enabled sanitizers:], [${ax_enabled_sanitizers}])"
163162
164 To compile, run:
165
166 cd `pwd` && make
167 --------------------------------------------------------------------------------"
163 #To compile, run:
164 #
165 # cd `pwd` && make
166 echo \
167 "--------------------------------------------------------------------------------"
0 #!/bin/sh
1
2 B='#00000000' # blank
3 C='#ffffff22' # clear ish
4 D='#ff00ffcc' # default
5 T='#ee00eeee' # text
6 W='#880000bb' # wrong
7 V='#bb00bbbb' # verifying
8
9 i3lock \
10 --insidever-color=$C \
11 --ringver-color=$V \
12 \
13 --insidewrong-color=$C \
14 --ringwrong-color=$W \
15 \
16 --inside-color=$B \
17 --ring-color=$D \
18 --line-color=$B \
19 --separator-color=$D \
20 \
21 --verif-color=$T \
22 --wrong-color=$T \
23 --time-color=$T \
24 --date-color=$T \
25 --layout-color=$T \
26 --keyhl-color=$W \
27 --bshl-color=$W \
28 \
29 --screen 1 \
30 --blur 5 \
31 --clock \
32 --indicator \
33 --time-str="%H:%M:%S" \
34 --date-str="%A, %m %Y" \
35 --keylayout 1 \
0 #!/bin/sh
1
2 B='#00000000' # blank
3 C='#ffffff22' # clear ish
4 D='#ff00ffcc' # default
5 T='#ee00eeee' # text
6 W='#880000bb' # wrong
7 V='#bb00bbbb' # verifying
8
9 i3lock \
10 --blur 5 \
11 --bar-indicator \
12 --bar-pos y+h \
13 --bar-direction 1 \
14 --bar-max-height 50 \
15 --bar-base-width 50 \
16 --bar-color 000000cc \
17 --keyhl-color 880088cc \
18 --bar-periodic-step 50 \
19 --bar-step 50 \
20 --redraw-thread \
21 \
22 --clock \
23 --force-clock \
24 --time-pos x+5:y+h-80 \
25 --time-color 880088ff \
26 --date-pos tx:ty+15 \
27 --date-color 990099ff \
28 --date-align 1 \
29 --time-align 1 \
30 --ringver-color 8800ff88 \
31 --ringwrong-color ff008888 \
32 --status-pos x+5:y+h-16 \
33 --verif-align 1 \
34 --wrong-align 1 \
35 --verif-color ffffffff \
36 --wrong-color ffffffff \
37 --modif-pos -50:-50
Binary diff not shown
1818
1919 char str[512];
2020 double size;
21 double outline_width;
2122
2223 cairo_font_face_t *font;
2324
2425 rgba_t color;
26 rgba_t outline_color;
2527 double x, y;
2628
2729 int align;
+283
-261
i3lock.1 less more
77 .fi
88 ..
99
10 .TH i3lock-color 1 "JULY 2020" Linux "User Manuals"
10 .TH i3lock-color 1 "JUN 2021" Linux "User Manuals"
1111
1212 .SH NAME
1313 i3lock-color \- improved screen locker
3030 .RB [\|\-m\|]
3131
3232 .SH DESCRIPTION
33 .B i3lock-color
33 .B i3lock\-color
3434 is a simple screen locker like slock. After starting it, you will see a white
3535 screen (you can configure the color/an image). You can return to your screen by
3636 entering your password.
3737
38 .SH IMPROVEMENTS
38 .SH FEATURES
3939 .IP \[bu] 2
4040 i3lock forks, so you can combine it with an alias to suspend to RAM
41 (run "i3lock && echo mem > /sys/power/state" to get a locked screen after waking up your computer from suspend to RAM)
42 .IP \[bu]
43 You can specify either a background color or a PNG image which will be displayed while your screen is locked.
41 (run "i3lock && echo mem > /sys/power/state" to get a locked screen after waking
42 up your computer from suspend to RAM)
43 .IP \[bu]
44 You can specify either a background color or a PNG image which will be displayed
45 while your screen is locked.
4446 .IP \[bu]
4547 You can specify whether i3lock should bell upon a wrong password.
4648 .IP \[bu]
7476
7577 .TP
7678 .BI \fB\-\-raw= format
77 Read the image given by \-\-image as a raw image instead of PNG. The argument is the image's format
78 as <width>x<height>:<pixfmt>. The supported pixel formats are:
79 Read the image given by \-\-image as a raw image instead of PNG. The argument is
80 the image's format as <width>x<height>:<pixfmt>.
81 The supported pixel formats are:
7982 \'native', 'rgb', 'xrgb', 'rgbx', 'bgr', 'xbgr', and 'bgrx'.
8083 The "native" pixel format expects a pixel as a 32-bit (4-byte) integer in
81 the machine's native endianness, with the upper 8 bits unused. Red, green and blue are stored in
82 the remaining bits, in that order.
84 the machine's native endianness, with the upper 8 bits unused.
85 Red, green and blue are stored in the remaining bits, in that order.
8386
8487 .BR Example:
8588 .Vb 6
104107
105108 .TP
106109 .BI \-c\ rrggbbaa \fR,\ \fB\-\-color= rrggbbaa
107 Turn the screen into the given color instead of white. Color must be given in 4-byte
108 format: rrggbbaa (i.e. ff0000ff is opaque red).
109 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).
110 Turn the screen into the given color instead of white. Color must be given in
111 4-byte format: rrggbbaa (i.e. ff0000ff is opaque red).
112 Use the last byte for alpha. Setting this below FF (i.e. ff000088) will allow
113 your screen to be shown translucently if you use a compositor (e.g. compton,
114 xcompmgr).
110115
111116 .TP
112117 .B \-t, \-\-tiling
113 If an image is specified (via \-i) it will display the image tiled all over the screen
114 (with a multi-monitor setup, the image is visible on all screens).
118 If an image is specified (via \-i) it will display the image tiled all over the
119 screen.
120
121 Note: For all image options, with a multi-monitor setup, the image is visible on
122 all screens.
115123
116124 .TP
117125 .B \-C, \-\-centered
118 If an image is specified (via \-i) it will display the image centered on the screen
119 (with a multi-monitor setup, the image is visible on all screens).
126 If an image is specified (via \-i) it will display the image centered on the
127 screen.
128
129 .TP
130 .B \-F, \-\-fill
131 If an image is specified (via \-i) it will scale the image until it fills the
132 screen. A portion of the image will be cropped.
133
134 .TP
135 .B \-M, \-\-max
136 If an image is specified (via \-i) it will scale the image until either the
137 width or the height fits the screen without being cropped. The border color
138 can be set via \-c.
139
140 .TP
141 .B \-L, \-\-scale
142 If an image is specified (via \-i) it will stretch the image until both the
143 width and the height fits the screen.
120144
121145 .TP
122146 .BI \-p\ win|default \fR,\ \fB\-\-pointer= win|default
129153
130154 .TP
131155 .B \-e, \-\-ignore\-empty\-password
132 When an empty password is provided by the user, do not validate
133 it. Without this option, the empty password will be provided to PAM
134 and, if invalid, the user will have to wait a few seconds before
135 another try. This can be useful if the XF86ScreenSaver key is used to
136 put a laptop to sleep and bounce on resume or if you happen to wake up
137 your computer with the enter key.
156 When an empty password is provided by the user, do not validate it. Without this
157 option, the empty password will be provided to PAM and, if invalid, the user
158 will have to wait a few seconds before another try. This can be useful if the
159 XF86ScreenSaver key is used to put a laptop to sleep and bounce on resume or if
160 you happen to wake up your computer with the enter key.
138161
139162 .TP
140163 .B \-f, \-\-show\-failed\-attempts
145168 Enables debug logging.
146169 Note, that this will log the password used for authentication to stdout.
147170
148 .SH i3lock-color options
171 .SH i3lock-color OPTIONS
149172 .TP
150173 .B \-S number, \-\-screen=number
151 Specifies which display to draw the unlock indicator and clock on. By default, they'll be placed on every screen.
174 Specifies which display to draw the unlock indicator and clock on. By default,
175 they'll be placed on every screen.
152176 Note that this number is zero indexed. The ordering is dependent on libxinerama.
153177
154178 .TP
155179 .B \-B sigma, \-\-blur=sigma
156180 Captures the screen and blurs it using the given sigma (radius).
157181 Images may still be overlaid over the blurred screenshot.
158 As an alternative to this option, you could specify a translucent background color
159 (-c option) with a fully transparent or translucent color, and use a compositor to perform blurring (e.g. compton, picom).
182 As an alternative to this option, you could specify a translucent background
183 color (-c option) with a fully transparent or translucent color, and use a
184 compositor to perform blurring (e.g. compton, picom).
185
186 .TP
187 .B \-k, \-\-clock, \-\-force\-clock
188 Displays the clock. \-\-force\-clock also displays the clock when there's
189 indicator text (useful for when the clock is not positioned with the indicator).
160190
161191 .TP
162192 .B \-\-indicator
163193 Forces the indicator to always be visible, instead of only showing on activity.
164194
165195 .TP
196 .B \-\-radius
197 The radius of the circle. Defaults to 90.
198
199 .TP
200 .B \-\-ring\-width
201 The width of the ring unlock indicator. Defaults to 7.0.
202
203 .TP
204 .B \-\-{inside, ring}\-color=rrggbbaa
205 Sets the idle color for the interior circle and ring. Note: use individual
206 options per element unless the shell supports brace expansion (in which case
207 remove the spaces inside the curly braces).
208
209 .TP
210 .B \-\-{inside, ring}ver\-color=rrggbbaa
211 Sets the interior circle and ring color while the password is being verified.
212
213 .TP
214 .B \-\-{inside, ring}wrong\-color=rrggbbaa
215 Sets the interior circle and ring color for during incorrect password flashes.
216
217 .TP
218 .B \-\-line\-color=rrggbbaa
219 Sets the color for the line separating the inside circle and the outer ring.
220
221 .TP
222 .B \-\-line\-uses\-{inside, ring}
223 Overrides \-\-line\-color. The line will match the {inside, ring} color.
224 Note: these two options conflict with each other.
225
226 .TP
227 .B \-\-{key, bs}hl\-color=rrggbbaa
228 Sets the color of highlight arcs on the ring upon keypress and backspace.
229
230 .TP
231 .B \-\-separator\-color=rrggbbaa
232 Sets the color of the seperators at both ends of the highlight arcs on the ring.
233
234 .TP
235 .B \-\-{verif, wrong, modif}\-color=rrggbbaa
236 Sets the color of the status text while verifying and when password is wrong.
237
238 .TP
239 .B \-\-{layout, time, date, greeter}\-color=rrggbbaa
240 Sets text colors.
241
242 .TP
243 .B \-\-time\-str="%H:%M:%S"
244 Sets the format used for generating the time string.
245 See strftime(3) for a full list of format specifiers.
246
247 .TP
248 .B \-\-date\-str="%A, %m %Y"
249 Sets the format used for generating the date string.
250
251 .TP
252 .B \-\-verif\-text="verifying…"
253 Sets the string to be shown while verifying the password/input/key/etc.
254
255 .TP
256 .B \-\-wrong\-text="wrong!"
257 Sets the string to be shown upon entering an incorrect password.
258
259 .TP
166260 .B \-\-keylayout mode
167 Displays the keylayout. Positionable similar to date, time, and indicator. Modes are as follows:
168 .RS
169 .RS
261 Displays the keylayout. Positionable similar to date, time, and indicator.
262 Modes are as follows:
263 .RS
264 .IP \[bu] 2
170265 0 - Displays the full string returned by the query, i.e. "English (US)"
266 .IP \[bu]
171267 1 - Displays up until the first parenthesis, i.e. "English"
268 .IP \[bu]
172269 2 - Displays just the contents of the parenthesis, i.e. "US"
173270 .RE
174 .RE
175
176 .TP
177 .B \-k, \-\-clock, \-\-force\-clock
178 Displays the clock. \-\-force\-clock also displays the clock when there's indicator text
179 (useful for when the clock is not positioned with the indicator).
180
181 .TP
182 .B \-\-composite
183 Some compositors have problems with i3lock trying to render over them, so this argument is disabled by default.
184 However, some will work properly with it, so it's been left enabled.
185
186 .TP
187 .B \-\-pass\-media\-keys
188 Allow the following keys to be used while the screen is locked by passing them through:
189 XF86AudioPlay, XF86AudioPause, XF86AudioStop, XF86AudioPrev, XF86AudioNext, XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume.
190
191 .TP
192 .B \-\-pass\-screen\-keys
193 Allow the following keys to be used while the screen is locked by passing them through:
194 XF86MonBrightnessUp, XF86MonBrightnessDown.
195
196 .TP
197 .B \-\-pass\-power\-keys
198 Allow the following keys to be used while the screen is locked by passing them through:
199 XF86PowerDown, XF86PowerOff, XF86Sleep.
200
201 .TP
202 .B \-\-pass\-volume\-keys
203 Allow the following keys to be used while the screen is locked by passing them through:
204 XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume.
205
206 .TP
207 .B \-\-insidevercolor=rrggbbaa
208 Sets the interior circle color while the password is being verified.
209
210 .TP
211 .B \-\-insidewrongcolor=rrggbbaa
212 Sets the interior circle color for during flash for an incorrect password.
213
214 .TP
215 .B \-\-insidecolor=rrggbbaa
216 Sets the default "resting" color for the interior circle.
217
218 .TP
219 .B \-\-ringvercolor=rrggbbaa
220 Sets the ring color while the password is being verified.
221
222 .TP
223 .B \-\-ringwrongcolor=rrggbbaa
224 Sets the ring color during the flash for an incorrect password.
225
226 .TP
227 .B \-\-ringcolor=rrggbbaa
228 Sets the default ring color.
229
230 .TP
231 .B \-\-linecolor=rrggbbaa
232 Sets the color for the line separating the inside circle, and the outer ring.
233
234 .TP
235 .B \-\-line\-uses\-ring
236 Conflicts with \-\-line\-uses\-inside. Overrides \-\-linecolor. The line will match the ring color.
237
238 .TP
239 .B \-\-line\-uses\-inside
240 Conflicts with \-\-line\-uses\-ring. Overrides \-\-linecolor; the line will match the inside color.
241
242 .TP
243 .B \-\-keyhlcolor=rrggbbaa
244 Sets the color of the ring 'highlight' strokes that appear upon keypress.
245
246 .TP
247 .B \-\-bshlcolor=rrggbbaa
248 Sets the color of the ring 'highlight' strokes that appear upon backspace.
249
250 .TP
251 .B \-\-separatorcolor=rrggbbaa
252 Sets the color of the 'separtor', which is at both ends of the ring highlights.
253
254 .TP
255 .B \-\-verifcolor=rrggbbaa
256 Sets the color of the status text while verifying.
257
258 .TP
259 .B \-\-wrongcolor=rrggbbaa
260 Sets the color of the status text when "wrong".
261
262 .TP
263 .B \-\-layoutcolor=rrggbbaa
264 Sets the color of the keyboard layout text.
265
266 .TP
267 .B \-\-indpos="x position:y position"
268 Sets the position for the unlock indicator. Valid variables include:
269 .RS
270 .RS
271 x - x position of the current display. Corresponds to the leftmost row of pixels on that display.
272 y - y position of the current display. Corresponds to the topmost row of pixels on that display.
273 w - width of the current display.
274 h - height of the current display.
275 r - the unlock indicator radius.
276 .RE
277 .RE
278
279 .TP
280 .B \-\-timecolor=rrggbbaa
281 Sets the color of the time in the clock.
282
283 .TP
284 .B \-\-timestr="%H:%M:%S"
285 Sets the format used for generating the time string. See strftime(3) for a full list of format specifiers.
286
287 .TP
288 .B \-\-timepos="x position:y position"
289 Sets the position for the time string. All the variables from \-\-indpos may be used, in addition to:
290 .RS
291 .RS
292 ix - the x value of the indicator on the current display.
293 iy - the y value of the indicator on the current display.
294 .RE
295 .RE
296
297 .TP
298 .B \-\-time\-align, \-\-date\-align, \-\-layout\-align, \-\-verif\-align, \-\-wrong\-align, \-\-modif\-align, \-\-greeter\-align
299 Sets the text alignment of the time, date, keylayout, verification text, wrong text, modifier text and greeter text.
300 .RS
301 .RS
271
272 .TP
273 .B \-\-noinput\-text="no input"
274 Sets the string to be shown upon pressing backspace without anything to delete.
275
276 .TP
277 .B \-\-lock\-text="locking…"
278 Sets the string to be shown while acquiring pointer and keyboard focus.
279
280 .TP
281 .B \-\-lockfailed\-text="lock failed!"
282 Sets the string to be shown after failing to acquire pointer and keyboard focus.
283
284 .TP
285 .B \-\-greeter\-text=""
286 Sets the greeter text.
287
288 .TP
289 .B \-\-no\-modkey\-text
290 Hides the modkey indicator (Num, Caps Lock ...)
291
292 .TP
293 .B \-\-{time, date, layout, verif, wrong, modif, greeter}\-align
294 Sets the text alignment of the time, date, keylayout, verification, wrong,
295 modifier and greeter texts.
296 .RS
297 .IP \[bu] 2
302298 0 - centered (default)
299 .IP \[bu]
303300 1 - left aligned
301 .IP \[bu]
304302 2 - right aligned
305303 .RE
306 .RE
307
308 .TP
309 .B \-\-datecolor=rrggbbaa
310 Sets the color of the date in the clock.
311
312 .TP
313 .B \-\-datestr="%A, %m %Y"
314 Sets the format used for generating the date string. See strftime(3) for a full list of format specifiers.
304
305 .TP
306 .B \-\-{time, date, layout, verif, wrong, greeter, modif}outline\-color=rrggbbaa
307 Sets the color of the outlines.
315308
316309 .TP
317310 .B \-\-{time, date, layout, verif, wrong, greeter}\-font=sans\-serif
318311 Sets the font used to render various strings.
319312
320313 .TP
321 .B \-\-{time, date, layout, verif, wrong, greeter}size=number
314 .B \-\-{time, date, layout, verif, wrong, greeter}\-size=number
322315 Sets the font size used to render various strings.
323316
324317 .TP
325 .B \-\-datepos="x position:y position"
326 Sets the position for the date string. All the variables from \-\-indpos and \-\-timepos may be used, in addition to:
327 .RS
328 .RS
329 tx - the computed x value of the timestring, for the current display.
330 ty - the computed y value of the timestring, for the current display.
331 .RE
332 .RE
333
334 .TP
335 .B \-\-greetertext="text"
336 Sets the greeter text. Defaults to "".
337
338 .TP
339 .B \-\-greetercolor=rrggbbaa
340 Sets the color of the greeter text.
341
342 .TP
343 .B \-\-greeterpos="x position:y position"
344 Sets the position for the greeter string. All the variables from \-\-indpos and \-\-timepos may be used.
345
346 .TP
347 .B \-\-refresh\-rate=seconds\-as\-double
348 The refresh rate of the indicator, given in seconds. This should automatically align itself, but is somewhat buggy currently.
349 Values less than one will work, but may result in poor system performance.
350
351 .TP
352 .B \-\-veriftext="text"
353 Sets the string to be shown while verifying the password/input/key/etc. Defaults to "verifying…".
354
355 .TP
356 .B \-\-wrongtext="text"
357 Sets the string to be shown upon entering an incorrect password. Defaults to "wrong!".
358
359 .TP
360 .B \-\-noinputtext="text"
361 Sets the string to be shown upon pressing backspace without anything to delete. Defaults to "no input".
362
363 .TP
364 .B \-\-locktext="text"
365 Sets the string to be shown while acquiring pointer and keyboard focus. Defaults to "locking…".
366
367 .TP
368 .B \-\-lockfailedtext="text"
369 Sets the string to be shown after failing to acquire pointer and keyboard focus. Defaults to "lock failed!".
370
371 .TP
372 .B \-\-radius
373 The radius of the circle. Defaults to 90.
374
375 .TP
376 .B \-\-ring\-width
377 The width of the ring unlock indicator. Defaults to 7.0.
318 .B \-\-{time, date, layout, verif, wrong, greeter, modifier}outline\-width=number
319 Sets the width of the outline.
320
321 .TP
322 .B \-\-ind\-pos="x\-position:y\-position"
323 Sets the position for the unlock indicator. Valid variables include:
324 .RS
325 .IP \[bu] 2
326 x - x position of the current display.
327 Corresponds to the leftmost column of pixels on that display.
328 .IP \[bu]
329 y - y position of the current display.
330 Corresponds to the topmost row of pixels on that display.
331 .IP \[bu]
332 w - width of the current display.
333 .IP \[bu]
334 h - height of the current display.
335 .IP \[bu]
336 r - unlock indicator radius.
337 .RE
338
339 .TP
340 .B \-\-time\-pos="x\-position:y\-position"
341 Sets the position for the time string. All the variables from \-\-ind\-pos may
342 be used, in addition to:
343 .RS
344 .IP \[bu] 2
345 ix - x position of the indicator on the current display.
346 .IP \[bu]
347 iy - y position of the indicator on the current display.
348
349 If the \-\-bar\-indicator option is used, the following variables may be used:
350 .IP \[bu] 2
351 bw - width of the bar indicator.
352 .IP \[bu]
353 bx - x position of the bar indicator on the current display.
354 .IP \[bu]
355 by - y position of the bar indicator on the current display.
356 .RE
357
358 .TP
359 .B \-\-date\-pos="x\-position:y\-position"
360 Sets the position for the date string. All the variables from \-\-ind\-pos and
361 \-\-time\-pos may be used, in addition to:
362 .RS
363 .IP \[bu] 2
364 tx - x position of the timestring on the current display.
365 .IP \[bu]
366 ty - y position of the timestring on the current display.
367 .RE
368
369 .TP
370 .B \-\-greeter\-pos="x\-position:y\-position"
371 Sets the position for the greeter string. All the variables from \-\-ind\-pos and
372 \-\-time\-pos may be used.
373
374 .TP
375 .B \-\-pass\-{media, screen, power, volume}\-keys
376 Allow the following keys to be used normally while the screen is locked by
377 passing them through:
378 .RS
379 .IP \[bu] 2
380 media - XF86AudioPlay, XF86AudioPause, XF86AudioStop, XF86AudioPrev,
381 XF86AudioNext, XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume
382 .IP \[bu]
383 screen - XF86MonBrightnessUp, XF86MonBrightnessDown
384 .IP \[bu]
385 power - XF86PowerDown, XF86PowerOff, XF86Sleep
386 .IP \[bu]
387 volume - XF86AudioMute, XF86AudioLowerVolume, XF86AudioRaiseVolume
388 .RE
378389
379390 .TP
380391 .B \-\-bar\-indicator
381 Replaces the usual ring indicator with a bar indicator, with a variety of options.
382
383 .TP
384 .B \-\-redraw\-thread
385 Starts a separate thread for redrawing the screen. Potentially worse for security, but makes the bar indicator still do
386 its usual periodic redraws when PAM is authenticating.
392 Replaces the usual ring indicator with a bar indicator. Comes with perks.
387393
388394 .TP
389395 .B \-\-bar\-direction={0, 1, 2}
390 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.
391
392 .TP
393 .B \-\-bar\-width=15
394 Sets the width of the minibars in the bar.
396 Sets the direction the bars grow in. 0 is the default (downwards, or rightwards,
397 depending on the bar orientation). 1 is the reverse, and 2 is both.
395398
396399 .TP
397400 .B \-\-bar\-orientation={vertical,horizontal}
398 Sets whether the bar is vertically or horizontally oriented. Defaults to horizontal.
401 Sets whether the bar is vertically or horizontally oriented.
402 Defaults to horizontal.
399403
400404 .TP
401405 .B \-\-bar\-step
402 Sets the step that each bar decreases by when a key is pressed. A random bar is set to its max height,
403 and then each neighbor is set to (height - step*distance).
406 Sets the step that each bar decreases by when a key is pressed. A random bar is
407 set to its max height, then each neighbor is set to (height - step*distance).
404408
405409 .TP
406410 .B \-\-bar\-max\-height
407 The maximum height a bar can get to. When a key is pressed, a random bar is set to this value,
408 and then its neighbors are set to its height, minus the step value.
411 The maximum height a bar can get to. When a key is pressed, a random bar is set
412 to this value, then its neighbors are set to its height, minus the step value.
409413
410414 .TP
411415 .B \-\-bar\-base\-width
412416 The thickness of the "base" bar that all the bars originate from.
413 This bar also takes on the ring verif and wrong colors to give authentication feedback.
417 This bar also takes on the ring verification and wrong colors to give
418 authentication feedback.
414419
415420 .TP
416421 .B \-\-bar\-color
421426 The value by which the bars decrease each time the screen is redrawn.
422427
423428 .TP
424 .B \-\-bar\-position
425 Works similarly to the time/date/indicator expressions. If the bar is horizontal, this sets the vertical offset from the top edge.
426 If it's vertically oriented, this sets the horizontal offset from the left edge.
429 .B \-\-bar\-pos
430 Works similarly to the time/date/indicator expressions. If only one number is
431 provided, this sets the vertical offset from the top or left edge. If two
432 numbers are provided in the form of x:y, sets the starting position of the bar.
433
434 .TP
435 .B \-\-bar\-count
436 Sets the number of minibars to draw on each screen.
437
438 .TP
439 .B \-\-bar\-total\-width
440 The total width of the bar. Can be an expression.
441
442 .TP
443 .B \-\-redraw\-thread
444 Starts a separate thread for redrawing the screen. Potentially worse from a
445 security standpoint, but makes the bar indicator still do its usual periodic
446 redraws when PAM is authenticating.
447
448 .TP
449 .B \-\-refresh\-rate=seconds\-as\-double
450 The refresh rate of the indicator, given in seconds. This should automatically
451 align itself, but is somewhat buggy currently.
452 Values less than one will work, but may result in poor system performance.
453
454 .TP
455 .B \-\-composite
456 Some compositors have problems with i3lock trying to render over them, so this
457 argument is disabled by default. However, some will work properly with it, so
458 it's been left enabled.
427459
428460 .TP
429461 .B \-\-no\-verify
430462 Do not verify the password entered by the user and unlock immediately.
431 .B Use only for quickly testing new configurations and remember to remove to actually lock your screen!
432
433 .SH DPMS
434 The \-d (\-\-dpms) option was removed from i3lock in version 2.8. There were
435 plenty of use-cases that were not properly addressed, and plenty of bugs
436 surrounding that feature. While features are not normally removed from i3 and
437 its tools, we felt the need to make an exception in this case.
438 Users who wish to explicitly enable DPMS only when their screen is locked can
439 use a wrapper script around i3lock like the following:
440 .Vb 6
441 \& #!/bin/sh
442 \& revert() {
443 \& xset dpms 0 0 0
444 \& }
445 \& trap revert HUP INT TERM
446 \& xset +dpms dpms 5 5 5
447 \& i3lock -n
448 \& revert
449 .Ve
450 The \-I (\-\-inactivity\-timeout=seconds) was removed because it only makes sense with DPMS.
463 .B Use only for quickly testing new configurations and remember to remove to
464 .B actually lock your screen!
465
466 .TP
467 .B \-\-slideshow\-interval
468 The interval to wait until switching to the next image.
469
470 .TP
471 .B \-\-slideshow\-random\-selection
472 Randomize the order of the images.
451473
452474 .SH SEE ALSO
453475 .IR xautolock(1)
+226
-113
i3lock.c less more
22 *
33 * © 2010 Michael Stapelberg
44 * © 2015 Cassandra Fox
5 * © 2020 Raymond Li
5 * © 2021 Raymond Li
66 *
77 * See LICENSE for licensing information
88 *
6969 typedef void (*ev_callback_t)(EV_P_ ev_timer *w, int revents);
7070 static void input_done(void);
7171
72 char color[9] = "ffffffff";
72 char color[9] = "a3a3a3ff";
7373
7474 /* options for unlock indicator colors */
7575 char insidevercolor[9] = "006effbf";
8484 char layoutcolor[9] = "000000ff";
8585 char timecolor[9] = "000000ff";
8686 char datecolor[9] = "000000ff";
87 char modifcolor[9] = "000000ff";
8788 char keyhlcolor[9] = "33db00ff";
8889 char bshlcolor[9] = "db3300ff";
8990 char separatorcolor[9] = "000000ff";
9091 char greetercolor[9] = "000000ff";
9192
93 char verifoutlinecolor[9] = "00000000";
94 char wrongoutlinecolor[9] = "00000000";
95 char layoutoutlinecolor[9] = "00000000";
96 char timeoutlinecolor[9] = "00000000";
97 char dateoutlinecolor[9] = "00000000";
98 char greeteroutlinecolor[9] = "00000000";
99 char modifoutlinecolor[9] = "00000000";
100
92101 /* int defining which display the lock indicator should be shown on. If -1, then show on all displays.*/
93102 int screen_number = 0;
103
94104 /* 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 */
95105 int internal_line_source = 0;
96 /* bool for showing the clock; why am I commenting this? */
106
107 /* refresh rate in seconds, default to 1s */
108 float refresh_rate = 1.0;
109
97110 bool show_clock = false;
98111 bool slideshow_enabled = false;
99112 bool always_show_clock = false;
100113 bool show_indicator = false;
101 float refresh_rate = 1.0;
114 bool show_modkey_text = true;
102115
103116 /* there's some issues with compositing - upstream removed support for this, but we'll allow people to supply an arg to enable it */
104117 bool composite = false;
166179 double circle_radius = 90.0;
167180 double ring_width = 7.0;
168181 double greeter_size = 32.0;
182
183 double timeoutlinewidth = 0;
184 double dateoutlinewidth = 0;
185 double verifoutlinewidth = 0;
186 double wrongoutlinewidth = 0;
187 double modifieroutlinewidth = 0;
188 double layoutoutlinewidth = 0;
189 double greeteroutlinewidth = 0;
169190
170191 char* verif_text = "verifying…";
171192 char* wrong_text = "wrong!";
221242 static int randr_base = -1;
222243
223244 cairo_surface_t *img = NULL;
224 cairo_surface_t *blur_img = NULL;
225245 cairo_surface_t *img_slideshow[256];
246 cairo_surface_t *blur_bg_img = NULL;
226247 int slideshow_image_count = 0;
227248 int slideshow_interval = 10;
228249 bool slideshow_random_selection = false;
229250
230 bool tile = false;
231 bool centered = false;
251 background_type_t bg_type = NONE;
252
232253 bool ignore_empty_password = false;
233254 bool skip_repeated_empty_password = false;
234255 bool pass_media_keys = false;
242263 // allow you to disable. handy if you use bar with lots of crap.
243264 bool redraw_thread = false;
244265
266 // experimental bar stuff
245267 #define BAR_VERT 0
246268 #define BAR_FLAT 1
247269 #define BAR_DEFAULT 0
248270 #define BAR_REVERSED 1
249271 #define BAR_BIDIRECTIONAL 2
250 // experimental bar stuff
272 #define MAX_BAR_COUNT 65535
273 #define MIN_BAR_COUNT 1
274
251275 bool bar_enabled = false;
252276 double *bar_heights = NULL;
253277 double bar_step = 15;
254278 double bar_base_height = 25;
255279 double bar_periodic_step = 15;
256280 double max_bar_height = 25;
257 int num_bars = 0;
258 int bar_width = 150;
281 int bar_count = 10;
259282 int bar_orientation = BAR_FLAT;
260283
261284 char bar_base_color[9] = "000000ff";
262 char bar_expr[32] = "0\0";
285 char bar_x_expr[32] = "0";
286 char bar_y_expr[32] = ""; // empty string on y means use x as offset based on orientation
287 char bar_width_expr[32] = ""; // empty string means full width based on bar orientation
263288 bool bar_bidirectional = false;
264289 bool bar_reversed = false;
265290
575600 else if (strcmp(mod_name, XKB_MOD_NAME_LOGO) == 0)
576601 mod_name = "Super";
577602
578 char *tmp;
579 if (modifier_string == NULL) {
580 if (asprintf(&tmp, "%s", mod_name) != -1)
603 if (show_modkey_text) {
604 char *tmp;
605 if (modifier_string == NULL) {
606 if (asprintf(&tmp, "%s", mod_name) != -1)
607 modifier_string = tmp;
608 } else if (asprintf(&tmp, "%s, %s", modifier_string, mod_name) != -1) {
609 free(modifier_string);
581610 modifier_string = tmp;
582 } else if (asprintf(&tmp, "%s, %s", modifier_string, mod_name) != -1) {
583 free(modifier_string);
584 modifier_string = tmp;
611 }
585612 }
586613 }
587614
14061433 {"raw", required_argument, NULL, 998},
14071434 {"tiling", no_argument, NULL, 't'},
14081435 {"centered", no_argument, NULL, 'C'},
1436 {"fill", no_argument, NULL, 'F'},
1437 {"scale", no_argument, NULL, 'L'},
1438 {"max", no_argument, NULL, 'M'},
14091439 {"ignore-empty-password", no_argument, NULL, 'e'},
14101440 {"inactivity-timeout", required_argument, NULL, 'I'},
14111441 {"show-failed-attempts", no_argument, NULL, 'f'},
1442 {"screen", required_argument, NULL, 'S'},
1443 {"blur", required_argument, NULL, 'B'},
14121444
14131445 // options for unlock indicator colors
1414 {"insidevercolor", required_argument, NULL, 300},
1415 {"insidewrongcolor", required_argument, NULL, 301},
1416 {"insidecolor", required_argument, NULL, 302},
1417 {"ringvercolor", required_argument, NULL, 303},
1418 {"ringwrongcolor", required_argument, NULL, 304},
1419 {"ringcolor", required_argument, NULL, 305},
1420 {"linecolor", required_argument, NULL, 306},
1421 {"verifcolor", required_argument, NULL, 307},
1422 {"wrongcolor", required_argument, NULL, 308},
1423 {"layoutcolor", required_argument, NULL, 309},
1424 {"timecolor", required_argument, NULL, 310},
1425 {"datecolor", required_argument, NULL, 311},
1426 {"keyhlcolor", required_argument, NULL, 312},
1427 {"bshlcolor", required_argument, NULL, 313},
1428 {"separatorcolor", required_argument, NULL, 314},
1429 {"greetercolor", required_argument, NULL, 315},
1446 {"insidever-color", required_argument, NULL, 300},
1447 {"insidewrong-color", required_argument, NULL, 301},
1448 {"inside-color", required_argument, NULL, 302},
1449 {"ringver-color", required_argument, NULL, 303},
1450 {"ringwrong-color", required_argument, NULL, 304},
1451 {"ring-color", required_argument, NULL, 305},
1452 {"line-color", required_argument, NULL, 306},
1453 {"verif-color", required_argument, NULL, 307},
1454 {"wrong-color", required_argument, NULL, 308},
1455 {"layout-color", required_argument, NULL, 309},
1456 {"time-color", required_argument, NULL, 310},
1457 {"date-color", required_argument, NULL, 311},
1458 {"modif-color", required_argument, NULL, 322},
1459 {"keyhl-color", required_argument, NULL, 312},
1460 {"bshl-color", required_argument, NULL, 313},
1461 {"separator-color", required_argument, NULL, 314},
1462 {"greeter-color", required_argument, NULL, 315},
1463
1464 // text outline colors
1465 {"verifoutline-color", required_argument, NULL, 316},
1466 {"wrongoutline-color", required_argument, NULL, 317},
1467 {"layoutoutline-color", required_argument, NULL, 318},
1468 {"timeoutline-color", required_argument, NULL, 319},
1469 {"dateoutline-color", required_argument, NULL, 320},
1470 {"greeteroutline-color", required_argument, NULL, 321},
1471 {"modifoutline-color", required_argument, NULL, 323},
14301472
14311473 {"line-uses-ring", no_argument, NULL, 'r'},
14321474 {"line-uses-inside", no_argument, NULL, 's'},
14331475
1434 {"screen", required_argument, NULL, 'S'},
1435 {"blur", required_argument, NULL, 'B'},
14361476 {"clock", no_argument, NULL, 'k'},
14371477 {"force-clock", no_argument, NULL, 400},
14381478 {"indicator", no_argument, NULL, 401},
14491489 {"greeter-align", required_argument, NULL, 506},
14501490
14511491 // string stuff
1452 {"timestr", required_argument, NULL, 510},
1453 {"datestr", required_argument, NULL, 511},
1454 {"veriftext", required_argument, NULL, 512},
1455 {"wrongtext", required_argument, NULL, 513},
1492 {"time-str", required_argument, NULL, 510},
1493 {"date-str", required_argument, NULL, 511},
1494 {"verif-text", required_argument, NULL, 512},
1495 {"wrong-text", required_argument, NULL, 513},
14561496 {"keylayout", required_argument, NULL, 514},
1457 {"noinputtext", required_argument, NULL, 515},
1458 {"locktext", required_argument, NULL, 516},
1459 {"lockfailedtext", required_argument, NULL, 517},
1460 {"greetertext", required_argument, NULL, 518},
1497 {"noinput-text", required_argument, NULL, 515},
1498 {"lock-text", required_argument, NULL, 516},
1499 {"lockfailed-text", required_argument, NULL, 517},
1500 {"greeter-text", required_argument, NULL, 518},
1501 {"no-modkey-text", no_argument, NULL, 519},
14611502
14621503 // fonts
14631504 {"time-font", required_argument, NULL, 520},
14681509 {"greeter-font", required_argument, NULL, 525},
14691510
14701511 // text size
1471 {"timesize", required_argument, NULL, 530},
1472 {"datesize", required_argument, NULL, 531},
1473 {"verifsize", required_argument, NULL, 532},
1474 {"wrongsize", required_argument, NULL, 533},
1475 {"layoutsize", required_argument, NULL, 534},
1476 {"modsize", required_argument, NULL, 535},
1477 {"greetersize", required_argument, NULL, 536},
1512 {"time-size", required_argument, NULL, 530},
1513 {"date-size", required_argument, NULL, 531},
1514 {"verif-size", required_argument, NULL, 532},
1515 {"wrong-size", required_argument, NULL, 533},
1516 {"layout-size", required_argument, NULL, 534},
1517 {"modif-size", required_argument, NULL, 535},
1518 {"greeter-size", required_argument, NULL, 536},
14781519
14791520 // text/indicator positioning
1480 {"timepos", required_argument, NULL, 540},
1481 {"datepos", required_argument, NULL, 541},
1482 {"verifpos", required_argument, NULL, 542},
1483 {"wrongpos", required_argument, NULL, 543},
1484 {"layoutpos", required_argument, NULL, 544},
1485 {"statuspos", required_argument, NULL, 545},
1486 {"modifpos", required_argument, NULL, 546},
1487 {"indpos", required_argument, NULL, 547},
1488 {"greeterpos", required_argument, NULL, 548},
1521 {"time-pos", required_argument, NULL, 540},
1522 {"date-pos", required_argument, NULL, 541},
1523 {"verif-pos", required_argument, NULL, 542},
1524 {"wrong-pos", required_argument, NULL, 543},
1525 {"layout-pos", required_argument, NULL, 544},
1526 {"status-pos", required_argument, NULL, 545},
1527 {"modif-pos", required_argument, NULL, 546},
1528 {"ind-pos", required_argument, NULL, 547},
1529 {"greeter-pos", required_argument, NULL, 548},
1530
1531 // text outline width
1532 {"timeoutline-width", required_argument, NULL, 560},
1533 {"dateoutline-width", required_argument, NULL, 561},
1534 {"verifoutline-width", required_argument, NULL, 562},
1535 {"wrongoutline-width", required_argument, NULL, 563},
1536 {"modifieroutline-width", required_argument, NULL, 564},
1537 {"layoutoutline-width", required_argument, NULL, 565},
1538 {"greeteroutline-width", required_argument, NULL, 566},
14891539
14901540 // pass keys
14911541 {"pass-media-keys", no_argument, NULL, 601},
14961546 // bar indicator stuff
14971547 {"bar-indicator", no_argument, NULL, 700},
14981548 {"bar-direction", required_argument, NULL, 701},
1499 {"bar-width", required_argument, NULL, 702},
15001549 {"bar-orientation", required_argument, NULL, 703},
15011550 {"bar-step", required_argument, NULL, 704},
15021551 {"bar-max-height", required_argument, NULL, 705},
15031552 {"bar-base-width", required_argument, NULL, 706},
15041553 {"bar-color", required_argument, NULL, 707},
15051554 {"bar-periodic-step", required_argument, NULL, 708},
1506 {"bar-position", required_argument, NULL, 709},
1555 {"bar-pos", required_argument, NULL, 709},
1556 {"bar-count", required_argument, NULL, 710},
1557 {"bar-total-width", required_argument, NULL, 711},
15071558
15081559 // misc.
15091560 {"redraw-thread", no_argument, NULL, 900},
15241575 if (getenv("WAYLAND_DISPLAY") != NULL)
15251576 errx(EXIT_FAILURE, "i3lock is a program for X11 and does not work on Wayland. Try https://github.com/swaywm/swaylock instead");
15261577
1527 char *optstring = "hvnbdc:p:ui:tCeI:frsS:kB:m";
1578 char *optstring = "hvnbdc:p:ui:tCFLMeI:frsS:kB:m";
15281579 char *arg = NULL;
15291580 int opt = 0;
15301581 char padded[9] = "ffffffff"; \
15401591 if (strlen(arg) != 8 || sscanf(arg, "%08[0-9a-fA-F]", acolor) != 1)\
15411592 errx(1, #acolor " is invalid, color must be given in 3 or 4-byte format: rrggbb[aa]\n");
15421593
1594 #define parse_outline_width(awidth)\
1595 arg = optarg;\
1596 if (sscanf(arg, "%lf", &awidth) != 1)\
1597 errx(1, #awidth " must be a number\n");\
1598 if (awidth < 0) {\
1599 fprintf(stderr, #awidth " must be a positive double; ignoring...\n");\
1600 awidth = 0;\
1601 }
1602
15431603 while ((o = getopt_long(argc, argv, optstring, longopts, &longoptind)) != -1) {
15441604 switch (o) {
15451605 case 'v':
1546 errx(EXIT_SUCCESS, "version " I3LOCK_VERSION " © 2010 Michael Stapelberg, © 2015 Cassandra Fox, © 2020 Raymond Li");
1606 errx(EXIT_SUCCESS, "version " I3LOCK_VERSION " © 2010 Michael Stapelberg, © 2015 Cassandra Fox, © 2021 Raymond Li");
15471607 case 'n':
15481608 dont_fork = true;
15491609 break;
15641624 image_path = strdup(optarg);
15651625 break;
15661626 case 't':
1567 if(centered) {
1568 errx(EXIT_FAILURE, "i3lock-color: Options tiling and centered conflict.");
1569 }
1570 tile = true;
1627 if(bg_type != NONE) {
1628 errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
1629 }
1630 bg_type = TILE;
15711631 break;
15721632 case 'C':
1573 if(tile) {
1574 errx(EXIT_FAILURE, "i3lock-color: Options tiling and centered conflict.");
1575 }
1576 centered = true;
1633 if(bg_type != NONE) {
1634 errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
1635 }
1636 bg_type = CENTER;
1637 break;
1638 case 'F':
1639 if(bg_type != NONE) {
1640 errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
1641 }
1642 bg_type = FILL;
1643 break;
1644 case 'L':
1645 if(bg_type != NONE) {
1646 errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
1647 }
1648 bg_type = SCALE;
1649 break;
1650 case 'M':
1651 if(bg_type != NONE) {
1652 errx(EXIT_FAILURE, "i3lock-color: Only one background type can be used.");
1653 }
1654 bg_type = MAX;
15771655 break;
15781656 case 'p':
15791657 if (!strcmp(optarg, "win")) {
16661744 case 315:
16671745 parse_color(greetercolor);
16681746 break;
1747 case 316:
1748 parse_color(verifoutlinecolor);
1749 break;
1750 case 317:
1751 parse_color(wrongoutlinecolor);
1752 break;
1753 case 318:
1754 parse_color(layoutoutlinecolor);
1755 break;
1756 case 319:
1757 parse_color(timeoutlinecolor);
1758 break;
1759 case 320:
1760 parse_color(dateoutlinecolor);
1761 break;
1762 case 321:
1763 parse_color(greeteroutlinecolor);
1764 break;
1765 case 322:
1766 parse_color(modifcolor);
1767 break;
1768 case 323:
1769 parse_color(modifoutlinecolor);
1770 break;
1771
16691772
16701773 // General indicator opts
16711774 case 400:
17681871 case 518:
17691872 greeter_text = optarg;
17701873 break;
1874 case 519:
1875 show_modkey_text = false;
1876 break;
17711877
17721878 // Font stuff
17731879 case 520:
19592065 errx(1, "indpos must be of the form x:y\n");
19602066 }
19612067 break;
2068
2069 // text outline width
2070 case 560:
2071 parse_outline_width(timeoutlinewidth);
2072 break;
2073 case 561:
2074 parse_outline_width(dateoutlinewidth);
2075 break;
2076 case 562:
2077 parse_outline_width(verifoutlinewidth);
2078 break;
2079 case 563:
2080 parse_outline_width(wrongoutlinewidth);
2081 break;
2082 case 564:
2083 parse_outline_width(modifieroutlinewidth);
2084 break;
2085 case 565:
2086 parse_outline_width(layoutoutlinewidth);
2087 break;
2088 case 566:
2089 parse_outline_width(greeteroutlinewidth);
2090 break;
2091
19622092
19632093 // Pass keys
19642094 case 601:
19922122 break;
19932123 }
19942124 break;
1995 case 702:
1996 bar_width = atoi(optarg);
1997 if (bar_width < 1) bar_width = 150;
1998 // num_bars and bar_heights* initialized later when we grab display info
1999 break;
20002125 case 703:
20012126 arg = optarg;
20022127 if (strcmp(arg, "vertical") == 0)
20272152 bar_periodic_step = opt;
20282153 break;
20292154 case 709:
2030 //read in to ind_x_expr and ind_y_expr
2031 if (strlen(optarg) > 31) {
2032 // this is overly restrictive since both the x and y string buffers have size 32, but it's easier to check.
2033 errx(1, "indicator position string can be at most 31 characters\n");
2034 }
20352155 arg = optarg;
2036 if (sscanf(arg, "%31s", bar_expr) != 1) {
2037 errx(1, "bar-position must be of the form [pos] with a max length of 31\n");
2156 if (sscanf(arg, "%31[^:]:%31[^:]", bar_x_expr, bar_y_expr) < 1) {
2157 errx(1, "bar-position must be a single number or of the form x:y with a max length of 31\n");
2158 }
2159 break;
2160 case 710:
2161 bar_count = atoi(optarg);
2162 if (bar_count > MAX_BAR_COUNT || bar_count < MIN_BAR_COUNT) {
2163 errx(1, "bar-count must be between %d and %d\n", MIN_BAR_COUNT, MAX_BAR_COUNT);
2164 }
2165 break;
2166 case 711:
2167 arg = optarg;
2168 if (sscanf(arg, "%31s", bar_width_expr) != 1) {
2169 errx(1, "missing argument for bar-total-width\n");
20382170 }
20392171 break;
20402172
21832315 last_resolution[0] = screen->width_in_pixels;
21842316 last_resolution[1] = screen->height_in_pixels;
21852317
2186 if (bar_enabled && bar_width > 0) {
2187 int tmp = screen->width_in_pixels;
2188 if (bar_orientation == BAR_VERT) tmp = screen->height_in_pixels;
2189 num_bars = tmp / bar_width;
2190 if (tmp % bar_width != 0) ++num_bars;
2191
2192 bar_heights = (double*) calloc(num_bars, sizeof(double));
2318 if (bar_enabled) {
2319 bar_heights = (double*) calloc(bar_count, sizeof(double));
21932320 }
21942321
21952322 xcb_change_window_attributes(conn, screen->root, XCB_CW_EVENT_MASK,
22092336
22102337 free(image_raw_format);
22112338
2212 xcb_pixmap_t* blur_pixmap = NULL;
22132339 if (blur) {
2214 blur_pixmap = malloc(sizeof(xcb_pixmap_t));
2215 xcb_visualtype_t *vistype = get_root_visual_type(screen);
2216 *blur_pixmap = capture_bg_pixmap(conn, screen, last_resolution);
2217 cairo_surface_t *xcb_img = cairo_xcb_surface_create(conn, *blur_pixmap, vistype, last_resolution[0], last_resolution[1]);
2218
2219 blur_img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, last_resolution[0], last_resolution[1]);
2220 cairo_t *ctx = cairo_create(blur_img);
2340 xcb_pixmap_t bg_pixmap = capture_bg_pixmap(conn, screen, last_resolution);
2341 cairo_surface_t *xcb_img = cairo_xcb_surface_create(conn, bg_pixmap, get_root_visual_type(screen), last_resolution[0], last_resolution[1]);
2342
2343 blur_bg_img = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, last_resolution[0], last_resolution[1]);
2344 cairo_t *ctx = cairo_create(blur_bg_img);
2345
22212346 cairo_set_source_surface(ctx, xcb_img, 0, 0);
22222347 cairo_paint(ctx);
2223
2224 blur_image_surface(blur_img, blur_sigma);
2225 if (img) {
2226 // Display image centered on all outputs.
2227 draw_image(last_resolution, ctx);
2228 cairo_surface_destroy(img);
2229 img = NULL;
2230 }
2348 blur_image_surface(blur_bg_img, blur_sigma);
2349
22312350 cairo_destroy(ctx);
22322351 cairo_surface_destroy(xcb_img);
2352 xcb_free_pixmap(conn, bg_pixmap);
22332353 }
22342354
22352355 xcb_window_t stolen_focus = find_focused_window(conn, screen->root);
22402360 xcb_pixmap_t pixmap = create_bg_pixmap(conn, win, last_resolution, color);
22412361 render_lock(last_resolution, pixmap);
22422362 xcb_change_window_attributes(conn, win, XCB_CW_BACK_PIXMAP, (uint32_t[]){pixmap});
2243
22442363 xcb_free_pixmap(conn, pixmap);
2245 if (blur_pixmap) {
2246 xcb_free_pixmap(conn, *blur_pixmap);
2247 free(blur_pixmap);
2248 blur_pixmap = NULL;
2249 }
2250
22512364
22522365 cursor = create_cursor(conn, screen, win, curs_choice);
22532366
+0
-44
lock.sh less more
0 #!/bin/sh
1
2 B='#00000000' # blank
3 C='#ffffff22' # clear ish
4 D='#ff00ffcc' # default
5 T='#ee00eeee' # text
6 W='#880000bb' # wrong
7 V='#bb00bbbb' # verifying
8
9 ./x86_64-pc-linux-gnu/i3lock \
10 --insidevercolor=$C \
11 --ringvercolor=$V \
12 \
13 --insidewrongcolor=$C \
14 --ringwrongcolor=$W \
15 \
16 --insidecolor=$B \
17 --ringcolor=$D \
18 --linecolor=$B \
19 --separatorcolor=$D \
20 \
21 --verifcolor=$T \
22 --wrongcolor=$T \
23 --timecolor=$T \
24 --datecolor=$T \
25 --layoutcolor=$T \
26 --keyhlcolor=$W \
27 --bshlcolor=$W \
28 \
29 --screen 1 \
30 --blur 5 \
31 --clock \
32 --indicator \
33 --timestr="%H:%M:%S" \
34 --datestr="%A, %m %Y" \
35 --keylayout 1 \
36
37 # --veriftext="Drinking verification can..."
38 # --wrongtext="Nope!"
39 # --textsize=20
40 # --modsize=10
41 # --timefont=comic-sans
42 # --datefont=monofur
43 # etc
+0
-41
lock_bar.sh less more
0 #!/bin/sh
1
2 B='#00000000' # blank
3 C='#ffffff22' # clear ish
4 D='#ff00ffcc' # default
5 T='#ee00eeee' # text
6 W='#880000bb' # wrong
7 V='#bb00bbbb' # verifying
8
9 ./x86_64-pc-linux-gnu/i3lock \
10 --blur 5 \
11 --bar-indicator \
12 --bar-position h \
13 --bar-direction 1 \
14 --bar-max-height 50 \
15 --bar-base-width 50 \
16 --bar-color 000000cc \
17 --keyhlcolor 880088cc \
18 --bar-periodic-step 50 \
19 --bar-step 50 \
20 --bar-width 250 \
21 --redraw-thread \
22 \
23 --clock \
24 --force-clock \
25 --timepos 5:h-80 \
26 --timecolor 880088ff \
27 --datepos tx:ty+15 \
28 --datecolor 990099ff \
29 --date-align 1 \
30 --time-align 1 \
31 --ringvercolor 8800ff88 \
32 --ringwrongcolor ff008888 \
33 --statuspos 5:h-16 \
34 --verif-align 1 \
35 --wrong-align 1 \
36 --verifcolor ffffffff \
37 --wrongcolor ffffffff \
38 --modifpos -50:-50 \
39 \
40 --screen 1
6262 # LICENSE
6363 #
6464 # Copyright (c) 2016 Michael Stapelberg <[email protected]>
65 # Copyright (c) 2020 Raymond Li <[email protected]>
65 # Copyright (c) 2021 Raymond Li <[email protected]>
6666 #
6767 # Copying and distribution of this file, with or without modification, are
6868 # permitted in any medium without royalty provided the copyright notice
6868 # LICENSE
6969 #
7070 # Copyright (c) 2016 Michael Stapelberg <[email protected]>
71 # Copyright (c) 2020 Raymond Li <[email protected]>
71 # Copyright (c) 2021 Raymond Li <[email protected]>
7272 #
7373 # Copying and distribution of this file, with or without modification,
7474 # are permitted in any medium without royalty provided the copyright
00 #
11 # PAM configuration file for the i3lock-color screen locker. By default, it includes
2 # the 'system-auth' configuration file (see /etc/pam.d/system-auth) for Arch and Gentoo
3 # and 'login' for Debian. Note that vanilla i3lock upstream uses 'login' instead.
2 # the 'system-local-login' configuration file (see /etc/pam.d/system-local-login)
3 # for Arch and Gentoo and 'login' for Debian. Note that upstream uses only 'login',
4 # which doesn't work on Arch and Gentoo.
45 #
56
6 #auth include system-auth # For Arch/Gentoo
7 #auth include system-local-login # For Arch/Gentoo
78 auth include login # For Debian
11 * vim:ts=4:sw=4:expandtab
22 *
33 * © 2010 Michael Stapelberg
4 * © 2020 Raymond Li
4 * © 2021 Raymond Li
55 *
66 * See LICENSE for licensing information
77 *
screenshot.png less more
Binary diff not shown
(No changes)
22 *
33 * © 2010 Michael Stapelberg
44 * © 2015 Cassandra Fox
5 * © 2020 Raymond Li
5 * © 2021 Raymond Li
66 *
77 * See LICENSE for licensing information
88 *
6161
6262 /* A Cairo surface containing the specified image (-i), if any. */
6363 extern cairo_surface_t *img;
64 extern cairo_surface_t *blur_img;
6564 extern cairo_surface_t *img_slideshow[256];
65 extern cairo_surface_t *blur_bg_img;
6666 extern int slideshow_image_count;
6767 extern int slideshow_interval;
6868 extern bool slideshow_random_selection;
6969
7070 unsigned long lastCheck;
7171
72 /* Whether the image should be tiled or centered. */
73 extern bool centered;
74 extern bool tile;
72 /* How the background image should be displayed */
73 extern background_type_t bg_type;
7574 /* The background color to use (in hex). */
7675 extern char color[9];
7776 /* indicator color options */
8786 extern char layoutcolor[9];
8887 extern char timecolor[9];
8988 extern char datecolor[9];
89 extern char modifcolor[9];
9090 extern char keyhlcolor[9];
9191 extern char bshlcolor[9];
9292 extern char separatorcolor[9];
9393 extern char greetercolor[9];
9494 extern int internal_line_source;
95
96 extern char verifoutlinecolor[9];
97 extern char wrongoutlinecolor[9];
98 extern char layoutoutlinecolor[9];
99 extern char timeoutlinecolor[9];
100 extern char dateoutlinecolor[9];
101 extern char greeteroutlinecolor[9];
102 extern char modifoutlinecolor[9];
95103
96104 extern int screen_number;
97105 extern float refresh_rate;
136144 extern double layout_size;
137145 extern double greeter_size;
138146
147 extern double timeoutlinewidth;
148 extern double dateoutlinewidth;
149 extern double verifoutlinewidth;
150 extern double wrongoutlinewidth;
151 extern double modifieroutlinewidth;
152 extern double layoutoutlinewidth;
153 extern double greeteroutlinewidth;
154
139155 extern char *verif_text;
140156 extern char *wrong_text;
141157 extern char *noinput_text;
186202 rgba_t layout16;
187203 rgba_t time16;
188204 rgba_t date16;
205 rgba_t modif16;
189206 rgba_t keyhl16;
190207 rgba_t bshl16;
191208 rgba_t sep16;
192209 rgba_t bar16;
193210 rgba_t greeter16;
194211 rgba_t background;
212
213 rgba_t verifoutline16;
214 rgba_t wrongoutline16;
215 rgba_t layoutoutline16;
216 rgba_t timeoutline16;
217 rgba_t dateoutline16;
218 rgba_t greeteroutline16;
219 rgba_t modifoutline16;
195220
196221 // experimental bar stuff
197222
205230 extern double bar_periodic_step;
206231 extern double max_bar_height;
207232 extern double bar_position;
208 extern int num_bars;
209 extern int bar_width;
233 extern int bar_count;
210234 extern int bar_orientation;
211235
212236 extern char bar_base_color[9];
213 extern char bar_expr[32];
237 extern char bar_x_expr[32];
238 extern char bar_y_expr[32];
239 extern char bar_width_expr[32];
214240 extern bool bar_bidirectional;
215241 extern bool bar_reversed;
216242
310336
311337 cairo_set_source_rgba(ctx, text.color.red, text.color.green, text.color.blue, text.color.alpha);
312338 cairo_move_to(ctx, x, text.y);
313 cairo_show_text(ctx, text.str);
314
339
340 cairo_text_path(ctx, text.str);
341 cairo_fill_preserve(ctx);
342
343 cairo_set_source_rgba(ctx, text.outline_color.red, text.outline_color.green, text.outline_color.blue, text.outline_color.alpha);
344 cairo_set_line_width(ctx, text.outline_width);
315345 cairo_stroke(ctx);
316346 }
317347
318 static void draw_bar(cairo_t *ctx, double x, double y, double bar_offset) {
319 // oh boy, here we go!
320 // TODO: get this to play nicely with multiple monitors
321 // ideally it'd intelligently span both monitors
322 double width, height;
323 double back_x = 0, back_y = 0, back_x2 = 0, back_y2 = 0, back_width = 0, back_height = 0;
324 for (int i = 0; i < num_bars; ++i) {
325 double cur_bar_height = bar_heights[i];
326
327 if (cur_bar_height > 0) {
328 if (unlock_state == STATE_BACKSPACE_ACTIVE) {
329 cairo_set_source_rgba(ctx, bshl16.red, bshl16.green, bshl16.blue, bshl16.alpha);
330 } else {
331 cairo_set_source_rgba(ctx, keyhl16.red, keyhl16.green, keyhl16.blue, keyhl16.alpha);
332 }
333 } else {
334 switch (auth_state) {
335 case STATE_AUTH_VERIFY:
336 case STATE_AUTH_LOCK:
337 cairo_set_source_rgba(ctx, ringver16.red, ringver16.green, ringver16.blue, ringver16.alpha);
338 break;
339 case STATE_AUTH_WRONG:
340 case STATE_I3LOCK_LOCK_FAILED:
341 cairo_set_source_rgba(ctx, ringwrong16.red, ringwrong16.green, ringwrong16.blue, ringwrong16.alpha);
342 break;
343 default:
344 cairo_set_source_rgba(ctx, bar16.red, bar16.green, bar16.blue, bar16.alpha);
345 break;
346 }
347 }
348
349 if (bar_orientation == BAR_VERT) {
350 width = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height);
351 height = bar_width;
352 x = bar_offset;
353 y = i * bar_width;
354 if (bar_reversed) {
355 x -= width;
356 } else if (bar_bidirectional) {
357 width = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height * 2);
358 x = bar_offset - (width / 2) + (bar_base_height / 2);
359 }
360 } else {
361 width = bar_width;
362 height = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height);
363 x = i * bar_width;
364 y = bar_offset;
365 if (bar_reversed) {
366 y -= height;
367 } else if (bar_bidirectional) {
368 height = (cur_bar_height <= 0 ? bar_base_height : cur_bar_height * 2);
369 y = bar_offset - (height / 2) + (bar_base_height / 2);
370 }
371 }
372
373 if (cur_bar_height < bar_base_height && cur_bar_height > 0) {
374 if (bar_orientation == BAR_VERT) {
375 back_x = bar_offset + cur_bar_height;
376 back_y = y;
377 back_width = bar_base_height - cur_bar_height;
378 back_height = height;
379 if (bar_reversed) {
380 back_x = bar_offset - bar_base_height;
381 } else if (bar_bidirectional) {
382 back_x = bar_offset;
383 back_y2 = y;
384 back_width = (bar_base_height - (cur_bar_height * 2)) / 2;
385 back_x2 = bar_offset + (cur_bar_height * 2) + back_width;
386 }
387 } else {
388 back_x = x;
389 back_y = bar_offset + cur_bar_height;
390 back_width = width;
391 back_height = bar_base_height - cur_bar_height;
392 if (bar_reversed) {
393 back_y = bar_offset - bar_base_height;
394 } else if (bar_bidirectional) {
395 back_x2 = x;
396 back_y = bar_offset;
397 back_height = (bar_base_height - (cur_bar_height * 2)) / 2;
398 back_y2 = bar_offset + (cur_bar_height * 2) + back_height;
399 }
400 }
401 }
402 cairo_rectangle(ctx, x, y, width, height);
403 cairo_fill(ctx);
404 switch (auth_state) {
405 case STATE_AUTH_VERIFY:
406 case STATE_AUTH_LOCK:
407 cairo_set_source_rgba(ctx, ringver16.red, ringver16.green, ringver16.blue, ringver16.alpha);
408 break;
409 case STATE_AUTH_WRONG:
410 case STATE_I3LOCK_LOCK_FAILED:
411 cairo_set_source_rgba(ctx, ringwrong16.red, ringwrong16.green, ringwrong16.blue, ringwrong16.alpha);
412 break;
413 default:
414 cairo_set_source_rgba(ctx, bar16.red, bar16.green, bar16.blue, bar16.alpha);
415 break;
416 }
417
418 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)))) {
419 cairo_rectangle(ctx, back_x, back_y, back_width, back_height);
420 cairo_fill(ctx);
421 if (bar_bidirectional) {
422 cairo_rectangle(ctx, back_x2, back_y2, back_width, back_height);
423 cairo_fill(ctx);
424 }
425 }
426 }
427 for (int i = 0; i < num_bars; ++i) {
428 if (bar_heights[i] > 0)
348 static void draw_single_bar(cairo_t *ctx, double pos, double offset, double width, double height) {
349 if (bar_reversed) {
350 offset -= height;
351 } else if (bar_bidirectional) {
352 offset -= height / 2;
353 }
354
355 if (bar_orientation == BAR_VERT)
356 cairo_rectangle(ctx, offset, pos, height, width);
357 else
358 cairo_rectangle(ctx, pos, offset, width, height);
359 cairo_fill(ctx);
360 }
361
362 static void draw_bar(cairo_t *ctx, double bar_x, double bar_y, double bar_width, double screen_x, double screen_y) {
363
364 cairo_save(ctx);
365
366 switch (auth_state) {
367 case STATE_AUTH_VERIFY:
368 case STATE_AUTH_LOCK:
369 cairo_set_source_rgba(ctx, ringver16.red, ringver16.green, ringver16.blue, ringver16.alpha);
370 break;
371 case STATE_AUTH_WRONG:
372 case STATE_I3LOCK_LOCK_FAILED:
373 cairo_set_source_rgba(ctx, ringwrong16.red, ringwrong16.green, ringwrong16.blue, ringwrong16.alpha);
374 break;
375 default:
376 cairo_set_source_rgba(ctx, bar16.red, bar16.green, bar16.blue, bar16.alpha);
377 break;
378 }
379
380 if (bar_orientation == BAR_VERT)
381 draw_single_bar(ctx, bar_y, bar_x, bar_width, bar_base_height);
382 else
383 draw_single_bar(ctx, bar_x, bar_y, bar_width, bar_base_height);
384
385 if (unlock_state == STATE_BACKSPACE_ACTIVE)
386 cairo_set_source_rgba(ctx, bshl16.red, bshl16.green, bshl16.blue, bshl16.alpha);
387 else
388 cairo_set_source_rgba(ctx, keyhl16.red, keyhl16.green, keyhl16.blue, keyhl16.alpha);
389
390 cairo_set_operator(ctx, CAIRO_OPERATOR_SOURCE);
391
392 double base_width = bar_width / bar_count;
393 double bar_pos, bar_offset;
394 if (bar_orientation == BAR_VERT) {
395 bar_pos = bar_y;
396 bar_offset = bar_x;
397 } else {
398 bar_pos = bar_x;
399 bar_offset = bar_y;
400 }
401
402 for (int i = 0; i < bar_count; ++i) {
403 double bar_height = bar_heights[i];
404 if (bar_bidirectional) bar_height *= 2;
405 if (bar_height > 0) {
406 draw_single_bar(ctx, bar_pos + i * base_width, bar_offset, base_width, bar_height);
407 }
408 }
409
410 for (int i = 0; i < bar_count; ++i) {
411 if (bar_heights[i] > 0) {
429412 bar_heights[i] -= bar_periodic_step;
430 }
413 }
414 }
415
416 cairo_restore(ctx);
431417 }
432418
433419 static void draw_indic(cairo_t *ctx, double ind_x, double ind_y) {
596582 colorgen(&tmp, layoutcolor, &layout16);
597583 colorgen(&tmp, timecolor, &time16);
598584 colorgen(&tmp, datecolor, &date16);
585 colorgen(&tmp, modifcolor, &modif16);
599586 colorgen(&tmp, keyhlcolor, &keyhl16);
600587 colorgen(&tmp, bshlcolor, &bshl16);
601588 colorgen(&tmp, separatorcolor, &sep16);
602589 colorgen(&tmp, bar_base_color, &bar16);
603590 colorgen(&tmp, greetercolor, &greeter16);
604591 colorgen(&tmp, color, &background);
592
593 colorgen(&tmp, verifoutlinecolor, &verifoutline16);
594 colorgen(&tmp, wrongoutlinecolor, &wrongoutline16);
595 colorgen(&tmp, layoutoutlinecolor, &layoutoutline16);
596 colorgen(&tmp, timeoutlinecolor, &timeoutline16);
597 colorgen(&tmp, dateoutlinecolor, &dateoutline16);
598 colorgen(&tmp, greeteroutlinecolor, &greeteroutline16);
599 colorgen(&tmp, modifoutlinecolor, &modifoutline16);
605600 }
606601
607602 static te_expr *compile_expression(const char *const from, const char *expression, const te_variable *variables, int var_count) {
629624 if (unlock_state == STATE_KEY_ACTIVE ||
630625 unlock_state == STATE_BACKSPACE_ACTIVE) {
631626 // note: might be biased to cause more hits on lower indices
632 // maybe see about doing ((double) rand() / RAND_MAX) * num_bars
633 int index = rand() % num_bars;
627 // maybe see about doing ((double) rand() / RAND_MAX) * bar_count
628 int index = rand() % bar_count;
634629 bar_heights[index] = max_bar_height;
635630 for (int i = 0; i < ((max_bar_height / bar_step) + 1); ++i) {
636631 int low_ind = index - i;
637632 while (low_ind < 0) {
638 low_ind += num_bars;
633 low_ind += bar_count;
639634 }
640 int high_ind = (index + i) % num_bars;
635 int high_ind = (index + i) % bar_count;
641636 int tmp_height = max_bar_height - (bar_step * i);
642637 if (tmp_height < 0)
643638 tmp_height = 0;
649644 break;
650645 }
651646 }
652 draw_bar(ctx, draw_data->bar_x, draw_data->bar_y, draw_data->bar_offset);
647 draw_bar(ctx, draw_data->bar_x, draw_data->bar_y, draw_data->bar_width, draw_data->screen_x, draw_data->screen_y);
653648 }
654649
655650 draw_text(ctx, draw_data->status_text);
702697 }
703698 }
704699
705 if (blur_img || img) {
706 if (blur_img) {
707 cairo_set_source_surface(xcb_ctx, blur_img, 0, 0);
708 cairo_paint(xcb_ctx);
709 } else { // img can no longer be non-NULL if blur_img is not null
710 draw_image(resolution, xcb_ctx);
711 }
700 if (blur_bg_img) {
701 cairo_set_source_surface(xcb_ctx, blur_bg_img, 0, 0);
702 cairo_paint(xcb_ctx);
712703 } else {
713704 cairo_set_source_rgba(xcb_ctx, background.red, background.green, background.blue, background.alpha);
714705 cairo_rectangle(xcb_ctx, 0, 0, resolution[0], resolution[1]);
715706 cairo_fill(xcb_ctx);
707 }
708
709 if (img) {
710 draw_image(resolution, img, xcb_ctx);
716711 }
717712
718713 /*
732727 strncpy(draw_data.status_text.str, verif_text, sizeof(draw_data.status_text.str) - 1);
733728 draw_data.status_text.font = get_font_face(VERIF_FONT);
734729 draw_data.status_text.color = verif16;
730 draw_data.status_text.outline_color = verifoutline16;
735731 draw_data.status_text.size = verif_size;
732 draw_data.status_text.outline_width = verifoutlinewidth;
736733 draw_data.status_text.align = verif_align;
737734 break;
738735 case STATE_AUTH_LOCK:
740737 strncpy(draw_data.status_text.str, lock_text, sizeof(draw_data.status_text.str) - 1);
741738 draw_data.status_text.font = get_font_face(VERIF_FONT);
742739 draw_data.status_text.color = verif16;
740 draw_data.status_text.outline_color = verifoutline16;
743741 draw_data.status_text.size = verif_size;
742 draw_data.status_text.outline_width = verifoutlinewidth;
744743 draw_data.status_text.align = verif_align;
745744 break;
746745 case STATE_AUTH_WRONG:
748747 strncpy(draw_data.status_text.str, wrong_text, sizeof(draw_data.status_text.str) - 1);
749748 draw_data.status_text.font = get_font_face(WRONG_FONT);
750749 draw_data.status_text.color = wrong16;
750 draw_data.status_text.outline_color = wrongoutline16;
751751 draw_data.status_text.size = wrong_size;
752 draw_data.status_text.outline_width = wrongoutlinewidth;
752753 draw_data.status_text.align = wrong_align;
753754 break;
754755 case STATE_I3LOCK_LOCK_FAILED:
756757 strncpy(draw_data.status_text.str, lock_failed_text, sizeof(draw_data.status_text.str) - 1);
757758 draw_data.status_text.font = get_font_face(WRONG_FONT);
758759 draw_data.status_text.color = wrong16;
760 draw_data.status_text.outline_color = wrongoutline16;
759761 draw_data.status_text.size = wrong_size;
762 draw_data.status_text.outline_width = wrongoutlinewidth;
760763 draw_data.status_text.align = wrong_align;
761764 break;
762765 default:
765768 strncpy(draw_data.status_text.str, noinput_text, sizeof(draw_data.status_text.str) - 1);
766769 draw_data.status_text.font = get_font_face(WRONG_FONT);
767770 draw_data.status_text.color = wrong16;
771 draw_data.status_text.outline_color = wrongoutline16;
768772 draw_data.status_text.size = wrong_size;
773 draw_data.status_text.outline_width = wrongoutlinewidth;
769774 draw_data.status_text.align = wrong_align;
770775 break;
771776 }
773778 draw_data.status_text.show = true;
774779 draw_data.status_text.font = get_font_face(WRONG_FONT);
775780 draw_data.status_text.color = wrong16;
781 draw_data.status_text.outline_color = wrongoutline16;
776782 draw_data.status_text.size = wrong_size;
783 draw_data.status_text.outline_width = wrongoutlinewidth;
777784 draw_data.status_text.align = wrong_align;
778785 // TODO: variable for this
779786 draw_data.status_text.size = 32.0;
791798 draw_data.mod_text.show = true;
792799 strncpy(draw_data.mod_text.str, modifier_string, sizeof(draw_data.mod_text.str) - 1);
793800 draw_data.mod_text.size = modifier_size;
801 draw_data.mod_text.outline_width = modifieroutlinewidth;
794802 draw_data.mod_text.font = get_font_face(WRONG_FONT);
795803 draw_data.mod_text.align = modif_align;
796 draw_data.mod_text.color = wrong16;
804 draw_data.mod_text.color = modif16;
805 draw_data.mod_text.outline_color = modifoutline16;
797806 }
798807
799808 if (layout_text) {
800809 draw_data.keylayout_text.show = true;
801810 strncpy(draw_data.keylayout_text.str, layout_text, sizeof(draw_data.keylayout_text.str) - 1);
802811 draw_data.keylayout_text.size = layout_size;
812 draw_data.keylayout_text.outline_width = layoutoutlinewidth;
803813 draw_data.keylayout_text.font = get_font_face(LAYOUT_FONT);
804814 draw_data.keylayout_text.color = layout16;
815 draw_data.keylayout_text.outline_color = layoutoutline16;
805816 draw_data.keylayout_text.align = layout_align;
806817 }
807818
809820 draw_data.greeter_text.show = true;
810821 strncpy(draw_data.greeter_text.str, greeter_text, sizeof(draw_data.greeter_text.str) - 1);
811822 draw_data.greeter_text.size = greeter_size;
823 draw_data.greeter_text.outline_width = greeteroutlinewidth;
812824 draw_data.greeter_text.font = get_font_face(GREETER_FONT);
813825 draw_data.greeter_text.color = greeter16;
826 draw_data.greeter_text.outline_color = greeteroutline16;
814827 draw_data.greeter_text.align = greeter_align;
815828 }
816829
824837 if (*draw_data.time_text.str) {
825838 draw_data.time_text.show = true;
826839 draw_data.time_text.size = time_size;
840 draw_data.time_text.outline_width = timeoutlinewidth;
827841 draw_data.time_text.color = time16;
842 draw_data.time_text.outline_color = timeoutline16;
828843 draw_data.time_text.font = get_font_face(TIME_FONT);
829844 draw_data.time_text.align = time_align;
830845 }
832847 if (*draw_data.date_text.str) {
833848 draw_data.date_text.show = true;
834849 draw_data.date_text.size = date_size;
850 draw_data.date_text.outline_width = dateoutlinewidth;
835851 draw_data.date_text.color = date16;
852 draw_data.date_text.outline_color = dateoutline16;
836853 draw_data.date_text.font = get_font_face(DATE_FONT);
837854 draw_data.date_text.align = date_align;
838855 }
840857 if (*draw_data.greeter_text.str) {
841858 draw_data.greeter_text.show = true;
842859 draw_data.greeter_text.size = greeter_size;
860 draw_data.greeter_text.outline_width = greeteroutlinewidth;
843861 draw_data.greeter_text.color = greeter16;
862 draw_data.greeter_text.outline_color = greeteroutline16;
844863 draw_data.greeter_text.font = get_font_face(GREETER_FONT);
845864 draw_data.greeter_text.align = greeter_align;
846865 }
855874 scaling_factor, button_diameter_physical);
856875
857876 // variable mapping for evaluating the clock position expression
858 const unsigned int vars_size = 11;
877 const unsigned int vars_size = 14;
859878 te_variable vars[] =
860879 {{"w", &width},
861880 {"h", &height},
867886 {"ty", &draw_data.time_text.y},
868887 {"dx", &draw_data.date_text.x},
869888 {"dy", &draw_data.date_text.y},
889 {"bw", &draw_data.bar_width},
890 {"bx", &draw_data.bar_x},
891 {"by", &draw_data.bar_y},
870892 {"r", &radius}};
871893
872894 te_expr *te_ind_x_expr = compile_expression("--indpos", ind_x_expr, vars, vars_size);
885907 te_expr *te_wrong_y_expr = compile_expression("--wrongpos", wrong_y_expr, vars, vars_size);
886908 te_expr *te_modif_x_expr = compile_expression("--modifpos", modif_x_expr, vars, vars_size);
887909 te_expr *te_modif_y_expr = compile_expression("--modifpos", modif_y_expr, vars, vars_size);
888 te_expr *te_bar_expr = compile_expression("--bar-position", bar_expr, vars, vars_size);
910 te_expr *te_bar_x_expr = compile_expression("--bar-position", bar_x_expr, vars, vars_size);
911 te_expr *te_bar_y_expr = strlen(bar_y_expr) ? compile_expression("--bar-position", bar_y_expr, vars, vars_size) : NULL;
912 te_expr *te_bar_width_expr = strlen(bar_width_expr) ? compile_expression("--bar-width", bar_width_expr, vars, vars_size) : NULL;
889913
890914 te_expr *te_greeter_x_expr = compile_expression("--greeterpos", greeter_x_expr, vars, vars_size);
891915 te_expr *te_greeter_y_expr = compile_expression("--greeterpos", greeter_y_expr, vars, vars_size);
913937 height = xr_resolutions[current_screen].height / scaling_factor;
914938 screen_x = xr_resolutions[current_screen].x / scaling_factor;
915939 screen_y = xr_resolutions[current_screen].y / scaling_factor;
916 if (te_ind_x_expr && te_ind_y_expr) {
917 draw_data.indicator_x = te_eval(te_ind_x_expr);
918 draw_data.indicator_y = te_eval(te_ind_y_expr);
919 } else {
920 draw_data.indicator_x = screen_x + width / 2;
921 draw_data.indicator_y = screen_y + height / 2;
922 }
923 draw_data.bar_x = draw_data.indicator_x - (button_diameter_physical / 2);
924 draw_data.bar_y = draw_data.indicator_y - (button_diameter_physical / 2);
925 draw_data.bar_offset = te_eval(te_bar_expr);
940 draw_data.screen_x = screen_x;
941 draw_data.screen_y = screen_y;
942 draw_data.indicator_x = te_eval(te_ind_x_expr);
943 draw_data.indicator_y = te_eval(te_ind_y_expr);
926944 draw_data.time_text.x = te_eval(te_time_x_expr);
927945 draw_data.time_text.y = te_eval(te_time_y_expr);
928946 draw_data.date_text.x = te_eval(te_date_x_expr);
952970 draw_data.mod_text.x = te_eval(te_modif_x_expr);
953971 draw_data.mod_text.y = te_eval(te_modif_y_expr);
954972
973 if (te_bar_y_expr) {
974 draw_data.bar_x = te_eval(te_bar_x_expr);
975 draw_data.bar_y = te_eval(te_bar_y_expr);
976 } else {
977 double bar_offset = te_eval(te_bar_x_expr);
978 if (bar_orientation == BAR_VERT) {
979 draw_data.bar_x = bar_offset;
980 draw_data.bar_y = screen_y;
981 } else {
982 draw_data.bar_x = screen_x;
983 draw_data.bar_y = bar_offset;
984 }
985 }
986 if (te_bar_width_expr)
987 draw_data.bar_width = te_eval(te_bar_width_expr);
988 else if (bar_orientation == BAR_VERT)
989 draw_data.bar_width = height;
990 else
991 draw_data.bar_width = width;
992
993
955994 DEBUG("Indicator at %fx%f on screen %d\n", draw_data.indicator_x, draw_data.indicator_y, current_screen + 1);
956 DEBUG("Bar at %fx%f on screen %d\n", draw_data.bar_x, draw_data.bar_y, current_screen + 1);
995 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);
957996 DEBUG("Time at %fx%f on screen %d\n", draw_data.time_text.x, draw_data.time_text.y, current_screen + 1);
958997 DEBUG("Date at %fx%f on screen %d\n", draw_data.date_text.x, draw_data.date_text.y, current_screen + 1);
959998 DEBUG("Layout at %fx%f on screen %d\n", draw_data.keylayout_text.x, draw_data.keylayout_text.y, current_screen + 1);
9681007 * hope for the best. */
9691008 width = last_resolution[0] / scaling_factor;
9701009 height = last_resolution[1] / scaling_factor;
1010 draw_data.screen_x = 0;
1011 draw_data.screen_y = 0;
9711012 draw_data.indicator_x = width / 2;
9721013 draw_data.indicator_y = height / 2;
973 draw_data.bar_x = draw_data.indicator_x - (button_diameter_physical / 2);
974 draw_data.bar_y = draw_data.indicator_y - (button_diameter_physical / 2);
9751014
9761015 draw_data.time_text.x = te_eval(te_time_x_expr);
9771016 draw_data.time_text.y = te_eval(te_time_y_expr);
10001039 draw_data.mod_text.x = te_eval(te_modif_x_expr);
10011040 draw_data.mod_text.y = te_eval(te_modif_y_expr);
10021041
1042 if (te_bar_y_expr) {
1043 draw_data.bar_x = te_eval(te_bar_x_expr);
1044 draw_data.bar_y = te_eval(te_bar_y_expr);
1045 } else {
1046 double bar_offset = te_eval(te_bar_x_expr);
1047 if (bar_orientation == BAR_VERT) {
1048 draw_data.bar_x = bar_offset;
1049 draw_data.bar_y = screen_y;
1050 } else {
1051 draw_data.bar_x = screen_x;
1052 draw_data.bar_y = bar_offset;
1053 }
1054 }
1055 if (te_bar_width_expr)
1056 draw_data.bar_width = te_eval(te_bar_width_expr);
1057 else if (bar_orientation == BAR_VERT)
1058 draw_data.bar_width = height;
1059 else
1060 draw_data.bar_width = width;
1061
10031062 DEBUG("Indicator at %fx%f\n", draw_data.indicator_x, draw_data.indicator_y);
1004 DEBUG("Bar at %fx%f\n", draw_data.bar_x, draw_data.bar_y);
1063 DEBUG("Bar at %fx%f with width %f\n", draw_data.bar_x, draw_data.bar_y, draw_data.bar_width);
10051064 DEBUG("Time at %fx%f\n", draw_data.time_text.x, draw_data.time_text.y);
10061065 DEBUG("Date at %fx%f\n", draw_data.date_text.x, draw_data.date_text.y);
10071066 DEBUG("Layout at %fx%f\n", draw_data.keylayout_text.x, draw_data.keylayout_text.y);
10271086 te_free(te_wrong_y_expr);
10281087 te_free(te_modif_x_expr);
10291088 te_free(te_modif_y_expr);
1030 te_free(te_bar_expr);
1089 te_free(te_bar_x_expr);
1090 te_free(te_bar_y_expr);
1091 te_free(te_bar_width_expr);
10311092 te_free(te_greeter_x_expr);
10321093 te_free(te_greeter_y_expr);
10331094
10431104
10441105 /**
10451106 * Draws the configured image on the provided context. The image is drawn centered on all monitors, tiled, or just
1046 * painted starting from 0,0.
1107 * painted starting from 0,0. It is also scaled if bg_type is FILL, MAX, or SCALE.
10471108 */
1048 void draw_image(uint32_t* resolution, cairo_t* xcb_ctx) {
1049 if (centered) {
1050 double image_width = cairo_image_surface_get_width(img);
1051 double image_height = cairo_image_surface_get_height(img);
1052
1053 xcb_randr_get_screen_resources_current_reply_t *reply = xcb_randr_get_screen_resources_current_reply(
1054 conn, xcb_randr_get_screen_resources_current(conn, screen->root), NULL);
1055
1056 xcb_timestamp_t timestamp = reply->config_timestamp;
1057 int len = xcb_randr_get_screen_resources_current_outputs_length(reply);
1058 xcb_randr_output_t *randr_outputs = xcb_randr_get_screen_resources_current_outputs(reply);
1059
1060 // For every output
1061 for (int i = 0; i < len; i++) {
1062 xcb_randr_get_output_info_reply_t *output = xcb_randr_get_output_info_reply(
1063 conn, xcb_randr_get_output_info(conn, randr_outputs[i], timestamp), NULL);
1064 if (output == NULL)
1065 continue;
1066
1067 if (output->crtc == XCB_NONE || output->connection == XCB_RANDR_CONNECTION_DISCONNECTED)
1068 continue;
1069
1070 xcb_randr_get_crtc_info_cookie_t infoCookie = xcb_randr_get_crtc_info(conn, output->crtc,
1071 timestamp);
1072 xcb_randr_get_crtc_info_reply_t *crtc = xcb_randr_get_crtc_info_reply(conn, infoCookie, NULL);
1073
1074 // Paint around center of monitor
1075 double origin_x = crtc->x + (crtc->width / 2.0 - image_width / 2.0);
1076 double origin_y = crtc->y + (crtc->height / 2.0 - image_height / 2.0);
1077
1078 cairo_set_source_surface(xcb_ctx, img, origin_x, origin_y);
1079 cairo_paint(xcb_ctx);
1080
1081 free(crtc);
1082 free(output);
1083 }
1084 } else if (tile) {
1085 /* create a pattern and fill a rectangle as big as the screen */
1086 cairo_pattern_t *pattern;
1087 pattern = cairo_pattern_create_for_surface(img);
1088 cairo_set_source(xcb_ctx, pattern);
1089 cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
1090 cairo_rectangle(xcb_ctx, 0, 0, resolution[0], resolution[1]);
1091 cairo_fill(xcb_ctx);
1092 cairo_pattern_destroy(pattern);
1093 } else {
1109 void draw_image(uint32_t* root_resolution, cairo_surface_t *img, cairo_t* xcb_ctx) {
1110
1111 if (bg_type == NONE) {
1112 // Don't do any image manipulation
10941113 cairo_set_source_surface(xcb_ctx, img, 0, 0);
10951114 cairo_paint(xcb_ctx);
1096 }
1097
1115 return;
1116 }
1117
1118 cairo_pattern_t *pattern = cairo_pattern_create_for_surface(img);
1119 cairo_pattern_set_extend(pattern, bg_type == TILE ? CAIRO_EXTEND_REPEAT : CAIRO_EXTEND_NONE);
1120 cairo_set_source(xcb_ctx, pattern);
1121
1122 double image_width = cairo_image_surface_get_width(img);
1123 double image_height = cairo_image_surface_get_height(img);
1124
1125 for (int i = 0; i < xr_screens; i++) {
1126 // Find out scaling factors using bg_type and aspect ratios
1127 double scale_x = 1, scale_y = 1;
1128 if (bg_type == SCALE) {
1129 scale_x = xr_resolutions[i].width / image_width;
1130 scale_y = xr_resolutions[i].height / image_height;
1131
1132 } else if (bg_type == MAX || bg_type == FILL) {
1133 double aspect_diff = (double) xr_resolutions[i].height / xr_resolutions[i].width - image_height / image_width;
1134 if((bg_type == MAX && aspect_diff > 0) || (bg_type == FILL && aspect_diff < 0)) {
1135 scale_x = scale_y = xr_resolutions[i].width / image_width;
1136 } else if ((bg_type == MAX && aspect_diff < 0) || (bg_type == FILL && aspect_diff > 0)) {
1137 scale_x = scale_y = xr_resolutions[i].height / image_height;
1138 }
1139 }
1140
1141 // Scale and translate the pattern
1142 cairo_matrix_t matrix;
1143 cairo_matrix_init_scale(&matrix, 1/scale_x, 1/scale_y);
1144
1145 if (bg_type == TILE) {
1146 // Start image from top-left corner
1147 cairo_matrix_translate(&matrix, -xr_resolutions[i].x, -xr_resolutions[i].y);
1148 } else {
1149 // Draw image in the center of the screen
1150 cairo_matrix_translate(&matrix,
1151 (image_width * scale_x - xr_resolutions[i].width ) / 2 - xr_resolutions[i].x,
1152 (image_height * scale_y - xr_resolutions[i].height) / 2 - xr_resolutions[i].y);
1153 }
1154
1155 cairo_pattern_set_matrix(pattern, &matrix);
1156
1157 // Draw to screen
1158 cairo_rectangle(xcb_ctx, xr_resolutions[i].x, xr_resolutions[i].y, xr_resolutions[i].width, xr_resolutions[i].height);
1159 cairo_fill(xcb_ctx);
1160 }
1161
1162 cairo_pattern_destroy(pattern);
10981163 }
10991164
11001165 /*
3333
3434 double indicator_x, indicator_y;
3535
36 double bar_x, bar_y;
37 double bar_offset;
36 double screen_x, screen_y;
37 double bar_x, bar_y, bar_width;
3838 } DrawData;
3939
40 typedef enum {
41 NONE,
42 TILE,
43 CENTER,
44 FILL,
45 SCALE,
46 MAX,
47 } background_type_t;
48
4049 void render_lock(uint32_t* resolution, xcb_drawable_t drawable);
41 void draw_image(uint32_t* resolution, cairo_t* xcb_ctx);
50 void draw_image(uint32_t* resolution, cairo_surface_t* img, cairo_t* xcb_ctx);
4251 void init_colors_once(void);
4352 void redraw_screen(void);
4453 void clear_indicator(void);
00 /*
11 * vim:ts=4:sw=4:expandtab
22 *
3 * © 2010 Michael
4 * @ © 2020 Raymond Li
3 * © 2010 Michael Stapelberg
4 * © 2021 Raymond Li
55 *
66 * xcb.c: contains all functions which use XCB to talk to X11. Mostly wrappers
77 * around the rather complicated/ugly parts of the XCB API.