wiki: prepare for hextra

treewide: replace hint with callout

treewide: remove ToC header

remove <toc>, since it's autogenerated
add missing _index.md

treewide: add frontmatter

treewide: fix headings

add weights

Configuring,Getting Started: expand in sidebar

Add version selector

fix links
This commit is contained in:
Mihai Fufezan 2024-02-20 22:16:07 +02:00
parent 27b9014e80
commit 0aae54eb6a
No known key found for this signature in database
63 changed files with 2027 additions and 1134 deletions

View file

@ -1,8 +1,9 @@
# Table of contents
---
weight: 9
title: Animations
---
{{< toc >}}
# General
## General
Animations are declared with the `animation` keyword.
@ -12,7 +13,8 @@ or
animation=NAME,ONOFF,SPEED,CURVE
```
`ONOFF` can be either 0 or 1, 0 to disable, 1 to enable. _note:_ if it's 0, you can omit further args.
`ONOFF` can be either 0 or 1, 0 to disable, 1 to enable. _note:_ if it's 0, you
can omit further args.
`SPEED` is the amount of ds (1ds = 100ms) the animation will take
@ -23,7 +25,7 @@ animation=NAME,ONOFF,SPEED,CURVE
The animations are a tree. If an animation is unset, it will inherit its
parent's values. See [the animation tree](#animation-tree).
## Examples
### Examples
```ini
animation=workspaces,1,8,default
@ -31,7 +33,7 @@ animation=windows,1,10,myepiccurve,slide
animation=fade,0
```
## Animation tree
### Animation tree
```txt
global
@ -53,7 +55,7 @@ global
↳ specialWorkspace - styles: same as workspaces
```
# Curves
## Curves
Defining your own Bezier curve can be done with the `bezier` keyword:
@ -63,28 +65,30 @@ bezier=NAME,X0,Y0,X1,Y1
where `NAME` is the name, and the rest are two points for the Cubic Bezier. A
good website to design your bezier can be found
[here, on cssportal.com](https://www.cssportal.com/css-cubic-bezier-generator/), but
if you want to instead choose from a list of beziers, you can check out [easings.net](https://easings.net).
[here, on cssportal.com](https://www.cssportal.com/css-cubic-bezier-generator/),
but if you want to instead choose from a list of beziers, you can check out
[easings.net](https://easings.net).
## Example
### Example
```ini
bezier=overshot,0.05,0.9,0.1,1.1
```
# Extras
### Extras
For animation style `popin` in `windows`, you can specify a minimum percentage
to start from. For example, the following will make the animation 80% -> 100% of the size:
to start from. For example, the following will make the animation 80% -> 100% of
the size:
```ini
animation=windows,1,8,default,popin 80%
```
For animation styles `slidefade` and `slidefadevert` in `workspaces`, you can specify a movement
percentage. For example, the following will make windows move 20% of the screen width:
For animation styles `slidefade` and `slidefadevert` in `workspaces`, you can
specify a movement percentage. For example, the following will make windows move
20% of the screen width:
```ini
animation=workspaces,1,8,default,slidefade 20%
```

View file

@ -1,8 +1,9 @@
# Table of Contents
---
weight: 5
title: Binds
---
{{< toc >}}
# Basic
## Basic
```ini
bind=MODS,key,dispatcher,params
@ -16,18 +17,20 @@ bind=SUPER_SHIFT,Q,exec,firefox
will bind opening firefox to <key>SUPER</key> + <key>SHIFT</key> + <key>Q</key>
{{< hint type=tip >}}
{{< callout type=info >}}
For binding keys without a modkey, leave it empty:
```ini
bind=,Print,exec,grim
```
{{< /hint >}}
{{< /callout >}}
_For a complete mod list, see [Variables](../Variables/#variable-types)._
_For a complete mod list, see [Variables](../variables/#variable-types)._
_The dispatcher list can be found in [Dispatchers](../Dispatchers/#list-of-dispatchers)._
_The dispatcher list can be found in
[Dispatchers](../dispatchers/#list-of-dispatchers)._
## Uncommon syms / binding with a keycode
@ -35,11 +38,11 @@ See the
[xkbcommon-keysyms.h header](https://github.com/xkbcommon/libxkbcommon/blob/master/include/xkbcommon/xkbcommon-keysyms.h)
for all the keysyms. The name you should use is the segment after `XKB_KEY_`.
If you are unsure of what your key's name is, you can
use `xev` or `wev` to find that information.
If you are unsure of what your key's name is, you can use `xev` or `wev` to find
that information.
If you want to bind by a keycode, you can just input it in the KEY position with a `code:` prefix,
e.g.:
If you want to bind by a keycode, you can just input it in the KEY position with
a `code:` prefix, e.g.:
```ini
bind=SUPER,code:28,exec,amongus
@ -48,9 +51,9 @@ bind=SUPER,code:28,exec,amongus
Will bind <key>SUPER</key> + <key>T</key>. (<key>T</key> is keycode 28.) - You
can also use `xev` or `wev` to find keycodes.
# Misc
## Misc
## Unbind
### Unbind
You can also unbind with `unbind`, e.g.:
@ -64,7 +67,7 @@ May be useful for dynamic keybindings with `hyprctl`.
hyprctl keyword unbind SUPER,O
```
## Mouse buttons
### Mouse buttons
You can also bind mouse buttons, by prefacing the mouse keycode with `mouse:`,
for example:
@ -75,7 +78,7 @@ bind=SUPER,mouse:272,exec,amongus
will bind it to <key>SUPER</key> + <key>LMB</key>.
## Only modkeys
### Only modkeys
For binding only modkeys, you need to use the TARGET modmask (with the
activating mod) and the `r` flag, e.g.:
@ -84,9 +87,10 @@ activating mod) and the `r` flag, e.g.:
bindr=SUPERALT,Alt_L,exec,amongus
```
## Mouse wheel
### Mouse wheel
You can also bind the mouse wheel with `mouse_up` and `mouse_down` (or `mouse_left` and `mouse_right` if your wheel supports horizontal scrolling):
You can also bind the mouse wheel with `mouse_up` and `mouse_down` (or
`mouse_left` and `mouse_right` if your wheel supports horizontal scrolling):
```ini
bind=SUPER,mouse_down,workspace,e-1
@ -94,7 +98,7 @@ bind=SUPER,mouse_down,workspace,e-1
(control the reset time with `binds:scroll_event_delay`)
## Switches
### Switches
Useful for binding e.g. the lid close/open event:
@ -109,9 +113,10 @@ bindl=,switch:off:[switch name],exec,hyprctl keyword monitor "eDP-1, 2560x1600,
check out your switches in `hyprctl devices`.
## Multiple binds to one key
### Multiple binds to one key
You can trigger multiple actions with one keybind by assigning multiple binds to one combination, e.g.:
You can trigger multiple actions with one keybind by assigning multiple binds to
one combination, e.g.:
```
# to switch between windows in a floating workspace
@ -121,7 +126,7 @@ bind = SUPER,Tab,bringactivetotop, # bring it to the top
The keybinds will be executed in the order they were created. (top to bottom)
# Bind flags
## Bind flags
`bind` supports flags in this format:
@ -162,10 +167,10 @@ bindr=SUPER, SUPER_L, exec, pkill wofi || wofi
# See Mouse Binds section for bindm usage
```
# Mouse Binds
## Mouse Binds
Mouse binds are binds that heavily rely on a mouse, usually its movement.
They will have one less arg, and look for example like this:
Mouse binds are binds that heavily rely on a mouse, usually its movement. They
will have one less arg, and look for example like this:
```ini
bindm=ALT,mouse:272,movewindow
@ -177,8 +182,8 @@ with your mouse.
_Available mouse binds_:
| Name | Description | Params |
| -----|------------ |--------|
| movewindow | moves the active window | none |
| --- | --- | --- |
| movewindow | moves the active window | none |
| resizewindow | resizes the active window | 1 - resize and keep window aspect ratio, 2 - resize and ignore `keepaspectratio` window rule/prop, none or anything else for normal resize |
_Common mouse buttons' codes:_
@ -190,12 +195,15 @@ RMB -> 273
_for more, you can of course use `wev` to check._
{{< hint type=tip >}}
Mouse binds, despite their name, behave like normal binds. You are free to use
whatever keys / mods you please. When held, the mouse function will be activated.
{{< /hint >}}
{{< callout type=info >}}
# Binding mods
Mouse binds, despite their name, behave like normal binds. You are free to use
whatever keys / mods you please. When held, the mouse function will be
activated.
{{< /callout >}}
## Binding mods
You can bind a mod alone like this:
@ -203,15 +211,16 @@ You can bind a mod alone like this:
bindr=ALT,Alt_L,exec,amongus
```
# Global Keybinds
## Global Keybinds
### Classic
## Classic
Yes, you heard this right, Hyprland does support global keybinds for ALL apps,
including OBS, Discord, Firefox, etc.
See the [`pass` dispatcher](../Dispatchers/#list-of-dispatchers) for keybinds.
See the [`pass` dispatcher](../dispatchers/#list-of-dispatchers) for keybinds.
Let's take OBS as an example: the "Start/Stop Recording" keybind is set to
Let's take OBS as an example: the "Start/Stop Recording" keybind is set to
<key>SUPER</key> + <key>F10</key>, and you want to make it work globally.
Simply add
@ -231,21 +240,24 @@ bind=,mouse:276,pass,^(TeamSpeak 3)$
Will pass MOUSE5 to TeamSpeak3.
{{< hint type=important >}}
{{< callout >}}
XWayland is a bit wonky. Make sure that what you're passing is a "global Xorg
keybind", otherwise passing from a different XWayland app may not work.
It works flawlessly with all native Wayland applications though.
{{< /hint >}}
## DBus Global Shortcuts
{{< /callout >}}
Some applications may already support the GlobalShortcuts portal in xdg-desktop-portal.
### DBus Global Shortcuts
Some applications may already support the GlobalShortcuts portal in
xdg-desktop-portal.
If that's the case, then it's recommended to use this method instead of `pass`.
Open your desired app and issue `hyprctl globalshortcuts`. This will give you a list
of currently registered shortcuts with their description(s).
Open your desired app and issue `hyprctl globalshortcuts`. This will give you a
list of currently registered shortcuts with their description(s).
Choose whichever you like, for example `coolApp:myToggle`
@ -255,16 +267,18 @@ Bind it to whatever you want with the `global` dispatcher:
bind = SUPERSHIFT, A, global, coolApp:myToggle
```
{{< hint type=tip >}}
Please note that this function will _only_ work with [XDPH](../../Useful-Utilities/Hyprland-desktop-portal).
{{</ hint >}}
{{< callout type=info >}}
# Submaps
Please note that this function will _only_ work with
[XDPH](../../hyprland-ecosystem/xdg-desktop-portal-hyprland).
{{</ callout >}}
## Submaps
If you want keybind submaps, also known as _modes_ or _groups_, for example if
you press <key>ALT</key> + <key>R</key>, you can enter a "resize" mode,
resize with arrow keys, and leave
with escape, do it like this:
you press <key>ALT</key> + <key>R</key>, you can enter a "resize" mode, resize
with arrow keys, and leave with escape, do it like this:
```ini
# will switch to a submap called resize
@ -288,11 +302,16 @@ submap=reset
# keybinds further down will be global again...
```
**IMPORTANT:** do not forget a keybind to reset the keymap while inside it! (In
this case, `escape`)
{{< callout type=warning >}}
Do not forget a keybind to reset the keymap while inside it! (In this case,
`escape`)
{{< /callout >}}
If you get stuck inside a keymap, you can use `hyprctl dispatch submap reset` to
go back. If you do not have a terminal open, tough luck buddy. You have been warned.
go back. If you do not have a terminal open, tough luck buddy. You have been
warned.
You can also set the same keybind to perform multiple actions, such as resize
and close the submap, like so:
@ -314,16 +333,18 @@ assigning multiple actions per bind is possible.
## Catch-All
You can also define a keybind via the special `catchall` keyword, which activates no matter which key is pressed.
This can be used to prevent any keys from passing to your active application while in a submap or to exit it immediately when any unknown key is pressed:
You can also define a keybind via the special `catchall` keyword, which
activates no matter which key is pressed. This can be used to prevent any keys
from passing to your active application while in a submap or to exit it
immediately when any unknown key is pressed:
```ini
bind=,catchall,submap,reset
```
# Example Binds
## Example Binds
## Media
### Media
These binds set the expected behavior for regular keyboard media volume keys,
including when the screen is locked:

View file

@ -1,9 +1,16 @@
---
weight: 1
title: Configuring Hyprland
---
The config is located in `~/.config/hypr/hyprland.conf`.
You can tell Hyprland to use a specific configuration file by using the `--config` (or `-c`) argument.
You can tell Hyprland to use a specific configuration file by using the
`--config` (or `-c`) argument.
Hyprland will automatically generate an example config for you if
you don't have one. You can find an example config [here](https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.conf).
Hyprland will automatically generate an example config for you if you don't have
one. You can find an example config
[here](https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.conf).
By removing the line `autogenerated=1` you'll remove the yellow warning.
@ -11,16 +18,18 @@ There is no "reload" keybind. The config is reloaded the moment you save it.
Start a section with `name {` and end in `}` **_in separate lines!_**
{{< hint type=important >}}
The default config is not complete and does not list all the options / features of Hyprland.
Please refer to this wiki page and the pages
linked further down here for full configuration instructions.
{{< callout >}}
**Make sure to read the [Variables](../Variables) page as well**. It covers all the
toggleable / numerical options.
{{< /hint >}}
The default config is not complete and does not list all the options / features
of Hyprland. Please refer to this wiki page and the pages linked further down
here for full configuration instructions.
# Line style
**Make sure to read the [Variables](../variables) page as well**. It covers all
the toggleable / numerical options.
{{< /callout >}}
## Line style
Every config line is a command followed by a value.
@ -41,22 +50,21 @@ COMMAND = VALUE
is valid.
## Comments
### Comments
Comments are started with the `#` character.
If you want to escape it (put an actual `#` and not start a comment)
you can use `##`. It will be turned into a single `#` that WILL be a part of your
line.
If you want to escape it (put an actual `#` and not start a comment) you can use
`##`. It will be turned into a single `#` that WILL be a part of your line.
# Basic configuring
## Basic configuring
To configure the "options" of Hyprland, animations, styling, etc. see
[Variables](../Variables).
[Variables](../variables).
# Advanced configuring
## Advanced configuring
Some keywords (binds, curves, execs, monitors, etc.) are not variables but define
special behavior.
Some keywords (binds, curves, execs, monitors, etc.) are not variables but
define special behavior.
See all of them in [Keywords](../Keywords) and the sidebar.
See all of them in [Keywords](../keywords) and the sidebar.

View file

@ -1,14 +1,15 @@
# Table of contents
{{< toc >}}
---
weight: 6
title: Dispatchers
---
Please keep in mind some layout-specific dispatchers will be listed in the
layout pages (See the sidebar).
# Parameter explanation
## Parameter explanation
| Param type | Description |
| ---------- | ----------- |
| --- | --- |
| window | a window. Any of the following: Class regex, `title:` and a title regex, `pid:` and the pid, `address:` and the address, `floating`, `tiled` |
| workspace | see below. |
| direction | `l` `r` `u` `d` left right up down |
@ -17,10 +18,10 @@ layout pages (See the sidebar).
| floatvalue | a relative float delta (e.g `-0.2` or `+0.2`) or `exact` followed by a the exact float value (e.g. `exact 0.5`) |
| zheight | `top` or `bottom` |
# List of Dispatchers
## List of Dispatchers
| Dispatcher | Description | Params |
| ---------- | ----------- | ------ |
| --- | --- | --- |
| exec | executes a shell command | command (supports rules, see [below]({{< relref "#executing-with-rules" >}})) |
| execr | executes a raw shell command (does not support rules) | command |
| pass | passes the key (with mods) to a specified window. Can be used as a workaround to global keybinds not working on Wayland. | window |
@ -33,11 +34,11 @@ layout pages (See the sidebar).
| fullscreen | toggles the focused window's fullscreen state | 0 - fullscreen (takes your entire screen), 1 - maximize (keeps gaps and bar(s)), 2 - fullscreen (same as fullscreen except doesn't alter window's internal fullscreen state) |
| fakefullscreen | toggles the focused window's internal fullscreen state without altering the geometry | none |
| dpms | sets all monitors' DPMS status. Do not use with a keybind directly. | `on`, `off`, or `toggle`. For specific monitor add monitor name after a space |
| pin | pins a window (i.e. show it on all workspaces) *note: floating only* | left empty / `active` for current, or `window` for a specific window |
| pin | pins a window (i.e. show it on all workspaces) _note: floating only_ | left empty / `active` for current, or `window` for a specific window |
| movefocus | moves the focus in a direction | direction |
| movewindow | moves the active window in a direction or to a monitor. For floating windows, moves the window to the screen edge in that direction | direction or `mon:` and a monitor |
| swapwindow | swaps the active window with another window in the given direction | direction |
| centerwindow | center the active window *note: floating only* | none (for monitor center) or 1 (to respect monitor reserved area) |
| centerwindow | center the active window _note: floating only_ | none (for monitor center) or 1 (to respect monitor reserved area) |
| resizeactive | resizes the active window | resizeparams |
| moveactive | moves the active window | resizeparams |
| resizewindowpixel | resizes a selected window | `resizeparams,window`, e.g. `100 100,^(kitty)$` |
@ -57,12 +58,12 @@ layout pages (See the sidebar).
| focusworkspaceoncurrentmonitor | Focuses the requested workspace on the current monitor, swapping the current workspace to a different monitor if necessary. If you want XMonad/Qtile-style workspace switching, replace `workspace` in your config with this. | workspace |
| moveworkspacetomonitor | Moves a workspace to a monitor | workspace and a monitor separated by a space |
| swapactiveworkspaces | Swaps the active workspaces between two monitors | two monitors separated by a space |
| bringactivetotop | *Deprecated* in favor of alterzorder. Brings the current window to the top of the stack | none |
| bringactivetotop | _Deprecated_ in favor of alterzorder. Brings the current window to the top of the stack | none |
| alterzorder | Modify the window stack order of the active or specified window. Note: this cannot be used to move a floating window behind a tiled one. | zheight[,window] |
| togglespecialworkspace | toggles a special workspace on/off | none (for the first) or name for named (name has to be a special workspace's name) |
| focusurgentorlast | Focuses the urgent window or the last window | none |
| togglegroup | toggles the current active window into a group | none |
| changegroupactive | switches to the next window in a group. | b - back, f - forward, or index start at 1 |
| changegroupactive | switches to the next window in a group. | b - back, f - forward, or index start at 1 |
| focuscurrentorlast | Switch focus from current to previously focused window | none |
| lockgroups | Locks the groups (all groups will not accept new windows) | `lock` for locking, `unlock` for unlocking, `toggle` for toggle |
| lockactivegroup | Lock the focused group (the current group will not accept new windows or be moved to other groups) | `lock` for locking, `unlock` for unlocking, `toggle` for toggle |
@ -72,35 +73,43 @@ layout pages (See the sidebar).
| movegroupwindow | Swaps the active window with the next or previous in a group | `b` for back, anything else for forward |
| denywindowfromgroup | Prohibit the active window from becoming or being inserted into group | `on`, `off` or, `toggle` |
| setignoregrouplock | Temporarily enable or disable binds:ignore_group_lock | `on`, `off`, or `toggle` |
| global | Executes a Global Shortcut using the GlobalShortcuts portal. See [here](../Binds/#global-keybinds) | name |
| submap | Change the current mapping group. See [Submaps](../Binds/#submaps) | `reset` or name |
| global | Executes a Global Shortcut using the GlobalShortcuts portal. See [here](../binds/#global-keybinds) | name |
| submap | Change the current mapping group. See [Submaps](../binds/#submaps) | `reset` or name |
{{< hint type=warning >}}
it is NOT recommended to set DPMS with a keybind directly, as it
might cause undefined behavior. Instead, consider something like
{{< callout type=warning >}}
it is NOT recommended to set DPMS with a keybind directly, as it might cause
undefined behavior. Instead, consider something like
```ini
bind = MOD,KEY,exec,sleep 1 && hyprctl dispatch dpms off
```
{{< /hint >}}
{{< /callout >}}
## Grouped (tabbed) windows
### Grouped (tabbed) windows
Hyprland allows you to make a group from the current active window with the `togglegroup` bind dispatcher.
Hyprland allows you to make a group from the current active window with the
`togglegroup` bind dispatcher.
A group is like i3wms “tabbed” container. It takes the space of one window, and you can change the window to the next one in the tabbed “group” with the `changegroupactive` bind dispatcher.
A group is like i3wms “tabbed” container. It takes the space of one window, and
you can change the window to the next one in the tabbed “group” with the
`changegroupactive` bind dispatcher.
The new groups border colors are configurable with the appropriate `col.` settings in the `group` config section.
The new groups border colors are configurable with the appropriate `col.`
settings in the `group` config section.
You can lock a group with the `lockactivegroup` dispatcher in order to stop new window from entering this group.
In addition, the `lockgroups` dispatcher can be used to toggle an independent global group lock that will prevent
new window from entering any groups, regardless of their local group lock stat.
You can lock a group with the `lockactivegroup` dispatcher in order to stop new
window from entering this group. In addition, the `lockgroups` dispatcher can be
used to toggle an independent global group lock that will prevent new window
from entering any groups, regardless of their local group lock stat.
You can prevent a window from being added to group or becoming a group with the `denywindowfromgroup` dispatcher.
`movewindoworgroup` will behave like `movewindow` if current active window or window in direction has this property set.
You can prevent a window from being added to group or becoming a group with the
`denywindowfromgroup` dispatcher. `movewindoworgroup` will behave like
`movewindow` if current active window or window in direction has this property
set.
# Workspaces
## Workspaces
You have eight choices:
@ -122,28 +131,36 @@ You have eight choices:
- Special Workspace: `special` or `special:name` for named special workspaces.
{{< hint type=warning >}}
`special` is supported ONLY on
`movetoworkspace` and `movetoworkspacesilent`. Any other dispatcher will result in undocumented behavior.
{{< /hint >}}
{{< callout type=warning >}}
{{< hint type=important >}}
Numerical workspaces (e.g. `1`, `2`, `13371337`) are allowed
**ONLY** between 1 and 2147483647 (inclusive)
`special` is supported ONLY on `movetoworkspace` and `movetoworkspacesilent`.
Any other dispatcher will result in undocumented behavior.
{{< /callout >}}
{{< callout >}}
Numerical workspaces (e.g. `1`, `2`, `13371337`) are allowed **ONLY** between 1
and 2147483647 (inclusive)
Neither `0` nor negative numbers are allowed.
{{< /hint >}}
# Special Workspace
{{< /callout >}}
## Special Workspace
A special workspace is what is called a "scratchpad" in some other places. A
workspace that you can toggle on/off on any monitor.
{{< hint >}}
You can define multiple named special workspaces, but the amount of those is limited to 97 at a time.
{{< /hint >}}
{{< callout type=info >}}
For example, to move a window/application to a special workspace you can use the following syntax:
You can define multiple named special workspaces, but the amount of those is
limited to 97 at a time.
{{< /callout >}}
For example, to move a window/application to a special workspace you can use the
following syntax:
```
bind = SUPER, C, movetoworkspace, special
@ -151,17 +168,20 @@ bind = SUPER, C, movetoworkspace, special
#To see the hidden window you can use the togglespecialworkspace dispatcher mentioned above.
```
# Executing with rules
The `exec` dispatcher supports adding rules. Please note some windows might work better, some
worse. It records the PID of the spawned process and uses that. If your process e.g. forks and then
the fork opens a window, this will not work.
## Executing with rules
The `exec` dispatcher supports adding rules. Please note some windows might work
better, some worse. It records the PID of the spawned process and uses that. If
your process e.g. forks and then the fork opens a window, this will not work.
The syntax is:
```
bind = mod, key, exec, [rules...] command
```
For example:
```
bind = SUPER, E, exec, [workspace 2 silent;float;noanim] kitty
```

View file

@ -1,47 +1,53 @@
Dwindle is a BSPWM-like layout, where every window on a workspace is a member
of a binary tree.
---
weight: 11
title: Dwindle Layout
---
# Quirks
Dwindle is a BSPWM-like layout, where every window on a workspace is a member of
a binary tree.
## Quirks
Dwindle splits are NOT PERMANENT. The split is determined dynamically with the
W/H ratio of the parent node. If W > H, it's side-by-side. If H > W, it's
top-and-bottom. You can make them permanent by enabling `preserve_split`.
# Config
## Config
category name: `dwindle`
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| pseudotile | enable pseudotiling. Pseudotiled windows retain their floating size when tiled. | bool | false |
| force_split | 0 -> split follows mouse, 1 -> always split to the left (new = left or top) 2 -> always split to the right (new = right or bottom) | int | 0 |
| preserve_split | if enabled, the split (side/top) will not change regardless of what happens to the container. | bool | false |
| smart_split | if enabled, allows a more precise control over the window split direction based on the cursor's position. The window is conceptually divided into four triangles, and cursor's triangle determines the split direction. This feature also turns on preserve_split. | bool | false |
| smart_resizing | if enabled, resizing direction will be determined by the mouse's position on the window (nearest to which corner). Else, it is based on the window's tiling position. | bool | true |
| permanent_direction_override | if enabled, makes the preselect direction persist until either this mode is turned off, another direction is specified, or a non-direction is specified (anything other than l,r,u/t,d/b) | bool | false |
| permanent_direction_override | if enabled, makes the preselect direction persist until either this mode is turned off, another direction is specified, or a non-direction is specified (anything other than l,r,u/t,d/b) | bool | false |
| special_scale_factor | specifies the scale factor of windows on the special workspace [0 - 1] | float | 1 |
| split_width_multiplier | specifies the auto-split width multiplier | float | 1.0 |
| no_gaps_when_only | whether to apply gaps when there is only one window on a workspace, aka. smart gaps. (default: disabled - 0) no border - 1, with border - 2 [0/1/2] | int | 0 |
| use_active_for_splits | whether to prefer the active window or the mouse position for splits | bool | true |
| default_split_ratio | the default split ratio on window open. 1 means even 50/50 split. [0.1 - 1.9] | float | 1.0 |
# Bind Dispatchers
## Bind Dispatchers
| dispatcher | description | params |
|---|---|---|
| --- | --- | --- |
| pseudo | toggles the focused window's pseudo mode | none |
# Layout messages
## Layout messages
Dispatcher `layoutmsg` params:
| param | description | args |
|---|---|---|
| --- | --- | --- |
| togglesplit | toggles the split (top/side) of the current window. `preserve_split` must be enabled for toggling to work. | none |
| swapsplit | swaps the two halves of the split of the current window. | none |
| preselect | A onetime override for the split direction. (valid for the next window to be opened, only works on tiled windows) | direction |
e.g.:
```ini
bind = SUPER, A, layoutmsg, preselect l
```

View file

@ -1,81 +1,112 @@
You can use the `env` keyword to set environment variables prior to the initialization of
the Display Server, e.g.:
---
weight: 15
title: Environment variables
---
You can use the `env` keyword to set environment variables prior to the
initialization of the Display Server, e.g.:
```ini
env = GTK_THEME,Nord
```
{{< hint type=important >}}
Hyprland puts the raw string to the envvar with the `env` keyword. You should _not_ add quotes around the values.
{{< callout >}}
Hyprland puts the raw string to the envvar with the `env` keyword. You should
_not_ add quotes around the values.
e.g.:
```ini
env = QT_QPA_PLATFORM,wayland
```
and ***NOT***
and _**NOT**_
```ini
env = QT_QPA_PLATFORM,"wayland"
```
{{< /hint >}}
Please avoid putting those environment variables in /etc/environment. That will cause all
sessions (including Xorg ones) to pick up your wayland-specific environment on traditional
Linux distros.
{{< /callout >}}
Please avoid putting those environment variables in /etc/environment. That will
cause all sessions (including Xorg ones) to pick up your wayland-specific
environment on traditional Linux distros.
## Hyprland Environment Variables
# Hyprland Environment Variables
- `HYPRLAND_LOG_WLR=1` - Enables more verbose logging of wlroots.
- `HYPRLAND_NO_RT=1` - Disables realtime priority setting by Hyprland.
- `HYPRLAND_NO_SD_NOTIFY=1` - If systemd, disables the `sd_notify` calls.
# Toolkit Backend Variables
- `GDK_BACKEND=wayland,x11` - GTK: Use wayland if available, fall back to x11 if not.
- `QT_QPA_PLATFORM="wayland;xcb"` - Qt: Use wayland if available, fall back to x11 if not.
- `SDL_VIDEODRIVER=wayland` - Run SDL2 applications on Wayland. Remove or set to `x11` if games that provide older versions of SDL cause
compatibility issues
- `CLUTTER_BACKEND=wayland` - Clutter package already has wayland enabled, this variable will force Clutter applications
to try and use the Wayland backend
## Toolkit Backend Variables
# XDG Specifications
- `GDK_BACKEND=wayland,x11` - GTK: Use wayland if available, fall back to x11 if
not.
- `QT_QPA_PLATFORM="wayland;xcb"` - Qt: Use wayland if available, fall back to
x11 if not.
- `SDL_VIDEODRIVER=wayland` - Run SDL2 applications on Wayland. Remove or set to
`x11` if games that provide older versions of SDL cause compatibility issues
- `CLUTTER_BACKEND=wayland` - Clutter package already has wayland enabled, this
variable will force Clutter applications to try and use the Wayland backend
## XDG Specifications
- `XDG_CURRENT_DESKTOP=Hyprland`
- `XDG_SESSION_TYPE=wayland`
- `XDG_SESSION_DESKTOP=Hyprland`
XDG specific environment variables are often detected through portals and applications that may
set those for you, however it is not a bad idea to set them explicitly.
XDG specific environment variables are often detected through portals and
applications that may set those for you, however it is not a bad idea to set
them explicitly.
# Qt Variables
## Qt Variables
- `QT_AUTO_SCREEN_SCALE_FACTOR=1` - [(From the Qt documentation)](https://doc.qt.io/qt-5/highdpi.html)
enables automatic scaling, based on the monitor's pixel density
- `QT_QPA_PLATFORM=wayland;xcb` - Tell Qt applications to use the Wayland backend, and fall back to x11 if Wayland is unavailable
- `QT_WAYLAND_DISABLE_WINDOWDECORATION=1` - Disables window decorations on Qt applications
- `QT_QPA_PLATFORMTHEME=qt5ct` - Tells Qt based applications to pick your theme from qt5ct, use with Kvantum.
- `QT_AUTO_SCREEN_SCALE_FACTOR=1` -
[(From the Qt documentation)](https://doc.qt.io/qt-5/highdpi.html) enables
automatic scaling, based on the monitor's pixel density
- `QT_QPA_PLATFORM=wayland;xcb` - Tell Qt applications to use the Wayland
backend, and fall back to x11 if Wayland is unavailable
- `QT_WAYLAND_DISABLE_WINDOWDECORATION=1` - Disables window decorations on Qt
applications
- `QT_QPA_PLATFORMTHEME=qt5ct` - Tells Qt based applications to pick your theme
from qt5ct, use with Kvantum.
# NVIDIA Specific
## NVIDIA Specific
To force GBM as a backend, set the following environment variables:
- `GBM_BACKEND=nvidia-drm`
- `__GLX_VENDOR_LIBRARY_NAME=nvidia`
> See [Archwiki Wayland Page](https://wiki.archlinux.org/title/Wayland#Requirements) for more details on those variables.
> See
> [Archwiki Wayland Page](https://wiki.archlinux.org/title/Wayland#Requirements)
> for more details on those variables.
- `LIBVA_DRIVER_NAME=nvidia` - Hardware acceleration on NVIDIA GPUs
> See [Archwiki Hardware Acceleration Page](https://wiki.archlinux.org/title/Hardware_video_acceleration)
> See
> [Archwiki Hardware Acceleration Page](https://wiki.archlinux.org/title/Hardware_video_acceleration)
> for details and necessary values before setting this variable.
- `__GL_GSYNC_ALLOWED` - Controls if G-Sync capable monitors should use Variable Refresh Rate (VRR)
- `__GL_GSYNC_ALLOWED` - Controls if G-Sync capable monitors should use Variable
Refresh Rate (VRR)
> See [Nvidia Documentation](https://download.nvidia.com/XFree86/Linux-32bit-ARM/375.26/README/openglenvvariables.html) for details.
> See
> [Nvidia Documentation](https://download.nvidia.com/XFree86/Linux-32bit-ARM/375.26/README/openglenvvariables.html)
> for details.
- `__GL_VRR_ALLOWED` - Controls if Adaptive Sync should be used. Recommended to set as "0" to avoid having problems on some games.
- `__GL_VRR_ALLOWED` - Controls if Adaptive Sync should be used. Recommended to
set as "0" to avoid having problems on some games.
- `WLR_DRM_NO_ATOMIC=1` - use legacy DRM interface instead of atomic mode setting. Might fix flickering issues.
- `WLR_DRM_NO_ATOMIC=1` - use legacy DRM interface instead of atomic mode
setting. Might fix flickering issues.
# Theming Related Variables
## Theming Related Variables
- `GTK_THEME` - Set a GTK theme manually, for those who want to avoid appearance tools such as lxappearance or nwg-look
- `XCURSOR_THEME` - Set your cursor theme. The theme needs to be installed and readable by your user.
- `XCURSOR_SIZE` - Set cursor size. See [here](../../FAQ/) for why you might want this variable set.
- `GTK_THEME` - Set a GTK theme manually, for those who want to avoid appearance
tools such as lxappearance or nwg-look
- `XCURSOR_THEME` - Set your cursor theme. The theme needs to be installed and
readable by your user.
- `XCURSOR_SIZE` - Set cursor size. See [here](../../faq/) for why you might
want this variable set.

View file

@ -1,37 +1,49 @@
This page houses links to a few repositories with beautiful Hyprland configurations
for you to get inspired from or learn how to configure Hyprland from
a more tangible example.
---
weight: 18
title: Example configurations
---
This page houses links to a few repositories with beautiful Hyprland
configurations for you to get inspired from or learn how to configure Hyprland
from a more tangible example.
### end_4
![](https://camo.githubusercontent.com/5ca3a06db6bcbec4b51448a6989c941d76b4dcac2e150452a45ae913793adfe9/68747470733a2f2f63646e2e646973636f72646170702e636f6d2f6174746163686d656e74732f313039313536393837323533353831343138352f313130373637353836363130313732333237372f73637265656e73686f742d73756d6d65722e706e67)
[https://github.com/end-4/dots-hyprland/tree/summer-gruv](https://github.com/end-4/dots-hyprland/tree/summer-gruv)
### fufexan
![](https://user-images.githubusercontent.com/36706276/192147190-cf9cf4df-94cb-4a3b-b9d8-137ed0c2538f.png)
[https://github.com/fufexan/dotfiles](https://github.com/fufexan/dotfiles)
### linuxmobile
![](https://i.ibb.co/kGrhpKd/68747470733a2f2f692e696d6775722e636f6d2f553173336a69372e706e67.png)
[https://github.com/linuxmobile/hyprland-dots](https://github.com/linuxmobile/hyprland-dots)
### flick0
![](https://raw.githubusercontent.com/flick0/dotfiles/aurora/assets/fetch.png)
[https://github.com/flick0/dotfiles](https://github.com/flick0/dotfiles)
### iamverysimp1e
![](https://github.com/iamverysimp1e/dots/raw/main/ScreenShots/HyprLand/Rice1.png)
[https://github.com/iamverysimp1e/dots](https://github.com/iamverysimp1e/dots)
### notusknot
![](https://github.com/notusknot/dotfiles-nix/raw/main/pics/screenshot.png)
[https://github.com/notusknot/dotfiles-nix](https://github.com/notusknot/dotfiles-nix)
### coffebar
![](https://github.com/coffebar/dotfiles/raw/6a5d595c594f108cd10219df08d338e98e1d2d7d/screenshot.png)
[https://github.com/coffebar/dotfiles](https://github.com/coffebar/dotfiles)

View file

@ -1,13 +1,17 @@
---
weight: 13
title: Expanding functionality
---
Hyprland exposes two powerful sockets for you to use.
The first, socket1, can be fully controlled with `hyprctl`, see its usage
[here](../Using-hyprctl).
[here](../using-hyprctl).
The second, socket2, sends events for certain changes / actions and can be used
to react to different events. See its description
[here](../../IPC/).
to react to different events. See its description [here](../../ipc/).
# Example script
## Example script
This bash script will change the outer gaps to 20 if the currently focused
monitor is DP-1, and 30 otherwise.

View file

@ -1,9 +1,15 @@
Keywords are not variables, but "commands" for more advanced configuring. On this
page, you will be presented with some that do not deserve their own page.
---
weight: 3
title: Keywords
---
See the sidebar for more keywords to control binds, animations, monitors, et cetera.
Keywords are not variables, but "commands" for more advanced configuring. On
this page, you will be presented with some that do not deserve their own page.
{{< hint type=important >}}
See the sidebar for more keywords to control binds, animations, monitors, et
cetera.
{{< callout >}}
Please remember, that for ALL arguments separated by a comma, if you want to
leave one of them empty, you cannot reduce the number of commas, _unless told
@ -19,13 +25,9 @@ three_param_keyword = A, , C # OK
three_param_keyword = A, B, # OK
```
{{< /hint >}}
{{< /callout >}}
# Table of contents
{{< toc format=html >}}
# Executing
## Executing
you can execute a shell script on startup of the compositor or on each time it's
reloaded.
@ -34,7 +36,7 @@ reloaded.
`exec=command` will execute on each reload
# Defining variables
## Defining variables
You can define your own custom variables like this:
@ -60,7 +62,7 @@ You ARE allowed to do this:
col.active_border=ff$MyRedValue1111
```
# Sourcing (multi-file)
## Sourcing (multi-file)
Use the `source` keyword to source another file.
@ -75,14 +77,14 @@ And Hyprland will enter that file and parse it like a Hyprland config.
Please note it's LINEAR. Meaning lines above the `source=` will be parsed first,
then lines inside `~/.config/hypr/myColors.conf`, then lines below.
# Gestures
## Gestures
Use something like
[libinput-gestures](https://github.com/bulletmark/libinput-gestures), with
`hyprctl` if you want to expand Hyprland's gestures beyond what's offered in
[Variables](../Variables).
[Variables](../variables).
# Per-device input configs
## Per-device input configs
Per-device config options will overwrite your options set in the `input`
section. It's worth noting that ONLY values explicitly changed will be
@ -111,10 +113,11 @@ touchdevice:transform -> transform
touchdevice:output -> output
```
You can also use the `output` setting for tablets to bind them to outputs. Remember to
use the name of the `Tablet` and not `Tablet Pad` or `Tablet tool`.
You can also use the `output` setting for tablets to bind them to outputs.
Remember to use the name of the `Tablet` and not `Tablet Pad` or `Tablet tool`.
Additional properties only present in per-device configs:
```plain
enabled -> (only for mice / touchpads / touchdevices / keyboards) enables / disables the device (connects / disconnects from the on-screen cursor) - default: Enabled
```
@ -130,25 +133,28 @@ device {
}
```
{{< hint type=info >}}
{{< callout type=info >}}
Per-device layouts will by default not alter the keybind keymap, so for example with a global keymap of `us`
and a per-device one of `fr`, the keybinds will still act as if you were on `us`.
You can change this behavior by setting `resolve_binds_by_sym = 1`.
In that case you'll need to type the symbol specified in the bind to activate it.
{{< /hint >}}
# Wallpapers
{{< /callout >}}
## Wallpapers
The hyprland background you see when you first start Hyprland is **NOT A
WALLPAPER**, it's the default image rendered at the bottom of the render stack.
To set a wallpaper, use a wallpaper utility like
[hyprpaper](https://github.com/hyprwm/hyprpaper) or [swaybg](https://github.com/swaywm/swaybg).
[hyprpaper](https://github.com/hyprwm/hyprpaper) or
[swaybg](https://github.com/swaywm/swaybg).
More can be found in [Useful Utilities](../../Useful-Utilities).
More can be found in [Useful Utilities](../../useful-utilities).
# Blurring layerSurfaces
## Blurring layerSurfaces
LayerSurfaces are not windows. These are for example: Your wallpapers,
notification overlays, bars, etc.
@ -175,32 +181,44 @@ For example:
layerrule = unset,NAMESPACE
```
# Setting the environment
## Setting the environment
{{< hint type=note >}}
The `env` keyword works just like `exec-once`, meaning it will only fire once on Hyprland's launch.
{{< /hint >}}
{{< callout type=info >}}
The `env` keyword works just like `exec-once`, meaning it will only fire once on
Hyprland's launch.
{{< /callout >}}
You can use the `env` keyword to set environment variables at Hyprland's start,
e.g.:
You can use the `env` keyword to set environment variables at Hyprland's start, e.g.:
```ini
env = XCURSOR_SIZE,24
```
You can also add a `d` flag if you want the env var to be exported to D-Bus (systemd only)
You can also add a `d` flag if you want the env var to be exported to D-Bus
(systemd only)
```ini
envd = XCURSOR_SIZE,24
```
{{< hint type=important >}}
Hyprland puts the raw string to the envvar. You should _not_ add quotes around the values.
{{< callout >}}
Hyprland puts the raw string to the envvar. You should _not_ add quotes around
the values.
e.g.:
```ini
env = QT_QPA_PLATFORM,wayland
```
and ***NOT***
and _**NOT**_
```ini
env = QT_QPA_PLATFORM,"wayland"
```
{{< /hint >}}
{{< /callout >}}

View file

@ -1,15 +1,21 @@
The master layout makes one (or more) window(s) be the "master", taking (by default) the left part of the
screen, and tiles the rest on the right. You can change the orientation on per-workspace basis
if you want to use anything other than the default left/right split.
---
weight: 11
title: Master Layout
---
The master layout makes one (or more) window(s) be the "master", taking (by
default) the left part of the screen, and tiles the rest on the right. You can
change the orientation on per-workspace basis if you want to use anything other
than the default left/right split.
![master1](https://user-images.githubusercontent.com/43317083/179357849-321f042c-f536-44b3-9e6f-371df5321836.gif)
# Config
## Config
_category name `master`_
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| allow_small_split | enable adding additional master windows in a horizontal split style | bool | false |
| special_scale_factor | the scale of the special workspace windows. [0.0 - 1.0] | float | 1 |
| mfact | master split factor, the ratio of master split [0.0 - 1.0] | float | 0.55 |
@ -20,10 +26,9 @@ _category name `master`_
| inherit_fullscreen | inherit fullscreen status when cycling/swapping to another window (e.g. monocle layout) | bool | true |
| always_center_master | when using orientation=center, keep the master window centered, even when it is the only window in the workspace. | bool | false |
| smart_resizing | if enabled, resizing direction will be determined by the mouse's position on the window (nearest to which corner). Else, it is based on the window's tiling position. | bool | true |
| drop_at_cursor | when enabled, dragging and dropping windows will put them at the cursor position. Otherwise, when dropped at the stack side, they will go to the top/bottom of the stack depending on new_on_top. | bool | true |
| drop_at_cursor | when enabled, dragging and dropping windows will put them at the cursor position. Otherwise, when dropped at the stack side, they will go to the top/bottom of the stack depending on new_on_top. | bool | true |
# Dispatchers
## Dispatchers
`layoutmsg` commands:
@ -51,7 +56,8 @@ _category name `master`_
params for the commands are separated by a single space
{{< hint type=info >}}
{{< callout type=info >}}
example usage:
```ini
@ -60,15 +66,13 @@ bind=MOD,KEY,layoutmsg,cyclenext
bind=MOD,KEY,layoutmsg,swapwithmaster master
```
{{< /hint >}}
{{< /callout >}}
## Workspace Rules
# Workspace Rules
`layoutopt` rules:
| rule | description | type |
| --- | --- | --- |
| orientation:[o] | Sets the orientation of a workspace. For available orientations, see [Config->orientation](#config) | string |
`layoutopt` rules: | rule | description | type | | --- | --- | --- | |
orientation:[o] | Sets the orientation of a workspace. For available
orientations, see [Config->orientation](#config) | string |
Example usage:

View file

@ -1,8 +1,9 @@
# Table of contents
---
weight: 4
title: Monitors
---
{{< toc format=html >}}
# General
## General
The general config of a monitor looks like this
@ -16,8 +17,8 @@ A common example:
monitor=DP-1,1920x1080@144,0x0,1
```
will tell Hyprland to make the monitor on `DP-1` a `1920x1080` display, at 144Hz,
`0x0` off from the top left corner, with a scale of 1 (unscaled).
will tell Hyprland to make the monitor on `DP-1` a `1920x1080` display, at
144Hz, `0x0` off from the top left corner, with a scale of 1 (unscaled).
To list all available monitors (active and inactive):
@ -25,36 +26,41 @@ To list all available monitors (active and inactive):
hyprctl monitors all
```
Monitors are positioned on a virtual "layout". The `position` is the position of
Monitors are positioned on a virtual "layout". The `position` is the position of
said display in the layout. (calculated from the top-left corner)
For example:
```ini
monitor=DP-1, 1920x1080, 0x0, 1
monitor=DP-2, 1920x1080, 1920x0, 1
```
will tell hyprland to make DP-1 on the _left_ of DP-2, while
```ini
monitor=DP-1, 1920x1080, 1920x0, 1
monitor=DP-2, 1920x1080, 0x0, 1
```
will tell hyprland to make DP-1 on the _right_.
The `position` may contain _negative_ values, so the above example could also be
written as
```ini
monitor=DP-1, 1920x1080, 0x0, 1
monitor=DP-2, 1920x1080, -1920x0, 1
```
{{< hint type=tip >}}
{{< callout type=info >}}
The position is calculated with the scaled (and transformed) resolution, meaning if
you want your 4K monitor with scale 2 to the left of your 1080p one, you'd use
the position `1920x0` for the second screen. (3840 / 2)
If the monitor is also rotated 90 degrees (vertical), you'd use `1080x0`.
The position is calculated with the scaled (and transformed) resolution, meaning
if you want your 4K monitor with scale 2 to the left of your 1080p one, you'd
use the position `1920x0` for the second screen. (3840 / 2) If the monitor is
also rotated 90 degrees (vertical), you'd use `1080x0`.
{{</ hint >}}
{{</ callout >}}
Leaving the name empty will define a fallback rule to use when no other rules
match.
@ -62,8 +68,8 @@ match.
You can use `preferred` as a resolution to use the display's preferred size and
`auto` as a position to let Hyprland decide on a position for you.
You can also use `auto` as a scale to let Hyprland decide on a scale for you. These
depend on the PPI of the monitor.
You can also use `auto` as a scale to let Hyprland decide on a scale for you.
These depend on the PPI of the monitor.
Recommended rule for quickly plugging in random monitors:
@ -89,9 +95,9 @@ for a focus on resolution this:
monitor=,highres,auto,1
```
For more specific rules, you can also use the output's description
(see `hyprctl monitors` for more details).
If the output of `hyprctl monitors` looks like the following:
For more specific rules, you can also use the output's description (see
`hyprctl monitors` for more details). If the output of `hyprctl monitors` looks
like the following:
```
Monitor eDP-1 (ID 0):
@ -102,8 +108,8 @@ Monitor eDP-1 (ID 0):
[...]
```
then the `description` value up to the portname `(eDP-1)` can be used
to specify the monitor:
then the `description` value up to the portname `(eDP-1)` can be used to specify
the monitor:
```
monitor=desc:Chimei Innolux Corporation 0x150C,preferred,auto,1.5
@ -111,15 +117,16 @@ monitor=desc:Chimei Innolux Corporation 0x150C,preferred,auto,1.5
Remember to remove the `(portname)`!
## Custom modelines
### Custom modelines
You can set up a custom modeline by changing the resolution field to a modeline, for example:
You can set up a custom modeline by changing the resolution field to a modeline,
for example:
```
monitor = DP-1, modeline 1071.101 3840 3848 3880 3920 2160 2263 2271 2277 +hsync -vsync, 0x0, 1
```
## Disabling a monitor
### Disabling a monitor
To disable a monitor, use
@ -127,15 +134,16 @@ To disable a monitor, use
monitor=name,disable
```
{{< hint type=tip >}}
{{< callout >}}
Disabling a monitor will literally remove it from the layout, moving all windows and workspaces
to any remaining ones. If you want to disable your monitor in a screensaver style (just turn
off the monitor) use the `dpms` [dispatcher](../Dispatchers).
Disabling a monitor will literally remove it from the layout, moving all windows
and workspaces to any remaining ones. If you want to disable your monitor in a
screensaver style (just turn off the monitor) use the `dpms`
[dispatcher](../dispatchers).
{{</ hint >}}
{{</ callout >}}
# Custom reserved area
## Custom reserved area
If your workflow requires custom reserved area, you can add it with
@ -147,18 +155,20 @@ Where `TOP` `BOTTOM` `LEFT` `RIGHT` are integers in pixels of the reserved area
to add. This does stack on top of the calculated one, (e.g. bars) but you may
only use one of these rules per monitor in the config.
# Extra args
## Extra args
You can combine extra arguments at the end of the monitor rule, examples:
```ini
monitor=eDP-1,2880x1800@90,0x0,1,transform,1,mirror,DP-2,bitdepth,10
```
See bellow for more detail about each argument.
## Mirrored displays
### Mirrored displays
If you want to mirror a display, add a `,mirror,[NAME]` at the end of the monitor
rule, examples:
If you want to mirror a display, add a `,mirror,[NAME]` at the end of the
monitor rule, examples:
```ini
monitor=DP-3,1920x1080@60,0x0,1,mirror,DP-2
@ -170,30 +180,36 @@ second monitor, so if mirroring a 1080p screen onto a 4K one, the resolution
will still be 1080p on the 4K display. This also means squishing and stretching
will occur on non-matching resolutions.
## 10 bit support
### 10 bit support
If you want to enable 10 bit support for your display, add a `,bitdepth,10` at
the end of the monitor rule, e.g.:
If you want to enable 10 bit support for your display, add a `,bitdepth,10` at the
end of the monitor rule, e.g.:
```ini
monitor=eDP-1,2880x1800@90,0x0,1,bitdepth,10
```
**NOTE** Colors registered in Hyprland (e.g. the border color) do _not_support 10 bit.
**NOTE** Colors registered in Hyprland (e.g. the border color) do _not_support
10 bit.
**NOTE** Some applications do _not_support screen capture with 10 bit enabled.
## VRR
### VRR
Per-display VRR can be done by adding `,vrr,X` where `X` is the mode from the [variables page](../Variables).
Per-display VRR can be done by adding `,vrr,X` where `X` is the mode from the
[variables page](../variables).
# Rotating
## Rotating
If you want to rotate a monitor, add a `,transform,X` at the end of the monitor
rule, where `X` corresponds to a transform number, e.g.:
If you want to rotate a monitor, add a `,transform,X` at the end
of the monitor rule, where `X` corresponds to a transform number, e.g.:
```ini
monitor=eDP-1,2880x1800@90,0x0,1,transform,1
```
Transform list:
```ini
normal (no transforms) -> 0
90 degrees -> 1
@ -205,8 +221,10 @@ flipped + 180 degrees -> 6
flipped + 270 degrees -> 7
```
{{< hint type=note >}}
If you're using a touchscreen, you'll also have to rotate its digitizer to match:
{{< callout type=info >}}
If you're using a touchscreen, you'll also have to rotate its digitizer to
match:
```ini
input {
@ -216,13 +234,15 @@ input {
}
```
This will be done automatically when [#3544](https://github.com/hyprwm/Hyprland/pull/3544) lands.
{{< /hint >}}
This will be done automatically when
[#3544](https://github.com/hyprwm/Hyprland/pull/3544) lands.
# Default workspace
{{< /callout >}}
See [Workspace Rules](../Workspace-Rules).
## Default workspace
## Binding workspaces to a monitor
See [Workspace Rules](../workspace-rules).
See [Workspace Rules](../Workspace-Rules).
### Binding workspaces to a monitor
See [Workspace Rules](../workspace-rules).

View file

@ -1,18 +1,18 @@
# Table of contents
---
weight: 16
title: Multi-GPU
---
{{< toc >}}
# General
## General
If your host machine uses multiple GPUs, you may want to primarily use one GPU
for rendering all the elements for Hyprland including windows, animations, and
another for hardware acceleration for certain applications, etc.
This setup is very common in the likes of gaming laptops,
GPU-passthrough (without VFIO) capable hosts, and if you have multiple GPUs in
general.
This setup is very common in the likes of gaming laptops, GPU-passthrough
(without VFIO) capable hosts, and if you have multiple GPUs in general.
# Detecting GPUs
## Detecting GPUs
For this case, the writer is taking the example of their laptop.
@ -23,6 +23,7 @@ available.
01:00.0 VGA compatible controller: NVIDIA Corporation TU117M [GeForce GTX 1650 Mobile / Max-Q] (rev a1)
06:00.0 VGA compatible controller: Advanced Micro Devices, Inc. [AMD/ATI] Cezanne [Radeon Vega Series / Radeon Vega Mobile Series] (rev c6)
```
Here it is clear that 2 GPUs are available, the dedicated NVIDIA GTX 1650 Mobile
/ Max-Q and the integrated AMD Cezanne Radeon Vega Series GPU.
@ -39,12 +40,12 @@ lrwxrwxrwx 1 root root 13 Jul 14 15:45 pci-0000:06:00.0-render -> ../renderD129
So from the above outputs, we can match the bus IDs and determine that NVIDIA is
`card0` and AMD is `card1`.
# Telling Hyprland which GPU to use
## Telling Hyprland which GPU to use
After determining which "card" belongs to which GPU, we now have to tell
Hyprland the GPU we want to use primarily.
{{< hint type=info >}}
{{< callout type=info >}}
It is generally a good idea for laptops to use the integrated GPU as the primary
renderer as this preserves battery life and is practically indistinguishable
@ -52,7 +53,7 @@ from using the dedicated GPU on modern systems in most cases. Hyprland can be
run on integrated GPUs just fine. The same principle applies for desktop setups
with a lower and higher power rating GPUs respectively.
{{< /hint >}}
{{< /callout >}}
We can do so by using the `WLR_DRM_DEVICES` variable.
@ -62,7 +63,7 @@ Add the following template to `hyprland.conf`
env = WLR_DRM_DEVICES,/dev/dri/cardN
```
For our case, we want to use `card1` primarily and use it to render stuff.
For our case, we want to use `card1` primarily and use it to render stuff.
```ini
env = WLR_DRM_DEVICES,/dev/dri/card1:/dev/dri/card0

View file

@ -1,22 +1,36 @@
This page documents known tricks and fixes to boost performance if by any chance you stumble upon problems or you do not care that much about animations.
---
weight: 19
title: Performance
---
# Fractional scaling
This page documents known tricks and fixes to boost performance if by any chance
you stumble upon problems or you do not care that much about animations.
Wayland fractional scaling is a lot better than before, but it is not perfect. Some applications do not support it yet or the support is experimental at best. If you have problems with your graphics card having high usage and hyprland feeling laggy then try setting the scaling to integer numbers such as `1` or `2` like in this example `monitor=,preferred,auto,2`.
## Fractional scaling
# Low FPS/stutter/FPS drops on Intel iGPU with TLP (mainly laptops)
Wayland fractional scaling is a lot better than before, but it is not perfect.
Some applications do not support it yet or the support is experimental at best.
If you have problems with your graphics card having high usage and hyprland
feeling laggy then try setting the scaling to integer numbers such as `1` or `2`
like in this example `monitor=,preferred,auto,2`.
The TLP defaults are rather aggressive, setting `INTEL_GPU_MIN_FREQ_ON_AC` and/or `INTEL_GPU_MIN_FREQ_ON_BAT` in `/etc/tlp.conf` to something slightly higher (e.g. to 500 from 300) will reduce stutter significantly or, in the best case, remove it completely.
## Low FPS/stutter/FPS drops on Intel iGPU with TLP (mainly laptops)
# How do I make Hyprland draw as little power as possible on my laptop?
The TLP defaults are rather aggressive, setting `INTEL_GPU_MIN_FREQ_ON_AC`
and/or `INTEL_GPU_MIN_FREQ_ON_BAT` in `/etc/tlp.conf` to something slightly
higher (e.g. to 500 from 300) will reduce stutter significantly or, in the best
case, remove it completely.
## How do I make Hyprland draw as little power as possible on my laptop?
**_Useful Optimizations_**:
* `decoration:blur = false` and `decoration:drop_shadow = false` to disable
fancy but battery hungry effects.
- `decoration:blur = false` and `decoration:drop_shadow = false` to disable
fancy but battery hungry effects.
* `misc:vfr = true`, since it'll lower the amount of sent frames when nothing is happening on-screen.
- `misc:vfr = true`, since it'll lower the amount of sent frames when nothing is
happening on-screen.
# My games work poorly, especially proton ones
## My games work poorly, especially proton ones
Use `gamescope`, tends to fix any and all issues with wayland/Hyprland.

View file

@ -1,17 +1,29 @@
---
weight: 10
title: Tearing
---
Screen tearing is used to reduce latency and/or jitter in games.
## Enabling tearing
To enable tearing:
- Set `general:allow_tearing` to `true`. This is a "master toggle"
- Add `env = WLR_DRM_NO_ATOMIC,1` to your Hyprland config. This disables the usage of a newer kernel DRM API that doesn't support tearing yet.
- Add an `immediate` windowrule to your game of choice. This makes sure that Hyprland will tear it.
{{< hint type=note >}}
Please note that tearing will only be in effect when the game is in fullscreen and the only thing visible on the screen.
{{< /hint >}}
- Set `general:allow_tearing` to `true`. This is a "master toggle"
- Add `env = WLR_DRM_NO_ATOMIC,1` to your Hyprland config. This disables the
usage of a newer kernel DRM API that doesn't support tearing yet.
- Add an `immediate` windowrule to your game of choice. This makes sure that
Hyprland will tear it.
{{< callout >}}
Please note that tearing will only be in effect when the game is in fullscreen
and the only thing visible on the screen.
{{< /callout >}}
Example snippet:
```env
general {
allow_tearing = true
@ -22,46 +34,62 @@ env = WLR_DRM_NO_ATOMIC,1
windowrulev2 = immediate, class:^(cs2)$
```
{{< hint type=note >}}
`env = WLR_DRM_NO_ATOMIC,1` is not recommended. If your kernel ver is >= 6.8, you can remove it.
{{< callout >}}
`env = WLR_DRM_NO_ATOMIC,1` is not recommended. If your kernel ver is >= 6.8,
you can remove it.
For kernels < 6.8, this env is required.
Check your kernel version with `uname -r`.
{{< /hint >}}
{{< hint type=warning >}}
If you experience graphical issues, you may be out of luck. Tearing support is experimental.
{{< /callout >}}
{{< callout type=warning >}}
If you experience graphical issues, you may be out of luck. Tearing support is
experimental.
See the likely culprits below.
{{< /hint >}}
{{< /callout >}}
## Common issues
### No tearing at all
Make sure your windowrules are matching and you have the master toggle enabled.
Also make sure nothing except for your game is showing on your monitor. No notifications, overlays, lockscreens,
bars, other windows, etc. (on a different monitor is fine)
Also make sure nothing except for your game is showing on your monitor. No
notifications, overlays, lockscreens, bars, other windows, etc. (on a different
monitor is fine)
### Apps that should tear, freeze
Almost definitely means your GPU driver does not support tearing, like e.g. Intel's.
Almost definitely means your GPU driver does not support tearing, like e.g.
Intel's.
Please _do not_ report issues if this is the culprit.
### Graphical artifacts (random colorful pixels, etc)
Likely issue with your graphics driver.
Please _do not_ report issues if this is the culprit. Unfortunately, it's most likely your GPU driver's fault.
Please _do not_ report issues if this is the culprit. Unfortunately, it's most
likely your GPU driver's fault.
Could be the below as well
### Other graphical issues
### Other graphical issues
or
### Hyprland instantly crashes on launch
Likely issue with `WLR_DRM_NO_ATOMIC`.
NO_ATOMIC forces the use of a legacy, less tested drm API.
Please _do not_ report issues if this is the culprit. Unfortunately, you will have to wait for the Linux kernel to support
tearing page flips on the atomic API.
Please _do not_ report issues if this is the culprit. Unfortunately, you will
have to wait for the Linux kernel to support tearing page flips on the atomic
API.

View file

@ -1,6 +1,12 @@
# Switchable keyboard layouts
---
weight: 17
title: Uncommon tips & tricks
---
The easiest way to accomplish this is to set this using XKB settings, for example:
## Switchable keyboard layouts
The easiest way to accomplish this is to set this using XKB settings, for
example:
```
input {
@ -9,11 +15,12 @@ input {
}
```
{{< hint type=important >}}
{{< callout >}}
The first layout defined in the input section will be the one used for binds by default.
For example: `us,ua` -> config binds would be e.g. `SUPER, A`, while on `ua,us` -> `SUPER, Cyrillic_ef`
For example: `us,ua` -> config binds would be e.g. `SUPER, A`, while on `ua,us`
-> `SUPER, Cyrillic_ef`
You can change this behavior globally or per-device by setting `resolve_binds_by_sym = 1`.
In that case, binds will activate when the symbol typed matches the symbol specified in the bind.
@ -22,25 +29,28 @@ For example: if your layouts are `us,fr` and have a bind for `SUPER, A` you'd ne
first letter on the second row while the `us` layout is active and the first letter on the first row
while the `fr` layout is active.
{{< /hint >}}
{{< /callout >}}
You can also bind a key to execute `hyprctl switchxkblayout` for more keybind freedom.
See [Using hyprctl](../Using-hyprctl).
You can also bind a key to execute `hyprctl switchxkblayout` for more keybind
freedom. See [Using hyprctl](../Using-hyprctl).
To find the valid layouts and `kb_options`, you can check out the `/usr/share/X11/xkb/rules/base.lst`. For example:
To find the valid layouts and `kb_options`, you can check out the
`/usr/share/X11/xkb/rules/base.lst`. For example:
To get the layout name of a language:
```sh
grep -i 'persian' /usr/share/X11/xkb/rules/base.lst
```
To get the list of keyboard shortcuts you can put in the `kb_options` to toggle keyboard layouts:
To get the list of keyboard shortcuts you can put in the `kb_options` to toggle
keyboard layouts:
```sh
grep 'grp:.*toggle' /usr/share/X11/xkb/rules/base.lst
```
# Disabling keybinds with one master keybind
## Disabling keybinds with one master keybind
If you want to disable all keybinds with another keybind (make a keybind toggle
of sorts) you can just use a submap with only a keybind to exit it.
@ -51,7 +61,8 @@ submap=clean
bind=MOD,KEY,submap,reset
submap=reset
```
# Remap Caps-Lock to Ctrl
## Remap Caps-Lock to Ctrl
```
input {
@ -59,7 +70,7 @@ input {
}
```
# Swap Caps-Lock and Escape
## Swap Caps-Lock and Escape
```
input {
@ -67,10 +78,11 @@ input {
}
```
# Minimize Steam instead of killing
## Minimize Steam instead of killing
Steam will exit entirely when it's last window is closed using the `killactive` dispatcher.
To minimize Steam to tray, use the following script to close applications:
Steam will exit entirely when it's last window is closed using the `killactive`
dispatcher. To minimize Steam to tray, use the following script to close
applications:
```sh
if [ "$(hyprctl activewindow -j | jq -r ".class")" = "Steam" ]; then
@ -80,14 +92,15 @@ else
fi
```
# Window Dancing
## Window Dancing
Some XWayland games like Rhythm Doctor and Friday Night Funkin' mods like to move
the windows by themselves, but that often doesn't work by default.
Some XWayland games like Rhythm Doctor and Friday Night Funkin' mods like to
move the windows by themselves, but that often doesn't work by default.
For example, if you want to configure Rhythm Doctor, you'd have to:
1. Set input rules
```ini
input {
# ...
@ -109,9 +122,11 @@ Click the GIF below to see a full demo video
[![Demo GIF of Rhythm Doctor](https://cdn.discordapp.com/attachments/810799100940255260/1032843745864986644/ezgif.com-gif-maker18.gif)](https://pool.jortage.com/voringme/misskey/565b9dfb-125f-4ea0-9257-b371cb4c7195.mp4)
## Shimeji
### Shimeji
To use Shimeji programs like [this](https://codeberg.org/thatonecalculator/spamton-linux-shimeji), set the following rules:
To use Shimeji programs like
[this](https://codeberg.org/thatonecalculator/spamton-linux-shimeji), set the
following rules:
```ini
windowrule=float, com-group_finity-mascot-Main
@ -121,19 +136,21 @@ windowrule=noshadow, com-group_finity-mascot-Main
windowrule=noborder, com-group_finity-mascot-Main
```
{{< hint >}}
{{< callout type=info >}}
The app indicator probably won't show, so you'll have to `killall -9 java` to kill them.
The app indicator probably won't show, so you'll have to `killall -9 java` to
kill them.
{{< /hint >}}
{{< /callout >}}
![Demo GIF of Spamton Shimeji](https://media.discordapp.net/attachments/810799100940255260/1032846469855727656/ezgif.com-gif-maker19.gif)
# Toggle animations/blur/etc hotkey
## Toggle animations/blur/etc hotkey
For increased performance in games, or for less distractions at a keypress
1. create file `~/.config/hypr/gamemode.sh && chmod +x ~/.config/hypr/gamemode.sh` and add:
1. create file
`~/.config/hypr/gamemode.sh && chmod +x ~/.config/hypr/gamemode.sh` and add:
```bash
#!/usr/bin/env sh
@ -152,7 +169,8 @@ fi
hyprctl reload
```
Edit to your liking of course. If animations are enabled, it disables all the pretty stuff. Otherwise, the script reloads your config to grab your defaults.
Edit to your liking of course. If animations are enabled, it disables all the
pretty stuff. Otherwise, the script reloads your config to grab your defaults.
2. Add this to your `hyprland.conf`:

View file

@ -1,3 +1,8 @@
---
weight: 12
title: Using hyprctl
---
`hyprctl` is a utility for controlling some parts of the compositor from a CLI
or a script. If you install with `make install`, or any package, it should
automatically be installed.
@ -8,18 +13,15 @@ the terminal.
If it's not, go to the repo root and `/hyprctl`. Issue a `make all` and then
`sudo cp ./hyprctl /usr/bin`.
# Using Hyprctl
{{< callout type=warning >}}
{{< hint type=warning >}}
_hyprctl_ calls will be dispatched by the compositor _synchronously_, meaning
any spam of the utility will cause slowdowns. It's recommended to use `--batch`
for many control calls, and limiting the amount of info calls.
_hyprctl_ calls will be dispatched by the compositor _synchronously_,
meaning any spam of the utility will cause slowdowns.
It's recommended to use `--batch` for many control calls, and
limiting the amount of info calls.
For live event handling, see the [socket2](../../ipc/).
For live event handling, see the [socket2](../../IPC/).
{{< /hint >}}
{{< /callout >}}
## Commands
@ -95,15 +97,17 @@ params: `create` or `remove` and `backend` or `name` respectively.
For _create_:
pass a backend name: `wayland`, `x11`, `headless` or `auto`. On a _real_ hyprland
session, if you're looking for a VNC / RDP type thing, it's 99% going to be `headless`.
pass a backend name: `wayland`, `x11`, `headless` or `auto`. On a _real_
hyprland session, if you're looking for a VNC / RDP type thing, it's 99% going
to be `headless`.
For _remove_:
pass the output's name, as found in `hyprctl monitors`. Please be aware you are _not_
allowed to remove real displays with this command.
pass the output's name, as found in `hyprctl monitors`. Please be aware you are
_not_ allowed to remove real displays with this command.
e.g.:
```ini
# will create a 1920x1080 headless display, for example to use with RDP.
hyprctl output create headless
@ -117,6 +121,7 @@ hyprctl output remove HEADLESS-1
Sets the xkb layout index for a keyboard.
For example, if you set:
```ini
device:my-epic-keyboard-v1 {
kb_layout=us,pl,de
@ -128,9 +133,10 @@ You can use this command to switch between them.
```sh
hyprctl switchxkblayout [DEVICE] [CMD]
```
where `CMD` is either `next` for next, `prev` for previous, or `ID`
for a specific one (in the above case, `us`: 0, `pl`: 1, `de`: 2).
You can find the `DEVICE` using `hyprctl devices` command.
where `CMD` is either `next` for next, `prev` for previous, or `ID` for a
specific one (in the above case, `us`: 0, `pl`: 1, `de`: 2). You can find the
`DEVICE` using `hyprctl devices` command.
example command for a typical keyboard:
@ -138,9 +144,12 @@ example command for a typical keyboard:
hyprctl switchxkblayout at-translated-set-2-keyboard next
```
{{< hint >}}
{{< callout type=info >}}
If you want a single variant ie. pl/dvorak on one layout but us/qwerty on the other, xkb parameters can still be blank, however the amount of comma-separated parameters have to match. Alternatively, a single parameter can be specified for it to apply to all three.
If you want a single variant ie. pl/dvorak on one layout but us/qwerty on the
other, xkb parameters can still be blank, however the amount of comma-separated
parameters have to match. Alternatively, a single parameter can be specified for
it to apply to all three.
```ini
input {
@ -150,7 +159,7 @@ input {
}
```
{{< /hint >}}
{{< /callout >}}
### seterror
@ -161,14 +170,16 @@ hyprctl seterror 'rgba(66ee66ff)' hello world this is my problem
```
or disable:
```sh
hyprctl seterror disable
```
### setprop
Sets a window prop. Can be locked by adding `lock` at the end. If `lock` is not added,
will be unlocked. Locking means a dynamic windowrule _cannot_ override this setting.
Sets a window prop. Can be locked by adding `lock` at the end. If `lock` is not
added, will be unlocked. Locking means a dynamic windowrule _cannot_ override
this setting.
Prop List:
| prop | comment |
@ -212,6 +223,7 @@ hyprctl notify [ICON] [TIME_MS] [COLOR] [MESSAGE]
```
For example:
```sh
hyprctl notify -1 10000 "rgb(ff1ea3)" "Hello everyone!"
```
@ -221,6 +233,7 @@ Icon of `-1` means "No icon"
Color of `0` means "Default color for icon"
Icon list:
```
WARNING = 0
INFO = 1
@ -270,8 +283,8 @@ instances - lists all running instances of hyprland with their info
layouts - lists all layouts available (including plugin'd ones)
```
For the getoption command, the option name should be written as `section:option`,
e.g.:
For the getoption command, the option name should be written as
`section:option`, e.g.:
```sh
hyprctl getoption general:border_size
@ -280,7 +293,7 @@ hyprctl getoption general:border_size
hyprctl getoption input:touchpad:disable_while_typing
```
See [Variables](../Variables) for section and options you can use.
See [Variables](../variables) for section and options you can use.
## Batch

View file

@ -1,17 +1,21 @@
For basic syntax info, see [Configuring Hyprland](../Configuring-Hyprland).
---
weight: 2
title: Variables
---
This page documents all the "options" of Hyprland. For binds, monitors, animations,
etc. see the sidebar. For anything else, see [Keywords](../Keywords).
For basic syntax info, see [Configuring Hyprland](../configuring-hyprland).
This page documents all the "options" of Hyprland. For binds, monitors,
animations, etc. see the sidebar. For anything else, see
[Keywords](../keywords).
Please keep in mind some options that are layout-specific will be documented in
the layout pages and not here. (See the Sidebar for Dwindle and Master layouts)
{{< toc >}}
# Variable types
## Variable types
| type | description |
|---|---|
| --- | --- |
| int | integer |
| bool | boolean, `true` or `false` (`yes` or `no`, `on` or `off`, `0` or `1`) - any numerical value that is not `0` or `1` will cause undefined behavior. |
| float | floating point number |
@ -21,7 +25,7 @@ the layout pages and not here. (See the Sidebar for Dwindle and Master layouts)
| str | a string |
| gradient | a gradient, in the form of `color color ... [angle]` where `color` is a color (see above) and angle is an angle in degrees, in the format of `123deg` e.g. `45deg` (e.g. `rgba(11ee11ff) rgba(1111eeff) 45deg`) Angle is optional and will default to `0deg` |
{{< hint type=info >}}
{{< callout type=info >}}
**_Colors:_**
@ -39,11 +43,11 @@ legacy, e.g. `0xeeb3ff1a` -> ARGB order
SHIFT CAPS CTRL/CONTROL ALT MOD2 MOD3 SUPER/WIN/LOGO/MOD4 MOD5
```
{{< /hint >}}
{{< /callout >}}
# Sections
## Sections
## General
### General
| name | description | type | default |
|---|---|---|---|
@ -68,15 +72,17 @@ SHIFT CAPS CTRL/CONTROL ALT MOD2 MOD3 SUPER/WIN/LOGO/MOD4 MOD5
| allow_tearing | master switch for allowing tearing to occur. See [the Tearing page](../Tearing). | bool | false |
| resize_corner | force floating windows to use a specific corner when being resized (1-4 going clockwise from top left, 0 to disable) | int | 0 |
{{< callout type=warning >}}
{{< hint type=warning >}}
Prefer using `input:sensitivity` over `general:sensitivity` to avoid bugs, especially with Wine/Proton apps.
{{< /hint >}}
Prefer using `input:sensitivity` over `general:sensitivity` to avoid bugs,
especially with Wine/Proton apps.
## Decoration
{{< /callout >}}
### Decoration
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| rounding | rounded corners' radius (in layout px) | int | 0 |
| active_opacity | opacity of active windows. [0.0 - 1.0] | float | 1.0 |
| inactive_opacity | opacity of inactive windows. [0.0 - 1.0] | float | 1.0 |
@ -95,11 +101,12 @@ Prefer using `input:sensitivity` over `general:sensitivity` to avoid bugs, espec
| dim_around | how much the `dimaround` window rule should dim by. [0.0 - 1.0] | float | 0.4 |
| screen_shader | a path to a custom shader to be applied at the end of rendering. See `examples/screenShader.frag` for an example. | str | \[\[Empty\]\] |
### Blur
#### Blur
_Subcategory `decoration:blur:`_
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| enabled | enable kawase window background blur | bool | true |
| size | blur size (distance) | int | 8 |
| passes | the amount of passes to perform | int | 1 |
@ -112,10 +119,11 @@ _Subcategory `decoration:blur:`_
| vibrancy | Increase saturation of blurred colors. [0.0 - 1.0] | float | 0.1696 |
| vibrancy_darkness | How strong the effect of `vibrancy` is on dark areas . [0.0 - 1.0] | float | 0.0 |
| special | whether to blur behind the special workspace (note: expensive) | bool | false |
| popups | whether to blur popups (e.g. right-click menus) | bool | false |
| popups_ignorealpha | works like ignorealpha in layer rules. If pixel opacity is below set value, will not blur. [0.0 - 1.0] | float | 0.2 |
| popups | whether to blur popups (e.g. right-click menus) | bool | false |
| popups_ignorealpha | works like ignorealpha in layer rules. If pixel opacity is below set value, will not blur. [0.0 - 1.0] | float | 0.2 |
{{< callout type=important >}}
{{< hint type=important >}}
A subcategory is a nested category:
```ini
@ -131,32 +139,33 @@ decoration {
```
Doing `decoration:blur {` is **invalid**!
{{< /hint >}}
{{< hint type=info >}}
{{< /callout >}}
{{< callout type=info >}}
`blur:size` and `blur:passes` have to be at least 1.
Increasing `blur:passes` is necessary to prevent blur looking wrong on higher `blur:size` values,
but remember that higher `blur:passes` will require more strain on the GPU.
Increasing `blur:passes` is necessary to prevent blur looking wrong on higher
`blur:size` values, but remember that higher `blur:passes` will require more
strain on the GPU.
{{< /hint >}}
{{< /callout >}}
## Animations
### Animations
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| enabled | enable animations | bool | true |
| first_launch_animation | enable first launch animation | bool | true |
{{< callout type=info >}}
{{< hint type=info >}}
_[More about Animations](../animations)._
_[More about Animations](../Animations)._
{{< /callout >}}
{{< /hint >}}
## Input
### Input
| name | description | type | default |
|---|---|---|---|
@ -185,33 +194,40 @@ _[More about Animations](../Animations)._
| float_switch_override_focus | If enabled (1 or 2), focus will change to the window under the cursor when changing from tiled-to-floating and vice versa. If 2, focus will also follow mouse on float-to-float switches. | int | 1 |
| special_fallthrough | if enabled, having only floating windows in the special workspace will not block focusing windows in the regular workspace. | bool | false |
{{< hint type=info >}}
## XKB Settings
{{< callout type=info >}}
You can find a list of models, layouts, variants and options in [`/usr/share/X11/xkb/rules/base.lst`](file:///usr/share/X11/xkb/rules/base.lst).
Alternatively, you can use the `localectl` command to discover what is available on your system.
### XKB Settings
For switchable keyboard configurations, take a look at [the uncommon tips & tricks page entry](../Uncommon-tips--tricks/#switchable-keyboard-layouts).
You can find a list of models, layouts, variants and options in
[`/usr/share/X11/xkb/rules/base.lst`](file:///usr/share/X11/xkb/rules/base.lst).
Alternatively, you can use the `localectl` command to discover what is available
on your system.
{{< /hint >}}
For switchable keyboard configurations, take a look at
[the uncommon tips & tricks page entry](../uncommon-tips--tricks/#switchable-keyboard-layouts).
{{< hint type=info >}}
## Follow Mouse Cursor
{{< /callout >}}
{{< callout type=info >}}
### Follow Mouse Cursor
- 0 - Cursor movement will not change focus.
- 1 - Cursor movement will always change focus to the window under the cursor.
- 2 - Cursor focus will be detached from keyboard focus. Clicking on a window will move keyboard focus to that window.
- 3 - Cursor focus will be completely separate from keyboard focus. Clicking on a window will not change keyboard focus.
- 2 - Cursor focus will be detached from keyboard focus. Clicking on a window
will move keyboard focus to that window.
- 3 - Cursor focus will be completely separate from keyboard focus. Clicking on
a window will not change keyboard focus.
## Custom accel profiles
### Custom accel profiles
### `accel_profile`
#### `accel_profile`
`custom <step> <points...>`
for example `custom 200 0.0 0.5`
### `scroll_points`
#### `scroll_points`
NOTE: Only works when `accel_profile` is set to `custom`.
@ -219,23 +235,24 @@ NOTE: Only works when `accel_profile` is set to `custom`.
For example `0.2 0.0 0.5 1 1.2 1.5`
To mimic the Windows acceleration curves, take a look at [this script](https://gist.github.com/fufexan/de2099bc3086f3a6c83d61fc1fcc06c9).
To mimic the Windows acceleration curves, take a look at
[this script](https://gist.github.com/fufexan/de2099bc3086f3a6c83d61fc1fcc06c9).
See [the libinput doc](https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html) for more insights on
how it works.
See
[the libinput doc](https://wayland.freedesktop.org/libinput/doc/latest/pointer-acceleration.html)
for more insights on how it works.
{{< /hint >}}
{{< /callout >}}
### Touchpad
#### Touchpad
_Subcategory `input:touchpad:`_
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| disable_while_typing | Disable the touchpad while typing. | bool | true |
| natural_scroll | Inverts scrolling direction. When enabled, scrolling moves content directly instead of manipulating a scrollbar. | bool | false |
| scroll_factor | Multiplier applied to the amount of scroll movement. | float | 1.0
| scroll_factor | Multiplier applied to the amount of scroll movement. | float | 1.0 |
| middle_button_emulation | Sending LMB and RMB simultaneously will be interpreted as a middle click. This disables any touchpad area that would normally send a middle click based on location. [libinput#middle-button-emulation](https://wayland.freedesktop.org/libinput/doc/latest/middle-button-emulation.html) | bool | false |
| tap_button_map | Sets the tap button mapping for touchpad button emulation. Can be one of `lrm` (default) or `lmr` (Left, Middle, Right Buttons). [lrm/lmr] | str | \[\[Empty\]\] |
| clickfinger_behavior | Button presses with 1, 2, or 3 fingers will be mapped to LMB, RMB, and MMB respectively. This disables interpretation of clicks based on location on the touchpad. [libinput#clickfinger-behavior](https://wayland.freedesktop.org/libinput/doc/latest/clickpad-softbuttons.html#clickfinger-behavior) | bool | false |
@ -243,37 +260,36 @@ _Subcategory `input:touchpad:`_
| drag_lock | When enabled, lifting the finger off for a short time while dragging will not drop the dragged item. [libinput#tap-and-drag](https://wayland.freedesktop.org/libinput/doc/latest/tapping.html#tap-and-drag) | bool | false |
| tap-and-drag | Sets the tap and drag mode for the touchpad | bool | false |
### Touchdevice
#### Touchdevice
_Subcategory `input:touchdevice:`_
| name | description | type | default |
|---|---|---|---|
| transform | transform the input from touchdevices. The possible transformations are the same as [those of the monitors](../Monitors/#rotating) | int | 0 |
| --- | --- | --- | --- |
| transform | transform the input from touchdevices. The possible transformations are the same as [those of the monitors](../monitors/#rotating) | int | 0 |
| output | the monitor to bind touch devices. The default is autodetection. To stop autotection use an empty string or the "\[\[Empty\]\]" value. | string | \[\[Auto\]\] |
| enabled | Whether input is enabled for touch devices. | bool | true |
### Tablet
#### Tablet
_Subcategory `input:tablet:`_
| name | description | type | default |
|---|---|---|---|
| transform | transform the input from tablets. The possible transformations are the same as [those of the monitors](../Monitors/#rotating) | int | 0 |
| --- | --- | --- | --- |
| transform | transform the input from tablets. The possible transformations are the same as [those of the monitors](../monitors/#rotating) | int | 0 |
| output | the monitor to bind tablets. Empty means unbound. | string | \[\[Empty\]\] |
| region_position | position of the mapped region in monitor layout. | vec2 | [0, 0] |
| region_size | size of the mapped region. When this variable is set, tablet input will be mapped to the region. [0, 0] or invalid size means unset. | vec2 | [0, 0] |
| relative_input | whether the input should be relative | bool | false |
## Per-device input config
### Per-device input config
Described [here](../Keywords#per-device-input-configs).
Described [here](../keywords#per-device-input-configs).
## Gestures
### Gestures
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| workspace_swipe | enable workspace swipe gesture | bool | false |
| workspace_swipe_fingers | how many fingers for the gesture | int | 3 |
| workspace_swipe_distance | in px, the distance of the gesture | int | 300 |
@ -287,9 +303,10 @@ Described [here](../Keywords#per-device-input-configs).
| workspace_swipe_numbered | if enabled, swiping will swipe on consecutive numbered workspaces. | bool | false |
| workspace_swipe_use_r | if enabled, swiping will use the `r` prefix instead of the `m` prefix for finding workspaces. (requires disabled `workspace_swipe_numbered`) | bool | false |
## Group
### Group
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| insert_after_current | whether new windows in a group spawn after current or at group tail | bool | true |
| focus_removed_window | whether Hyprland should focus on the window that has just been moved out of the group | bool | true |
| col.border_active | active group border color | gradient | 0x66ffff00 |
@ -297,11 +314,12 @@ Described [here](../Keywords#per-device-input-configs).
| col.border_locked_active | active locked group border color | gradient | 0x66ff5500 |
| col.border_locked_inactive | inactive locked group border color | gradient | 0x66775500 |
### Groupbar
#### Groupbar
_Subcategory `group:groupbar:`_
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| enabled | enables groupbars | bool | true |
| font_family | font used to display groupbar titles | string | Sans |
| font_size | font size for the above | int | 8 |
@ -316,7 +334,7 @@ _Subcategory `group:groupbar:`_
| col.locked_active | active locked group border color | gradient | 0x66ff5500 |
| col.locked_inactive | inactive locked group border color | gradient | 0x66775500 |
## Misc
### Misc
| name | description | type | default |
|---|---|---|---|
@ -352,43 +370,43 @@ _Subcategory `group:groupbar:`_
| new_window_takes_over_fullscreen | if there is a fullscreen window, whether a new tiled window opened should replace the fullscreen one or stay behind. 0 - behind, 1 - takes over, 2 - unfullscreen the current fullscreen window [0/1/2] | int | 0 |
| enable_hyprcursor | whether to enable hyprcursor support | bool | true |
## Binds
### Binds
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| pass_mouse_when_bound | if disabled, will not pass the mouse events to apps / dragging windows around if a keybind has been triggered. | bool | false |
| scroll_event_delay | in ms, how many ms to wait after a scroll event to allow to pass another one for the binds. | int | 300 |
| workspace_back_and_forth | If enabled, an attempt to switch to the currently focused workspace will instead switch to the previous workspace. Akin to i3's *auto_back_and_forth*. | bool | false |
| workspace_back_and_forth | If enabled, an attempt to switch to the currently focused workspace will instead switch to the previous workspace. Akin to i3's _auto_back_and_forth_. | bool | false |
| allow_workspace_cycles | If enabled, workspaces don't forget their previous workspace, so cycles can be created by switching to the first workspace in a sequence, then endlessly going to the previous workspace. | bool | false |
| workspace_center_on | Whether switching workspaces should center the cursor on the workspace (0) or on the last active window for that workspace (1) | int | 0 |
| focus_preferred_method | sets the preferred focus finding method when using `focuswindow`/`movewindow`/etc with a direction. 0 - history (recent have priority), 1 - length (longer shared edges have priority) | int | 0 |
| ignore_group_lock | If enabled, dispatchers like `moveintogroup`, `moveoutofgroup` and `movewindoworgroup` will ignore lock per group. | bool | false |
| movefocus_cycles_fullscreen | If enabled, when on a fullscreen window, `movefocus` will cycle fullscreen, if not, it will move the focus in a direction. | bool | true |
## XWayland
### XWayland
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| use_nearest_neighbor | uses the nearest neigbor filtering for xwayland apps, making them pixelated rather than blurry | bool | true |
| force_zero_scaling | forces a scale of 1 on xwayland windows on scaled displays. | bool | false |
## OpenGL
### OpenGL
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| nvidia_anti_flicker | reduces flickering on nvidia at the cost of possible frame drops on lower-end GPUs. On non-nvidia, this is ignored. | bool | true |
| force_introspection | forces introspection at all times. Introspection is aimed at reducing GPU usage in certain cases, but might cause graphical glitches on nvidia. 0 - nothing, 1 - force always on, 2 - force always on if nvidia | int | 2 |
| force_introspection | forces introspection at all times. Introspection is aimed at reducing GPU usage in certain cases, but might cause graphical glitches on nvidia. 0 - nothing, 1 - force always on, 2 - force always on if nvidia | int | 2 |
## Debug
### Debug
{{< hint type=warning >}}
{{< callout type=warning >}}
Only for developers.
{{< /hint >}}
{{< /callout >}}
| name | description | type | default |
|---|---|---|---|
| --- | --- | --- | --- |
| overlay | print the debug performance overlay. Disable VFR for accurate results. | bool | false |
| damage_blink | (epilepsy warning!) flash areas updated with damage tracking | bool | false |
| disable_logs | disable logging to a file | bool | true |
@ -396,11 +414,11 @@ Only for developers.
| damage_tracking | redraw only the needed bits of the display. Do **not** change. (default: full - 2) monitor - 1, none - 0 | int | 2 |
| enable_stdout_logs | enables logging to stdout | bool | false |
| manual_crash | set to 1 and then back to 0 to crash Hyprland. | int | 0 |
| suppress_errors| if true, do not display config file parsing errors. | bool | false |
| suppress_errors | if true, do not display config file parsing errors. | bool | false |
| watchdog_timeout | sets the timeout in seconds for watchdog to abort processing of a signal of the main thread. Set to 0 to disable. | int | 5 |
| disable_scale_checks | disables verifying of the scale factors. Will result in pixel alignment and rounding errors. | bool | false |
| disable_scale_checks | disables verifying of the scale factors. Will result in pixel alignment and rounding errors. | bool | false |
## More
### More
There are more config options described in other pages, which are layout- or
circumstance-specific. See the sidebar for more pages.

View file

@ -1,25 +1,29 @@
# Table of contents
---
weight: 7
title: Window Rules
---
{{< toc >}}
{{< callout type=warning >}}
# Disclaimers
Window rules (both V1 and V2) are **case sensitive**. (e.g. `firefox`
`Firefox`)
{{< hint type=warning >}}
Window rules (both V1 and V2) are **case sensitive**. (e.g. `firefox``Firefox`)
{{< /hint >}}
{{< /callout >}}
# Window Rules V1
## Window Rules V1
You can set window rules to achieve different behaviors from the active container.
You can set window rules to achieve different behaviors from the active
container.
## Syntax
### Syntax
```ini
windowrule=RULE,WINDOW
```
- `RULE` is a [rule](#rules) (and a param if applicable)
- `WINDOW` is a [RegEx](https://en.wikipedia.org/wiki/Regular_expression), either:
- `WINDOW` is a [RegEx](https://en.wikipedia.org/wiki/Regular_expression),
either:
- plain RegEx (for matching a window class);
- `title:` followed by a regex (for matching a window's title)
@ -30,10 +34,10 @@ windowrule=float,^(kitty)$
windowrule=move 0 0,title:^(Firefox)(.*)$
```
# Window Rules V2
## Window Rules V2
In order to allow more flexible rules, while retaining compatibility with the above
rule system, window rules V2 were implemented.
In order to allow more flexible rules, while retaining compatibility with the
above rule system, window rules V2 were implemented.
In V2, you are allowed to match multiple variables.
@ -44,17 +48,22 @@ for multiple values like so:
windowrulev2 = float,class:(kitty),title:(kitty)
```
{{< hint type=tip >}}
In the case of dynamic window titles such as browser windows keep in mind how powerful regex is.
{{< callout type=info >}}
for example a window rule of: `windowrule=opacity 0.3 override 0.3 override,title:(.*)(- Youtube)$` will match
*any* window that contains a string of "- Youtube" after any other text. This could be multiple browser windows
or other applications that contain the string for any reason.
In the case of dynamic window titles such as browser windows keep in mind how
powerful regex is.
for example a window rule of:
`windowrule=opacity 0.3 override 0.3 override,title:(.*)(- Youtube)$` will match
_any_ window that contains a string of "- Youtube" after any other text. This
could be multiple browser windows or other applications that contain the string
for any reason.
for the `windowrulev2 = float,class:(kitty),title:(kitty)` example, the `class:(kitty)` `WINDOW` field is what keeps the window rule
specific to kitty terminals.
{{< /hint >}}
for the `windowrulev2 = float,class:(kitty),title:(kitty)` example, the
`class:(kitty)` `WINDOW` field is what keeps the window rule specific to kitty
terminals.
{{< /callout >}}
For now, the supported fields are:
@ -69,17 +78,17 @@ fullscreen - 0/1
pinned - 0/1
focus - 0/1
workspace - id or name: and name
onworkspace (how many windows are on the workspace) - int
onworkspace (how many windows are on the workspace) - int
```
Keep in mind that you _have_ to declare at least one field, but not all.
{{< hint type=tip >}}
{{< callout type=info >}}
To get more information about a window's class, title, XWayland status or its size,
you can use `hyprctl clients`.
To get more information about a window's class, title, XWayland status or its
size, you can use `hyprctl clients`.
{{< /hint >}}
{{< /callout >}}
## Rules
@ -99,7 +108,7 @@ Static rules are evaluated once at window open and never again.
| center (\[opt\]) | if the window is floating, will center it on the monitor. Set opt as 1 to respect monitor reserved area |
| pseudo | pseudotiles a window |
| monitor \[id\] | sets the monitor on which a window should open. `id` can be either id or name (either e.g. `1` or e.g. `DP-1`) |
| workspace \[w\] | sets the workspace on which a window should open (for workspace syntax, see [dispatchers->workspaces](../Dispatchers#workspaces)). You can also make \[w\] to `unset`, will unset all previous workspace rules applied to this window. You can also add `silent` after the workspace to make the window open silently. |
| workspace \[w\] | sets the workspace on which a window should open (for workspace syntax, see [dispatchers->workspaces](../dispatchers#workspaces)). You can also make \[w\] to `unset`, will unset all previous workspace rules applied to this window. You can also add `silent` after the workspace to make the window open silently. |
| nofocus | disables focus to the window |
| noinitialfocus | disables the initial focus to the window |
| forceinput | forces an XWayland window to receive input, even if it requests not to do so. (Might fix issues like e.g. Game Launchers not receiving focus for some reason) |
@ -132,31 +141,38 @@ Dynamic rules are re-evaluated every time a property changes.
| noshadow | disables shadows for the window |
| noanim | disables the animations for the window |
| keepaspectratio | forces aspect ratio when resizing window with the mouse |
| bordercolor \[c\] | force the bordercolor of the window. Options for c: `color`/`color ... color angle` -> sets the active border color/gradient OR `color color`/`color ... color angle color ... color [angle]` -> sets the active and inactive border color/gradient of the window. See [variables->colors](../Variables#variable_types) for color definition. |
| bordercolor \[c\] | force the bordercolor of the window. Options for c: `color`/`color ... color angle` -> sets the active border color/gradient OR `color color`/`color ... color angle color ... color [angle]` -> sets the active and inactive border color/gradient of the window. See [variables->colors](../variables#variable_types) for color definition. |
| idleinhibit \[mode\] | sets an idle inhibit rule for the window. If active, apps like `hypridle` will not fire. Modes: `none`, `always`, `focus`, `fullscreen` |
| dimaround | dims everything around the window . Please note this rule is meant for floating windows and using it on tiled ones may result in strange behavior. |
| xray \[on\] | sets blur xray mode for the window (0 for off, 1 for on, unset for default) |
| immediate | forces the window to allow to be torn. See [the Tearing page](../Tearing). |
| immediate | forces the window to allow to be torn. See [the Tearing page](../tearing). |
| nearestneighbor | forces the window to use the nearest neigbor filtering. |
{{< hint type=info >}}
{{< callout type=info >}}
## `group` window rule options
- `set` \[`always`\] - Open window as a group.
- `new` - Shorthand of `barred set`.
- `lock` \[`always`\] - Lock the group that added this window. Use with `set` or `new` (i.e. `new lock`) to create a new locked group.
- `barred` - Do not add the window to the focused group. By default, a window with a `group set` rule will be added to an active group if possible.
- `deny` - Do not allow window to be toggled as or added to group (see `denywindowfromgroup` dispatcher).
- `lock` \[`always`\] - Lock the group that added this window. Use with `set` or
`new` (i.e. `new lock`) to create a new locked group.
- `barred` - Do not add the window to the focused group. By default, a window
with a `group set` rule will be added to an active group if possible.
- `deny` - Do not allow window to be toggled as or added to group (see
`denywindowfromgroup` dispatcher).
- `invade` - Force open window in the locked group.
- `override` \[other options\] - Override other `group` rules, e.g. You can make all windows in a particular workspace open as a group, and use `group override barred` to make windows with specific titles open as normal windows.
- `override` \[other options\] - Override other `group` rules, e.g. You can make
all windows in a particular workspace open as a group, and use
`group override barred` to make windows with specific titles open as normal
windows.
- `unset` - Clear all `group` rules.
The `group` rule without options is a shorthand for `group set`.
By default, `set` and `lock` only affect new windows once. The `always` qualifier makes them always effective.
By default, `set` and `lock` only affect new windows once. The `always`
qualifier makes them always effective.
{{< /hint >}}
{{< /callout >}}
### Example Rules
@ -174,39 +190,45 @@ windowrulev2 = stayfocused, class:^(pinentry-) # fix pinentry losing focus
### Notes
Rules that are marked as _Dynamic_ will be reevaluated if the matching property of the window changes. For instance, if a rule is defined that changes the bordercolor of a window when it is floating, then the bordercolor will change to the requested color when it is set to floating, and revert to the default color when it is tiled again.
Rules that are marked as _Dynamic_ will be reevaluated if the matching property
of the window changes. For instance, if a rule is defined that changes the
bordercolor of a window when it is floating, then the bordercolor will change to
the requested color when it is set to floating, and revert to the default color
when it is tiled again.
Rules will be processed from top to bottom, where the _last_ match will take precedence.
i.e.
Rules will be processed from top to bottom, where the _last_ match will take
precedence. i.e.
```ini
windowrulev2 = opacity 0.8 0.8,class:^(kitty)$
windowrulev2 = opacity 0.5 0.5,floating:1
```
-> all kitty windows will have opacity 0.8, except if they are floating. Then they will have opacity 0.5.
-> all floating windows will have opacity 0.5.
-> all kitty windows will have opacity 0.8, except if they are floating. Then
they will have opacity 0.5. -> all floating windows will have opacity 0.5.
```ini
windowrulev2 = opacity 0.5 0.5,floating:1
windowrulev2 = opacity 0.8 0.8,class:^(kitty)$
```
-> all kitty windows will have opacity 0.8, also if they are floating.
-> all other floating windows will have opacity 0.5.
-> all kitty windows will have opacity 0.8, also if they are floating. -> all
other floating windows will have opacity 0.5.
{{< callout type=info >}}
{{< hint type=tip >}}
Opacity is _always_ a PRODUCT of all opacities. E.g. `active_opacity` to
0.5 and windowrule opacity to 0.5 will result in a total opacity 0.25. You are
allowed to set opacities over 1, but any opacity product over 1 will cause
graphical glitches. E.g. `0.5 * 2 = 1`, and it will be fine, `0.5 * 4` will cause
Opacity is _always_ a PRODUCT of all opacities. E.g. `active_opacity` to 0.5 and
windowrule opacity to 0.5 will result in a total opacity 0.25. You are allowed
to set opacities over 1, but any opacity product over 1 will cause graphical
glitches. E.g. `0.5 * 2 = 1`, and it will be fine, `0.5 * 4` will cause
graphical glitches.
{{< /hint >}}
# Layer Rules
Some things in wayland are not windows, but layers. That includes for example most launchers, your status bar or wallpaper.
{{< /callout >}}
## Layer Rules
Some things in wayland are not windows, but layers. That includes for example
most launchers, your status bar or wallpaper.
Those have specific rules separate from windows:
@ -215,10 +237,11 @@ layerrule = rule, namespace
# or
layerrule = rule, address
```
where `rule` is the rule and `namespace` is the namespace regex (find namespaces in `hyprctl layers`)
or `address` is an address in the form of `address:0x[hex]`
## Rules
where `rule` is the rule and `namespace` is the namespace regex (find namespaces
in `hyprctl layers`) or `address` is an address in the form of `address:0x[hex]`
### Rules
| rule | description |
| --- | --- |

View file

@ -1,43 +1,54 @@
# Table of contents
---
weight: 8
title: Workspace Rules
---
{{< toc >}}
## Workspace Rules
# Workspace Rules
You can set workspace rules to achieve workspace-specific behaviors. For instance, you can define a workspace where all windows are drawn without borders or gaps.
You can set workspace rules to achieve workspace-specific behaviors. For
instance, you can define a workspace where all windows are drawn without borders
or gaps.
For layout-specific rules, see the specific layout page. For example: [Master Layout->Workspace Rules](../Master-Layout#workspace-rules)
For layout-specific rules, see the specific layout page. For example:
[Master Layout->Workspace Rules](../master-layout#workspace-rules)
### Syntax
## Syntax
```ini
workspace=WORKSPACE,RULES
```
- WORKSPACE is a valid workspace identifier (see [Dispatchers->Workspaces](../Dispatchers#workspaces)). This field is mandatory;
- WORKSPACE is a valid workspace identifier (see
[Dispatchers->Workspaces](../dispatchers#workspaces)). This field is
mandatory;
- RULES is one (or more) rule(s) as described here in [rules](#rules).
### Examples
```ini
workspace=name:myworkspace,gapsin:0,gapsout:0
workspace=3,rounding:false,bordersize:0
```
## Rules
| Rule | Description | type |
| ---- | ----------- | ---- |
| monitor:[m] | Binds a workspace to a monitor See [syntax](#syntax) and [Monitors](../Monitors).| string |
| --- | --- | --- |
| monitor:[m] | Binds a workspace to a monitor See [syntax](#syntax) and [Monitors](../monitors). | string |
| default:[b] | Whether this workspace should be the default workspace for the given monitor | bool |
| gapsin:[x] | Set the gaps between windows (equivalent to [General->gaps_in](../Variables#general) except for not using commas as delimiter (spaces instead)) | int |
| gapsout:[x] | Set the gaps between windows and monitor edges (equivalent to [General->gaps_out](../Variables#general) except for not using commas as delimiter (spaces instead)) | int |
| bordersize:[x] | Set the border size around windows (equivalent to [General->border_size](../Variables#general)) | int |
| border:[b]| Whether to draw borders or not| bool |
| shadow:[b]| Whether to draw shadows or not| bool |
| gapsin:[x] | Set the gaps between windows (equivalent to [General->gaps_in](../variables#general)) | int |
| gapsout:[x] | Set the gaps between windows and monitor edges (equivalent to [General->gaps_out](../variables#general)) | int |
| bordersize:[x] | Set the border size around windows (equivalent to [General->border_size](../variables#general)) | int |
| border:[b] | Whether to draw borders or not | bool |
| shadow:[b] | Whether to draw shadows or not | bool |
| rounding:[b] | Whether to draw rounded windows or not | bool |
| decorate:[b] | Whether to draw window decorations or not | bool |
| persistent:[b] | Keep this workspace alive even if empty and inactive | bool |
| on-created-empty:[c] | A command to be executed once a workspace is created empty (i.e. not created by moving a window to it). See the [command syntax](../Dispatchers#executing-with-rules) | string |
| on-created-empty:[c] | A command to be executed once a workspace is created empty (i.e. not created by moving a window to it). See the [command syntax](../dispatchers#executing-with-rules) | string |
| defaultName:[s] | A default name for the workspace. | string |
### Example Rules
```ini
workspace = 3, rounding:false, decorate:false
workspace = name:coding, rounding:false, decorate:false, gapsin:0, gapsout:0, border:false, decorate:false, monitor:DP-1

View file

@ -1,3 +1,8 @@
---
weight: 14
title: XWayland
---
XWayland is the bridging mechanism between legacy Xorg programs and Wayland
compositors.
@ -6,8 +11,9 @@ compositors.
XWayland currently looks pixelated on HiDPI screens, due to Xorg's inability to
scale.
This problem is mitigated by the [`xwayland:force_zero_scaling`](../../Configuring/Variables/#xwayland)
option, which forces XWayland windows not to be scaled.
This problem is mitigated by the
[`xwayland:force_zero_scaling`](../../configuring/variables/#xwayland) option,
which forces XWayland windows not to be scaled.
This will get rid of the pixelated look, but will not scale applications
properly. To do this, each toolkit has its own mechanism.
@ -28,6 +34,8 @@ env = XCURSOR_SIZE,32
The GDK_SCALE variable won't conflict with Wayland-native GTK programs.
{{< hint type="important" >}}
{{< callout >}}
XWayland HiDPI patches are no longer supported. Do not use them.
{{</ hint >}}
{{</ callout >}}

View file

@ -0,0 +1,6 @@
---
weight: 3
title: Configuring
sidebar:
open: true
---

View file

@ -1,23 +1,29 @@
# PR Requirements
---
title: PR Guidelines
---
## PR Requirements
- Clean, not hacky code
- Described changes and _why_ they were there
- Following the style (see below)
## Code Style
### Code Style
Hyprland's code style is governed by the `.clang-format` file.
Make sure to format accordingly whenever you make a PR.
## Some code FAQ
### Some code FAQ
> Why is the config variable getting so weird?
Every variable from the config needs to be found in a hashmap. To limit the amount of hashmap searches, getting a config option looks like this:
Every variable from the config needs to be found in a hashmap. To limit the
amount of hashmap searches, getting a config option looks like this:
```cpp
static auto* const PFOLLOWMOUSE = &g_pConfigManager->getConfigValuePtr("input:follow_mouse")->intValue;
```
Since the hashmap _cannot_ be mutated during runtime, this pointer will always be valid, and will not require hashmap lookups every single time it's read.
Since the hashmap _cannot_ be mutated during runtime, this pointer will always
be valid, and will not require hashmap lookups every single time it's read.

View file

@ -1,6 +1,11 @@
---
weight: 12
title: Contributing and Debugging
---
# Contributing guidelines
PR, code styling and code FAQs are [here](./PR-Guidelines)
PR, code styling and code FAQs are [here](./pr-guidelines)
For issues, please see
[the guidelines](https://github.com/hyprwm/Hyprland/blob/main/docs/ISSUE_GUIDELINES.md)
@ -23,7 +28,8 @@ _Arch_:
Install the VSCode C/C++ and CMake Tools extensions and use that.
I've attached a [example/launch.json](https://github.com/hyprwm/Hyprland/blob/main/example/launch.json)
I've attached a
[example/launch.json](https://github.com/hyprwm/Hyprland/blob/main/example/launch.json)
that you can copy to your .vscode/ folder in the repo root.
With that, you can build in debug, go to the debugging tab and hit
@ -79,7 +85,8 @@ for live logs. (replace `hyprland` with `hyprlandd` for debug builds)
### How do I get a coredump?
See [`ISSUE_GUIDELINES.md`](https://github.com/hyprwm/Hyprland/blob/main/docs/ISSUE_GUIDELINES.md).
See
[`ISSUE_GUIDELINES.md`](https://github.com/hyprwm/Hyprland/blob/main/docs/ISSUE_GUIDELINES.md).
## Nesting Hyprland
@ -89,7 +96,9 @@ Hyprland can run nested in a window. For that, make sure you did the following:
- removed ALL `exec=` and `exec-once=` keywords from your debug config
(`hyprlandd.conf`)
- set a resolution for `WL-1` and are not using `preferred`
- made sure no keybinds overlap (use a different mod for your keybinds altogether)
- made sure no keybinds overlap (use a different mod for your keybinds
altogether)
Once you launch, the display might be cropped. This can be fixed by setting the resolution for `WL-1` to
the exact dimensions of the window as reported by `hyprctl clients`.
Once you launch, the display might be cropped. This can be fixed by setting the
resolution for `WL-1` to the exact dimensions of the window as reported by
`hyprctl clients`.

View file

@ -1,4 +1,9 @@
# Getting the log
---
weight: 10
title: Crashes and Bugs
---
## Getting the log
If you are in a TTY, and the hyprland session that crashed was the last one you
launched, the log will be printed with
@ -15,15 +20,18 @@ if you are in a Hyprland session, and you want the log of the last session, use
cat /tmp/hypr/$(ls -t /tmp/hypr/ | head -n 2 | tail -n 1)/hyprland.log
```
# Obtaining the Hyprland Crash Report
## Obtaining the Hyprland Crash Report
If you have `$XDG_CACHE_HOME` set, the crash report directory is `$XDG_CACHE_HOME/hyprland`. If not, it's `$HOME/.cache/hyprland`.
If you have `$XDG_CACHE_HOME` set, the crash report directory is
`$XDG_CACHE_HOME/hyprland`. If not, it's `$HOME/.cache/hyprland`.
Go to the crash report directory and you should find a file named `hyprlandCrashReport[XXXX].txt` where `[XXXX]` is the PID of the process that crashed.
Go to the crash report directory and you should find a file named
`hyprlandCrashReport[XXXX].txt` where `[XXXX]` is the PID of the process that
crashed.
Attach that file to your issue.
# Crashes at launch
## Crashes at launch
Diagnose the issue by what is in the log:
@ -39,18 +47,18 @@ Diagnose the issue by what is in the log:
in the first point.
- failing on `Hyprland` -> report an issue.
# Crashes not at launch
## Crashes not at launch
Report an issue on GitHub or on the Discord server.
# Bugs
## Bugs
First of all, **_READ THE [FAQ PAGE](../FAQ)_**
First of all, **_READ THE [FAQ PAGE](../faq)_**
If your bug is not listed there, you can ask on the Discord server or open an
issue on GitHub.
# Building the Wayland stack with ASan
## Building the Wayland stack with ASan
If requested, this is the deepest level of memory issue debugging possible.
@ -58,16 +66,11 @@ _Do this in the tty, with no Hyprland instances running_
Clone hyprland: `git clone --recursive https://github.com/hyprwm/Hyprland`
cd to it: `cd Hyprland`
`make asan`
This will compile everything and launch Hyprland.
Reproduce your crash. Hyprland will exit back to the tty.
You can now launch your regular Hyprland session.
Now, in either `cwd`, `~` or `./build`, search for file(s) named
`asan.log.XXXXX` where XXXXX is a number.
Now, in either `cwd`, `~` or `./build`, search for file(s) named `asan.log.XXXXX` where XXXXX is a number.
Zip all of them up and attach to your issue.
Zip all of them up and attach to your issue.

View file

@ -1,60 +1,66 @@
# Table of Contents
---
weight: 11
title: FAQ
---
{{< toc format=html >}}
### My apps are pixelated
# My apps are pixelated
This just means they are running through XWayland, which physically cannot scale
by fractional amounts.
This just means they are running through XWayland, which physically cannot scale by fractional amounts.
To force them to run in wayland-native mode, see
[the Master Tutorial](../../getting-started/master-tutorial/#force-apps-to-use-wayland).
To force them to run in wayland-native mode, see [the Master Tutorial](../../Getting-Started/Master-Tutorial/#force-apps-to-use-wayland).
If they can't, see [the XWayland page](../../configuring/xwayland).
If they can't, see [the XWayland page](../../Configuring/XWayland).
# Nothing renders / screen is empty / crash on opening first app
### Nothing renders / screen is empty / crash on opening first app
Possible causes:
> Your themes are not set up properly, making apps crash.
Use something like `qt6ct` (Qt) and `nwg-look` (GTK) (\*for GTK you can also
set up themes with envvars) to set up your themes.
Use something like `qt6ct` (Qt) and `nwg-look` (GTK) (\*for GTK you can also set
up themes with envvars) to set up your themes.
> Your PC is very, _very_ old.
In that case, see the
[Installation Page](../../Getting-Started/Installation) and
try compiling with LEGACY_RENDERER
In that case, see the [Installation Page](../../getting-started/installation)
and try compiling with LEGACY_RENDERER
_For more info about bugs and crashes, see this_
_[wiki page](../../Crashes-and-Bugs)_
_[wiki page](../../crashes-and-bugs)_
# Me cursor no render?
### Me cursor no render?
Are you on NVIDIA? If so, then you have been a naughty boy and haven't listened
to my tips on other pages. Use the `WLR_NO_HARDWARE_CURSORS=1` environment
variable.
# My external monitor is blank / doesn't render / receives no signal (laptop)
### My external monitor is blank / doesn't render / receives no signal (laptop)
For Nvidia graphics - This issue appears to be resolved when using Nvidia Drivers 525.60.11 or later, but it may persist with older drivers.
For Nvidia graphics - This issue appears to be resolved when using Nvidia
Drivers 525.60.11 or later, but it may persist with older drivers.
Outside those, there is a way to fix it that _might_ work for you though:
**Option 1:** Use _only_ the external monitor
By using `WLR_DRM_DEVICES=/dev/dri/card1` (or `card0`) you can force Hyprland to use only your dGPU,
meaning your laptop's screen will be gone but your external one will work.
By using `WLR_DRM_DEVICES=/dev/dri/card1` (or `card0`) you can force Hyprland to
use only your dGPU, meaning your laptop's screen will be gone but your external
one will work.
**Option 2:** Use all outputs, at the cost of battery life.
By switching your laptop to only use the dGPU in the BIOS, you _might_ be able to get everything to work,
at the cost of high battery usage.
By switching your laptop to only use the dGPU in the BIOS, you _might_ be able
to get everything to work, at the cost of high battery usage.
_Please note these are highly model-specific and might or might not work. If they don't, you're unfortunately out of luck._
_Please note these are highly model-specific and might or might not work. If
they don't, you're unfortunately out of luck._
You might try a USB-C to HDMI adapter though, maybe that could route the external monitor through the iGPU.
You might try a USB-C to HDMI adapter though, maybe that could route the
external monitor through the iGPU.
# How do I screenshot?
### How do I screenshot?
Install `grim` and `slurp`
@ -62,42 +68,47 @@ Use a keybind (or execute) `grim -g "$(slurp)"`, select a region. A screenshot
will pop into your `~/Pictures/` (You can configure grim and slurp, see their
GitHub pages).
If you want those screenshots to go directly to your clipboard, consider using `wl-copy`, from [`wl-clipboard`](https://github.com/bugaevc/wl-clipboard). Here's an example binding:
`bind = , Print, exec, grim -g "$(slurp -d)" - | wl-copy`
For a more complete utility, try our own screenshotting utility:
If you want those screenshots to go directly to your clipboard, consider using
`wl-copy`, from [`wl-clipboard`](https://github.com/bugaevc/wl-clipboard).
Here's an example binding:
`bind = , Print, exec, grim -g "$(slurp -d)" - | wl-copy` For a more complete
utility, try our own screenshotting utility:
[Grimblast](https://github.com/hyprwm/contrib).
For recording videos, [wf-recorder](https://github.com/ammen99/wf-recorder), [wl-screenrec](https://github.com/russelltg/wl-screenrec) or [OBS Studio](https://obsproject.com/) could be used.
For recording videos, [wf-recorder](https://github.com/ammen99/wf-recorder),
[wl-screenrec](https://github.com/russelltg/wl-screenrec) or
[OBS Studio](https://obsproject.com/) could be used.
# Screenshare / OBS no worky
### Screenshare / OBS no worky
Check [Screensharing](../Useful-Utilities/Screen-Sharing).
Check [Screensharing](../useful-utilities/screen-sharing).
Also install `qt6-wayland` if you plan to use obs.
# How do I change my wallpaper?
### How do I change my wallpaper?
See [Wallpapers](../Useful-Utilities/Wallpapers).
See [Wallpapers](../useful-utilities/wallpapers).
# How heavy is this?
### How heavy is this?
Not that much heavier than Xorg. If you want maximum performance, consider
turning off the blur and animations.
# My monitor no worky
### My monitor no worky
Try changing the mode in your config. If your preferred one doesn't work, try a
lower one. A good way to list all modes is to get `wlr-randr` and do a
`wlr-randr --dryrun`
# My monitor has flickering brightness when I turn on VRR
### My monitor has flickering brightness when I turn on VRR
Change the VRR option to `2` (fullscreen), so that it is only used in games.
This happens because the brightness on some monitors can depends on the refresh
rate, and rapidly changing refresh rates (for example, when the screen momentarily
updates after pressing a key) will cause rapid changes in brightness.
rate, and rapidly changing refresh rates (for example, when the screen
momentarily updates after pressing a key) will cause rapid changes in
brightness.
# How do I update?
### How do I update?
Open a terminal where you cloned the repo.
@ -106,33 +117,47 @@ git pull
make all && sudo make install
```
If you are using the AUR (hyprland-git) package, you
will need to cleanbuild to update the package. Paru
has been problematic with updating before, use Yay.
If you are using the AUR (hyprland-git) package, you will need to cleanbuild to
update the package. Paru has been problematic with updating before, use Yay.
# How do I screen lock?
### How do I screen lock?
Use a wayland-compatible locking utility using WLR protocols, e.g. `swaylock`.
# How do I change me mouse cursor?
### How do I change me mouse cursor?
See [hyprcursor](../Hypr-Ecosystem/hyprcursor)
||||||| parent of 0fcc6e5 (treewide: replace hint with callout)
1. Set the GTK cursor using [nwg-look](https://github.com/nwg-piotr/nwg-look).
2. Add `exec-once=hyprctl setcursor [THEME] [SIZE]` to your config and restart Hyprland.
# GTK Settings no work / whatever
If using flatpak, run `flatpak override --env=~/.themes:ro --env=~/.icons:ro --user` and put your themes in both `/usr/share/themes` and `~/.themes`, and put your icons and cursors in both `/usr/share/icons` and `~/.icons`.
For Qt applications, Hyprland exports XCURSOR_SIZE as 24, which is the default.
You can overwrite this by exporting XCURSOR_SIZE to a different value with `env`.
You can also try running `gsettings set org.gnome.desktop.interface cursor-theme 'theme-name'` or adding it after `exec-once=` in your config.
If you do not want to install a GTK settings editor, change the config files according to the
[XDG specification (Arch Wiki link)](https://wiki.archlinux.org/title/Cursor_themes#Configuration).
Make sure to also edit `~/.config/gtk-4.0/settings.ini` and `~/.gtkrc-2.0` if _not_ using a tool
(like `nwg-look`).
### GTK Settings no work / whatever
[https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland](https://github.com/swaywm/sway/wiki/GTK-3-settings-on-Wayland)
# My \[program name\] is freezing
### My \[program name\] is freezing
Make sure you have a notification daemon running, for example `dunst`. Autostart
it with the `exec-once` keyword.
# Waybar workspaces no worky???
### Waybar workspaces no worky???
Waybar has a set of caveats or settings that you need to be aware of. See
[Status bars](../Useful-Utilities/Status-Bars) for solutions.
[Status bars](../useful-utilities/status-bars) for solutions.
# How do I autostart my favorite apps?
### How do I autostart my favorite apps?
Using the window rules to assign apps to workspace you can open a bunch of
applications on various workspaces. The following method will start these apps
@ -147,7 +172,7 @@ exec-once=[workspace 3 silent] mailspring
exec-once=[workspace 4 silent] firefox
```
# How do I move my favorite workspaces to a new monitor when I plug it in?
### How do I move my favorite workspaces to a new monitor when I plug it in?
if you want workspaces to automatically go to a monitor upon connection, use the
following:
@ -179,13 +204,13 @@ if you want workspaces 1 2 4 5 to go to monitor 1 when connecting it.
Please note this requires `socat` to be installed.
# My tablet no worky??
### My tablet no worky??
Use [Open Tablet Driver](https://github.com/OpenTabletDriver/OpenTabletDriver)
to configure your tablet. In the future it will be supported in the config.
Until then, OTD is the way to go.
# Some of my apps take a really long time to open...?
### Some of my apps take a really long time to open...?
_~/.config/hypr/hyprland.conf_
@ -208,11 +233,12 @@ sleep 4
/usr/lib/xdg-desktop-portal &
```
launched with `exec-once` should fix all issues. Adjust the sleep durations to taste.
launched with `exec-once` should fix all issues. Adjust the sleep durations to
taste.
# How do I export envvars for Hyprland?
### How do I export envvars for Hyprland?
See [Environment Variables](../Configuring/Environment-variables)
See [Environment Variables](../configuring/environment-variables)
The `env` keyword is used for this purpose. For example:
@ -220,60 +246,83 @@ The `env` keyword is used for this purpose. For example:
env = XDG_CURRENT_DESKTOP,Hyprland
```
# How to disable middle-click paste?
### How to disable middle-click paste?
You can simply intercept the middle-click action all together, via hyprland binds for example. The drawbacks to this solution are that 1. it disables the rest of the functionality of the middle-click action, such as auto scroll, closing browser tabs, etc., and 2. many applications (such as kitty) manually intercept the middle-click events and bind them to paste from the primary buffer themselves, bypassing the solution altogether. For this solution, add this bind to your config:
You can simply intercept the middle-click action all together, via hyprland
binds for example. The drawbacks to this solution are that 1. it disables the
rest of the functionality of the middle-click action, such as auto scroll,
closing browser tabs, etc., and 2. many applications (such as kitty) manually
intercept the middle-click events and bind them to paste from the primary buffer
themselves, bypassing the solution altogether. For this solution, add this bind
to your config:
`bind = , mouse:274, exec, ;`. Note that the exact bindcode may vary, so you may want to check it with `wev` first.
`bind = , mouse:274, exec, ;`. Note that the exact bindcode may vary, so you may
want to check it with `wev` first.
<details>
<summary> Alternative method using wl-paste (warning: major power consumption)</summary>
The middle-click paste action pastes from a separate buffer (primary buffer) than what the regular clipboard uses (clipboard buffer). Since the primary buffer is unrelated to the clipboard buffer, it's easy to simply keep the primary buffer empty, allowing the middle-click action to retain the rest of its functionality without having anything to paste. Run the following command (in your config with `exec-once`, for example) to achieve this:
`wl-paste -p --watch wl-copy -p ''` (`wl-paste -p --watch` watches for changes to the primary buffer, `wl-copy -p ''` clears the primary buffer)
The middle-click paste action pastes from a separate buffer (primary buffer)
than what the regular clipboard uses (clipboard buffer). Since the primary
buffer is unrelated to the clipboard buffer, it's easy to simply keep the
primary buffer empty, allowing the middle-click action to retain the rest of its
functionality without having anything to paste. Run the following command (in
your config with `exec-once`, for example) to achieve this:
**As you can see, however, this creates an endless loop (found copied text -> copy -> found copied text...). Therefore this method is not recommended.**
`wl-paste -p --watch wl-copy -p ''` (`wl-paste -p --watch` watches for changes
to the primary buffer, `wl-copy -p ''` clears the primary buffer)
**As you can see, however, this creates an endless loop (found copied text ->
copy -> found copied text...). Therefore this method is not recommended.**
</details>
# How do I make Hyprland draw as little power as possible on my laptop?
### How do I make Hyprland draw as little power as possible on my laptop?
**_Useful Optimizations_**:
* `decoration:blur = false` and `decoration:drop_shadow = false` to disable fancy but battery hungry effects.
- `decoration:blur = false` and `decoration:drop_shadow = false` to disable
fancy but battery hungry effects.
* `misc:vfr = true`, since it'll lower the amount of sent frames when nothing is happening on-screen.
- `misc:vfr = true`, since it'll lower the amount of sent frames when nothing is
happening on-screen.
# How to fix games with window dancing?
### How to fix games with window dancing?
Read [this trick](../Configuring/Uncommon-tips--tricks/#window-dancing).
Read [this trick](../configuring/uncommon-tips--tricks/#window-dancing).
# My apps take a long time to start / can't screenshare
### My apps take a long time to start / can't screenshare
See [The XDPH Page](../Useful-Utilities/Hyprland-desktop-portal).
See [The XDPH Page](../useful-utilities/xdg-desktop-portal-hyprland).
You most likely have multiple portal impls / an impl is failing to launch.
# My screenshot utilities won't work with multiple screens
### My screenshot utilities won't work with multiple screens
Some programs like flameshot (currently) has limited wayland support so on most Wayland compositors, you will have to do few tweaks.
For Hyprland, you can add these window rules to your config to make said programs work with both of your screens.
Some programs like flameshot (currently) has limited wayland support so on most
Wayland compositors, you will have to do few tweaks. For Hyprland, you can add
these window rules to your config to make said programs work with both of your
screens.
```windowrulev2=float,title:^(flameshot)
windowrulev2=move 0 0,title:^(flameshot)
windowrulev2=nofullscreenrequest,title:^(flameshot)
```
# I cannot bind SUPER as my mod key on my laptop
### I cannot bind SUPER as my mod key on my laptop
Many laptops have a built-in function to toggle `SUPER` between single key press mode and hold mode. This is usually indicated by a padlock on the `SUPER` key.
Many laptops have a built-in function to toggle `SUPER` between single key press
mode and hold mode. This is usually indicated by a padlock on the `SUPER` key.
First, install and run `wev`, then press `SUPER`. If you see a key press event followed by an instant key release event, then it's likely your `SUPER` key is set to single press mode.
First, install and run `wev`, then press `SUPER`. If you see a key press event
followed by an instant key release event, then it's likely your `SUPER` key is
set to single press mode.
On most laptops this can be fixed by pressing `FN+SUPER` and verified in `wev`. You should be able to hold `SUPER` and not see an instant release event. In case `FN+SUPER` doesn't work, consult your laptop's manual.
On most laptops this can be fixed by pressing `FN+SUPER` and verified in `wev`.
You should be able to hold `SUPER` and not see an instant release event. In case
`FN+SUPER` doesn't work, consult your laptop's manual.
# My VM doesn't receive keybinds I have set in Hyprland
### My VM doesn't receive keybinds I have set in Hyprland
This is expected, as Hyprland takes precedence.
@ -288,15 +337,19 @@ submap = reset
set `MOD` and `KEY` to desired values.
By pressing the selected combo you will enter a mode where hyprland ignores your keybinds and passes them on to the vm.
By pressing the selected combo you will enter a mode where hyprland ignores your
keybinds and passes them on to the vm.
Then, pressing `SUPER + Escape` will leave that mode.
# Some of my drop-down/pop-up windows in apps disappear
### Some of my drop-down/pop-up windows in apps disappear
In some apps like Steam or VSCode, the drop-down windows may disappear if you hover over them. This can be fixed with window rules.
In some apps like Steam or VSCode, the drop-down windows may disappear if you
hover over them. This can be fixed with window rules.
First, find the title and class of the pop-up window with `hyprctl clients`. You can try something like `sleep 3 && hyprctl clients` so you have time to open the pop-up. It should look something like this:
First, find the title and class of the pop-up window with `hyprctl clients`. You
can try something like `sleep 3 && hyprctl clients` so you have time to open the
pop-up. It should look something like this:
```bash
Window 55d794495400 -> :
@ -312,7 +365,8 @@ If the pop-up disappears as you hover over it, you can add to your config:
windowrulev2 = stayfocused, title:^(TITLE)$, class:^(CLASS)$
```
This has a downside of not being able to click on anything in the main UI until you've interacted with the pop-up.
This has a downside of not being able to click on anything in the main UI until
you've interacted with the pop-up.
If the pop-up disappears immediately, you can use:
@ -320,11 +374,11 @@ If the pop-up disappears immediately, you can use:
windowrulev2 = minsize 1 1, title:^(TITLE)$, class:^(CLASS)$
```
# Steam's file picker no worky
### Steam's file picker no worky
On instances where you have a steam library on another drive that you have
to add, Hyprland's file picker would not normally appear when selecting
a directory from steam.
On instances where you have a steam library on another drive that you have to
add, Hyprland's file picker would not normally appear when selecting a directory
from steam.
Steam has its own file picker, however, it's not functional. Install
`xdg-desktop-portal-gtk` to show the desktop's file picker.

View file

@ -1,9 +1,14 @@
---
weight: 2
title: Installation
---
# Foreword
Due to their proprietary nature, Nvidia GPUs have limited compatibility with
Hyprland. If you want to try Hyprland on Nvidia regardless
(many people have reported successes), follow the [Nvidia page](../../Nvidia)
after installing Hyprland.
Hyprland. If you want to try Hyprland on Nvidia regardless (many people have
reported successes), follow the [Nvidia page](../../nvidia) after installing
Hyprland.
## Distros
@ -17,28 +22,29 @@ might have **major** issues running Hyprland.
Installing Hyprland is very easy. Either you install it from your local package
provider (if they provide pkgs for Hyprland) or you install/build it yourself.
{{< hint title=note >}}
This project is under development and is constantly
changing. If you want to keep up to date with the latest commits, please
consider updating your packages with `yay -Syu --devel`, or your other preferred
package manager.
{{< /hint >}}
{{< callout >}}
This project is under development and is constantly changing. If you want to
keep up to date with the latest commits, please consider updating your packages
with `yay -Syu --devel`, or your other preferred package manager.
{{< /callout >}}
### Packages
**WARNING:** I do not maintain any packages. If they are broken, try building
from source first.
{{< tabs "uniqueid" >}}
{{% details title="Arch" closed="true" %}}
{{< tab "Arch Linux" >}}
```plain
hyprland-git (AUR) - compiles from latest source
hyprland - binary x86 tagged release
```
{{< /tab >}}
{{< tab "Nix" >}}
{{% /details %}}
{{% details title="Nix" closed="true" %}}
Enable Hyprland in your NixOS configuration:
@ -46,11 +52,14 @@ Enable Hyprland in your NixOS configuration:
programs.hyprland.enable = true;
```
For more details, read the [Nix page](../../Nix).
For more details, read the [Nix page](../../nix).
{{< /tab >}}
{{< tab "openSUSE*" >}}
Hyprland is part of factory, starting with snapshot 20230411. To install it simply use zypper
{{% /details %}}
{{% details title="openSUSE*" closed="true" %}}
Hyprland is part of factory, starting with snapshot 20230411. To install it
simply use zypper
```sh
sudo zypper in hyprland
@ -58,12 +67,16 @@ sudo zypper in hyprland
or install the "hyprland" package via YaST2 Software.
Alternatively, you can also follow the instructions under ["Manual (Manual Build)"](#manual-manual-build)
to build Hyprland yourself.
Alternatively, you can also follow the instructions under
["Manual (Manual Build)"](#manual-manual-build) to build Hyprland yourself.
Note: _Hyprland is not available for Leap, as most libraries (and compiler) that
Hyprland needs are too old._
{{% /details %}}
{{% details title="Fedora*" closed="true" %}}
Note: _Hyprland is not available for Leap, as most libraries (and compiler) that Hyprland needs are too old._
{{< /tab >}}
{{< tab "Fedora*" >}}
On Fedora 39 and Rawhide, run:
```sh
@ -71,18 +84,28 @@ sudo dnf install hyprland
sudo dnf install hyprland-devel # If you want to build plugins
```
Builds for Fedora 38 and additional packages are available in the [solopasha/hyprland](https://copr.fedorainfracloud.org/coprs/solopasha/hyprland) Copr repository.
Builds for Fedora 38 and additional packages are available in the
[solopasha/hyprland](https://copr.fedorainfracloud.org/coprs/solopasha/hyprland)
Copr repository.
If you are on an older version of Fedora, you can also compile it yourself by
following the instructions
[here](https://github.com/hyprwm/Hyprland/discussions/284)
{{% /details %}}
{{% details title="Gentoo*" closed="true" %}}
If you are on an older version of Fedora, you can also compile it yourself by following the instructions [here](https://github.com/hyprwm/Hyprland/discussions/284)
{{< /tab >}}
{{< tab "Gentoo*" >}}
The hyprland package is available in the main tree:
```sh
emerge --ask gui-wm/hyprland
```
Additional packages like hyprlock, hypridle, xdg-desktop-portal-hyprland, hyprland-plugins, hyprpaper and hyprpicker are available in the [GURU](https://wiki.gentoo.org/wiki/Project:GURU) overlay. Community-contributed scripts are also available in GURU as part of the hyprland-contrib package.
Additional packages like hyprlock, hypridle, xdg-desktop-portal-hyprland,
hyprland-plugins, hyprpaper and hyprpicker are available in the
[GURU](https://wiki.gentoo.org/wiki/Project:GURU) overlay. Community-contributed
scripts are also available in GURU as part of the hyprland-contrib package.
```sh
eselect repository enable guru
@ -97,50 +120,84 @@ emerge --ask gui-apps/hyprpicker
emerge --ask gui-wm/hyprland-contrib
```
For USE flags and more details, read the [Gentoo wiki page](https://wiki.gentoo.org/wiki/Hyprland) about Hyprland.
For USE flags and more details, read the
[Gentoo wiki page](https://wiki.gentoo.org/wiki/Hyprland) about Hyprland.
{{% /details %}}
{{% details title="FreeBSD*" closed="true" %}}
{{</ tab >}}
{{< tab "FreeBSD*" >}}
Hyprland and related are in the default repository:
- [hyprland](https://www.freshports.org/x11-wm/hyprland)
- [hyprpaper](https://www.freshports.org/x11/hyprpaper)
- [hyprpicker](https://www.freshports.org/x11/hyprpicker)
- [xdg-desktop-portal-hyprland](https://www.freshports.org/x11/xdg-desktop-portal-hyprland)
- [Other Wayland stuff](https://www.freshports.org/wayland/)
{{</ tab >}}
{{< tab "Ubuntu 23.04*" >}}
{{% /details %}}
{{% details title="Ubuntu 23.04*" closed="true" %}}
Build Dependencies:
```bash
sudo apt-get install -y meson wget build-essential ninja-build cmake-extras cmake gettext gettext-base fontconfig libfontconfig-dev libffi-dev libxml2-dev libdrm-dev libxkbcommon-x11-dev libxkbregistry-dev libxkbcommon-dev libpixman-1-dev libudev-dev libseat-dev seatd libxcb-dri3-dev libegl-dev libgles2 libegl1-mesa-dev glslang-tools libinput-bin libinput-dev libxcb-composite0-dev libavutil-dev libavcodec-dev libavformat-dev libxcb-ewmh2 libxcb-ewmh-dev libxcb-present-dev libxcb-icccm4-dev libxcb-render-util0-dev libxcb-res0-dev libxcb-xinput-dev xdg-desktop-portal-wlr libtomlplusplus3
```
you will also need to build the latest wayland, wayland-protocols, and libdisplay-info tagged releases from source
for more info refer to the [Ubuntu Guide For Installing And Building Hyprland Gist](https://gist.github.com/Vertecedoc4545/3b077301299c20c5b9b4db00f4ca6000)
you will also need to build the latest wayland, wayland-protocols, and
libdisplay-info tagged releases from source
{{< hint type=warning >}}
for more info refer to the
[Ubuntu Guide For Installing And Building Hyprland Gist](https://gist.github.com/Vertecedoc4545/3b077301299c20c5b9b4db00f4ca6000)
Please note that since Ubuntu is generally behind with dependencies, it's not guaranteed
that the build process will work at all. Even if it is, it's likely that it will break at some point in the future.
{{< callout type=warning >}}
Please note that since Ubuntu is generally behind with dependencies, it's not
guaranteed that the build process will work at all. Even if it is, it's likely
that it will break at some point in the future.
Refer to the gist if anything fails.
{{< /hint >}}
{{< /callout >}}
{{</ tab >}}
{{< tab "Void Linux*" >}}
Hyprland is not available for Void Linux from the official repositories [as Hyprland doesn't build against tagged wlroots](https://github.com/void-linux/void-packages/issues/37544),
however template files are available [from a third party](https://github.com/Makrennel/hyprland-void) which can build Hyprland [using xbps-src](https://github.com/void-linux/void-packages).
{{% /details %}}
For further instructions on building with the third party resource, refer to the [README](https://github.com/Makrennel/hyprland-void/blob/master/README.md).
{{% details title="Void Linux*" closed="true" %}}
{{< hint type=warning >}}
As always, when using third party scripts exercise caution and understand what the script does.
{{< /hint>}}
{{< /tab >}}
Hyprland is not available for Void Linux from the official repositories
[as Hyprland doesn't build against tagged wlroots](https://github.com/void-linux/void-packages/issues/37544),
however template files are available
[from a third party](https://github.com/Makrennel/hyprland-void) which can build
Hyprland [using xbps-src](https://github.com/void-linux/void-packages).
{{< /tabs >}}
For further instructions on building with the third party resource, refer to the
[README](https://github.com/Makrennel/hyprland-void/blob/master/README.md).
***\* Unofficial, no official support is provided. These instructions are community-driven, and no guarantee is provided for their validity.***
{{< callout type=warning >}}
As always, when using third party scripts exercise caution and understand what
the script does.
{{< /callout >}}
{{% /details %}}
{{% details title="Slackware*" closed="true" %}}
```plain
hyprland-bin (SlackBuilds) - Prebuilt release for Slackware ready for install
```
Hyprland is not installed by default on the current release of Slackware.
For detailed instructions on installing this build see
[here](https://slackbuilds.org/repository/15.0/desktop/hyprland-bin/)
{{% /details %}}
_**\* Unofficial, no official support is provided. These instructions are
community-driven, and no guarantee is provided for their validity.**_
### Manual (Releases, Linux-only)
@ -170,15 +227,17 @@ _Arch dependencies_:
yay -S gdb ninja gcc cmake meson libxcb xcb-proto xcb-util xcb-util-keysyms libxfixes libx11 libxcomposite xorg-xinput libxrender pixman wayland-protocols cairo pango seatd libxkbcommon xcb-util-wm xorg-xwayland libinput libliftoff libdisplay-info cpio tomlplusplus
```
_(Please make a pull request or open an issue if any packages are missing from the list)_
_(Please make a pull request or open an issue if any packages are missing from
the list)_
_openSUSE dependencies_:
```sh
zypper in gcc-c++ git meson cmake "pkgconfig(cairo)" "pkgconfig(egl)" "pkgconfig(gbm)" "pkgconfig(gl)" "pkgconfig(glesv2)" "pkgconfig(libdrm)" "pkgconfig(libinput)" "pkgconfig(libseat)" "pkgconfig(libudev)" "pkgconfig(pango)" "pkgconfig(pangocairo)" "pkgconfig(pixman-1)" "pkgconfig(vulkan)" "pkgconfig(wayland-client)" "pkgconfig(wayland-protocols)" "pkgconfig(wayland-scanner)" "pkgconfig(wayland-server)" "pkgconfig(xcb)" "pkgconfig(xcb-icccm)" "pkgconfig(xcb-renderutil)" "pkgconfig(xkbcommon)" "pkgconfig(xwayland)" "pkgconfig(xcb-errors)" glslang-devel Mesa-libGLESv3-devel tomlplusplus-devel
zypper in gcc-c++ git meson cmake "pkgconfig(cairo)" "pkgconfig(egl)" "pkgconfig(gbm)" "pkgconfig(gl)" "pkgconfig(glesv2)" "pkgconfig(libdrm)" "pkgconfig(libinput)" "pkgconfig(libseat)" "pkgconfig(libudev)" "pkgconfig(pango)" "pkgconfig(pangocairo)" "pkgconfig(pixman-1)" "pkgconfig(vulkan)" "pkgconfig(wayland-client)" "pkgconfig(wayland-protocols)" "pkgconfig(wayland-scanner)" "pkgconfig(wayland-server)" "pkgconfig(xcb)" "pkgconfig(xcb-icccm)" "pkgconfig(xcb-renderutil)" "pkgconfig(xkbcommon)" "pkgconfig(xwayland)" "pkgconfig(xcb-errors)" glslang-devel Mesa-libGLESv3-devel tomlplusplus-devel
```
(this should also work on RHEL/Fedora if you remove `Mesa-libGLESv3-devel` and `pkgconfig(xcb-errors)`)
(this should also work on RHEL/Fedora if you remove `Mesa-libGLESv3-devel` and
`pkgconfig(xcb-errors)`)
_FreeBSD dependencies_:
@ -188,17 +247,16 @@ pkg install meson jq `pkg rquery %dn wlroots` hwdata libdisplay-info libliftoff
export CC=gcc CXX=g++ LDFLAGS="-static-libstdc++ -static-libgcc"
```
_Ubuntu 23.04 dependencies_:
refer to the Ubuntu tab above
_Ubuntu 23.04 dependencies_: refer to the Ubuntu tab above
Please note Hyprland builds `wlroots`. Make sure you have the dependencies of
wlroots installed, you can make sure you have them by installing wlroots
separately (Hyprland doesn't mind)
Also note that Hyprland uses the C++23 standard, so both your compiler
and your C++ library has to support that (`gcc>=13.0.0` or `clang>=15`).
On Clang-based systems libc++ may be used by default, so until libc++
supports C++23 you have to pass `-stdlib=libstdc++` or switch to GCC.
Also note that Hyprland uses the C++23 standard, so both your compiler and your
C++ library has to support that (`gcc>=13.0.0` or `clang>=15`). On Clang-based
systems libc++ may be used by default, so until libc++ supports C++23 you have
to pass `-stdlib=libstdc++` or switch to GCC.
### CMake (recommended)
@ -208,7 +266,8 @@ cd Hyprland
make all && sudo make install
```
_CMake is always recommended as it's the intended way Hyprland should be installed._
_CMake is always recommended as it's the intended way Hyprland should be
installed._
### Meson
@ -219,12 +278,12 @@ ninja -C build
ninja -C build install --tags runtime,man
```
Refer to [Debugging](../../Contributing-and-Debugging) to see how to build &
Refer to [Debugging](../../contributing-and-debugging) to see how to build &
debug.
## Crash on launch
See [Crashes and Bugs](../../Crashes-and-Bugs).
See [Crashes and Bugs](../../crashes-and-bugs).
## Custom installation (legacy renderer, etc)
@ -284,4 +343,5 @@ Now, of course, install manually.
sudo cp ./build/Hyprland /usr/bin && sudo cp ./example/hyprland.desktop /usr/share/wayland-sessions
```
Lastly, copy hyprctl, hyprpm, and wlroots as mentioned [here](#manual-releases-linux-only)
Lastly, copy hyprctl, hyprpm, and wlroots as mentioned
[here](#manual-releases-linux-only)

View file

@ -1,33 +1,41 @@
If you are coming to Hyprland for the first time, this is the main tutorial to read.
---
weight: 1
title: Master tutorial
---
Due to a lot of people doing stupid stuff, this tutorial will cover literally everything
you need to just get things going. It does link to other pages where necessary.
If you are coming to Hyprland for the first time, this is the main tutorial to
read.
{{< toc >}}
Due to a lot of people doing stupid stuff, this tutorial will cover literally
everything you need to just get things going. It does link to other pages where
necessary.
## Install Hyprland
See [Installation](../Installation) and come back here once you have successfully
installed Hyprland.
Install `kitty` (default terminal emulator) terminal. This is available in most
See [Installation](../installation) and come back here once you have
successfully installed Hyprland.
Install `kitty` (default terminal emulator) terminal. This is available in most
distros' repositories.
## NVIDIA?
_If not using an NVIDIA card, skip this step_
Please take a look at
[The Nvidia page](../../Nvidia) before launching. It has a lot of info regarding the needed
environment and tweaks.
Please take a look at [The Nvidia page](../../nvidia) before launching. It has a
lot of info regarding the needed environment and tweaks.
## VM?
_If not using a VM, skip this step_
In a VM, make sure you have 3D acceleration enabled in your virtio config (or virt-manager)
otherwise Hyprland ***will not work***.
In a VM, make sure you have 3D acceleration enabled in your virtio config (or
virt-manager) otherwise Hyprland _**will not work**_.
You can also passthru a GPU to make it work.
Please bear in mind 3D accel in VMs may be pretty slow.
## Launching Hyprland
Now, you can just execute `Hyprland` in your tty.
@ -35,65 +43,82 @@ Now, you can just execute `Hyprland` in your tty.
**!IMPORTANT**: Do **not** launch Hyprland with `root` permissions (don't
`sudo`)
You can see some launch flags by doing `Hyprland -h`, these include setting the config
path, ignoring a check for the above, etc.
You can see some launch flags by doing `Hyprland -h`, these include setting the
config path, ignoring a check for the above, etc.
Login managers are not officially supported, but here's a short compatibility
list:
- SDDM → Works flawlessly. Install sddm ⩾ 0.20.0 or the [latest git version](https://github.com/sddm/sddm) (or [sddm-git](https://aur.archlinux.org/packages/sddm-git) from AUR) to prevent SDDM bug [1476](https://github.com/sddm/sddm/issues/1476) (90s shutdowns).
- SDDM → Works flawlessly. Install sddm ⩾ 0.20.0 or the
[latest git version](https://github.com/sddm/sddm) (or
[sddm-git](https://aur.archlinux.org/packages/sddm-git) from AUR) to prevent
SDDM bug [1476](https://github.com/sddm/sddm/issues/1476) (90s shutdowns).
- GDM → Works with the caveat of crashing Hyprland on the first launch
- ly → Works poorly
## In Hyprland
You're good to go with your adventure, technically.
Use <key>SUPER</key> + <key>Q</key> to launch kitty. If you wish to choose the
default terminal before you proceed, you can do so in `~/.config/hypr/hyprland.conf`
([example config](https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.conf)).
default terminal before you proceed, you can do so in
`~/.config/hypr/hyprland.conf`
([example config](https://github.com/hyprwm/Hyprland/blob/main/example/hyprland.conf)).
If you want the best experience with less hassle googling, keep reading.
## Critical software
See the [Must-have Software page](../../Useful-Utilities/Must-have) for the crucial
things to make Wayland / Hyprland / other apps work correctly.
See the [Must-have Software page](../../useful-utilities/must-have) for the
crucial things to make Wayland / Hyprland / other apps work correctly.
## Monitors config
See [Configuring Hyprland page](../../Configuring/Monitors) to learn all
about configuring your displays.
See [Configuring Hyprland page](../../configuring/monitors) to learn all about
configuring your displays.
## Apps / X11 replacements
See the [Useful Utilities page](../../Useful-Utilities) and the
See the [Useful Utilities page](../../useful-utilities) and the
[Sway wiki page](https://github.com/swaywm/sway/wiki/Useful-add-ons-for-sway)
just about that. You can also visit the
[Awesome-Hyprland](https://github.com/hyprland-community/awesome-hyprland)
repository for a more comprehensive list.
## Fully configure
Head onto the
[Configuring Hyprland page](../../Configuring/Configuring-Hyprland) to learn all
[Configuring Hyprland page](../../configuring/configuring-Hyprland) to learn all
about configuring Hyprland to your likings.
## Cursors
Cursors are a notorious pain to set up when you don't know how. See
[this FAQ entry](../../FAQ#how-do-i-change-me-mouse-cursor)
If your cursor does not appear, then see [this FAQ entry](../../FAQ#me-cursor-no-render)
Cursors are a notorious pain to set up when you don't know how. See
[this FAQ entry](../../faq#how-do-i-change-me-mouse-cursor)
If your cursor does not appear, then see
[this FAQ entry](../../faq#me-cursor-no-render)
## Themes
Since this is not a full fledged Desktop Environment, you will need to use tools such as
`lxappearance` and `nwg-look` (recommended) for GTK, and `qt5ct` / `qt6ct` for their
respective Qt versions. Some older applications may also require `qt4ct`.
Since this is not a full fledged Desktop Environment, you will need to use tools
such as `lxappearance` and `nwg-look` (recommended) for GTK, and `qt5ct` /
`qt6ct` for their respective Qt versions. Some older applications may also
require `qt4ct`.
## Force apps to use Wayland
A lot of apps will use Wayland by default. Chromium (and other browsers based on it or electron)
don't. You need to pass `--enable-features=UseOzonePlatform --ozone-platform=wayland` to them or use `.conf` files
where possible. Chromium-based browsers also should have a toggle in `chrome://flags`. Search for _"ozone"_ and select Wayland.
For most electron apps, you should put the above in `~/.config/electron-flags.conf`. VSCode is known
to not work with that though.
A lot of apps will use Wayland by default. Chromium (and other browsers based on
it or electron) don't. You need to pass
`--enable-features=UseOzonePlatform --ozone-platform=wayland` to them or use
`.conf` files where possible. Chromium-based browsers also should have a toggle
in `chrome://flags`. Search for _"ozone"_ and select Wayland.
A few more environment variables for forcing Wayland mode are documented [here](../../Configuring/Environment-variables).
For most electron apps, you should put the above in
`~/.config/electron-flags.conf`. VSCode is known to not work with that though.
You can check whether an app is running in xwayland or not with `hyprctl clients`.
A few more environment variables for forcing Wayland mode are documented
[here](../../configuring/environment-variables).
You can check whether an app is running in xwayland or not with
`hyprctl clients`.

View file

@ -0,0 +1,6 @@
---
weight: 2
title: Getting Started
sidebar:
open: true
---

View file

@ -1,10 +1,15 @@
---
weight: 4
title: Hypr Ecosystem
---
This wiki section hosts docs for various hypr* projects. See a list bere:
{{< hint type=info >}}
{{< callout type=info >}}
These docs always target latest -git branch of respective apps.
{{< /hint >}}
{{< /callout >}}
## Wiki pages
- **[hyprpaper](./hyprpaper)**
@ -12,4 +17,4 @@ These docs always target latest -git branch of respective apps.
- **[hypridle](./hypridle)**
- **[hyprlock](./hyprlock)**
- **[hyprcursor](./hyprcursor)**
- **[xdg-desktop-portal-hyprland](./xdg-desktop-portal-hyprland)**
- **[xdg-desktop-portal-hyprland](./xdg-desktop-portal-hyprland)**

View file

@ -1,20 +1,22 @@
hypridle is hyprland's idle management daemon.
---
weight: 3
title: hypridle
---
{{< toc >}}
hypridle is hyprland's idle management daemon.
## Configuration
Configuration is done via the config file at `~/.config/hypr/hypridle.conf`.
A config file is required; hypridle won't run without one.
To run hypridle at startup edit `hyprland.conf` and add:
`exec-once = hypridle`.
Configuration is done via the config file at `~/.config/hypr/hypridle.conf`. A
config file is required; hypridle won't run without one. To run hypridle at
startup edit `hyprland.conf` and add: `exec-once = hypridle`.
### General
Variables in the `general` category:
| variable | description | type | default |
| -- | -- | -- | -- |
| --- | --- | --- | --- |
| lock_cmd | command to run when receiving a dbus lock event (e.g. `loginctl lock-session`) | string | empty |
| unlock_cmd | command to run when receiving a dbus unlock event (e.g. `loginctl unlock-session`) | string | empty |
| before_sleep_cmd | command to run when receiving a dbus prepare_sleep event | string | empty |
@ -25,8 +27,9 @@ Variables in the `general` category:
Hypridle uses listeners to define actions on idleness.
Every listener has a _timeout_ (in seconds). After idling for _timeout_ seconds, `on-timeout` will fire.
When action is resumed after idle, `on-resume` will fire.
Every listener has a _timeout_ (in seconds). After idling for _timeout_ seconds,
`on-timeout` will fire. When action is resumed after idle, `on-resume` will
fire.
Example listener:

View file

@ -1,11 +1,16 @@
hyprlock is a simple, yet fast, multi-threaded and GPU-accelerated screen
lock for hyprland.
---
weight: 4
title: hyprlock
---
{{< toc >}}
hyprlock is a simple, yet fast, multi-threaded and GPU-accelerated screen lock
for hyprland.
## Configuration
Configuration is done via the config file at `~/.config/hypr/hyprlock.conf`. It is not required, but recommended. Without it, locking shows the current screen.
Configuration is done via the config file at `~/.config/hypr/hyprlock.conf`. It
is not required, but recommended. Without it, locking shows the current screen.
### General
Variables in the `general` category:
@ -33,10 +38,16 @@ widget_name {
## Widget List
### General remarks
- All rendered text supports [pango markup](https://docs.gtk.org/Pango/pango_markup.html).
- Additionally hyprlock will parse `<br/>` for your convenience. (That's a linebreak) Remember to enable linebreaks in your spans with `allow_breaks="true"`.
- Positioning is done via halign, valign and position. Position is an added offset to the result of alignment.
- halign: `left`, `center`, `right`, `none`. valign: `top`, `center`, `bottom`, `none`
- All rendered text supports
[pango markup](https://docs.gtk.org/Pango/pango_markup.html).
- Additionally hyprlock will parse `<br/>` for your convenience. (That's a
linebreak) Remember to enable linebreaks in your spans with
`allow_breaks="true"`.
- Positioning is done via halign, valign and position. Position is an added
offset to the result of alignment.
- halign: `left`, `center`, `right`, `none`. valign: `top`, `center`,
`bottom`, `none`
### Shadowable
@ -52,7 +63,8 @@ Some widgets are shadowable, aka. can have a shadow. For those widgets, you get:
Draws a background image or fills with color.
If `path` is empty or missing, will use `color`. Otherwise, the image will be used.
If `path` is empty or missing, will use `color`. Otherwise, the image will be
used.
If `path` is `screenshot`, a screenshot of your desktop at launch will be used.
@ -142,9 +154,11 @@ Available variables for `text`:
- `$ATTEMPTS` - failed attempts
`text` also supports launching commands, for example:
```ini
text = cmd[update:1000] echo "<span foreground='##ff2222'>$(date)</span>"
```
Worth noting:
- `update:` - time is in ms.
- label can be forcefully updated by specifying `update:<time>:1` or `update:<time>:true` and sending `SIGUSR2` to hyprlock. `<time>` can be `0` in this case

View file

@ -1,14 +1,17 @@
hyprpaper is a fast, IPC-controlled wallpaper utility for hyprland.
---
weight: 1
title: hyprpaper
---
{{< toc >}}
hyprpaper is a fast, IPC-controlled wallpaper utility for hyprland.
## Configuration
The config file is located at `~/.config/hypr/hyprpaper.conf`. It is not required.
The config file is located at `~/.config/hypr/hyprpaper.conf`. It is not
required.
Configuration is done via `preload`s, which _load_ an image into memory.
Then, you use `wallpaper` keywords to apply the preloaded image to your
monitor(s):
Configuration is done via `preload`s, which _load_ an image into memory. Then,
you use `wallpaper` keywords to apply the preloaded image to your monitor(s):
```ini
preload = /home/me/amongus.png
@ -16,30 +19,32 @@ wallpaper = DP-1,/home/me/amongus.png
```
For wallpaper keywords:
- all paths have to be absolute (or start with `~`)
- leaving the first parameter (monitor) empty will act as a wildcard
- adding `contain:` before the path (e.g. `contain:/home/me/amongus.png`) will adjust the fitting algorithm to contain.
You can also `unload` preloaded images to free up memory. `unload all` and `unload unused` are a thing too.
You can also `unload` preloaded images to free up memory. `unload all` and
`unload unused` are a thing too.
To run hyprpaper at startup edit `hyprland.conf` and add:
`exec-once = hyprpaper`.
### Misc options
| variable | description | type | default |
| -- | -- | -- | -- |
| --- | --- | --- | --- |
| splash | enable rendering of the hyprland splash over the wallpaper | bool | false |
| splash_offset | how far (in % of height) up should the splash be displayed | float | 2.0 |
| ipc | whether to enable IPC | bool | true |
## IPC
hyprpaper supports IPC via `hyprctl`. Every dispatcher mentioned in [Configuration](#Configuration)
can be called with `hyprctl hyprpaper <dispatcher> <arg(s)>`.
hyprpaper supports IPC via `hyprctl`. Every dispatcher mentioned in
[Configuration](#configuration) can be called with
`hyprctl hyprpaper <dispatcher> <arg(s)>`.
Additionally, you can get some info about the current state of hyprpaper with `listloaded` and `listactive`.
Additionally, you can get some info about the current state of hyprpaper with
`listloaded` and `listactive`.
Examples:
```sh
hyprctl hyprpaper preload "~/Pictures/myepicpng.png"
hyprctl hyprpaper wallpaper "DP-1,~/Pictures/myepicpng.png"

View file

@ -1,15 +1,18 @@
hyprpicker is a neat utility for picking a color your screen on hyprland.
---
weight: 2
title: hyprpicker
---
{{< toc >}}
hyprpicker is a neat utility for picking a color your screen on hyprland.
## Configuration
No configuration, only launch flags:
| flag | description | args |
| -- | -- | -- |
| --- | --- | --- |
| -a / --autocopy | Automatically copies the output to the clipboard (requires wl-clipboard) | none |
| -f / --format= | Specifies the output format | cmyk / hex / rgb / hsl / hsv |
| -n / --no-fancy | Disables the "fancy" (aka. colored) outputting | none |
| -r | --render-inactive | Render (freeze) inactive displays | none |
| -z | --no-zoom | Disable the zoom lens | none |
| -r | --render-inactive | Render (freeze) inactive displays |
| -z | --no-zoom | Disable the zoom lens |

View file

@ -1,7 +1,10 @@
xdg-desktop-portal-hyprland is Hyprland's xdg-desktop-portal implementation.
It allows for screensharing, global shortcuts, etc.
---
weight: 5
title: xdg-desktop-portal-hyprland
---
{{< toc >}}
xdg-desktop-portal-hyprland is Hyprland's xdg-desktop-portal implementation. It
allows for screensharing, global shortcuts, etc.
## Configuration
@ -9,4 +12,5 @@ No configuration.
## Troubleshooting
See the [XDG Desktop Portal wiki page](../../Useful-Utilities/Hyprland-desktop-portal).
See the
[XDG Desktop Portal wiki page](../../useful-utilities/xdg-desktop-portal-hyprland).

View file

@ -1,21 +1,25 @@
---
weight: 9
title: IPC
---
Hyprland exposes 2 UNIX Sockets, for controlling / getting info about Hyprland
via code / bash utilities.
# Hyprland Instance Signature (HIS)
## Hyprland Instance Signature (HIS)
```sh
echo $HYPRLAND_INSTANCE_SIGNATURE
```
# /tmp/hypr/\[HIS\]/.socket.sock
## /tmp/hypr/\[HIS\]/.socket.sock
Used for hyprctl-like requests. See the
[Hyprctl page](../Configuring/Using-hyprctl) for
commands.
[Hyprctl page](../configuring/using-hyprctl) for commands.
basically, write `[flag(s)]/command args`.
# /tmp/hypr/\[HIS\]/.socket2.sock
## /tmp/hypr/\[HIS\]/.socket2.sock
Used for events. Hyprland will write to each connected client live events like
this:
@ -24,7 +28,7 @@ this:
e.g.: `workspace>>2`
# Events list
## Events list
| name | description | data |
| --- | --- | --- |
@ -62,13 +66,15 @@ e.g.: `workspace>>2`
| lockgroups | emitted when `lockgroups` is toggled. | `0/1` |
| configreloaded | emitted when the config is done reloading | empty |
{{< hint type=warning >}}
A fullscreen event is not guaranteed to fire on/off once in succession.
A window might do for example 3 requests to be fullscreen'd, which would result
in 3 fullscreen events.
{{< /hint >}}
{{< callout type=warning >}}
# How to use socket2 with bash
A fullscreen event is not guaranteed to fire on/off once in succession. A window
might do for example 3 requests to be fullscreen'd, which would result in 3
fullscreen events.
{{< /callout >}}
## How to use socket2 with bash
example script using socket2 events with bash and `socat`:

View file

@ -1,3 +1,7 @@
---
title: Cachix
---
NOTE: This page only applies to the flake package. You can safely skip this if
you use the Nixpkgs package.
@ -11,10 +15,12 @@ your Nix configuration.
The [Hyprland Cachix](https://app.cachix.org/cache/hyprland) exists to cache the
`hyprland` packages and any dependencies not found in [cache.nixos.org].
{{< hint >}}
{{< callout >}}
In order for Nix to take advantage of the cache, it has to be enabled **before**
using the Hyprland flake package.
{{< /hint >}}
{{< /callout >}}
```nix
# configuration.nix
@ -26,12 +32,10 @@ using the Hyprland flake package.
}
```
{{< hint type=important >}}
Do **not** override Hyprland's `nixpkgs` input unless you know what you are
doing.
{{< callout type=important >}} Do **not** override Hyprland's `nixpkgs` input
unless you know what you are doing.
Doing so will make the cache useless, since you're building from a different
Nixpkgs commit.
{{< /hint >}}
Nixpkgs commit. {{< /callout >}}
[cache.nixos.org]: https://cache.nixos.org

View file

@ -1,16 +1,20 @@
---
title: Hyprland on Home Manager
---
For a list of available options, check the
[Home Manager options](https://nix-community.github.io/home-manager/options.xhtml#opt-wayland.windowManager.hyprland.enable).
{{< hint title=Note >}}
{{< callout >}}
- _(Required) NixOS Module_: enables critical components needed to run Hyprland
properly
- _(Optional) Home-manager module_: lets you declaratively configure Hyprland
{{< /hint >}}
{{< /callout >}}
## Installation
{{< tabs "uniqueid" >}}
{{< tabs items="Home Manager,Flakes,No Flakes (with flake-compat)" >}}
{{< tab "Home Manager" >}}
@ -27,13 +31,13 @@ module.
{{< tab "Flakes" >}}
{{< hint >}}
{{< callout >}}
The flake module is merely an extension to the Home Manager downstream module.
It is mainly used as a staging area for new options, so unless you're a tester
you should use the downstream Home Manager module.
{{< /hint >}}
{{< /callout >}}
The following snippet of code tries to show how to bring the Hyprland flake from
the flake input and import it into the module system. Feel free to make any
@ -74,13 +78,13 @@ Don't forget to replace `user@hostname` with your username and hostname!
{{< tab "No flakes (with flake-compat)" >}}
{{< hint >}}
{{< callout >}}
The flake module is merely an extension to the Home Manager downstream module.
It is mainly used as a staging area for new options, so unless you're a tester
you should use the downstream Home Manager module.
{{< /hint >}}
{{< /callout >}}
The following snippet of code tries to show how to bring the Hyprland flake from
the flake input and import it into the module system. Feel free to make any
@ -106,8 +110,6 @@ in {
{{< /tabs >}}
};
## Usage
Once the module is enabled, you can use it to declaratively configure Hyprland.

View file

@ -1,3 +1,7 @@
---
title: Hyprland on NixOS
---
The NixOS module enables critical components needed to run Hyprland properly,
such as: polkit,
[xdg-desktop-portal-hyprland](https://github.com/hyprwm/xdg-desktop-portal-hyprland),
@ -7,12 +11,15 @@ your Display Manager.
Make sure to check out the options of the
[NixOS module](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=hyprland).
{{< hint title=Note >}}
- *(Required) NixOS Module*: enables critical components needed to run Hyprland properly
- *(Optional) Home-manager module*: lets you declaratively configure Hyprland
{{< /hint >}}
{{< callout >}}
{{< tabs "uniqueid" >}}
- _(Required) NixOS Module_: enables critical components needed to run Hyprland
properly
- _(Optional) Home-manager module_: lets you declaratively configure Hyprland
{{< /callout >}}
{{< tabs items="Nixpkgs,Flake Package, No Flakes (with flake-compat)" >}}
{{< tab "Nixpkgs" >}}
@ -30,13 +37,15 @@ This will use the Hyprland version that Nixpkgs has.
{{< tab "Flake package" >}}
{{< hint >}}
Please enable [Cachix](../Cachix) before using the flake package, so you don't
have to compile Hyprland yourself.
{{< /hint >}}
{{< callout >}}
In case you want to use the development version of Hyprland, you can add it
like this:
Please enable [Cachix](../cachix) before using the flake package, so you don't
have to compile Hyprland yourself.
{{< /callout >}}
In case you want to use the development version of Hyprland, you can add it like
this:
```nix
# flake.nix
@ -64,16 +73,19 @@ like this:
};
}
```
Don't forget to change the `HOSTNAME` to your actual hostname!
{{< /tab >}}
{{< tab "Flake package, Nix stable" >}}
{{< hint >}}
Please enable [Cachix](../Cachix) before using the flake package, so you don't
{{< callout >}}
Please enable [Cachix](../cachix) before using the flake package, so you don't
have to compile Hyprland yourself.
{{< /hint >}}
{{< /callout >}}
```nix
# configuration.nix
@ -93,8 +105,10 @@ in {
```
{{< /tab >}}
{{< /tabs >}}
## Fixing problems with themes
If your themes for mouse cursor, icons or windows don't load correctly, see the relevant section in [Hyprland on Home Manager](../Hyprland-on-Home-Manager).
If your themes for mouse cursor, icons or windows don't load correctly, see the
relevant section in [Hyprland on Home Manager](../hyprland-on-home-manager).

View file

@ -1,13 +1,17 @@
---
title: Hyprland on other distros
---
If you use Nix on distros other than NixOS, you can still use Hyprland.
The best option would be through [Home Manager](../Hyprland-on-Home-Manager).
The best option would be through [Home Manager](../hyprland-on-home-manager).
However, if Home Manager is not for you, you can use it as a normal package.
First, [enable flakes](https://nixos.wiki/wiki/Flakes#Enable_flakes).
Once you have flakes working, install Hyprland through `nix profile`:
First, [enable flakes](https://nixos.wiki/wiki/Flakes#Enable_flakes). Once you
have flakes working, install Hyprland through `nix profile`:
{{< tabs "uniqueid" >}}
{{< tabs items="From Nixpkgs,From the Flake" >}}
{{< tab "From Nixpkgs" >}}
@ -18,19 +22,22 @@ nix profile install nixpkgs#hyprland
```
{{< /tab >}}
{{< tab "From the Flake" >}}
NOTE: Make sure to enable [Cachix](../Cachix) first.
NOTE: Make sure to enable [Cachix](../cachix) first.
```sh
nix profile install github:hyprwm/Hyprland
```
{{< /tab >}}
{{< /tabs >}}
Since you're using Hyprland outside of NixOS, it won't be able to find graphics
drivers. To get around that, you can use [nixGL](https://github.com/guibou/nixGL).
drivers. To get around that, you can use
[nixGL](https://github.com/guibou/nixGL).
First, install it:
@ -59,4 +66,3 @@ nix profile upgrade '.*'
Check the
[nix profile](https://nixos.org/manual/nix/stable/command-ref/new-cli/nix3-profile.html)
command documentation for other upgrade options.

View file

@ -1,11 +1,15 @@
You can override the package through `.override` or `.overrideAttrs`. This
is easily achievable on [NixOS](../Hyprland-on-NixOS) or
[Home Manager](../Hyprland-on-Home-Manager).
---
title: Options & Overrides
---
You can override the package through `.override` or `.overrideAttrs`. This is
easily achievable on [NixOS](../hyprland-on-nixos) or
[Home Manager](../hyprland-on-home-manager).
## Package options
These are the default options that the Hyprland package is built with. These
can be changed by setting the appropriate option to `true`/`false`.
These are the default options that the Hyprland package is built with. These can
be changed by setting the appropriate option to `true`/`false`.
### Package
@ -30,12 +34,12 @@ programs.hyprland = { # or wayland.windowManager.hyprland
### XWayland
XWayland is enabled by default in the Nix package. You can disable it either
in the package itself, or through the module options.
XWayland is enabled by default in the Nix package. You can disable it either in
the package itself, or through the module options.
### XWayland HiDPI
See [XWayland](../../Configuring/XWayland).
See [XWayland](../../configuring/xwayland).
## Using Nix repl

View file

@ -1,11 +1,17 @@
---
weight: 7
title: Nix
---
To install Hyprland on NixOS, we provide a NixOS and a Home Manager module.
{{< hint title=Note >}}
{{< callout title=Note >}}
- _(Required) NixOS Module_: enables critical components needed to run Hyprland
properly
- _(Optional) Home-manager module_: lets you declaratively configure Hyprland
{{< /hint >}}
{{< /callout >}}
## NixOS module
@ -26,11 +32,11 @@ Note that the command to run hyprland is `Hyprland` (with a capital `H`) and not
For more options, see
[module options](https://search.nixos.org/options?channel=unstable&from=0&size=50&sort=relevance&type=packages&query=hyprland).
For other NixOS options, see [Hyprland on NixOS](./Hyprland-on-NixOS).
For other NixOS options, see [Hyprland on NixOS](./hyprland-on-nixos).
## Home-manager module
Read [Hyprland on Home Manager](./Hyprland-on-Home-Manager).
Read [Hyprland on Home Manager](./hyprland-on-home-manager).
For the adventurous, [@spikespaz](https://github.com/spikespaz) has made a
Hyprland module that can be used in Home Manager and NixOS. It can be found
@ -38,4 +44,4 @@ Hyprland module that can be used in Home Manager and NixOS. It can be found
## Options and overrides
Read [Options & Overrides](./Options-Overrides).
Read [Options & Overrides](./options--overrides).

View file

@ -1,35 +1,79 @@
---
weight: 8
title: NVidia
---
# Foreword
There is no _official_ Hyprland support for Nvidia hardware. However, you might make it work properly following this page.
There is no _official_ Hyprland support for Nvidia hardware. However, you might
make it work properly following this page.
You can choose between the proprietary [Nvidia drivers](https://wiki.archlinux.org/title/NVIDIA) or the open source [Nouveau driver](https://wiki.archlinux.org/title/Nouveau). Under the proprietary Nvidia drivers category, there are 3 of them: the current driver named 'nvidia' (or 'nvidia-dkms' to use with custom linux kernels) which is under active development, the legacy drivers 'nvidia-3xxxx' for older cards which Nvidia no longer actively supports, and the 'nvidia-open' driver which is currently an alpha stage attempt to open source a part of their close source driver for newer cards.
You can choose between the proprietary
[Nvidia drivers](https://wiki.archlinux.org/title/NVIDIA) or the open source
[Nouveau driver](https://wiki.archlinux.org/title/Nouveau). Under the
proprietary Nvidia drivers category, there are 3 of them: the current driver
named 'nvidia' (or 'nvidia-dkms' to use with custom linux kernels) which is
under active development, the legacy drivers 'nvidia-3xxxx' for older cards
which Nvidia no longer actively supports, and the 'nvidia-open' driver which is
currently an alpha stage attempt to open source a part of their close source
driver for newer cards.
You may want to use the proprietary Nvidia drivers in some cases, for example: if you have a new Nvidia GPU model, if you want more performance, if you want to play video games, if you need a wider feature set (for example, better power consumption on recent GPUs), etc. However, keep in mind that if the proprietary Nvidia drivers do not work properly on your computer, the Nouveau driver might work fine while not having as much features or performance. For [older cards](https://wiki.archlinux.org/title/NVIDIA#Unsupported_drivers), in order to use Hyprland, you will probably need to use the Nouveau driver which actively supports them.
You may want to use the proprietary Nvidia drivers in some cases, for example:
if you have a new Nvidia GPU model, if you want more performance, if you want to
play video games, if you need a wider feature set (for example, better power
consumption on recent GPUs), etc. However, keep in mind that if the proprietary
Nvidia drivers do not work properly on your computer, the Nouveau driver might
work fine while not having as much features or performance. For
[older cards](https://wiki.archlinux.org/title/NVIDIA#Unsupported_drivers), in
order to use Hyprland, you will probably need to use the Nouveau driver which
actively supports them.
Below are some tips to try to make the proprietary Nvidia driver work with Hyprland properly:
Below are some tips to try to make the proprietary Nvidia driver work with
Hyprland properly:
## How to get Hyprland to possibly work on Nvidia
Install the `nvidia-dkms` driver and add it to your initramfs & kernel parameters.
For people using [systemd-boot](https://wiki.archlinux.org/title/systemd-boot) you can do this adding `nvidia_drm.modeset=1` to the end of `/boot/loader/entries/arch.conf`.
For people using [grub](https://wiki.archlinux.org/title/GRUB) you can do this by adding `nvidia_drm.modeset=1` to the end of `GRUB_CMDLINE_LINUX_DEFAULT=` in `/etc/default/grub`, then run `# grub-mkconfig -o /boot/grub/grub.cfg`
For others check out [kernel parameters](https://wiki.archlinux.org/title/Kernel_parameters) and how to add `nvidia_drm.modeset=1` to your specific bootloader.
Install the `nvidia-dkms` driver and add it to your initramfs & kernel
parameters.\
For people using [systemd-boot](https://wiki.archlinux.org/title/systemd-boot)
you can do this adding `nvidia_drm.modeset=1` to the end of
`/boot/loader/entries/arch.conf`. For people using
[grub](https://wiki.archlinux.org/title/GRUB) you can do this by adding
`nvidia_drm.modeset=1` to the end of `GRUB_CMDLINE_LINUX_DEFAULT=` in
`/etc/default/grub`, then run `# grub-mkconfig -o /boot/grub/grub.cfg` For
others check out
[kernel parameters](https://wiki.archlinux.org/title/Kernel_parameters) and how
to add `nvidia_drm.modeset=1` to your specific bootloader.
in `/etc/mkinitcpio.conf` add `nvidia nvidia_modeset nvidia_uvm nvidia_drm` to your `MODULES`
in `/etc/mkinitcpio.conf` add `nvidia nvidia_modeset nvidia_uvm nvidia_drm` to
your `MODULES`
run `# mkinitcpio --config /etc/mkinitcpio.conf --generate /boot/initramfs-custom.img` (make sure you have the `linux-headers` package installed first)
run
`# mkinitcpio --config /etc/mkinitcpio.conf --generate /boot/initramfs-custom.img`
(make sure you have the `linux-headers` package installed first)
add a new line to `/etc/modprobe.d/nvidia.conf` (make it if it does not exist) and add the line `options nvidia-drm modeset=1`
add a new line to `/etc/modprobe.d/nvidia.conf` (make it if it does not exist)
and add the line `options nvidia-drm modeset=1`
More information is available here:
[https://wiki.archlinux.org/title/NVIDIA#DRM_kernel_mode_setting](https://wiki.archlinux.org/title/NVIDIA#DRM_kernel_mode_setting)
{{< hint >}}If your GPU is listed as supported by the `nvidia-open-dkms` driver,
use that one instead. Note that on a laptop, it could cause problems with the suspended state when closing the lid, so you might be better off with `nvidia-dkms`.
{{< /hint >}}
{{< callout >}}
{{< hint >}}To get multi monitor to work properly on a hybrid graphics device (a laptop with both an Intel and an Nvidia GPU), you will need to remove the `optimus-manager` package if installed (disabling the service does not work). You also need to change your BIOS settings from hybrid graphics to discrete graphics.
{{< /hint >}}
If your GPU is listed as supported by the `nvidia-open-dkms` driver, use that
one instead. Note that on a laptop, it could cause problems with the suspended
state when closing the lid, so you might be better off with `nvidia-dkms`.
{{< /callout >}}
{{< callout >}}
To get multi monitor to work properly on a hybrid graphics device (a laptop with
both an Intel and an Nvidia GPU), you will need to remove the `optimus-manager`
package if installed (disabling the service does not work). You also need to
change your BIOS settings from hybrid graphics to discrete graphics.
{{< /callout >}}
Export these variables in your hyprland config:
@ -41,11 +85,20 @@ env = __GLX_VENDOR_LIBRARY_NAME,nvidia
env = WLR_NO_HARDWARE_CURSORS,1
```
{{< hint >}}If you encounter crashes in Firefox, remove the line `env = GBM_BACKEND,nvidia-drm`.
{{< /hint >}}
{{< callout >}}
{{< hint >}}If you face problems with Discord windows not displaying or screen sharing not working in Zoom, remove or comment the line `env = __GLX_VENDOR_LIBRARY_NAME,nvidia`.
{{< /hint >}}
If you encounter crashes in Firefox, remove the line
`env = GBM_BACKEND,nvidia-drm`.
{{< /callout >}}
{{< callout >}}
If you face problems with Discord windows not displaying or screen sharing not
working in Zoom, remove or comment the line
`env = __GLX_VENDOR_LIBRARY_NAME,nvidia`.
{{< /callout >}}
Install `qt5-wayland`, `qt5ct` and `libva`. Additionally
`libva-nvidia-driver-git` (AUR) to fix crashes in some Electron-based
@ -74,20 +127,34 @@ options nvidia NVreg_RegistryDwords="PowerMizerEnable=0x1; PerfLevelSrc=0x2222;
Reboot your computer and it should be working.
If it does not, try:
- lowering your monitors' refresh rate, as this can stop the flickering altogether
- installing the 535xx versions of the drivers, as later (545, 550) can cause flickering with XWayland
- these are available for arch via [the AUR here](https://aur.archlinux.org/packages?O=0&K=535xx)
- using the [Nouveau driver](https://wiki.archlinux.org/title/Nouveau) as mentioned above
- lowering your monitors' refresh rate, as this can stop the flickering
altogether
- installing the 535xx versions of the drivers, as later (545, 550) can cause
flickering with XWayland
- these are available for arch via
[the AUR here](https://aur.archlinux.org/packages?O=0&K=535xx)
- using the [Nouveau driver](https://wiki.archlinux.org/title/Nouveau) as
mentioned above
## Fixing suspend/wakeup issues
Enable the services `nvidia-suspend.service`, `nvidia-hibernate.service` and `nvidia-resume.service`, they will be started by systemd when needed.
Enable the services `nvidia-suspend.service`, `nvidia-hibernate.service` and
`nvidia-resume.service`, they will be started by systemd when needed.
Add `nvidia.NVreg_PreserveVideoMemoryAllocations=1` to your kernel parameters if you don't have it already.
Add `nvidia.NVreg_PreserveVideoMemoryAllocations=1` to your kernel parameters if
you don't have it already.
{{< hint type=important >}} Suspend functions are currently broken on `nvidia-open-dkms` [due to a bug](https://github.com/NVIDIA/open-gpu-kernel-modules/issues/472), so make sure you're on `nvidia-dkms`. {{< /hint >}}
{{< callout >}}
Suspend functions are currently broken on `nvidia-open-dkms`
[due to a bug](https://github.com/NVIDIA/open-gpu-kernel-modules/issues/472), so
make sure you're on `nvidia-dkms`.
{{< /callout >}}
For Nix users, the equivalent of the above is
```nix
# configuration.nix
@ -96,6 +163,5 @@ boot.kernelParams = [ "nvidia.NVreg_PreserveVideoMemoryAllocations=1" ];
hardware.nvidia.powerManagement.enable = true
# Making sure to use the proprietary drivers until the issue above is fixed upstream
hardware.nvidia.open = false
hardware.nvidia.open = false
```

View file

@ -1,26 +1,32 @@
This page documents a few advanced things about the Hyprland Plugin API.
---
weight: 4
title: Advanced
---
{{< toc >}}
This page documents a few advanced things about the Hyprland Plugin API.
## Using Function Hooks
{{< hint type=important >}}
{{< callout >}}
Function hooks are only available on `AMD64` (`x86_64`).
Attempting to hook on any other arch will make Hyprland simply ignore your hooking attempt.
Function hooks are only available on `AMD64` (`x86_64`). Attempting to hook on
any other arch will make Hyprland simply ignore your hooking attempt.
{{</ hint >}}
{{</ callout >}}
Function hooks are intimidating at first, but when used properly can be _extremely_ powerful.
Function hooks are intimidating at first, but when used properly can be
_extremely_ powerful.
Function hooks allow you to intercept any call to the function you hook.
Let's look at a simple example:
```cpp
void Events::listener_monitorFrame(void* owner, void* data)
```
will be the function we want to hook. `Events::` is a namespace, not a class, so this
is just a plain function.
will be the function we want to hook. `Events::` is a namespace, not a class, so
this is just a plain function.
```cpp
// make a global instance of a hook class for this hook
@ -45,18 +51,21 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
// further stuff...
}
```
We have just made a hook. Now, whenever Hyprland calls `Events::listener_monitorFrame`, our hook will be called instead!
We have just made a hook. Now, whenever Hyprland calls
`Events::listener_monitorFrame`, our hook will be called instead!
This way, you can run code before / after the function, modify the inputs or results, or even block the function from executing.
This way, you can run code before / after the function, modify the inputs or
results, or even block the function from executing.
`CFunctionHook` can also be unhooked whenever you please. Just run `unhook()`. It can be rehooked later by calling `hook()` again.
`CFunctionHook` can also be unhooked whenever you please. Just run `unhook()`.
It can be rehooked later by calling `hook()` again.
### Member functions
For members, e.g. `CCompositor::focusWindow(CWindow*, wlr_surface*)` you will also need to add the thisptr argument to your hook:
For members, e.g. `CCompositor::focusWindow(CWindow*, wlr_surface*)` you will
also need to add the thisptr argument to your hook:
```cpp
typedef void (*origFocusWindow)(void*, CWindow*, wlr_surface*);
@ -79,20 +88,28 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
}
```
{{< hint type=warning >}}
Please note method lookups are slow and should not be used often. The entries _will not_ change during runtime, so it's a good idea
to make the lookups `static`.
{{</ hint >}}
{{< callout type=warning >}}
Please note method lookups are slow and should not be used often. The entries
_will not_ change during runtime, so it's a good idea to make the lookups
`static`.
{{</ callout >}}
### Why use findFunctionsByName?
Why use that instead of e.g. `&CCompositor::focusWindow`? Two reasons:
1 - less breakage. Whenever someone updates hyprland, that address might become invalid. findFunctionsByName is more resilient. As long as the function exists, it will be found.
1 - less breakage. Whenever someone updates hyprland, that address might become
invalid. findFunctionsByName is more resilient. As long as the function exists,
it will be found.
2 - error handling. The method array contains, besides the address, the signatures. You can verify those to make 100% sure you got the right function, or throw an error if it was not found.
2 - error handling. The method array contains, besides the address, the
signatures. You can verify those to make 100% sure you got the right function,
or throw an error if it was not found.
## Using the config
You can register config values in the `PLUGIN_INIT` function:
```cpp
@ -105,17 +122,22 @@ APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
}
```
Plugin variables ***must*** be in the `plugins:` category. Further categories are up to you. It's generally
a good idea to group all variables from your plugin in a subcategory with the plugin name, e.g. `plugins:myPlugin:variable1`.
Plugin variables _**must**_ be in the `plugins:` category. Further categories
are up to you. It's generally a good idea to group all variables from your
plugin in a subcategory with the plugin name, e.g. `plugins:myPlugin:variable1`.
For retrieving the values, call `HyprlandAPI::getConfigValue`.
Please remember that the pointer to your config value will never change after `PLUGIN_INIT`, so to greatly optimize performance, make it static:
Please remember that the pointer to your config value will never change after
`PLUGIN_INIT`, so to greatly optimize performance, make it static:
```cpp
static auto* const MYVAR = &HyprlandAPI::getConfigValue(PHANDLE, "plugin:myPlugin:variable1")->intValue;
```
## Further
Read the API at `src/plugins/PluginAPI.hpp`, check out the [official plugins](https://github.com/hyprwm/hyprland-plugins).
And, most importantly, have fun!
Read the API at `src/plugins/PluginAPI.hpp`, check out the
[official plugins](https://github.com/hyprwm/hyprland-plugins).
And, most importantly, have fun!

View file

@ -1,12 +1,17 @@
---
weight: 3
title: Event list
---
These are all the events that can be listened to using Event Hooks.
## Complete list
{{< hint type=note >}}
M: means std::unordered_map<std::string, std::any>
following props are members.
{{</ hint >}}
{{< callout type=info >}}
M: means std::unordered_map<std::string, std::any> following props are members.
{{</ callout >}}
| name | description | argument(s) | cancellable |
| --- | --- | --- | --- |

View file

@ -1,19 +1,24 @@
This page documents the basics of making your own Hyprland plugin from scratch.
---
weight: 1
title: Getting started
---
{{< toc >}}
This page documents the basics of making your own Hyprland plugin from scratch.
## How do plugins work?
Plugins are basically dynamic objects loaded by Hyprland. They have
(almost) full access to every part of Hyprland's internal process, and as such,
can modify and change way more than a script.
Plugins are basically dynamic objects loaded by Hyprland. They have (almost)
full access to every part of Hyprland's internal process, and as such, can
modify and change way more than a script.
## Prerequisites
In order to write a Hyprland plugin, you will need:
- Knowledge of C++
- The ability to read
- A rough understanding of the Hyprland internals (you _can_ learn this alongside your development work)
- Knowledge of C++
- The ability to read
- A rough understanding of the Hyprland internals (you _can_ learn this
alongside your development work)
## Making your first plugin
@ -21,45 +26,56 @@ Open your favorite code editor.
Make a new directory, in this example we will use `MyPlugin`.
***→ If you have the Hyprland headers***
_**→ If you have the Hyprland headers**_
If you install with `make install`, you should have the headers. In that case, no further action
is required.
If you install with `make install`, you should have the headers. In that case,
no further action is required.
***→ If you don't have the Hyprland source cloned***
_**→ If you don't have the Hyprland source cloned**_
Clone the Hyprland source code to a subdirectory, in our example `MyPlugin/Hyprland`.
Run `cd Hyprland && make all && sudo make installheaders && cd ..`.
Clone the Hyprland source code to a subdirectory, in our example
`MyPlugin/Hyprland`. Run
`cd Hyprland && make all && sudo make installheaders && cd ..`.
Now that you have the Hyprland sources set up, you can either start from scratch if you know how,
or take a look at some simple plugins in the [official plugins repo](https://github.com/hyprwm/hyprland-plugins)
like for example `csgo-vulkan-fix` or `hyprwinwrap`.
Now that you have the Hyprland sources set up, you can either start from scratch
if you know how, or take a look at some simple plugins in the
[official plugins repo](https://github.com/hyprwm/hyprland-plugins) like for
example `csgo-vulkan-fix` or `hyprwinwrap`.
### The basic parts of the plugin
Starting from the top, you will have to include the plugin API:
```cpp
#include <hyprland/src/plugins/PluginAPI.hpp>
```
Feel free to take a look at the header. It contains a bunch of useful comments.
We also create a global pointer for our handle:
```cpp
inline HANDLE PHANDLE = nullptr;
```
we will initialize it in our plugin init function later. It serves as an internal "ID" of our plugin.
we will initialize it in our plugin init function later. It serves as an
internal "ID" of our plugin.
Then, there is the API version method:
```cpp
// Do NOT change this function.
APICALL EXPORT std::string PLUGIN_API_VERSION() {
return HYPRLAND_API_VERSION;
}
```
This method will tell Hyprland what API version was used to compile this plugin. Do NOT change it.
It will be set automatically when compiling to the correct value.
This method will tell Hyprland what API version was used to compile this plugin.
Do NOT change it. It will be set automatically when compiling to the correct
value.
Skipping over some example handlers, we have two important functions:
```cpp
APICALL EXPORT PLUGIN_DESCRIPTION_INFO PLUGIN_INIT(HANDLE handle) {
PHANDLE = handle;
@ -73,30 +89,36 @@ APICALL EXPORT void PLUGIN_EXIT() {
// ...
}
```
The first method will be called when your plugin gets initialized (loaded)
You can, and probably should, initialize everything you may want to use in there.
You can, and probably should, initialize everything you may want to use in
there.
It's worth noting that adding config variables is _only_ allowed in this function.
It's worth noting that adding config variables is _only_ allowed in this
function.
The plugin init function is _required_.
The return value should be the `PLUGIN_DESCRIPTION_INFO` struct which lets Hyprland know about your
plugin's name, description, author and version.
The return value should be the `PLUGIN_DESCRIPTION_INFO` struct which lets
Hyprland know about your plugin's name, description, author and version.
Make sure to store your `HANDLE` as it's going to be required for API calls.
The second method is not required, and will be called when your plugin is being
unloaded by the user.
If your plugin is being unloaded because it committed a fault, this function
will _not_ be called.
The second method is not required, and will be called when your plugin is being unloaded by the user.
If your plugin is being unloaded because it committed a fault, this function will _not_ be called.
You do not have to unload layouts, remove config options, remove dispatchers, window decorations or unregister hooks
in the exit method. Hyprland will do that for you.
You do not have to unload layouts, remove config options, remove dispatchers,
window decorations or unregister hooks in the exit method. Hyprland will do that
for you.
### Setting up a development environment
In order to make your life easier, it's a good idea to work on a nested debug Hyprland session.
In order to make your life easier, it's a good idea to work on a nested debug
Hyprland session.
Enter your Hyprland directory and run `make debug`
@ -104,22 +126,28 @@ Make a copy of your config in `~/.config/hypr` called `hyprlandd.conf`.
Remove _all_ `exec=` or `exec-once=` directives from your config.
*recommended*: Change the modifier for your keybinds (e.g. `SUPER` -> `ALT`)
_recommended_: Change the modifier for your keybinds (e.g. `SUPER` -> `ALT`)
Add this line:
```ini
monitor = WL-1, 1920x1080, 0x0, 1
```
Launch the output `Hyprland` binary in `./build/` _when logged into a Hyprland session_.
Launch the output `Hyprland` binary in `./build/` _when logged into a Hyprland
session_.
A new window should open with Hyprland running inside of it. You can now run your plugin in the nested session without worrying
about nuking your actual session, and also being able to debug it easily.
A new window should open with Hyprland running inside of it. You can now run
your plugin in the nested session without worrying about nuking your actual
session, and also being able to debug it easily.
See more info in [the Contributing Section](https://wiki.hyprland.org/Contributing-and-Debugging/#nesting-hyprland)
See more info in
[the Contributing Section](https://wiki.hyprland.org/Contributing-and-Debugging/#nesting-hyprland)
### More advanced stuff
Take a look at the `src/plugins/PluginAPI.hpp` header. It has comments to every method to let you know what it is.
Take a look at the `src/plugins/PluginAPI.hpp` header. It has comments to every
method to let you know what it is.
For more explanation on a few concepts, see [Advanced](../Advanced) and [Plugin Guidelines](../Plugin-Guidelines)
For more explanation on a few concepts, see [Advanced](../advanced) and
[Plugin Guidelines](../plugin-guidelines)

View file

@ -1,8 +1,11 @@
---
weight: 2
title: Plugin guidelines
---
This page documents the recommended guidelines for making a stable and neat
plugin.
{{< toc >}}
## Making your plugin compatible with hyprpm
In order for your plugin to be installable by `hyprpm`, you need a manifest.

View file

@ -0,0 +1,4 @@
---
weight: 2
title: Development
---

View file

@ -1,10 +1,14 @@
This page will tell you how to use plugins.
---
weight: 1
title: Using plugins
---
{{< toc >}}
This page will tell you how to use plugins.
## Disclaimers
{{< hint type=warning >}}
{{< callout type=warning >}}
Plugins are written in C++ and will run as a part of Hyprland.
Make sure to _always_ read the source code of the plugins you are going to use
@ -12,31 +16,35 @@ and to trust the source.
Writing a plugin to wipe your computer is easy.
***Never*** trust random `.so` files you receive from other people.
{{< /hint >}}
_**Never**_ trust random `.so` files you receive from other people.
{{< /callout >}}
## Getting plugins
Plugins come as _shared objects_, aka. `.so` files.
Hyprland does not have any "default" plugins, so any plugin you may want
to use you will have to find yourself.
Hyprland does not have any "default" plugins, so any plugin you may want to use
you will have to find yourself.
## Installing / Using plugins
It is _highly_ recommended you use the Hyprland Plugin Manager, `hyprpm`. For manual instructions, see a bit below.
It is _highly_ recommended you use the Hyprland Plugin Manager, `hyprpm`. For
manual instructions, see a bit below.
### hyprpm
Make sure you have the required dependencies: `cpio`, `meson`, `cmake`.
Find a repository you want to install plugins from. As an example, we will use [hyprland-plugins](https://github.com/hyprwm/hyprland-plugins).
Find a repository you want to install plugins from. As an example, we will use
[hyprland-plugins](https://github.com/hyprwm/hyprland-plugins).
```sh
hyprpm add https://github.com/hyprwm/hyprland-plugins
```
once it finishes, you can list your installed plugins with
```sh
hyprpm list
```
@ -45,8 +53,9 @@ and enable or disable them via `hyprpm enable name` and `hyprpm disable name`.
In order for the plugins to be loaded into hyprland, run `hyprpm reload`.
You can add `exec-once = hyprpm reload -n` to your hyprland config to have plugins loaded at startup.
`-n` will make hyprpm send a notification if anything goes wrong (e.g. update needed)
You can add `exec-once = hyprpm reload -n` to your hyprland config to have
plugins loaded at startup. `-n` will make hyprpm send a notification if anything
goes wrong (e.g. update needed)
In order update your plugins, run `hyprpm update`.
@ -56,23 +65,28 @@ For all options of `hyprpm`, run `hyprpm -h`.
Different plugins may have different build methods, refer to their instructions.
If you don't have hyprland headers installed, clone hyprland, checkout to your version,
build hyprland, and run `sudo make installheaders`. Then build your plugin(s).
If you don't have hyprland headers installed, clone hyprland, checkout to your
version, build hyprland, and run `sudo make installheaders`. Then build your
plugin(s).
To load plugins manually, use `hyprctl plugin load path` !NOTE: Path HAS TO BE ABSOLUTE!
To load plugins manually, use `hyprctl plugin load path` !NOTE: Path HAS TO BE
ABSOLUTE!
You can unload plugins with `hyprctl plugin unload path`.
## FAQ About Plugins
### My Hyprland crashes!
Oh no. Oopsie. Usually means a plugin is broken. `hyprpm disable` it.
### How do I list my loaded plugins?
`hyprctl plugin list`
### How do I make my own plugin?
See [here](../Development/Getting-Started).
See [here](../development/getting-started).
### Where do I find plugins?
@ -81,10 +95,12 @@ You can also see a list at [awesome-hyprland](https://github.com/hyprland-commun
Lastly, you can try searching around github for the `"hyprland plugin"` keyword.
### Are plugins safe?
As long as you read the source code of your plugin(s) and can see there's nothing bad going on,
they will be safe.
As long as you read the source code of your plugin(s) and can see there's
nothing bad going on, they will be safe.
### Do plugins decrease Hyprland's stability?
Hyprland employs a few tactics to unload plugins that crash. However, those tactics may not
always work. In general, as long as the plugin is well-designed, it should not affect the
stability of Hyprland.
Hyprland employs a few tactics to unload plugins that crash. However, those
tactics may not always work. In general, as long as the plugin is well-designed,
it should not affect the stability of Hyprland.

4
pages/Plugins/_index.md Normal file
View file

@ -0,0 +1,4 @@
---
weight: 6
title: Plugins
---

View file

@ -1,19 +1,25 @@
---
weight: 7
title: App clients
---
Some clients are known for being a massive pain under Wayland. Here are great
replacements for them:
## Discord
- [WebCord](https://github.com/SpacingBat3/WebCord) is a Discord client based on
the latest Electron, with support for Wayland Ozone platform, as well as
PipeWire screensharing. It has tons of great features and tries not to infringe
on the Discord ToS.
the latest Electron, with support for Wayland Ozone platform, as well as
PipeWire screensharing. It has tons of great features and tries not to
infringe on the Discord ToS.
- [gtkcord4](https://github.com/diamondburned/gtkcord4) is a Discord client written in GTK4.
While it does infringe on Discord's ToS, it's relatively safe and doesn't rely on any webview technologies.
- [gtkcord4](https://github.com/diamondburned/gtkcord4) is a Discord client
written in GTK4. While it does infringe on Discord's ToS, it's relatively safe
and doesn't rely on any webview technologies.
## Matrix/Element
[Fractal](https://wiki.gnome.org/Apps/Fractal) is a Matrix client written in GTK4.
Much like Discord, Element is known to have a lot of problems as a result of being
based on Electron. Fractal currently doesn't support VoIP calling, but all other features
are supported, including E2EE and cross-device verification.
[Fractal](https://wiki.gnome.org/Apps/Fractal) is a Matrix client written in
GTK4. Much like Discord, Element is known to have a lot of problems as a result
of being based on Electron. Fractal currently doesn't support VoIP calling, but
all other features are supported, including E2EE and cross-device verification.

View file

@ -1,3 +1,8 @@
---
weight: 6
title: App launchers
---
## Wofi
Wofi is a GTK-based customizable launcher for wayland.
@ -5,8 +10,7 @@ Wofi is a GTK-based customizable launcher for wayland.
## Rofi (Wayland fork)
Rofi, but with Wayland support.
[GitHub](https://github.com/lbonn/rofi).
Rofi, but with Wayland support. [GitHub](https://github.com/lbonn/rofi).
## bemenu
@ -15,18 +19,21 @@ bemenu is a Wayland-native replacement for dmenu.
## fuzzel
Fuzzel is an application launcher for wlroots based Wayland compositors, similar to rofi's `drun` mode.
[Codeberg](https://codeberg.org/dnkl/fuzzel)
Fuzzel is an application launcher for wlroots based Wayland compositors, similar
to rofi's `drun` mode. [Codeberg](https://codeberg.org/dnkl/fuzzel)
## tofi
tofi is an extremely fast and simple yet highly customizable dmenu / rofi replacement for wlroots-based Wayland compositors. When configured correctly, tofi can get on screen within a single frame.
tofi is an extremely fast and simple yet highly customizable dmenu / rofi
replacement for wlroots-based Wayland compositors. When configured correctly,
tofi can get on screen within a single frame.
[Github](https://github.com/philj56/tofi)
For a more comprehensive list of launchers, check
[awesome-hyprland](https://github.com/hyprland-community/awesome-hyprland#runners-menus-and-application-launchers).
## Emacs
If you are already running an emacs server you can use Emacs.
For the config you can check out [DistroTube's Configuring Emacs](https://gitlab.com/dwt1/configuring-emacs/-/blob/main/07-the-final-touches/scripts/app-launchers.el?ref_type=heads) or [Sebastian Wae's `app-launcher`](https://github.com/SebastienWae/app-launcher) repositories.
@ -36,4 +43,3 @@ For the config you can check out [DistroTube's Configuring Emacs](https://gitlab
Anyrun is a wayland native krunner-like runner, made with customizability in
mind. It is modular and extensible through plugins. It can be used as an app launcher with its Applications Plugin.
[GitHub](https://github.com/Kirottu/anyrun)

View file

@ -1,14 +1,27 @@
---
weight: 9
title: Clipboard managers
---
_Starting method:_ manual (`exec-once`)
Clipboard Managers are useful tools that allows one to manage their copied items, be-it texts or images.
Clipboard Managers are useful tools that allows one to manage their copied
items, be-it texts or images.
Some common ones used are `copyq`, `clipman` and `cliphist`.
`clipman` - Utilizes Wayland with `wl-clipboard` support and stores text only [Github](https://github.com/chmouel/clipman)
`clipman` - Utilizes Wayland with `wl-clipboard` support and stores text only
[Github](https://github.com/chmouel/clipman)
`cliphist` - Utilizes Wayland with `wl-clipboard` and can store both images and text [Github](https://github.com/sentriz/cliphist)
`cliphist` - Utilizes Wayland with `wl-clipboard` and can store both images and
text [Github](https://github.com/sentriz/cliphist)
`wl-clip-persist` - When we copy something on Wayland (using wl-clipboard) and close the application we copied from, the copied data disappears from the clipboard and we cannot paste it anymore. So to fix this problem we can use a program called as `wl-clip-persist` which will preserve the data in the clipboard after the application is closed. [Github](https://github.com/Linus789/wl-clip-persist)
`wl-clip-persist` - When we copy something on Wayland (using wl-clipboard) and
close the application we copied from, the copied data disappears from the
clipboard and we cannot paste it anymore. So to fix this problem we can use a
program called as `wl-clip-persist` which will preserve the data in the
clipboard after the application is closed.
[Github](https://github.com/Linus789/wl-clip-persist)
## copyq
@ -17,7 +30,9 @@ Start by adding the following lines to your `~/.config/hypr/hyprland.conf`
```ini
exec-once = copyq --start-server
```
If your `copyq`'s main window cannot close/hide properly, try to enable its "Hide main window" option in Layout configuration tab in Preferences dialog.
If your `copyq`'s main window cannot close/hide properly, try to enable its
"Hide main window" option in Layout configuration tab in Preferences dialog.
## cliphist
@ -28,59 +43,70 @@ exec-once = wl-paste --type text --watch cliphist store #Stores only text data
exec-once = wl-paste --type image --watch cliphist store #Stores only image data
```
Do note that any of the above lines can be disabled based on your needs
To bind `cliphist` to a hotkey and display it under `rofi` or `dmenu` or `wofi`, again head over to `~/.config/hypr/hyprland.conf`
To bind `cliphist` to a hotkey and display it under `rofi` or `dmenu` or `wofi`,
again head over to `~/.config/hypr/hyprland.conf`
### For `rofi` users
```ini
bind = SUPER, V, exec, cliphist list | rofi -dmenu | cliphist decode | wl-copy
```
### For `dmenu` users
```ini
bind = SUPER, V, exec, cliphist list | dmenu | cliphist decode | wl-copy
```
### For `wofi` users
```ini
bind = SUPER, V, exec, cliphist list | wofi --dmenu | cliphist decode | wl-copy
```
The binds mention above correspond to SUPER+V to access the clipboard history
For further info, please refer to the repository mentioned above
## clipman
## clipman
Start by adding the following line to your `~/.config/hypr/hyprland.conf`
```ini
exec-once = wl-paste -t text --watch clipman store --no-persist
```
If you wish to use it as a primary clipboard manager, use this instead
```ini
exec-once = wl-paste -p -t text --watch clipman store -P --histpath="~/.local/share/clipman-primary.json"
```
And also make sure to create a file named `clipman-primary.json` in `~/.local/share/clipman-primary.json`
And also make sure to create a file named `clipman-primary.json` in
`~/.local/share/clipman-primary.json`
Now bind the `clipman` like this:
### For `rofi` users
```ini
bind = SUPER, V, exec, clipman pick -t rofi
```
### For `dmenu` users
```ini
bind = SUPER, V, exec, clipman pick -t dmenu
```
### For `wofi` users
```ini
bind = SUPER, V, exec, clipman pick -t wofi
```
So on and so forth. For further information, please refer to the repository mentioned above
So on and so forth. For further information, please refer to the repository
mentioned above

View file

@ -1,8 +1,15 @@
Color pickers are useful for quickly grabbing a color of _something_ on your screen.
---
weight: 8
title: Color pickers
---
It's preferred using _hyprwm_'s own solution, which, so far, seems to be the only one that
doesn't suck.
Color pickers are useful for quickly grabbing a color of _something_ on your
screen.
It's preferred using _hyrpwm_'s own solution, which, so far, seems to be the
only one that doesn't suck.
## Hyprpicker
Dead simple to use. Launch, click, and you're done. [GitHub](https://github.com/hyprwm/hyprpicker)
Dead simple to use. Launch, click, and you're done.
[GitHub](https://github.com/hyprwm/hyprpicker)

View file

@ -15,7 +15,7 @@ A neat color picker for your hyprland desktop.
## xdg-desktop-portal-hyprland
A must-have, see [The wiki page](../Hyprland-desktop-portal)
A must-have, see [The wiki page](../xdg-desktop-portal-hyprland)
## hypridle

View file

@ -1,9 +1,16 @@
This page documents software that is __strongly__ recommended to have running for a smooth Hyprland experience.
---
weight: 1
title: Must have
---
DEs like Plasma or Gnome will take care of this automatically.
Hyprland will not, as you might want to use something else.
This page documents software that is **strongly** recommended to have running
for a smooth Hyprland experience.
DEs like Plasma or Gnome will take care of this automatically. Hyprland will
not, as you might want to use something else.
### A notification daemon
_Starting method:_ most likely manual (`exec-once`)
Many apps (e.g. Discord) may freeze without one running.
@ -11,44 +18,55 @@ Many apps (e.g. Discord) may freeze without one running.
Use e.g. `dunst`, `mako`, `swaync`, etc.
### Pipewire
_Starting method:_ Automatic on Systemd, manual otherwise
Pipewire is not necessarily required, but screensharing will not work without it.
Pipewire is not necessarily required, but screensharing will not work without
it.
Install `pipewire` and `wireplumber` (**not** `pipewire-media-session`)
#### Non-systemd distros
Since here is no truly standardized way (outside of systemd) to load PipeWire when starting
a graphical shell[^1] non-systemd distros like Gentoo or Artix provide a decicated launcher.
It can be usually found by running `whereis <distro>-pipewire-launcher`.
If such file does not exist on your install please refer to your distro's documentation for help.
#### Non-systemd distros
Since here is no truly standardized way (outside of systemd) to load PipeWire
when starting a graphical shell[^1] non-systemd distros like Gentoo or Artix
provide a decicated launcher.
It can be usually found by running `whereis <distro>-pipewire-launcher`. If such
file does not exist on your install please refer to your distro's documentation
for help.
[^1]: https://wiki.gentoo.org/wiki/PipeWire#OpenRC
### XDG Desktop Portal
_Starting method:_ Automatic on Systemd, manual otherwise
XDG Desktop Portal handles a lot of stuff for your desktop, like file pickers,
screensharing, etc.
See the [Hyprland Desktop Portal Page](../Hyprland-desktop-portal)
See the [Hyprland Desktop Portal Page](../xdg-desktop-portal-hyprland)
### Authentication Agent
_Starting method:_ manual (`exec-once`)
Authentication agents are the things that pop up a window asking you for a password whenever
an app wants to elevate its privileges.
Authentication agents are the things that pop up a window asking you for a
password whenever an app wants to elevate its privileges.
Our recommendation is the KDE one. For arch, it's `polkit-kde-agent`.
You can autostart it with `exec-once=/usr/lib/polkit-kde-authentication-agent-1`.
On some distributions you might have to use a different path `/usr/libexec/polkit-kde-authentication-agent-1`.
You can autostart it with
`exec-once=/usr/lib/polkit-kde-authentication-agent-1`. On some distributions
you might have to use a different path
`/usr/libexec/polkit-kde-authentication-agent-1`.
On other distributions that use a more recent version, such as Gentoo, it may be necessary to use `exec-once=/usr/lib64/libexec/polkit-kde-authentication-agent-1` instead.
On other distributions that use a more recent version, such as Gentoo, it may be
necessary to use
`exec-once=/usr/lib64/libexec/polkit-kde-authentication-agent-1` instead.
### Qt Wayland Support
_Starting method:_ none (just a library)
Install `qt5-wayland` and `qt6-wayland`.

View file

@ -1,16 +1,34 @@
Here you will find links to some other projects that may not fit into any of the above categories.
---
weight: 10
title: Other
---
Here you will find links to some other projects that may not fit into any of the
above categories.
### Workspace management
[hyprsome](https://github.com/sopa0/hyprsome) by _sopa0_: Awesome-like workspaces for Hyprland.
[hyprsome](https://github.com/sopa0/hyprsome) by _sopa0_: Awesome-like
workspaces for Hyprland.
### Keyboard layout management
[hyprland-per-window-layout](https://github.com/coffebar/hyprland-per-window-layout/) by _MahouShoujoMivutilde and coffebar_: Per window keyboard layouts for Hyprland.
[hyprland-per-window-layout](https://github.com/coffebar/hyprland-per-window-layout/)
by _MahouShoujoMivutilde and coffebar_: Per window keyboard layouts for
Hyprland.
### IPC wrappers
[hyprland-rs](https://github.com/yavko/hyprland-rs) by _yavko_: A neat wrapper for Hyprland's IPC written in Rust
[hyprland-rs](https://github.com/yavko/hyprland-rs) by _yavko_: A neat wrapper
for Hyprland's IPC written in Rust
### Screen shaders/color temperature
[hyprshade](https://github.com/loqusion/hyprshade) by _loqusion_: Utility for swapping and scheduling screen shaders; also functions as an [automatic color temperature shifter](https://en.wikipedia.org/wiki/F.lux). (Useful for Nvidia users for whom other color temperature shifting apps do not work.)
[hyprshade](https://github.com/loqusion/hyprshade) by _loqusion_: Utility for
swapping and scheduling screen shaders; also functions as an
[automatic color temperature shifter](https://en.wikipedia.org/wiki/F.lux).
(Useful for Nvidia users for whom other color temperature shifting apps do not
work.)
### Wireless settings
- [iwgtk](https://github.com/J-Lentz/iwgtk) by _Jesse Lentz_: WiFi settings frontend for `iwd` in GTK
@ -22,16 +40,18 @@ Here you will find links to some other projects that may not fit into any of the
_Starting method:_ manual ('exec-once')
USB Mass storage devices, like thumb drives, mobile phones, digital cameras, etc. do not mount automatically to the file system.
USB Mass storage devices, like thumb drives, mobile phones, digital cameras,
etc. do not mount automatically to the file system.
We generally have to manually mount it, often using root and `umount` to do so.
Many popular DEs automatically handle this by using `udisks2` wrappers.
`udiskie` is a udisks2 front-end that allows to manage removable media such as
CDs or flash drives from userspace.
`udiskie` is a udisks2 front-end that allows to manage removable media such as CDs or flash drives from userspace.
Install `udiskie` via your repositories, or [build manually](https://github.com/coldfix/udiskie/wiki/installation)
Install `udiskie` via your repositories, or
[build manually](https://github.com/coldfix/udiskie/wiki/installation)
Head over to your `~/.config/hypr/hyprland.conf` and add the following lines:
@ -39,7 +59,7 @@ Head over to your `~/.config/hypr/hyprland.conf` and add the following lines:
exec-once = udiskie &
```
What this does is launches `udiskie` and `&` argument launches it in the background.
What this does is launches `udiskie` and `&` argument launches it in the
background.
[See more uses here](https://github.com/coldfix/udiskie/wiki/Usage) .

View file

@ -1,3 +1,8 @@
---
weight: 4
title: Screen sharing
---
Screensharing is done through PipeWire on Wayland.
## Prerequisites
@ -13,14 +18,24 @@ for a great tutorial.
## Better screensharing
See [the hyprland portal page](../Hyprland-desktop-portal)
See [the hyprland portal page](../xdg-desktop-portal-hyprland)
## XWayland
If your screensharing application is running under XWayland (like Discord, Skype,...), it can only see other XWayland windows and cannot share an entire screen or a Wayland window.
If your screensharing application is running under XWayland (like Discord,
Skype,...), it can only see other XWayland windows and cannot share an entire
screen or a Wayland window.
The KDE-team has implemented a workaround for this called
[xwaylandvideobridge](https://invent.kde.org/system/xwaylandvideobridge). You
can use
[this AUR package](https://aur.archlinux.org/packages/xwaylandvideobridge-git)
on ArchLinux. Note that Hyprland currently doesn't support the way it tries to
hide the main window, so you will have to create some window-rules to achieve
the same effect. See
[this issue](https://invent.kde.org/system/xwaylandvideobridge/-/issues/1) for
more information. For example:
The KDE-team has implemented a workaround for this called [xwaylandvideobridge](https://invent.kde.org/system/xwaylandvideobridge). You can use [this AUR package](https://aur.archlinux.org/packages/xwaylandvideobridge-git) on ArchLinux.
Note that Hyprland currently doesn't support the way it tries to hide the main window, so you will have to create some window-rules to achieve the same effect. See [this issue](https://invent.kde.org/system/xwaylandvideobridge/-/issues/1) for more information. For example:
```ini
windowrulev2 = opacity 0.0 override 0.0 override,class:^(xwaylandvideobridge)$
windowrulev2 = noanim,class:^(xwaylandvideobridge)$

View file

@ -1,38 +1,44 @@
# Table of contents
---
weight: 2
title: Status bars
---
{{< toc >}}
# Waybar
## Waybar
Waybar is a GTK status bar made specifically for wlroots compositors and
supports Hyprland by default. To use it, it's recommended to use your distro's
package.
If you want to use the workspaces module, first, copy the configuration files from
`/etc/xdg/waybar/` into `~/.config/waybar/`. Then, in `~/.config/waybar/config` replace
all the references to `sway/workspaces` with `hyprland/workspaces`.
If you want to use the workspaces module, first, copy the configuration files
from `/etc/xdg/waybar/` into `~/.config/waybar/`. Then, in
`~/.config/waybar/config` replace all the references to `sway/workspaces` with
`hyprland/workspaces`.
For more info regarding configuration, see
[The Waybar Wiki](https://github.com/Alexays/Waybar/wiki/Module:-Hyprland).
## How to launch
### How to launch
After getting everything set up, you might want to check if Waybar is configured to your liking. To launch it, simply type `waybar` into your terminal.
If you would like waybar to launch alongside hyprland, you can do this by adding a line to your hyprland configuration that reads `exec-once=waybar`
After getting everything set up, you might want to check if Waybar is configured
to your liking. To launch it, simply type `waybar` into your terminal. If you
would like waybar to launch alongside hyprland, you can do this by adding a line
to your hyprland configuration that reads `exec-once=waybar`
## Waybar popups render behind the windows
### Waybar popups render behind the windows
In `~/.config/waybar/config`, make sure that you have the `layer` configuration
set to `top` and not `bottom`.
## Active workspace doesn't show up
### Active workspace doesn't show up
Replace `#workspaces button.focused` with `#workspaces button.active` in `~/.config/waybar/style.css`.
Replace `#workspaces button.focused` with `#workspaces button.active` in
`~/.config/waybar/style.css`.
## Scrolling through workspaces
### Scrolling through workspaces
Since there a lot of configuration options from `sway/workspaces` are missing, you
should deduce some of them by yourself. In the case of scrolling, it should look like this:
Since there a lot of configuration options from `sway/workspaces` are missing,
you should deduce some of them by yourself. In the case of scrolling, it should
look like this:
```json
"hyprland/workspaces": {
@ -42,22 +48,26 @@ should deduce some of them by yourself. In the case of scrolling, it should look
}
```
## Clicking on a workspace icon does not work!
### Clicking on a workspace icon does not work!
On the `hyprland/workspaces` module, add `"on-click": "activate"`. That's the purpose of
the `sed` command used before building Waybar: the default way to select a workspace by
clicking uses the `swaymsg`'s way, and thus it is required to edit
this function to make it work with `hyprctl`.
On the `hyprland/workspaces` module, add `"on-click": "activate"`. That's the
purpose of the `sed` command used before building Waybar: the default way to
select a workspace by clicking uses the `swaymsg`'s way, and thus it is required
to edit this function to make it work with `hyprctl`.
## Window title is missing
### Window title is missing
Follow the above instructions to make sure everything is working. The prefix for
the window module that provides the title is `hyprland` not `wlr`. In your
waybar config, insert this module:
Follow the above instructions to make sure everything is working.
The prefix for the window module that provides the title is `hyprland` not `wlr`.
In your waybar config, insert this module:
```json
"modules-center": ["hyprland/window"],
```
If you are using a multiple monitors, you may want to also insert this module configuration:
If you are using a multiple monitors, you may want to also insert this module
configuration:
```json
"hyprland/window": {
"max-length": 200,
@ -65,34 +75,45 @@ If you are using a multiple monitors, you may want to also insert this module co
},
```
# Eww
## Eww
In order to use [Eww](https://github.com/elkowar/eww), you first have to install
it, either using your distro's package manager, by searching `eww-wayland`, or
by manually compiling. In the latter case, you can follow the
[instructions](https://elkowar.github.io/eww).
## Configuration
### Configuration
After you've successfully installed Eww, you can move onto configuring it. There
are a few examples listed in the [Readme](https://github.com/elkowar/eww). It's also
highly recommended to read through the
are a few examples listed in the [Readme](https://github.com/elkowar/eww). It's
also highly recommended to read through the
[Configuration options](https://elkowar.github.io/eww/configuration.html).
{{< hint type=important >}}
{{< callout >}}
Read
[the Wayland section](https://elkowar.github.io/eww/configuration.html#wayland)
carefully before asking why your bar doesn't work.
{{< /hint >}}
{{< /callout >}}
Here are some example widgets that might be useful for Hyprland:
<details>
<summary>Workspaces widget</summary>
This widget displays a list of workspaces 1-10. Each workspace can be clicked on to jump to it, and scrolling over the widget cycles through them. It supports different styles for the current workspace, occupied workspaces, and empty workspaces. It requires [bash](https://linux.die.net/man/1/bash), [awk](https://linux.die.net/man/1/awk), [stdbuf](https://linux.die.net/man/1/stdbuf), [grep](https://linux.die.net/man/1/grep), [seq](https://linux.die.net/man/1/seq), [socat](https://linux.die.net/man/1/socat), [jq](https://stedolan.github.io/jq/), and [Python 3](https://www.python.org/).
This widget displays a list of workspaces 1-10. Each workspace can be clicked on
to jump to it, and scrolling over the widget cycles through them. It supports
different styles for the current workspace, occupied workspaces, and empty
workspaces. It requires [bash](https://linux.die.net/man/1/bash),
[awk](https://linux.die.net/man/1/awk),
[stdbuf](https://linux.die.net/man/1/stdbuf),
[grep](https://linux.die.net/man/1/grep),
[seq](https://linux.die.net/man/1/seq),
[socat](https://linux.die.net/man/1/socat),
[jq](https://stedolan.github.io/jq/), and [Python 3](https://www.python.org/).
### `~/.config/eww.yuck`
#### `~/.config/eww.yuck`
```lisp
...
@ -113,10 +134,9 @@ This widget displays a list of workspaces 1-10. Each workspace can be clicked on
)
)
...
```
### `~/.config/eww/scripts/change-active-workspace`
#### `~/.config/eww/scripts/change-active-workspace`
```sh
#!/usr/bin/env bash
@ -142,7 +162,7 @@ then
fi
```
### `~/.config/eww/scripts/get-active-workspace`
#### `~/.config/eww/scripts/get-active-workspace`
```sh
#!/usr/bin/env bash
@ -153,7 +173,7 @@ socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - |
stdbuf -o0 awk -F '>>|,' -e '/^workspace>>/ {print $2}' -e '/^focusedmon>>/ {print $3}'
```
### `~/.config/eww/scripts/get-workspaces`
#### `~/.config/eww/scripts/get-workspaces`
```sh
#!/usr/bin/env bash
@ -174,9 +194,13 @@ done
<details>
<summary>Active window title widget</summary>
This widget simply displays the title of the active window. It requires [awk](https://linux.die.net/man/1/awk), [stdbuf](https://linux.die.net/man/1/stdbuf), [socat](https://linux.die.net/man/1/socat), and [jq](https://stedolan.github.io/jq/).
This widget simply displays the title of the active window. It requires
[awk](https://linux.die.net/man/1/awk),
[stdbuf](https://linux.die.net/man/1/stdbuf),
[socat](https://linux.die.net/man/1/socat), and
[jq](https://stedolan.github.io/jq/).
### `~/.config/eww/eww.yuck`
#### `~/.config/eww/eww.yuck`
```lisp
...
@ -189,7 +213,7 @@ This widget simply displays the title of the active window. It requires [awk](ht
...
```
### `~/.config/eww/scripts/get-window-title`
#### `~/.config/eww/scripts/get-window-title`
```sh
#!/bin/sh
@ -199,24 +223,32 @@ socat -u UNIX-CONNECT:/tmp/hypr/$HYPRLAND_INSTANCE_SIGNATURE/.socket2.sock - | s
</details>
# Hybrid
## Hybrid
Like Waybar, [Hybrid](https://github.com/vars1ty/HybridBar) is a GTK status bar mainly focused for wlroots compositors.
Like Waybar, [Hybrid](https://github.com/vars1ty/HybridBar) is a GTK status bar
mainly focused for wlroots compositors.
You can install it from the AUR by the name `hybrid-bar`.
## Configuration
### Configuration
The configuration is done through JSON, more information is available [here](https://github.com/vars1ty/HybridBar).
The configuration is done through JSON, more information is available
[here](https://github.com/vars1ty/HybridBar).
## How to launch
### How to launch
After configuring HybridBar, you can launch it by typing `hybrid-bar` into your terminal to try it out.
It is also possible to set it to launch at start, to do this you can add a line to your hyprland configuration that reads `exec-once=hybrid-bar`
After configuring HybridBar, you can launch it by typing `hybrid-bar` into your
terminal to try it out. It is also possible to set it to launch at start, to do
this you can add a line to your hyprland configuration that reads
`exec-once=hybrid-bar`
### Blur
#### Blur
To activate blur, set `blurls=NAMESPACE` in your hyprland configuration, where
`NAMESPACE` is the gtk-layer-shell namespace of your HybridBar. The default
namespace is `gtk-layer-shell` and can be changed in the HybridBar configuration
at
To activate blur, set `blurls=NAMESPACE` in your hyprland configuration, where `NAMESPACE` is the gtk-layer-shell namespace of your HybridBar. The default namespace is `gtk-layer-shell` and can be changed in the HybridBar configuration at
```json
{
"hybrid" {

View file

@ -1,3 +1,8 @@
---
weight: 3
title: Wallpapers
---
Launch your wallpaper utility with `exec-once=`.
## hyprpaper
@ -24,8 +29,8 @@ A neat mpv wrapper to play a video as your wallpaper.
## swww
An efficient animated wallpaper daemon for wayland, controlled at runtime,
which means you can change wallpapers without even needing to restart.
An efficient animated wallpaper daemon for wayland, controlled at runtime, which
means you can change wallpapers without even needing to restart.
[GitHub](https://github.com/Horus645/swww)
## waypaper

View file

@ -1,26 +1,31 @@
---
weight: 5
title: Useful Utilities
---
This category is dedicated to short tutorials on how to get useful utilities for
Hyprland working.
# List of Pages
## List of Pages
- **[Must-Have](./Must-have)**
- **[Must-Have](./must-have)**
- **[Hypr Ecosystem](./Hypr-Ecosystem)**
- **[Hypr Ecosystem](./hypr-ecosystem)**
- **[Status Bars](./Status-Bars)**
- **[Status Bars](./status-bars)**
- **[App Launchers](./App-Launchers)**
- **[App Launchers](./app-launchers)**
- **[Wallpapers](./Wallpapers)**
- **[Wallpapers](./wallpapers)**
- **[Screen Sharing](./Screen-Sharing)**
- **[Screen Sharing](./screen-sharing)**
- **[App Clients](./App-Clients)**
- **[App Clients](./app-clients)**
- **[Color Pickers](./Color-Pickers)**
- **[Color Pickers](./color-pickers)**
- **[Clipboard Managers](./Clipboard-Managers)**
- **[Clipboard Managers](./clipboard-managers)**
- **[Hyprland Desktop Portal](./Hyprland-desktop-portal)**
- **[Hyprland Desktop Portal](./xdg-desktop-portal-hyprland)**
- **[Other](./Other)**
- **[Other](./other)**

View file

@ -1,42 +1,58 @@
---
weight: 5
title: Hyprland Desktop Portal
---
An XDG Desktop Portal (later called XDP) is a program that lets other
applications communicate swiftly with the compositor through D-Bus.
It's used for stuff like e.g. opening file pickers, screen sharing.
On Wayland, it also requires an implementation. For Hyprland,
you'd usually use `xdg-desktop-portal-wlr` (later called XDPW)
On Wayland, it also requires an implementation. For Hyprland, you'd usually use
`xdg-desktop-portal-wlr` (later called XDPW)
Unfortunately, due to various reasons the -wlr portal is inferior
to the KDE or Gnome ones.
Unfortunately, due to various reasons the -wlr portal is inferior to the KDE or
Gnome ones.
In order to bridge the gap, Hyprland has its own fork of XDPW that
has more features, called [xdg-desktop-portal-hyprland](https://github.com/hyprwm/xdg-desktop-portal-hyprland).
In order to bridge the gap, Hyprland has its own fork of XDPW that has more
features, called
[xdg-desktop-portal-hyprland](https://github.com/hyprwm/xdg-desktop-portal-hyprland).
(later called XDPH)
{{< hint type=important >}}
You don't **need** XDPH. Hyprland will work with XDPW, but XDPH has more features, like e.g.
window sharing.
{{< callout >}}
XDPH will work on other wlroots-based compositors, although limited to the XDPW features (other
will be disabled)
{{< /hint >}}
You don't **need** XDPH. Hyprland will work with XDPW, but XDPH has more
features, like e.g. window sharing.
XDPH will work on other wlroots-based compositors, although limited to the XDPW
features (other will be disabled).
{{< /callout >}}
## Installing
{{< tabs "uniqueid" >}}
{{< tabs items="Arch Linux,Gentoo,Manual" >}}
{{< tab "Arch Linux" >}}
```plain
pacman -S xdg-desktop-portal-hyprland
```
or, for -git:
```plain
yay -S xdg-desktop-portal-hyprland-git
```
{{< /tab >}}
{{< tab "Gentoo" >}}
## Unmask dependencies
### /etc/portage/profile/package.unmask
```plain
dev-qt/qtbase
dev-qt/qtwayland
@ -45,7 +61,9 @@ dev-qt/qtshadertools
```
## Apply necessary useflags
### /etc/portage/package.use
```plain
dev-qt/qtbase opengl egl eglfs gles2-only
dev-qt/qtdeclarative opengl
@ -53,7 +71,9 @@ sys-apps/xdg-desktop-portal screencast
```
## Unmask dependencies and xdph
### /etc/portage/package.accept_keywords
```plain
gui-libs/xdg-desktop-portal-hyprland
dev-qt/qtbase
@ -65,6 +85,7 @@ dev-qt/qtshadertools
btw those are the useflags that I have tested, you could also test others.
## Installation
```sh
eselect repository enable guru
emaint sync -r guru
@ -72,31 +93,39 @@ emerge --ask --verbose gui-libs/xdg-desktop-portal-hyprland
```
{{< /tab >}}
{{< tab "Manual" >}}
See [The Github repo's readme](https://github.com/hyprwm/xdg-desktop-portal-hyprland).
See
[The Github repo's readme](https://github.com/hyprwm/xdg-desktop-portal-hyprland).
{{</ tab >}}
{{< /tabs >}}
{{< hint type=tip >}}
XDPH doesn't implement a file picker. For that, I recommend installing `xdg-desktop-portal-gtk` alongside XDPH.
{{< /hint >}}
{{< callout type=info >}}
XDPH doesn't implement a file picker. For that, I recommend installing
`xdg-desktop-portal-gtk` alongside XDPH.
{{< /callout >}}
## Usage
Should start automatically.
The most basic way of telling everything is OK is by trying to screenshare anything, or
open OBS and select pipewire source. If XDPH is running, a qt menu will pop up asking you
what to share.
The most basic way of telling everything is OK is by trying to screenshare
anything, or open OBS and select pipewire source. If XDPH is running, a qt menu
will pop up asking you what to share.
If it doesn't, and you get e.g. slurp, then XDPW is launching. In that case, try removing XDPW.
If it doesn't, and you get e.g. slurp, then XDPW is launching. In that case, try
removing XDPW.
XDPH will work on other wlroots compositors, but features available only on Hyprland will not work
(e.g. window sharing)
XDPH will work on other wlroots compositors, but features available only on
Hyprland will not work (e.g. window sharing)
For a nuclear option, you can use this script and `exec-once` it:
```sh
#!/usr/bin/env bash
sleep 1
@ -107,11 +136,13 @@ killall xdg-desktop-portal
sleep 2
/usr/lib/xdg-desktop-portal &
```
adjust the paths if incorrect.
## Share picker doesn't use the system theme
Try one or both:
```sh
dbus-update-activation-environment --systemd --all
systemctl --user import-environment QT_QPA_PLATFORMTHEME
@ -131,8 +162,10 @@ You can read more about this in the [xdg-desktop-portal documentation in the Arc
## Debugging
If you get long app launch times, or screensharing does not work, consult the logs.
If you get long app launch times, or screensharing does not work, consult the
logs.
`systemctl --user status xdg-desktop-portal-hyprland`
if you see a crash, it's most likely you are missing `qt6-wayland` and/or `qt5-wayland`.
if you see a crash, it's most likely you are missing `qt6-wayland` and/or
`qt5-wayland`.

View file

@ -1,3 +1,8 @@
---
cascade:
type: docs
---
# Hyprland Wiki
Hello there, dear traveler! Welcome to the Hyprland Wiki!
@ -6,17 +11,18 @@ Take a tour of the pages on the left and read ones that you may need.
## Wayland info (especially useful for Xorg users)
A Wayland compositor is a fully autonomous Display Server, like Xorg itself.
It is **not** possible to mix'n'match Wayland compositors like you could on Xorg
with window managers and compositors. It is also not entirely possible, nor recommended,
to try and use all Xorg applications on Wayland. See [this page](../Useful-Utilities) for a
list of recommended Wayland native/compatible programs.
A Wayland compositor is a fully autonomous Display Server, like Xorg itself. It
is **not** possible to mix'n'match Wayland compositors like you could on Xorg
with window managers and compositors. It is also not entirely possible, nor
recommended, to try and use all Xorg applications on Wayland. See
[this page](../useful-utilities) for a list of recommended Wayland
native/compatible programs.
Wayland **compositors** should not be confused with Xorg **window managers**.
## IMPORTANT
If you are having issues, please try [reading the FAQ](../FAQ) and configuring
If you are having issues, please try [reading the FAQ](../faq) and configuring
sections — chances are your issue is described somewhere there. If not, you can
try [searching the issues](https://github.com/hyprwm/Hyprland/issues) or
[joining the Discord server](https://discord.gg/hQ9XvMUjjr).

39
pages/version-selector.md Normal file
View file

@ -0,0 +1,39 @@
---
title: Version selector ⚙️
weight: 1
---
Select your preferred wiki version below:
- [Latest Git](https://wiki.hyprland.org/)
- [v0.36.0](https://wiki.hyprland.org/0.36.0/)
- [v0.35.0](https://wiki.hyprland.org/0.35.0/)
- [v0.34.0](https://wiki.hyprland.org/0.34.0/)
- [v0.33.1](https://wiki.hyprland.org/0.33.0/)
- [v0.33.0](https://wiki.hyprland.org/0.33.0/)
- [v0.32.2](https://wiki.hyprland.org/0.32.1/)
- [v0.32.1](https://wiki.hyprland.org/0.32.1/)
- [v0.32.0](https://wiki.hyprland.org/0.32.0/)
- [v0.31.0](https://wiki.hyprland.org/0.31.0/)
- [v0.30.0](https://wiki.hyprland.org/0.30.0/)
- [v0.29.1](https://wiki.hyprland.org/0.29.1/)
- [v0.29.0](https://wiki.hyprland.org/0.29.0/)
- [v0.28.0](https://wiki.hyprland.org/0.28.0/)
- [v0.27.2](https://wiki.hyprland.org/0.27.2/)
- [v0.27.1](https://wiki.hyprland.org/0.27.1/)
- [v0.27.0](https://wiki.hyprland.org/0.27.0/)
- [v0.26.0](https://wiki.hyprland.org/0.26.0/)
- [v0.25.0](https://wiki.hyprland.org/0.25.0/)
- [v0.24.1](https://wiki.hyprland.org/0.24.1/)
- [v0.24.0](https://wiki.hyprland.org/0.24.0/)
- [v0.23.0beta](https://wiki.hyprland.org/0.23.0beta/)
- [v0.22.0beta](https://wiki.hyprland.org/0.22.0beta/)
- [v0.21.0beta](https://wiki.hyprland.org/0.21.0beta/)
- [v0.20.1beta](https://wiki.hyprland.org/0.20.1beta/)
- [v0.20.0beta](https://wiki.hyprland.org/0.20.0beta/)
- [v0.19.2beta](https://wiki.hyprland.org/0.19.2beta/)
- [v0.19.1beta](https://wiki.hyprland.org/0.19.1beta/)
- [v0.19.0beta](https://wiki.hyprland.org/0.19.0beta/)
- [v0.18.0beta](https://wiki.hyprland.org/0.18.0beta/)
- [v0.17.0beta](https://wiki.hyprland.org/0.17.0beta/)
- [v0.16.0beta](https://wiki.hyprland.org/0.16.0beta/)