32 Commits

Author SHA1 Message Date
piotr
71ce3b5d75 Merge remote-tracking branch 'origin/main' 2024-02-06 03:40:14 +01:00
piotr
b056b4c436 bump to 0.4.6 2024-02-06 03:39:35 +01:00
Piotr Miller
42b55d41df Merge pull request #113 from nwg-piotr/touch
Don't launch if the window has been scrolled
2024-02-06 03:38:09 +01:00
piotr
ec0ce767d9 get proper adjustment 2024-02-06 03:35:29 +01:00
piotr
ec3caa02d2 add comments #110 2024-02-06 03:33:12 +01:00
piotr
6b39eba14c check if window scrolled #110 2024-02-06 03:21:42 +01:00
piotr
631b651eed bump to 0.4.5 2024-02-05 01:02:34 +01:00
piotr
df644f4196 gotk3 -> 0.6.3 2024-02-05 01:01:30 +01:00
piotr
be89ff4b97 update README.md 2024-02-03 16:44:55 +01:00
piotr
5cab646d08 update README.md 2024-02-03 16:40:57 +01:00
piotr
f93e6923d0 update README.md 2024-02-03 16:39:34 +01:00
Piotr Miller
2d114e58bc Update README.md 2024-02-03 15:53:10 +01:00
piotr
11f2f67184 update README.md 2024-02-03 04:26:49 +01:00
piotr
038fddc9da update README.md 2024-02-03 04:23:30 +01:00
piotr
945f73adbf Merge remote-tracking branch 'origin/main' 2024-02-03 04:15:05 +01:00
Piotr Miller
f8572b3db8 Update README.md 2024-02-03 04:14:35 +01:00
piotr
9012a45be4 update README.md 2024-02-03 04:12:06 +01:00
piotr
fe311ced2a bump to 0.4.4 2024-02-03 04:06:01 +01:00
Piotr Miller
bd12c281b1 Merge pull request #112 from nwg-piotr/power
add optional PowerBar
2024-02-02 02:06:56 +01:00
piotr
ff34cf8194 fix finding userDirsFile 2024-02-02 01:39:58 +01:00
piotr
8e02b59f83 clear status label on button exit 2024-02-01 18:24:14 +01:00
Piotr Miller
7b2ed76fac update lock icon 2024-02-01 09:48:06 +01:00
piotr
b0dc1404e7 formatting 2024-02-01 04:14:42 +01:00
piotr
6da6787272 add powerButton size argument 2024-02-01 04:09:31 +01:00
piotr
01c26ba092 add powerButton function 2024-02-01 03:52:56 +01:00
piotr
db265ccf6a update dependencies 2024-02-01 01:09:57 +01:00
piotr
ffc256ba87 fix Makefile; modify icons 2024-02-01 01:09:13 +01:00
Piotr Miller
b5f1713c3e add power icons 2024-01-31 10:50:44 +01:00
piotr
b1908537d1 cp README.md, LICENSE 2024-01-27 14:52:34 +01:00
piotr
664917c105 update README.md 2024-01-27 04:15:17 +01:00
piotr
bf66683a09 update README.md 2024-01-27 03:31:21 +01:00
piotr
ff8e2435b6 rename variable 2023-11-27 00:18:03 +01:00
12 changed files with 453 additions and 40 deletions

View File

@@ -9,16 +9,20 @@ get:
go get github.com/fsnotify/fsnotify
build:
go build -o bin/nwg-drawer .
go build -v -o bin/nwg-drawer .
install:
-pkill -f nwg-drawer
sleep 1
mkdir -p /usr/share/nwg-drawer
cp -r desktop-directories /usr/share/nwg-drawer
cp -r img /usr/share/nwg-drawer
cp drawer.css /usr/share/nwg-drawer
cp bin/nwg-drawer /usr/bin
install -Dm 644 -t "/usr/share/licenses/nwg-drawer" LICENSE
install -Dm 644 -t "/usr/share/doc/nwg-drawer" README.md
uninstall:
rm -r /usr/share/nwg-drawer
rm /usr/bin/nwg-drawer

