initial commit
1
.gitignore
vendored
Normal file
@ -0,0 +1 @@
|
||||
cursors
|
||||
19
LICENSE
Normal file
@ -0,0 +1,19 @@
|
||||
MIT License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
63
README.md
Normal file
@ -0,0 +1,63 @@
|
||||
|
||||
# sqr-xcursor
|
||||
|
||||
a simple, complete, 32x32, square shaped x11 cursor theme.
|
||||
|
||||
|
||||
## Preview
|
||||
|
||||

|
||||
|
||||
|
||||
## Usage
|
||||
|
||||
to build and install the cursor theme, `xcursorgen` is required.
|
||||
you can then use the provided shell scripts:
|
||||
|
||||
1. create the cursor files from the png images:
|
||||
```sh
|
||||
# hotspot at pixel 15,15 (center), 50ms per animation frame
|
||||
cd src && ./generate.sh 15 15 50
|
||||
```
|
||||
|
||||
2. create links for some other cursors for completeness:
|
||||
```sh
|
||||
cd src && ./create-links.sh
|
||||
```
|
||||
|
||||
3. install the theme
|
||||
- either system-wide:
|
||||
```sh
|
||||
sudo mkdir -p /usr/share/icons/sqr-xcursor && sudo cp cursors $_ -r
|
||||
```
|
||||
- or just for the current user:
|
||||
```sh
|
||||
mkdir -p $XDG_DATA_HOME/icons/sqr-xcursor && cp cursors $_ -r
|
||||
```
|
||||
|
||||
4. use the theme:
|
||||
in regular desktop environments, selecting it in your settings should suffice.
|
||||
|
||||
without a desktop environment, setting a `default` in the `icons` directory
|
||||
(whether system-wide or user-specific)
|
||||
should work:
|
||||
```sh
|
||||
# system-wide:
|
||||
sudo mkdir -p /usr/share/icons/default && \
|
||||
sudo printf "\n[Icon Theme]\nInherits=sqr-xcursor\n" >> $_/index.theme
|
||||
|
||||
# or user-only:
|
||||
mkdir -p $XDG_DATA_HOME/icons/default && \
|
||||
printf "\n[Icon Theme]\nInherits=sqr-xcursor\n" >> $_/index.theme
|
||||
```
|
||||
|
||||
### **you will need to restart your xsession after this (log out and back in)**
|
||||
|
||||
if issues still arise, setting the cursor theme in your `.config/gtk-3.0/settings.ini`
|
||||
might also be required/help:
|
||||
```ini
|
||||
[Settings]
|
||||
gtk-cursor-theme-name=sqr-xcursor
|
||||
gtk-cursor-theme-size=32
|
||||
```
|
||||
|
||||
9
index.theme
Normal file
@ -0,0 +1,9 @@
|
||||
[Icon Theme]
|
||||
Name=Sqr
|
||||
Comment=A minimalist Square Cursor
|
||||
Inherits=WhiteSur cursors,Adwaita,hicolor
|
||||
Directories=cursors
|
||||
|
||||
[cursors]
|
||||
Size=32
|
||||
Type=Fixed
|
||||
BIN
preview.png
Normal file
|
After Width: | Height: | Size: 1.5 KiB |
143
src/create-links.sh
Normal file
@ -0,0 +1,143 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
dir="../cursors"
|
||||
|
||||
|
||||
main() {
|
||||
parse_args $@
|
||||
|
||||
cd "$dir"
|
||||
set -e
|
||||
|
||||
ln -s frame all-scroll
|
||||
ln -s default arrow
|
||||
ln -s downleft bottom_left_corner
|
||||
ln -s downright bottom_right_corner
|
||||
ln -s down bottom_side
|
||||
ln -s default cell
|
||||
ln -s default center_ptr
|
||||
ln -s forbidden circle
|
||||
ln -s active closedhand
|
||||
ln -s cross colorpicker
|
||||
ln -s leftright col-resize
|
||||
ln -s plus copy
|
||||
ln -s forbidden crossed_circle
|
||||
ln -s default crosshair
|
||||
ln -s plus dnd-copy
|
||||
ln -s active dnd-move
|
||||
ln -s forbidden dnd-no-drop
|
||||
ln -s active dnd-none
|
||||
ln -s down down-arrow
|
||||
ln -s default draft
|
||||
ln -s right e-resize
|
||||
ln -s leftright ew-resize
|
||||
ln -s updownleftright fleur
|
||||
ln -s active grab
|
||||
ln -s active grabbing
|
||||
ln -s wait half-busy
|
||||
ln -s active hand1
|
||||
ln -s active hand2
|
||||
ln -s leftright h_double_arrow
|
||||
ln -s question-mark help
|
||||
ln -s text ibeam
|
||||
ln -s left left-arrow
|
||||
ln -s default left_ptr
|
||||
ln -s question-mark left_ptr_help
|
||||
ln -s wait left_ptr_watch
|
||||
ln -s left left-side
|
||||
ln -s alias link
|
||||
ln -s downleft ll_angle
|
||||
ln -s downright lr_angle
|
||||
ln -s active move
|
||||
ln -s upright ne-resize
|
||||
ln -s downleft-upright nesw-resize
|
||||
ln -s forbidden-active no-drop
|
||||
ln -s forbidden not-allowed
|
||||
ln -s up n-resize
|
||||
ln -s updown ns-resize
|
||||
ln -s upleft nw-resize
|
||||
ln -s upleft-downright nwse-resize
|
||||
ln -s active openhand
|
||||
ln -s active pointer
|
||||
ln -s active pointing_hand
|
||||
ln -s wait progress
|
||||
ln -s question-mark question_arrow
|
||||
ln -s right right-arrow
|
||||
ln -s default right_ptr
|
||||
ln -s right right_side
|
||||
ln -s updown row-resize
|
||||
ln -s leftright sb_h_double_arrow
|
||||
ln -s updown sb_v_double_arrow
|
||||
ln -s downright se-resize
|
||||
ln -s updownleftright size_all
|
||||
ln -s downleft-upright size_bdiag
|
||||
ln -s upleft-downright size_fdiag
|
||||
ln -s leftright size_hor
|
||||
ln -s updown size_ver
|
||||
ln -s leftright split_h
|
||||
ln -s updown split_v
|
||||
ln -s down s-resize
|
||||
ln -s downleft sw-resize
|
||||
ln -s upleft top_left_corner
|
||||
ln -s upright top_right_corner
|
||||
ln -s up top_side
|
||||
ln -s upleft ul_angle
|
||||
ln -s up up-arrow
|
||||
ln -s upright ur_angle
|
||||
ln -s updown v_double_arrow
|
||||
ln -s wait watch
|
||||
ln -s question-mark whats_this
|
||||
ln -s left w-resize
|
||||
ln -s cross x-cursor
|
||||
ln -s text xterm
|
||||
ln -s plus zoom-in
|
||||
ln -s minus zoom-out
|
||||
|
||||
set +e
|
||||
|
||||
info "done with all cursors. created links can be found in \`$dir\`."
|
||||
}
|
||||
|
||||
|
||||
usage() {
|
||||
echo ""
|
||||
echo "usage: $scriptname"
|
||||
echo ""
|
||||
echo "generate a predefined set of links to xcursor files easily."
|
||||
echo ""
|
||||
echo "options: hot_x, hot_y the offset of the cursor hotspot from the top-left pixel"
|
||||
echo " frametime time in ms for each frame, defaults to 50, only affects animations"
|
||||
echo ""
|
||||
echo "flags: -h, --help display this message and exit"
|
||||
echo ""
|
||||
}
|
||||
|
||||
|
||||
parse_args() {
|
||||
scriptname=$(basename "$0")
|
||||
|
||||
# sanity check that cursors even exist
|
||||
if [[ ! -d "$dir" ]]; then
|
||||
error "$dir not found. generate cursor files first before creating symlinks."
|
||||
exit 1
|
||||
elif [[ -z $(ls "$dir"/*) ]]; then
|
||||
error "$dir seems to be empty. generate cursor files first before creating symlinks."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# parse flags
|
||||
shift
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-h|--help) usage ; exit 0 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
info() { echo "[info] " "$1" >&2 ;}
|
||||
error() { echo "[error]" "$1" >&2 ;}
|
||||
|
||||
# run main, passing on all args
|
||||
main $@
|
||||
99
src/generate.sh
Normal file
@ -0,0 +1,99 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
out_dir="../cursors"
|
||||
|
||||
|
||||
main() {
|
||||
parse_args $@
|
||||
|
||||
# create output directory
|
||||
mkdir -p "$out_dir" >/dev/null
|
||||
|
||||
# for simple png cursors
|
||||
for file in ./img/*.png; do
|
||||
get_image_size "$file"
|
||||
name=$(basename "$file" .png)
|
||||
echo "$size $hot_x $hot_y $file" | xcursorgen > "$out_dir/$name"
|
||||
info "done with regular cursor $name..."
|
||||
done
|
||||
|
||||
# for folders of png frames
|
||||
for name in $(find ./img -mindepth 1 -maxdepth 1 -type d); do
|
||||
content=""
|
||||
for file in "$name"/*.png; do
|
||||
get_image_size "$file"
|
||||
content+="$size $hot_x $hot_x $file $frametime\n"
|
||||
done
|
||||
name=$(basename "$name")
|
||||
printf "$content" | xcursorgen > "$out_dir/$name"
|
||||
info "done with animated cursor $name..."
|
||||
done
|
||||
|
||||
echo ""
|
||||
info "done with all cursors. outputted files can be found in \`$out_dir\`."
|
||||
}
|
||||
|
||||
|
||||
get_image_size() {
|
||||
if [[ $(file "$1") =~ ([0-9]+)\ x\ ([0-9]+) ]]; then
|
||||
size=${BASH_REMATCH[1]}
|
||||
else
|
||||
error "failed to read image dimensions from command \`file \"$1\"\`."
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
|
||||
usage() {
|
||||
echo ""
|
||||
echo "usage: $scriptname <hot_x> <hot_y> [frametime?] [FLAGS...]"
|
||||
echo ""
|
||||
echo "generate an .cursor theme file. iterates all png files in \`./img\`."
|
||||
echo "named folders of png files are used as frames for animated cursors. (alphabetical order)"
|
||||
echo ""
|
||||
echo "options: hot_x, hot_y the offset of the cursor hotspot from the top-left pixel"
|
||||
echo " frametime time in ms for each frame, defaults to 50, only affects animations"
|
||||
echo ""
|
||||
echo "flags: -h, --help display this message and exit"
|
||||
echo ""
|
||||
}
|
||||
|
||||
|
||||
parse_args() {
|
||||
scriptname=$(basename "$0")
|
||||
|
||||
if ! command -v xcursorgen >/dev/null; then
|
||||
error "missing required dependency \`xcursorgen\`. install it and try again."
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [[ $# -lt 2 ]] || [[ $# -gt 3 ]]; then
|
||||
error "invalid number of arguments. expected 2-3, got $#."
|
||||
usage >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# parse options
|
||||
hot_x="$1"
|
||||
hot_y="$2"
|
||||
frametime=50
|
||||
if [[ -n "$3" ]]; then
|
||||
frametime="$3"
|
||||
fi
|
||||
|
||||
# parse flags
|
||||
shift
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case "$1" in
|
||||
-h|--help) usage ; exit 0 ;;
|
||||
esac
|
||||
shift
|
||||
done
|
||||
}
|
||||
|
||||
|
||||
info() { echo "[info] " "$1" >&2 ;}
|
||||
error() { echo "[error]" "$1" >&2 ;}
|
||||
|
||||
# run main, passing on all args
|
||||
main $@
|
||||
BIN
src/img/active.png
Normal file
|
After Width: | Height: | Size: 266 B |
BIN
src/img/alias.png
Normal file
|
After Width: | Height: | Size: 319 B |
BIN
src/img/context-menu.png
Normal file
|
After Width: | Height: | Size: 317 B |
BIN
src/img/cross.png
Normal file
|
After Width: | Height: | Size: 321 B |
BIN
src/img/default.png
Normal file
|
After Width: | Height: | Size: 254 B |
BIN
src/img/down.png
Normal file
|
After Width: | Height: | Size: 298 B |
BIN
src/img/downleft-upright.png
Normal file
|
After Width: | Height: | Size: 322 B |
BIN
src/img/downleft.png
Normal file
|
After Width: | Height: | Size: 290 B |
BIN
src/img/downright.png
Normal file
|
After Width: | Height: | Size: 285 B |
BIN
src/img/forbidden-active.png
Normal file
|
After Width: | Height: | Size: 357 B |
BIN
src/img/forbidden.png
Normal file
|
After Width: | Height: | Size: 353 B |
BIN
src/img/frame.png
Normal file
|
After Width: | Height: | Size: 331 B |
BIN
src/img/left.png
Normal file
|
After Width: | Height: | Size: 285 B |
BIN
src/img/leftright.png
Normal file
|
After Width: | Height: | Size: 304 B |
BIN
src/img/minus.png
Normal file
|
After Width: | Height: | Size: 303 B |
BIN
src/img/pirate.png
Normal file
|
After Width: | Height: | Size: 458 B |
BIN
src/img/plus.png
Normal file
|
After Width: | Height: | Size: 325 B |
BIN
src/img/question-mark.png
Normal file
|
After Width: | Height: | Size: 340 B |
BIN
src/img/right.png
Normal file
|
After Width: | Height: | Size: 289 B |
BIN
src/img/text.png
Normal file
|
After Width: | Height: | Size: 283 B |
BIN
src/img/up.png
Normal file
|
After Width: | Height: | Size: 287 B |
BIN
src/img/updown.png
Normal file
|
After Width: | Height: | Size: 322 B |
BIN
src/img/updownleftright.png
Normal file
|
After Width: | Height: | Size: 364 B |
BIN
src/img/upleft-downright.png
Normal file
|
After Width: | Height: | Size: 321 B |
BIN
src/img/upleft.png
Normal file
|
After Width: | Height: | Size: 292 B |
BIN
src/img/upright.png
Normal file
|
After Width: | Height: | Size: 291 B |
BIN
src/img/vertical-text.png
Normal file
|
After Width: | Height: | Size: 267 B |
BIN
src/img/wait/wait_00.png
Normal file
|
After Width: | Height: | Size: 265 B |
BIN
src/img/wait/wait_01.png
Normal file
|
After Width: | Height: | Size: 264 B |
BIN
src/img/wait/wait_02.png
Normal file
|
After Width: | Height: | Size: 265 B |
BIN
src/img/wait/wait_03.png
Normal file
|
After Width: | Height: | Size: 265 B |
BIN
src/img/wait/wait_04.png
Normal file
|
After Width: | Height: | Size: 267 B |
BIN
src/img/wait/wait_05.png
Normal file
|
After Width: | Height: | Size: 265 B |
BIN
src/img/wait/wait_06.png
Normal file
|
After Width: | Height: | Size: 265 B |
BIN
src/img/wait/wait_07.png
Normal file
|
After Width: | Height: | Size: 265 B |
BIN
src/img/wait/wait_08.png
Normal file
|
After Width: | Height: | Size: 266 B |
BIN
src/img/wait/wait_09.png
Normal file
|
After Width: | Height: | Size: 266 B |
BIN
src/img/wait/wait_10.png
Normal file
|
After Width: | Height: | Size: 266 B |
BIN
src/img/wait/wait_11.png
Normal file
|
After Width: | Height: | Size: 267 B |