nix-conf/system/modules/shells/noctalia/default.nix
2026-03-12 14:34:33 +08:00

835 lines
30 KiB
Nix
Executable file

{
lib,
config,
inputs,
...
}:
let
inherit (config.systemConf) username;
inherit (builtins) mapAttrs hasAttr;
inherit (lib)
listToAttrs
mkForce
removePrefix
concatStringsSep
mapAttrsToList
mkIf
mkDefault
;
in
{
# ==== Extra Services Settings ==== #
services.power-profiles-daemon.enable = true;
networking.networkmanager.enable = true;
services.upower.enable = true;
hardware.bluetooth.enable = true;
systemd.user.services.polkit-gnome-authentication-agent-1.enable = mkForce false;
# ================================= #
# Calendar Service
# Run `nix shell nixpkgs#gnome-control-center -c bash -c "XDG_CURRENT_DESKTOP=GNOME gnome-control-center"`,
# Then login to service. Check: https://nixos.wiki/wiki/GNOME/Calendar
programs.dconf.enable = true;
services.gnome.evolution-data-server.enable = true;
services.gnome.gnome-online-accounts.enable = true;
services.gnome.gnome-keyring.enable = true;
programs.evolution.enable = true;
home-manager.users.${username} =
{
osConfig,
config,
pkgs,
...
}:
let
wmCfg = config.wm;
bindCfg = wmCfg.keybinds;
mod = wmCfg.keybinds.mod;
sep = wmCfg.keybinds.separator;
in
{
# ==== Disabled Services ==== #
services.swww.enable = mkForce false; # Wallpaper
programs.waybar.enable = mkForce false; # Bar
services.swayidle.enable = mkForce false; # Idle
services.sunsetr.enable = mkForce false; # Bluelight filter
programs.hyprlock.enable = mkForce false; # Lock
services.swaync.enable = mkForce false; # Notification daemon
systemd.user.services.noctalia-shell.Service.Environment = [
"QT_QPA_PLATFORMTHEME=gtk3"
];
wm.keybinds.spawn-repeat = {
# ==== Media ==== #
"XF86AudioPrev" = ''noctalia "media" "previous"'';
"XF86AudioNext" = ''noctalia "media" "next"'';
"${mod}${sep}CTRL${sep}COMMA" = ''noctalia "media" "previous"'';
"${mod}${sep}CTRL${sep}PERIOD" = ''noctalia "media" "next"'';
"XF86AudioPlay" = ''noctalia "media" "playPause"'';
"XF86AudioStop" = ''noctalia "media" "pause"'';
"XF86AudioMute" = ''noctalia "volume" "muteOutput"'';
"XF86AudioRaiseVolume" = ''noctalia "volume" "increase"'';
"XF86AudioLowerVolume" = ''noctalia "volume" "decrease"'';
"XF86MonBrightnessDown" = ''noctalia "brightness" "decrease"'';
"XF86MonBrightnessUp" = ''noctalia "brightness" "increase"'';
};
# Install Required Packages
home.packages = mkIf (hasAttr "wt0" osConfig.services.netbird.clients) [
# Alias netbird-wt0 to netbird
(pkgs.writeShellScriptBin "netbird" ''
netbird-wt0 $@
'')
# Output noctalia settings in nix format
(pkgs.writeShellScriptBin "noctalia-settings" ''
PATH="$PATH:${pkgs.jq}/bin:${pkgs.nixfmt}/bin"
tmp=$(mktemp)
noctalia-shell ipc call state all | jq -S .settings > "$tmp"
nix eval --impure --expr \
"(builtins.fromJSON (builtins.readFile \"$tmp\"))$1" \
| nixfmt
rm "$tmp"
'')
pkgs.gpu-screen-recorder
];
programs.noctalia-shell =
let
officialPlugins = [
"niri-overview-launcher"
"timer"
"screen-recorder"
"clipper"
"battery-threshold"
"polkit-agent"
"todo"
"keybind-cheatsheet"
"battery-action"
"weekly-calendar"
"privacy-indicator"
"netbird"
"network-manager-vpn"
];
states = listToAttrs (
map (x: {
name = x;
value = {
enabled = true;
sourceUrl = "https://github.com/noctalia-dev/noctalia-plugins";
};
}) officialPlugins
);
in
{
enable = true;
package = inputs.noctalia.packages.${pkgs.stdenv.hostPlatform.system}.default.override {
calendarSupport = true;
};
systemd.enable = true;
colors = mkForce { };
plugins = {
sources = [
{
enabled = true;
name = "Official Noctalia Plugins";
url = "https://github.com/noctalia-dev/noctalia-plugins";
}
];
inherit states;
};
pluginSettings = {
netbird = {
compactMode = true;
defaultPeerAction = "copy-ip";
hideDisconnected = false;
pingCount = 5;
refreshInterval = 5000;
showIpAddress = false;
showPing = false;
};
privacy-indicator = {
activeColor = "primary";
enableToast = false;
hideInactive = true;
iconSpacing = 4;
inactiveColor = "none";
micFilterRegex = "";
removeMargins = true;
};
};
settings = {
appLauncher = {
autoPasteClipboard = false;
clipboardWatchImageCommand = "wl-paste --type image --watch cliphist store";
clipboardWatchTextCommand = "wl-paste --type text --watch cliphist store";
clipboardWrapText = true;
customLaunchPrefix = "";
customLaunchPrefixEnabled = false;
density = "default";
enableClipPreview = true;
enableClipboardHistory = true;
enableSessionSearch = true;
enableSettingsSearch = true;
enableWindowsSearch = true;
iconMode = "tabler";
ignoreMouseInput = false;
overviewLayer = false;
pinnedApps = [ ];
position = "top_center";
screenshotAnnotationTool = "";
showCategories = true;
showIconBackground = false;
sortByMostUsed = true;
terminalCommand = "${wmCfg.app.terminal.run}";
useApp2Unit = false;
viewMode = "list";
};
audio = {
mprisBlacklist = [ ];
preferredPlayer = "mpv";
spectrumFrameRate = 30;
visualizerType = "linear";
volumeFeedback = false;
volumeFeedbackSoundFile = "";
volumeOverdrive = false;
volumeStep = 5;
};
bar = import ./bar.nix { inherit lib; };
brightness = {
backlightDeviceMappings = [ ];
brightnessStep = 5;
enableDdcSupport = false;
enforceMinimum = true;
};
calendar = {
cards = [
{
enabled = true;
id = "banner-card";
}
{
enabled = true;
id = "calendar-card";
}
{
enabled = true;
id = "timer-card";
}
{
enabled = true;
id = "weather-card";
}
];
};
colorSchemes = {
darkMode = true;
generationMethod = "tonal-spot";
manualSunrise = "06:30";
manualSunset = "18:30";
monitorForColors = "";
predefinedScheme = "Noctalia (default)";
schedulingMode = "off";
useWallpaperColors = true;
};
controlCenter = import ./controlCenter.nix { inherit config; };
dock = {
animationSpeed = 1;
backgroundOpacity = mkForce 1.0;
colorizeIcons = false;
deadOpacity = 0.6;
displayMode = "auto_hide";
dockType = "floating";
enabled = false;
floatingRatio = 1;
groupApps = false;
groupClickAction = "cycle";
groupContextMenuMode = "extended";
groupIndicatorStyle = "dots";
inactiveIndicators = false;
indicatorColor = "primary";
indicatorOpacity = 0.6;
indicatorThickness = 3;
launcherIconColor = "none";
launcherPosition = "end";
monitors = [ ];
onlySameOutput = true;
pinnedApps = [ ];
pinnedStatic = false;
position = "bottom";
showDockIndicator = false;
showLauncherIcon = false;
sitOnFrame = false;
size = 1;
};
general = {
allowPanelsOnScreenWithoutBar = true;
allowPasswordWithFprintd = false;
animationDisabled = false;
animationSpeed = 1.5;
autoStartAuth = false;
avatarImage = "${config.home.homeDirectory}/.face";
boxRadiusRatio = 0.68;
clockFormat = "hh\\nmm";
clockStyle = "custom";
compactLockScreen = false;
dimmerOpacity = 0.4;
enableBlurBehind = true;
enableLockScreenCountdown = true;
enableLockScreenMediaControls = false;
enableShadows = true;
forceBlackScreenCorners = true;
iRadiusRatio = 0.68;
keybinds = {
keyDown = [ "Down" ];
keyEnter = [
"Return"
"Enter"
];
keyEscape = [ "Esc" ];
keyLeft = [ "Left" ];
keyRemove = [ "Del" ];
keyRight = [ "Right" ];
keyUp = [ "Up" ];
};
language = "";
lockOnSuspend = true;
lockScreenAnimations = false;
lockScreenBlur = 0;
lockScreenCountdownDuration = 3000;
lockScreenMonitors = [ ];
lockScreenTint = 0;
passwordChars = false;
radiusRatio = 1;
reverseScroll = false;
scaleRatio = 1;
screenRadiusRatio = 1.09;
shadowDirection = "bottom_right";
shadowOffsetX = 2;
shadowOffsetY = 3;
showChangelogOnStartup = true;
showHibernateOnLockScreen = false;
showScreenCorners = true;
showSessionButtonsOnLockScreen = true;
telemetryEnabled = false;
};
hooks = {
darkModeChange = "";
enabled = false;
performanceModeDisabled = "";
performanceModeEnabled = "";
screenLock = "";
screenUnlock = "";
session = "";
startup = "";
wallpaperChange = "";
};
location = {
analogClockInCalendar = false;
firstDayOfWeek = -1;
hideWeatherCityName = false;
hideWeatherTimezone = false;
name = mkDefault "Taipei, TW";
showCalendarEvents = true;
showCalendarWeather = true;
showWeekNumberInCalendar = false;
use12hourFormat = false;
useFahrenheit = false;
weatherEnabled = true;
weatherShowEffects = true;
};
network = {
airplaneModeEnabled = false;
bluetoothAutoConnect = true;
bluetoothDetailsViewMode = "grid";
bluetoothHideUnnamedDevices = false;
bluetoothRssiPollIntervalMs = 60000;
bluetoothRssiPollingEnabled = false;
disableDiscoverability = false;
networkPanelView = "wifi";
wifiDetailsViewMode = "grid";
wifiEnabled = true;
};
nightLight = {
autoSchedule = true;
dayTemp = "6000";
enabled = true;
forced = false;
manualSunrise = "06:30";
manualSunset = "18:30";
nightTemp = "5500";
};
notifications = {
backgroundOpacity = mkForce 1.00;
clearDismissed = true;
criticalUrgencyDuration = 15;
density = "default";
enableBatteryToast = true;
enableKeyboardLayoutToast = true;
enableMarkdown = true;
enableMediaToast = false;
enabled = true;
location = "bottom_right";
lowUrgencyDuration = 3;
monitors = [ ];
normalUrgencyDuration = 8;
overlayLayer = true;
respectExpireTimeout = false;
saveToHistory = {
critical = true;
low = true;
normal = true;
};
sounds = {
criticalSoundFile = "";
enabled = false;
excludedApps = "discord,firefox,chrome,chromium,edge";
lowSoundFile = "";
normalSoundFile = "";
separateSounds = false;
volume = 0.5;
};
};
osd = {
autoHideMs = 1500;
backgroundOpacity = mkForce 0.55;
enabled = true;
enabledTypes = [
0
1
2
];
location = "right";
monitors = [ ];
overlayLayer = true;
};
settingsVersion = 57;
sessionMenu = import ./sessionMenu.nix;
systemMonitor = {
batteryCriticalThreshold = 5;
batteryWarningThreshold = 20;
cpuCriticalThreshold = 90;
cpuWarningThreshold = 80;
criticalColor = "";
diskAvailCriticalThreshold = 10;
diskAvailWarningThreshold = 20;
diskCriticalThreshold = 90;
diskWarningThreshold = 80;
enableDgpuMonitoring = false;
externalMonitor = "resources || missioncenter || jdsystemmonitor || corestats || system-monitoring-center || gnome-system-monitor || plasma-systemmonitor || mate-system-monitor || ukui-system-monitor || deepin-system-monitor || pantheon-system-monitor";
gpuCriticalThreshold = 90;
gpuWarningThreshold = 80;
memCriticalThreshold = 90;
memWarningThreshold = 80;
swapCriticalThreshold = 90;
swapWarningThreshold = 80;
tempCriticalThreshold = 90;
tempWarningThreshold = 80;
useCustomColors = false;
warningColor = "";
};
templates = {
activeTemplates = [ ];
enableUserTheming = false;
};
ui = {
boxBorderEnabled = false;
fontDefault = config.stylix.fonts.sansSerif.name;
fontDefaultScale = 1;
fontFixed = config.stylix.fonts.monospace.name;
fontFixedScale = 1;
panelBackgroundOpacity = mkForce 0.25;
panelsAttachedToBar = true;
settingsPanelMode = "attached";
settingsPanelSideBarCardStyle = false;
tooltipsEnabled = true;
};
wallpaper = {
automationEnabled = false;
directory = "${config.home.homeDirectory}/Pictures/Wallpapers";
enableMultiMonitorDirectories = false;
enabled = true;
favorites = [ ];
fillColor = "#000000";
fillMode = "crop";
hideWallpaperFilenames = true;
monitorDirectories = [ ];
overviewBlur = 0.4;
overviewEnabled = true;
overviewTint = 0.6;
panelPosition = "follow_bar";
randomIntervalSec = 300;
setWallpaperOnAllMonitors = true;
showHiddenFiles = false;
skipStartupTransition = false;
sortOrder = "name";
transitionDuration = 1500;
transitionEdgeSmoothness = 0.05;
transitionType = "random";
useSolidColor = false;
useWallhaven = false;
viewMode = "single";
wallhavenApiKey = "";
wallhavenCategories = "111";
wallhavenOrder = "desc";
wallhavenPurity = "100";
wallhavenQuery = "";
wallhavenRatios = "";
wallhavenResolutionHeight = "";
wallhavenResolutionMode = "atleast";
wallhavenResolutionWidth = "";
wallhavenSorting = "relevance";
wallpaperChangeMode = "random";
};
plugins = {
autoUpdate = false;
};
noctaliaPerformance = {
disableDesktopWidgets = true;
disableWallpaper = true;
};
desktopWidgets = {
enabled = true;
gridSnap = false;
monitorWidgets = [ ];
overviewEnabled = true;
};
idle = {
customCommands = "[]";
enabled = false;
fadeDuration = 5;
lockCommand = "";
lockTimeout = 660;
resumeLockCommand = "";
resumeScreenOffCommand = "";
resumeSuspendCommand = "";
screenOffCommand = "";
screenOffTimeout = 600;
suspendCommand = "";
suspendTimeout = 1800;
};
};
};
programs.niri.settings = mkIf osConfig.programs.niri.enable (
with config.lib.niri.actions;
let
noctalia = spawn "noctalia-shell" "ipc" "call";
in
{
binds = mapAttrs (name: value: mkForce value) {
# Core
"${bindCfg.toggle-control-center}".action = noctalia "controlCenter" "toggle";
"${bindCfg.toggle-launcher}".action = noctalia "launcher" "toggle";
"${bindCfg.lock-screen}".action = noctalia "lockScreen" "lock";
# Utilities
"${bindCfg.clipboard-history}".action = noctalia "launcher" "clipboard";
"${bindCfg.emoji}".action = noctalia "launcher" "emoji";
"${bindCfg.screen-recorder}".action = noctalia "screenRecorder" "toggle";
"${bindCfg.notification-center}".action = noctalia "notifications" "toggleHistory";
"${bindCfg.toggle-dont-disturb}".action = noctalia "notifications" "toggleDND";
"${bindCfg.wallpaper-selector}".action = noctalia "wallpaper" "toggle";
"${bindCfg.calculator}".action = noctalia "launcher" "calculator";
"${bindCfg.wallpaper-random}".action = noctalia "wallpaper" "random";
# Media
"XF86AudioPlay".action = noctalia "media" "playPause";
"XF86AudioStop".action = noctalia "media" "pause";
"XF86AudioPrev".action = noctalia "media" "previous";
"XF86AudioNext".action = noctalia "media" "next";
"${bindCfg.media.prev}".action = noctalia "media" "previous";
"${bindCfg.media.next}".action = noctalia "media" "next";
"XF86AudioMute".action = noctalia "volume" "muteOutput";
"XF86AudioRaiseVolume".action = noctalia "volume" "increase";
"XF86AudioLowerVolume".action = noctalia "volume" "decrease";
"XF86MonBrightnessDown".action = noctalia "brightness" "decrease";
"XF86MonBrightnessUp".action = noctalia "brightness" "increase";
};
}
);
wayland.windowManager.mango.settings = mkIf osConfig.programs.mango.enable (
mkForce (
let
keybinds = concatStringsSep "\n" (
mapAttrsToList (n: v: "bind=${n},spawn,${v}") (bindCfg.spawn-repeat // bindCfg.spawn)
);
in
''
# Window effect
blur=0
blur_layer=0
blur_optimized=1
blur_params_num_passes = 2
blur_params_radius = 5
blur_params_noise = 0.02
blur_params_brightness = 0.9
blur_params_contrast = 0.9
blur_params_saturation = 1.2
shadows = 0
layer_shadows = 0
shadow_only_floating = 1
shadows_size = 10
shadows_blur = 15
shadows_position_x = 0
shadows_position_y = 0
shadowscolor= 0x000000ff
border_radius=${toString wmCfg.border.radius}
no_radius_when_single=0
focused_opacity=${toString wmCfg.window.opacity}
unfocused_opacity=${toString wmCfg.window.opacity}
# Animation Configuration(support type:zoom,slide)
# tag_animation_direction: 1-horizontal,0-vertical
animations=1
layer_animations=1
animation_type_open=slide
animation_type_close=slide
animation_fade_in=1
animation_fade_out=1
tag_animation_direction=1
zoom_initial_ratio=0.3
zoom_end_ratio=0.8
fadein_begin_opacity=0.5
fadeout_begin_opacity=0.8
animation_duration_move=500
animation_duration_open=400
animation_duration_tag=350
animation_duration_close=800
animation_duration_focus=0
animation_curve_open=0.46,1.0,0.29,1
animation_curve_move=0.46,1.0,0.29,1
animation_curve_tag=0.46,1.0,0.29,1
animation_curve_close=0.08,0.92,0,1
animation_curve_focus=0.46,1.0,0.29,1
animation_curve_opafadeout=0.5,0.5,0.5,0.5
animation_curve_opafadein=0.46,1.0,0.29,1
# Scroller Layout Setting
scroller_structs=20
scroller_default_proportion=0.8
scroller_focus_center=0
scroller_prefer_center=0
edge_scroller_pointer_focus=1
scroller_default_proportion_single=1.0
scroller_proportion_preset=0.5,0.8,1.0
# Master-Stack Layout Setting
new_is_master=1
default_mfact=0.55
default_nmaster=1
smartgaps=0
# Overview Setting
hotarea_size=10
enable_hotarea=1
ov_tab_mode=0
overviewgappi=5
overviewgappo=30
# Misc
no_border_when_single=0
axis_bind_apply_timeout=100
focus_on_activate=1
idleinhibit_ignore_visible=0
sloppyfocus=1
warpcursor=1
focus_cross_monitor=0
focus_cross_tag=0
enable_floating_snap=0
snap_distance=30
cursor_size=24
drag_tile_to_tile=1
# keyboard
repeat_rate=${toString wmCfg.input.keyboard.repeat-rate}
repeat_delay=${toString wmCfg.input.keyboard.repeat-delay}
numlockon=0
xkb_rules_layout=us
# Trackpad
# need relogin to make it apply
disable_trackpad=0
tap_to_click=1
tap_and_drag=1
drag_lock=1
trackpad_natural_scrolling=0
disable_while_typing=1
left_handed=0
middle_button_emulation=0
swipe_min_threshold=1
# mouse
# need relogin to make it apply
mouse_natural_scrolling=0
# Appearance
gappih=5
gappiv=5
gappoh=10
gappov=10
scratchpad_width_ratio=0.8
scratchpad_height_ratio=0.9
borderpx=4
rootcolor=0x${removePrefix "#" wmCfg.border.active.to}ff
bordercolor=0x${removePrefix "#" wmCfg.border.active.from}ff
focuscolor=0x${removePrefix "#" wmCfg.border.active.to}ff
maximizescreencolor=0x89aa61ff
urgentcolor=0xad401fff
scratchpadcolor=0x516c93ff
globalcolor=0xb153a7ff
overlaycolor=0x14a57cff
# layout support:
# tile,scroller,grid,deck,monocle,center_tile,vertical_tile,vertical_scroller
tagrule=id:1,layout_name:tile
tagrule=id:2,layout_name:tile
tagrule=id:3,layout_name:tile
tagrule=id:4,layout_name:tile
tagrule=id:5,layout_name:tile
tagrule=id:6,layout_name:tile
tagrule=id:7,layout_name:tile
tagrule=id:8,layout_name:tile
tagrule=id:9,layout_name:tile
# Key Bindings
# key name refer to `xev` or `wev` command output,
# mod keys name: super,ctrl,alt,shift,none
${keybinds}
# exit
bind=${bindCfg.close-window},killclient
# switch window focus
bind=${bindCfg.switch-window-focus},focusstack,next
bind=${bindCfg.move-window-focus.left},focusdir,left
bind=${bindCfg.move-window-focus.right},focusdir,right
bind=${bindCfg.move-window-focus.up},focusdir,up
bind=${bindCfg.move-window-focus.down},focusdir,down
# swap window
bind=${bindCfg.move-window.up},exchange_client,up
bind=${bindCfg.move-window.down},exchange_client,down
bind=${bindCfg.move-window.left},exchange_client,left
bind=${bindCfg.move-window.right},exchange_client,right
# switch window status
bind=SUPER,g,toggleglobal,
bind=${bindCfg.toggle-overview},toggleoverview,
bind=${bindCfg.toggle-float},togglefloating,
bind=${bindCfg.maximize-column},togglemaximizescreen,
# bind=${bindCfg.toggle-fullscreen},togglefullscreen,
bind=${bindCfg.toggle-fullscreen},togglefakefullscreen,
bind=${bindCfg.minimize},minimized,
# bind=SUPER,o,toggleoverlay,
bind=${bindCfg.restore-minimize},restore_minimized
bind=${bindCfg.toggle-scratchpad},toggle_scratchpad
# scroller layout
bind=${bindCfg.expand-column-to-available-width},set_proportion,1.0
bind=${bindCfg.switch-preset-column-width},switch_proportion_preset,
# switch layout
bind=${bindCfg.switch-layout},switch_layout
# tag switch
bind=SUPER,Left,viewtoleft,0
bind=CTRL,Left,viewtoleft_have_client,0
bind=SUPER,Right,viewtoright,0
bind=CTRL,Right,viewtoright_have_client,0
bind=CTRL+SUPER,Left,tagtoleft,0
bind=CTRL+SUPER,Right,tagtoright,0
bind=${bindCfg.focus-workspace-prefix},1,view,1,0
bind=${bindCfg.focus-workspace-prefix},2,view,2,0
bind=${bindCfg.focus-workspace-prefix},3,view,3,0
bind=${bindCfg.focus-workspace-prefix},4,view,4,0
bind=${bindCfg.focus-workspace-prefix},5,view,5,0
bind=${bindCfg.focus-workspace-prefix},6,view,6,0
bind=${bindCfg.focus-workspace-prefix},7,view,7,0
bind=${bindCfg.focus-workspace-prefix},8,view,8,0
bind=${bindCfg.focus-workspace-prefix},9,view,9,0
# tag: move client to the tag and focus it
# tagsilent: move client to the tag and not focus it
# bind=Alt,1,tagsilent,1
bind=Alt,1,tag,1,0
bind=Alt,2,tag,2,0
bind=Alt,3,tag,3,0
bind=Alt,4,tag,4,0
bind=Alt,5,tag,5,0
bind=Alt,6,tag,6,0
bind=Alt,7,tag,7,0
bind=Alt,8,tag,8,0
bind=Alt,9,tag,9,0
# monitor switch
bind=${bindCfg.move-monitor-focus.left},focusmon,left
bind=${bindCfg.move-monitor-focus.right},Right,focusmon,right
bind=SUPER+Alt,Left,tagmon,left
bind=SUPER+Alt,Right,tagmon,right
# gaps
# bind=ALT+SHIFT,X,incgaps,1
# bind=ALT+SHIFT,Z,incgaps,-1
# bind=ALT+SHIFT,R,togglegaps
# movewin
bind=CTRL+SHIFT,Up,movewin,+0,-50
bind=CTRL+SHIFT,Down,movewin,+0,+50
bind=CTRL+SHIFT,Left,movewin,-50,+0
bind=CTRL+SHIFT,Right,movewin,+50,+0
# resizewin
bind=CTRL+ALT,Up,resizewin,+0,-50
bind=CTRL+ALT,Down,resizewin,+0,+50
bind=CTRL+ALT,Left,resizewin,-50,+0
bind=CTRL+ALT,Right,resizewin,+50,+0
# Mouse Button Bindings
# NONE mode key only work in ov mode
mousebind=SUPER,btn_left,moveresize,curmove
mousebind=NONE,btn_middle,togglemaximizescreen,0
mousebind=SUPER,btn_right,moveresize,curresize
mousebind=NONE,btn_left,toggleoverview,1
mousebind=NONE,btn_right,killclient,0
# Axis Bindings
axisbind=SUPER,UP,viewtoleft_have_client
axisbind=SUPER,DOWN,viewtoright_have_client
# layer rule
layerrule=animation_type_open:zoom,layer_name:rofi
layerrule=animation_type_close:zoom,layer_name:rofi
# Core
${bindCfg.toggle-control-center},spawn,noctalia "controlCenter" "toggle";
${bindCfg.toggle-launcher},spawn,noctalia "launcher" "toggle";
${bindCfg.lock-screen},spawn,noctalia "lockScreen" "lock";
# Utilities
${bindCfg.clipboard-history},spawn,noctalia "launcher" "clipboard";
${bindCfg.emoji},spawn,noctalia "launcher" "emoji";
${bindCfg.screen-recorder},spawn,noctalia "screenRecorder" "toggle";
${bindCfg.notification-center},spawn,noctalia "notifications" "toggleHistory";
${bindCfg.toggle-dont-disturb},spawn,noctalia "notifications" "toggleDND";
${bindCfg.wallpaper-selector},spawn,noctalia "wallpaper" "toggle";
${bindCfg.calculator},spawn,noctalia "launcher" "calculator";
${bindCfg.wallpaper-random},spawn,noctalia "wallpaper" "random";
''
)
);
};
}