View File

@@ -1,37 +1,30 @@
# nwg-drawer
<img src="https://github.com/nwg-piotr/nwg-drawer/assets/20579136/1a7578e8-5332-4e4c-bdce-9b9bf875c0e7" width="90" style="margin-right:10px" align=left alt="logo">
<H1>nwg-drawer</H1><br>
This application is a part of the [nwg-shell](https://nwg-piotr.github.io/nwg-shell) project.
**Contributing:** please read the [general contributing rules for the nwg-shell project](https://nwg-piotr.github.io/nwg-shell/contribution).
Nwg-drawer is a golang replacement to the `nwggrid` command
(a part of [nwg-launchers](https://github.com/nwg-piotr/nwg-launchers)). It's being developed with
[sway](https://github.com/swaywm/sway) in mind, but should also work with other wlroots-based Wayland compositors.
X Window System is not officially supported, but you should be able to use the drawer on some floating
window managers (tested on Openbox).
**Nwg-drawer** is an application launcher. It's being developed with [sway](https://github.com/swaywm/sway) and
[Hyprland](https://github.com/hyprwm/Hyprland) in mind, but should also work with other wlroots-based Wayland
compositors.
The `nwg-drawer` command displays the application grid. The search entry allows to look for installed applications,
and for files in XDG user directories. The grid view may also be filtered by categories.
You may pin applications by right-clicking them. Pinned items will appear above the application grid. Right-click
a pinned item to unpin it. The pinned items cache is shared with [nwg-menu](https://github.com/nwg-piotr/nwg-menu)
and `nwggrid`.
a pinned item to unpin it. The pinned items cache is shared with [nwg-menu](https://github.com/nwg-piotr/nwg-menu).
![screenshot.png](https://raw.githubusercontent.com/nwg-piotr/nwg-shell-resources/master/images/nwg-shell/nwg-drawer.png)
Below the grid there is the power bar - a row of buttons to lock the screen, exit the compositor, reboot, suspend and power
the machine off. For each button to appear, you need to provide a corresponding command. See "Command line arguments"
below.
[see on YouTube](https://youtu.be/iIgxJQhCQf0)
<img src="https://github.com/nwg-piotr/nwg-drawer/assets/20579136/8f4eacb4-5395-4350-889b-a9037aa34f08" width=640 alt="screenshot"><br>
[![Packaging status](https://repology.org/badge/vertical-allrepos/nwg-drawer.svg)](https://repology.org/project/nwg-drawer/versions)
To close the window w/o running a program, you may use `Esc` key, or right-click the window next to the icons.
## v0.2.x note
1. Placing config files in the nwg-panel config directory was a mistake, sorry. The 0.2.0 version migrates them to `~/.config/nwg-drawer`.
2. From now on you may run the program residently, which should speed it up (but also occupy some resources!). See "Running" below.
To close the window w/o running a program, you may use the `Esc` key, or right-click the window next to the grid.
## Installation
[![Packaging status](https://repology.org/badge/vertical-allrepos/nwg-drawer.svg)](https://repology.org/project/nwg-drawer/versions)
### Dependencies
- go >=1.20 (just to build)
@@ -58,7 +51,7 @@ confirmed to work well with the program. Also see **Files** below.
```text
$ nwg-drawer -h
Usage of nwg-drawer:
Usage of /tmp/go-build3511850078/b001/exe/nwg-drawer:
-c uint
number of Columns (default 6)
-d Turn on Debug messages
@@ -92,9 +85,21 @@ Usage of nwg-drawer:
-nofs
Disable file search
-o string
name of the Output to display the drawer on (sway only)
name of the Output to display the drawer on (sway & Hyprland only)
-ovl
use OVerLay layer
-pbexit string
command for the Exit power bar icon
-pblock string
command for the Lock power bar icon
-pbpoweroff string
command for the Poweroff power bar icon
-pbreboot string
command for the Reboot power bar icon
-pbsize int
power bar icon size (default 64)
-pbsleep string
command for the sleep power bar icon
-r Leave the program resident in memory
-s string
Styling: css file name (default "drawer.css")
@@ -103,13 +108,15 @@ Usage of nwg-drawer:
-term string
Terminal emulator (default "foot")
-v display Version information
-wm string
use swaymsg exec (with 'sway' argument) or hyprctl dispatch exec (with 'hyprland') to launch programs
```
*NOTE: the `$TERM` environment variable overrides the `-term` argument if defined.*
*NOTE: the `$TERM` environment variable overrides the `-term` argument.*
## Running
Since v0.2.x you may use the drawer in two ways:
You may use the drawer in two ways:
1. Simply run the `nwg-drawer` command, by adding a key binding to your sway config file, e.g.:
@@ -128,7 +135,7 @@ The second line does nothing but `pkill -USR1 nwg-drawer`, so you may just use t
this should be a little bit faster.
Running a resident instance should speed up use of the drawer significantly. Pay attention to the fact, that you
need to `pkill -f nwg-drawer` and reload sway to apply any new arguments!
need to `pkill -f nwg-drawer` and reload the compositor to apply any new arguments!
## Logging
@@ -145,12 +152,10 @@ exit sway, launch it again and include the `drawer.log` content in the GitHub is
Edit `~/.config/nwg-drawer/drawer.css` to your taste.
## Files
## File search
When the search phrase is at least 3 characters long, your XDG user directories are being searched.
![screenshot-02.png](https://raw.githubusercontent.com/nwg-piotr/nwg-shell/main/images/nwg-drawer/search.png)
Use the **left mouse button** to open a file with the `xdg-open` command. As configuring file associations for it is
PITA, you may override them, by creating the `~/.config/nwg-panel/preferred-apps.json` file with your own definitions.
@@ -160,7 +165,7 @@ PITA, you may override them, by creating the `~/.config/nwg-panel/preferred-apps
{
"\\.pdf$": "atril",
"\\.svg$": "inkscape",
"\\.(jpg|png|tiff|gif)$": "feh",
"\\.(jpg|png|tiff|gif)$": "swayimg",
"\\.(mp3|ogg|flac|wav|wma)$": "audacious",
"\\.(avi|mp4|mkv|mov|wav)$": "mpv",
"\\.(doc|docx|xls|xlsx)$": "libreoffice"

6
go.mod
View File

@@ -6,7 +6,7 @@ require (
github.com/allan-simon/go-singleinstance v0.0.0-20210120080615-d0997106ab37
github.com/dlasky/gotk3-layershell v0.0.0-20230802002603-b0c42cd8474f
github.com/fsnotify/fsnotify v1.7.0
github.com/gotk3/gotk3 v0.6.2
github.com/gotk3/gotk3 v0.6.3
github.com/joshuarubin/go-sway v1.2.0
github.com/sirupsen/logrus v1.9.3
)
@@ -14,6 +14,6 @@ require (
require (
github.com/joshuarubin/lifecycle v1.1.4 // indirect
go.uber.org/multierr v1.11.0 // indirect
golang.org/x/sync v0.5.0 // indirect
golang.org/x/sys v0.14.0 // indirect
golang.org/x/sync v0.6.0 // indirect
golang.org/x/sys v0.16.0 // indirect
)

6
go.sum
View File

@@ -14,6 +14,8 @@ github.com/fsnotify/fsnotify v1.7.0/go.mod h1:40Bi/Hjc2AVfZrqy+aj+yEI+/bRxZnMJyT
github.com/gotk3/gotk3 v0.6.1/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
github.com/gotk3/gotk3 v0.6.2 h1:sx/PjaKfKULJPTPq8p2kn2ZbcNFxpOJqi4VLzMbEOO8=
github.com/gotk3/gotk3 v0.6.2/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
github.com/gotk3/gotk3 v0.6.3 h1:+Ke4WkM1TQUNOlM2TZH6szqknqo+zNbX3BZWVXjSHYw=
github.com/gotk3/gotk3 v0.6.3/go.mod h1:/hqFpkNa9T3JgNAE2fLvCdov7c5bw//FHNZrZ3Uv9/Q=
github.com/joshuarubin/go-sway v1.2.0 h1:t3eqW504//uj9PDwFf0+IVfkD+WoOGaDX5gYIe0BHyM=
github.com/joshuarubin/go-sway v1.2.0/go.mod h1:qcDd6f25vJ0++wICwA1BainIcRC67p2Mb4lsrZ0k3/k=
github.com/joshuarubin/lifecycle v1.0.0/go.mod h1:sRy++ATvR9Ee21tkRdFkQeywAWvDsue66V70K0Dnl54=
@@ -36,12 +38,16 @@ golang.org/x/sync v0.3.0 h1:ftCYgMx6zT/asHUrPw8BLLscYtGznsLAnjq5RH9P66E=
golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y=
golang.org/x/sync v0.5.0 h1:60k92dhOjHxJkrqnwsfl8KuaHbn/5dl0lUPUklKo3qE=
golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sync v0.6.0 h1:5BMeUDZ7vkXGfEr1x9B4bRcTH4lpkTkpdh0T/J+qjbQ=
golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.10.0 h1:SqMFp9UcQJZa+pmYuAKjd9xq1f0j5rLcDIk0mj4qAsA=
golang.org/x/sys v0.10.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.14.0 h1:Vz7Qs629MkJkGyHxUlRHizWJRG2j8fbQKjELVSNhy7Q=
golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
golang.org/x/sys v0.16.0 h1:xWw16ngr6ZMtmxDyKyIgsE93KNKz5HKmMa3b8ALHidU=
golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=

64
img/exit.svg Normal file
View File

@@ -0,0 +1,64 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg8"
version="1.1"
viewBox="0 0 48 48"
height="48"
width="48"
sodipodi:docname="exit1.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="9.4201949"
inkscape:cx="17.197096"
inkscape:cy="24.256398"
inkscape:window-width="2552"
inkscape:window-height="1372"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8"
showgrid="false"
showguides="true">
<sodipodi:guide
position="-17.76063,69.315161"
orientation="0,-1"
id="guide1"
inkscape:locked="false" />
</sodipodi:namedview>
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<path
id="path831"
style="opacity:1;vector-effect:none;fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:3.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
d="M 24 4 C 12.954338 4 4 12.954338 4 24 C 4 35.045662 12.954338 44 24 44 C 31.79942 44 38.549265 39.531179 41.845703 33.017578 L 40.427734 33.017578 C 37.240509 38.816001 31.084255 42.75 24 42.75 C 13.644691 42.75 5.25 34.355309 5.25 24 C 5.25 13.644691 13.644691 5.25 24 5.25 C 31.084255 5.25 37.240509 9.1839991 40.427734 14.982422 L 41.845703 14.982422 C 38.549265 8.4688214 31.79942 4 24 4 z " />
<path
id="path5"
style="color:#000000;fill:#f2f2f2;fill-opacity:1;stroke-linejoin:bevel;-inkscape-stroke:none"
d="M 34.980469,18.517578 V 19.8125 l 6.347656,3.591797 -16.929687,-0.115235 -0.0078,1.125 18.927734,0.128907 v -1.304688 z" />
</svg>

After

Width:  |  Height:  |  Size: 2.5 KiB

66
img/lock.svg Normal file
View File

@@ -0,0 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="48"
height="48"
viewBox="0 0 48 48"
version="1.1"
id="svg8"
sodipodi:docname="lock.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="16.208306"
inkscape:cx="18.447332"
inkscape:cy="19.43448"
inkscape:window-width="1912"
inkscape:window-height="1012"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8"
showgrid="false" />
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<path
style="vector-effect:none;fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:3.75238;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
d="m 117.78998,28.062266 -1.08641,0.0064 2e-5,0.0024 -37.799575,0.0816 -0.007,-1.249983 37.379655,-0.0791 c -1.83062,-8.704176 -9.52473,-14.924431 -18.41926,-14.890941 -8.428083,0.0507 -15.786638,5.718662 -17.987023,13.854598 l -1.291486,0.0077 C 80.806771,16.95191 88.730946,10.732773 97.849919,10.670451 107.928,10.61958 116.47101,18.070836 117.78998,28.062266 Z m -0.43153,7.507607 C 115.13057,44.412889 107.20639,50.632007 98.087432,50.694325 88.009353,50.745197 79.466338,43.293941 78.147368,33.30251 l 1.086411,-0.0064 -1.4e-5,-0.0024 38.306055,-0.0816 0.007,1.249983 -37.886139,0.0791 c 1.830589,8.704029 9.524477,14.924242 18.418861,14.890942 8.428078,-0.0507 15.786638,-5.718664 17.987018,-13.854598 z"
id="path817"
sodipodi:nodetypes="cccccccccccccccccccccc" />
<path
id="path2"
style="color:#000000;opacity:1;fill:#f2f2f2;fill-opacity:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2;-inkscape-stroke:none"
d="M 4.28125 20.666016 C 4.0995845 21.748484 4 22.858366 4 23.992188 C 4 35.02783 12.958497 43.986328 23.994141 43.986328 C 35.029785 43.986328 43.988281 35.02783 43.988281 23.992188 C 43.988281 22.858366 43.888701 21.748484 43.707031 20.666016 L 43.542969 20.666016 L 42.566406 20.666016 L 5.421875 20.666016 L 4.5546875 20.666016 L 4.28125 20.666016 z M 5.2597656 21.791016 L 42.728516 21.791016 C 42.813924 22.51349 42.863281 23.246468 42.863281 23.992188 C 42.863281 34.419838 34.421791 42.861328 23.994141 42.861328 C 13.566489 42.861328 5.125 34.419838 5.125 23.992188 C 5.125 23.246468 5.1743575 22.51349 5.2597656 21.791016 z " />
<path
style="color:#000000;fill:#f2f2f2;fill-opacity:1;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:2;-inkscape-stroke:none"
d="m 23.880859,30.039062 c -1.679508,0 -3.048828,1.369321 -3.048828,3.048829 v 1.808593 c 0,1.679508 1.36932,3.048828 3.048828,3.048828 h 0.226563 c 1.679508,0 3.048828,-1.36932 3.048828,-3.048828 v -1.808593 c 0,-1.679508 -1.36932,-3.048829 -3.048828,-3.048829 z m 0,1.125 h 0.226563 c 1.075718,0 1.923828,0.848111 1.923828,1.923829 v 1.808593 c 0,1.075718 -0.84811,1.923828 -1.923828,1.923828 h -0.226563 c -1.075718,0 -1.923828,-0.84811 -1.923828,-1.923828 v -1.808593 c 0,-1.075718 0.84811,-1.923828 1.923828,-1.923829 z"
id="rect2" />
<path
id="path3"
style="color:#000000;fill:#f2f2f2;-inkscape-stroke:none;fill-opacity:1"
d="M 23.994141 4 C 16.432673 4 10.050669 9.0735967 8.0585938 15.998047 L 9.2265625 15.998047 C 11.17813 9.6962096 17.046647 5.125 23.994141 5.125 C 30.941634 5.125 36.810151 9.6962096 38.761719 15.998047 L 39.929688 15.998047 C 37.937612 9.0735967 31.555607 4 23.994141 4 z " />
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

52
img/poweroff.svg Normal file
View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg8"
version="1.1"
viewBox="0 0 48 48"
height="48"
width="48"
sodipodi:docname="poweroff.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="6.9411765"
inkscape:cx="16.927966"
inkscape:cy="16.927966"
inkscape:window-width="2552"
inkscape:window-height="1372"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8" />
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<path
id="path822"
d="M 20.25,4 V 19 H 21.5 V 4 Z m 6.25,0 v 15 h 1.25 V 4 Z M 14,6.7319336 C 7.9628546,10.218607 4.0033064,16.702931 4,24 4,35.045695 12.954305,44 24,44 35.045695,44 44,35.045695 44,24 43.994912,16.704586 40.035832,10.222562 34,6.7368164 V 8.1870117 C 39.351053,11.561829 42.735765,17.485293 42.75,24 42.75,34.355339 34.355339,42.75 24,42.75 13.644661,42.75 5.25,34.355339 5.25,24 5.2650811,17.48603 8.6494321,11.563781 14,8.1894531 Z"
style="opacity:1;vector-effect:none;fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:3.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill" />
</svg>

After

Width:  |  Height:  |  Size: 2.1 KiB

59
img/reboot.svg Normal file
View File

@@ -0,0 +1,59 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
width="48"
height="48"
viewBox="0 0 48 48"
version="1.1"
id="svg8"
sodipodi:docname="reboot.svg"
inkscape:version="1.3.2 (091e20ef0f, 2023-11-25, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="6.9411765"
inkscape:cx="16.927966"
inkscape:cy="16.927966"
inkscape:window-width="2552"
inkscape:window-height="1372"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8"
showgrid="false" />
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<g
id="layer1"
transform="matrix(-1.2507463,0,0,1.2508411,44.011945,-356.92327)"
style="fill:#f2f2f2">
<path
style="opacity:1;vector-effect:none;fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:3.00189;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
d="M 19.001953,1.1308594 V 2 H 19 v 11 h 1 V 2.3359375 A 15,15 45 0 1 32,17 15,15 45 0 1 21.001953,31.455078 v 1.033203 A 16.009488,16.010701 45 0 0 33.009766,17 16.009488,16.010701 45 0 0 19.001953,1.1308594 Z M 12.998047,1.5117188 A 16.009488,16.010701 45 0 0 0.99023438,17 16.009488,16.010701 45 0 0 14.998047,32.869141 V 32 H 15 V 21 H 14 V 31.664062 A 15,15 45 0 1 2,17 15,15 45 0 1 12.998047,2.5449219 Z"
transform="matrix(0.70668771,-0.70663419,0.70668771,0.70663419,-8.0273788,304.53335)"
id="path817" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

52
img/sleep.svg Normal file
View File

@@ -0,0 +1,52 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
id="svg8"
version="1.1"
viewBox="0 0 48 48"
height="48"
width="48"
sodipodi:docname="sleep.svg"
inkscape:version="1.3 (0e150ed6c4, 2023-07-21)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:dc="http://purl.org/dc/elements/1.1/">
<sodipodi:namedview
id="namedview1"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
inkscape:zoom="6.9411765"
inkscape:cx="16.927966"
inkscape:cy="16.927966"
inkscape:window-width="2552"
inkscape:window-height="1372"
inkscape:window-x="0"
inkscape:window-y="0"
inkscape:window-maximized="1"
inkscape:current-layer="svg8" />
<defs
id="defs2" />
<metadata
id="metadata5">
<rdf:RDF>
<cc:Work
rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type
rdf:resource="http://purl.org/dc/dcmitype/StillImage" />
</cc:Work>
</rdf:RDF>
</metadata>
<path
style="opacity:1;vector-effect:none;fill:#f2f2f2;fill-opacity:1;stroke:none;stroke-width:3.75;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1;paint-order:stroke markers fill"
d="M 24,4 C 12.954305,4 4,12.954305 4,24 4,35.045695 12.954305,44 24,44 35.045695,44 44,35.045695 44,24 44,12.954305 35.045695,4 24,4 Z m 0,1.25 C 34.355339,5.25 42.75,13.644661 42.75,24 42.75,34.355339 34.355339,42.75 24,42.75 13.644661,42.75 5.25,34.355339 5.25,24 5.25,13.644661 13.644661,5.25 24,5.25 Z M 19,16.5 v 15 h 1.25 v -15 z m 8.75,0 v 15 H 29 v -15 z"
id="path831" />
</svg>

After

Width:  |  Height:  |  Size: 2.0 KiB

50
main.go
View File

@@ -21,7 +21,7 @@ import (
"github.com/gotk3/gotk3/gtk"
)
const version = "0.4.3"
const version = "0.4.6"
var (
appDirs []string
@@ -32,6 +32,7 @@ var (
preferredApps map[string]interface{}
exclusions []string
hyprlandMonitors []monitor
beenScrolled bool
)
var categoryNames = [...]string{
@@ -171,6 +172,12 @@ var nameLimit = flag.Int("fslen", 80, "File Search name LENgth Limit")
var noCats = flag.Bool("nocats", false, "Disable filtering by category")
var noFS = flag.Bool("nofs", false, "Disable file search")
var resident = flag.Bool("r", false, "Leave the program resident in memory")
var pbExit = flag.String("pbexit", "", "command for the Exit power bar icon")
var pbLock = flag.String("pblock", "", "command for the Lock power bar icon")
var pbPoweroff = flag.String("pbpoweroff", "", "command for the Poweroff power bar icon")
var pbReboot = flag.String("pbreboot", "", "command for the Reboot power bar icon")
var pbSleep = flag.String("pbsleep", "", "command for the sleep power bar icon")
var pbSize = flag.Int("pbsize", 64, "power bar icon size")
var debug = flag.Bool("d", false, "Turn on Debug messages")
func main() {
@@ -512,6 +519,18 @@ func main() {
resultWindow.SetEvents(int(gdk.ALL_EVENTS_MASK))
resultWindow.SetPolicy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
// On touch screen we don't want the button-release-event to launch the app if the user just wanted to scroll the
// window. Let's forbid doing so if the content has been scrolled. We will reset the value on button-press-event.
// Resolves https://github.com/nwg-piotr/nwg-drawer/issues/110
vAdj := resultWindow.GetVAdjustment()
vAdj.Connect("value-changed", func() {
beenScrolled = true
})
hAdj := resultWindow.GetHAdjustment()
hAdj.Connect("value-changed", func() {
beenScrolled = true
})
resultWindow.Connect("button-release-event", func(_ *gtk.ScrolledWindow, event *gdk.Event) bool {
btnEvent := gdk.EventButtonNewFromEvent(event)
if btnEvent.Button() == 3 {
@@ -559,6 +578,35 @@ func main() {
resultsWrapper.PackEnd(wrapper, false, false, 10)
}
// Power Button Bar
if *pbExit != "" || *pbLock != "" || *pbPoweroff != "" || *pbReboot != "" || *pbSleep != "" {
powerBarWrapper, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0)
outerVBox.PackStart(powerBarWrapper, false, false, 0)
powerButtonsWrapper, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0)
powerBarWrapper.PackStart(powerButtonsWrapper, true, false, 12)
if *pbLock != "" {
btn := powerButton("/usr/share/nwg-drawer/img/lock.svg", *pbLock)
powerButtonsWrapper.PackStart(btn, true, false, 0)
}
if *pbExit != "" {
btn := powerButton("/usr/share/nwg-drawer/img/exit.svg", *pbExit)
powerButtonsWrapper.PackStart(btn, true, false, 0)
}
if *pbReboot != "" {
btn := powerButton("/usr/share/nwg-drawer/img/reboot.svg", *pbReboot)
powerButtonsWrapper.PackStart(btn, true, false, 0)
}
if *pbSleep != "" {
btn := powerButton("/usr/share/nwg-drawer/img/sleep.svg", *pbSleep)
powerButtonsWrapper.PackStart(btn, true, false, 0)
}
if *pbPoweroff != "" {
btn := powerButton("/usr/share/nwg-drawer/img/poweroff.svg", *pbPoweroff)
powerButtonsWrapper.PackStart(btn, true, false, 0)
}
}
statusLineWrapper, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0)
statusLineWrapper.SetProperty("name", "status-line-wrapper")
outerVBox.PackStart(statusLineWrapper, false, false, 10)

View File

@@ -78,7 +78,7 @@ func mapXdgUserDirs() map[string]string {
result["pictures"] = filepath.Join(home, "Pictures")
result["videos"] = filepath.Join(home, "Videos")
userDirsFile := filepath.Join(filepath.Join(os.Getenv("XDG_CONFIG_HOME"), "user-dirs.dirs"))
userDirsFile := filepath.Join(filepath.Join(configHome(), "user-dirs.dirs"))
if pathExists(userDirsFile) {
log.Debugf("userDirsFile found: %s", userDirsFile)
log.Info(fmt.Sprintf("Using XDG user dirs from %s", userDirsFile))
@@ -166,6 +166,13 @@ func configDir() string {
return dir
}
func configHome() string {
if os.Getenv("XDG_CONFIG_HOME") != "" {
return os.Getenv("XDG_CONFIG_HOME")
}
return path.Join(os.Getenv("HOME"), ".config")
}
func dataDir() string {
var dir string
if xdgData := os.Getenv("XDG_DATA_HOME"); xdgData != "" {
@@ -696,12 +703,12 @@ func mapOutputs() (map[string]*gdk.Monitor, error) {
num := display.GetNMonitors()
for i := 0; i < num; i++ {
monitor, _ := display.GetMonitor(i)
geometry := monitor.GetGeometry()
mon, _ := display.GetMonitor(i)
geometry := mon.GetGeometry()
// assign output to monitor on the basis of the same x, y coordinates
for _, output := range outputs {
if int(output.Rect.X) == geometry.GetX() && int(output.Rect.Y) == geometry.GetY() {
result[output.Name] = monitor
result[output.Name] = mon
}
}
}

View File

@@ -264,11 +264,19 @@ func flowBoxButton(entry desktopEntry) *gtk.Button {
r := substring(desc, 0, 117)
desc = fmt.Sprintf("%s…", string(r))
}
button.Connect("button-press-event", func() {
// if not scrolled from now on, we will allow launching apps on button-release-event
beenScrolled = false
})
button.Connect("button-release-event", func(btn *gtk.Button, e *gdk.Event) bool {
btnEvent := gdk.EventButtonNewFromEvent(e)
if btnEvent.Button() == 1 {
if !beenScrolled {
launch(exec, terminal)
return true
}
} else if btnEvent.Button() == 3 {
pinItem(ID)
return true
@@ -281,12 +289,54 @@ func flowBoxButton(entry desktopEntry) *gtk.Button {
button.Connect("enter-notify-event", func() {
statusLabel.SetText(desc)
})
button.Connect("leave-notify-event", func() {
statusLabel.SetText("")
})
button.Connect("focus-in-event", func() {
statusLabel.SetText(desc)
})
return button
}
func powerButton(iconPath, command string) *gtk.Button {
button, _ := gtk.ButtonNew()
button.SetAlwaysShowImage(true)
var pixbuf *gdk.Pixbuf
var img *gtk.Image
var err error
pixbuf, err = gdk.PixbufNewFromFileAtSize(iconPath, *pbSize, *pbSize)
if err != nil {
pixbuf, _ = createPixbuf("unknown", *pbSize)
log.Warnf("Couldn't find icon %s", iconPath)
}
img, _ = gtk.ImageNewFromPixbuf(pixbuf)
button.SetImage(img)
button.SetImagePosition(gtk.POS_TOP)
button.Connect("button-release-event", func(btn *gtk.Button, e *gdk.Event) bool {
btnEvent := gdk.EventButtonNewFromEvent(e)
if btnEvent.Button() == 1 {
launch(command, false)
return true
}
return false
})
button.Connect("activate", func() {
launch(command, false)
})
button.Connect("enter-notify-event", func() {
statusLabel.SetText(command)
})
button.Connect("leave-notify-event", func() {
statusLabel.SetText("")
})
button.Connect("focus-in-event", func() {
statusLabel.SetText(command)
})
return button
}
func setUpFileSearchResultContainer() *gtk.FlowBox {
if fileSearchResultFlowBox != nil {
fileSearchResultFlowBox.Destroy()