#
# $NetBSD: system.ctwmrc,v 1.20 2024/04/24 10:35:13 nia Exp $
#
# ctwmrc by nia
#
# An attempt to strike a usability balance that makes keys and buttons
# do the thing users of various operating systems expect them to do.
#
# Most things should be possible to accomplish with only the keyboard.
#
# Also, mostly inoffensive colours (avoiding potentially inaccessible
# combinations like red-green).
#

# don't use the default buttons or key bindings, we define our own
NoDefaults

DontShowWelcomeWindow

ShowWorkSpaceManager
ShowIconManager
#SqueezeTitle

# 3D icon managers do not seemingly honor IconManagerHighlight,
# which makes them slightly less useful
#UseThreeDIconManagers
#UseThreeDWMap
UseThreeDBorders
#UseThreeDMenus
UseThreeDTitles

esyscmd(`printf "define(fontsize, %d)\n" "$(/usr/X11R7/libexec/ctwm_font_size)"')

ifelse(fontsize, `64', `
TitleFont        "-*-spleen-*-*-*-*-64-*-*-*-*-*-*-*"
MenuFont         "-*-spleen-*-*-*-*-64-*-*-*-*-*-*-*"
IconManagerFont  "-*-spleen-*-*-*-*-64-*-*-*-*-*-*-*"
IconFont         "-*-spleen-*-*-*-*-64-*-*-*-*-*-*-*"
ResizeFont       "-*-spleen-*-*-*-*-64-*-*-*-*-*-*-*"
WorkSpaceFont    "-*-spleen-*-*-*-*-32-*-*-*-*-*-*-*"
WorkSpaceManagerGeometry  "240x960-4-4" 1
IconManagerGeometry       "800x-1-1+0" 1
ThreeDBorderWidth         12
BorderWidth               12
define(setsizes, `yes')
')

ifelse(fontsize, `32', `
TitleFont        "-*-spleen-*-*-*-*-32-*-*-*-*-*-*-*"
MenuFont         "-*-spleen-*-*-*-*-32-*-*-*-*-*-*-*"
IconManagerFont  "-*-spleen-*-*-*-*-32-*-*-*-*-*-*-*"
IconFont         "-*-spleen-*-*-*-*-32-*-*-*-*-*-*-*"
ResizeFont       "-*-spleen-*-*-*-*-32-*-*-*-*-*-*-*"
WorkSpaceFont    "-*-spleen-*-*-*-*-24-*-*-*-*-*-*-*"
WorkSpaceManagerGeometry  "120x480-4-4" 1
IconManagerGeometry       "400x-1-1+0" 1
ThreeDBorderWidth         6
BorderWidth               6
define(setsizes, `yes')
')

ifelse(fontsize, `24', `
TitleFont        "-*-spleen-*-*-*-*-24-*-*-*-*-*-*-*"
MenuFont         "-*-spleen-*-*-*-*-24-*-*-*-*-*-*-*"
IconManagerFont  "-*-spleen-*-*-*-*-24-*-*-*-*-*-*-*"
IconFont         "-*-spleen-*-*-*-*-24-*-*-*-*-*-*-*"
ResizeFont       "-*-spleen-*-*-*-*-24-*-*-*-*-*-*-*"
WorkSpaceFont    "-*-spleen-*-*-*-*-16-*-*-*-*-*-*-*"
WorkSpaceManagerGeometry  "90x360-4-4" 1
IconManagerGeometry       "300x-1-1+0" 1
ThreeDBorderWidth         4
BorderWidth               4
define(setsizes, `yes')
')

ifelse(fontsize, `12', `
TitleFont        "-*-spleen-*-*-*-*-12-*-*-*-*-*-*-*"
MenuFont         "-*-spleen-*-*-*-*-12-*-*-*-*-*-*-*"
IconManagerFont  "-*-spleen-*-*-*-*-12-*-*-*-*-*-*-*"
IconFont         "-*-spleen-*-*-*-*-12-*-*-*-*-*-*-*"
ResizeFont       "-*-spleen-*-*-*-*-12-*-*-*-*-*-*-*"
WorkSpaceFont    "-*-spleen-*-*-*-*-8-*-*-*-*-*-*-*"
WorkSpaceManagerGeometry  "45x180-4-4" 1
IconManagerGeometry       "150x-1-1+0" 1
ThreeDBorderWidth         1
BorderWidth               1
define(setsizes, `yes')
')

# Fallback in case a valid font size was not returned.
# "Default case" is 16px.

ifdef(`setsizes', `', `
TitleFont        "-*-spleen-*-*-*-*-16-*-*-*-*-*-*-*"
MenuFont         "-*-spleen-*-*-*-*-16-*-*-*-*-*-*-*"
IconManagerFont  "-*-spleen-*-*-*-*-16-*-*-*-*-*-*-*"
IconFont         "-*-spleen-*-*-*-*-16-*-*-*-*-*-*-*"
ResizeFont       "-*-spleen-*-*-*-*-16-*-*-*-*-*-*-*"
WorkSpaceFont    "-*-spleen-*-*-*-*-12-*-*-*-*-*-*-*"
WorkSpaceManagerGeometry  "60x240-4-4" 1
IconManagerGeometry       "200x-1-1+0" 1
ThreeDBorderWidth         3
BorderWidth               3
')

RestartPreviousState

DecorateTransients

# allow the user to have their root window recolored as they choose
DontPaintRootWindow

# hide window contents while altering windows for performance
#NoOpaqueMove
#NoOpaqueResize

AutoOccupy
AutoRelativeResize

CenterFeedbackWindow

NoGrabServer

RaiseOnClick
ClickToFocus

DontMoveOff
MoveOffResistance	  150

ConstrainedMoveTime       0

IgnoreLockModifier

# Not actually that random.
# Means that windows do not have to be placed by hand with a mouse,
# which helps if you are using a keyboard only.
RandomPlacement          "on"

MoveDelta                 3
ClearShadowContrast       40
DarkShadowContrast        60
MovePackResistance        100

RaiseWhenAutoUnSqueeze
ShortAllWindowsMenus

#BeNiceToColorMap

NoStackMode

StayUpMenus
WarpToDefaultMenuEntry
MenuShadowDepth      1

# warp through all windows in the current workspace
WindowRing
WarpRingOnScreen

#NoTitleHighlight

TitleButtonShadowDepth    1
TitleShadowDepth          1
TitleButtonBorderWidth    0
TitlePadding              0
TitleJustification        "left"
ButtonIndent              0
FramePadding		  0

LeftTitleButton           ":xpm:dot"      = f.menu "titleops"
RightTitleButton          ":xpm:resize"   = f.resize
RightTitleButton          ":xpm:cross"    = f.delete

BorderShadowDepth         2
BorderResizeCursors

MaxIconTitleWidth         120
NoIconManagerFocus
IconManagerShadowDepth    1
IconifyByUnmapping

ReallyMoveInWorkspaceManager
MapWindowCurrentWorkSpace {  "black" "firebrick" }
DontToggleWorkSpaceManagerState
DontWarpCursorInWMap
NoShowOccupyAll	
ReverseCurrentWorkspace	
StartInMapState
WMgrHorizButtonIndent     0
WMgrVertButtonIndent      0

WorkSpaces 
{
    "1"    { "lavender" "black" "darkslateblue" "white" }
    "2"    { "lavender" "black" "darkslateblue" "white" }
    "3"    { "lavender" "black" "darkslateblue" "white" }
    "4"    { "lavender" "black" "darkslateblue" "white" }
    "5"    { "lavender" "black" "darkslateblue" "white" }
}

Cursors
{
  Frame    "left_ptr"
  Title    "left_ptr"
  Icon     "left_ptr"
  IconMgr  "left_ptr"
  Move     "fleur"
  Resize   "fleur"
  Menu     "left_ptr"
  Button   "hand2"
  Wait     "watch"
  Select   "dot"
  Destroy  "pirate"
}

Color
{
  BorderColor           "firebrick"

  BorderTileBackground  "steelblue"
  BorderTileForeground  "steelblue"

  DefaultBackground     "lavender"
  DefaultForeground     "black"

  TitleBackground       "lavender"
  TitleForeground       "black" 

  MenuBackground        "lavender"
  MenuForeground        "black"
  MenuTitleBackground   "darkorange3"
  MenuTitleForeground   "black"
  MenuShadowColor 	"gray15"

  IconBackground        "lavender"
  IconForeground        "black"
  IconBorderColor       "steelblue"

  IconManagerBackground "lavender"
  IconManagerForeground "black"
  IconManagerHighlight  "firebrick"

  MapWindowBackground   "lavender"
  MapWindowForeground   "black"	
}

Monochrome
{
    BorderColor 		"black"

    BorderTileForeground 	"black"
    BorderTileBackground 	"white"

    TitleForeground 		"black"
    TitleBackground 		"white"

    MenuForeground 		"black"
    MenuBackground 		"white"
    MenuTitleForeground 	"black"
    MenuTitleBackground 	"white"

    MapWindowForeground 	"white"
    MapWindowBackground 	"white"
}

syscmd(/usr/X11R7/libexec/ctwm_app_menu)

menu "appmenu"
{
    "pkgsrc Applications"	f.title
    " Accessories"		f.menu "Accessories"
    " Games"			f.menu "Games"
    " Graphics"			f.menu "Graphics"
    " Internet"			f.menu "Internet"
    " Multimedia"		f.menu "Multimedia"
    " Office"			f.menu "Office"
    " Programming"		f.menu "Programming"
    " System"			f.menu "System"
    " Misc"			f.menu "Misc"
}

menu "deskutils"
{
    "Desktop utilities"		f.title
    " Calculator"		!"xcalc &"
    " Text editor"		!"xedit &"
    ""				f.separator
    " XEyes"			!"xeyes &"
    " OpenGL Gears"		!"glxgears &"
    " Spinning cube"		!"ico -sleep 0.016 -obj cube -colors darkorange &"
    ""				f.separator
    " Compositor (shadows)"	!"pkill xcompmgr; xcompmgr -c &"
    " Compositor (simple)"	!"pkill xcompmgr; xcompmgr -n &"
    ""				f.separator
    " Magnify"			!"xmag -source 100x100 &"
    " Kill window"		!"xkill &"
}

menu "termutils"
{
    "Terminal utilities"	f.title
    ""				f.separator
    " VIsual Editor"		!"xterm -class UXTerm -e vi &"
    " Tetris"			!"xterm -class UXTerm -e tetris &"
    ""				f.separator
    " Audio mixer"		!"xterm -class UXTerm -e aiomixer &"
    ""				f.separator
    " Top processes"		!"xterm -class UXTerm -e top &"
    " I/O stats"		!"xterm -class UXTerm -e 'sysstat iostat' &"
    " Network stats"		!"xterm -class UXTerm -e 'sysstat ifstat' &"
    " Disk usage"		!"xterm -class UXTerm -e 'sysstat df' &"
}

menu "NetBSD"
{
    "NetBSD"			f.title
    ""				f.separator
    #" Terminal"			!"uxterm &"
    " uxterm"			!"uxterm -ls &"
	" lxterminal"       !"lxterminal -l &"
	" Alacritty"        !"alacritty msg create-window &"
	" Tabbed Alacritty"        !"tabbed -f -g 1120x716+135+8 alacritty msg create-window --embed &"
    ""				f.separator
    " Applications"		f.menu "appmenu"
    " Desktop utilities"	f.menu "deskutils"
    " Terminal utilities"	f.menu "termutils"
    ""				f.separator
    " Restart CTWM"		f.twmrc
    " Quit"			f.quit
}

menu "titleops"
{
    "Window"       f.title
    ""             f.separator
    " Iconify"     f.iconify
    " Resize"      f.resize
    " Move"        f.move
    ""             f.separator
    " Occupy ..."  f.occupy
    " Occupy All"  f.occupyall
    ""             f.separator
    " Raise"       f.raise
    " Lower"       f.lower
    ""             f.separator
    " Zoom"        f.fullzoom
    " Zoom-V"      f.zoom
    " Zoom-H"      f.horizoom
    ""             f.separator
    " Kill"        f.destroy
    " Close"       f.delete
}

IconManagerDontShow
{
} 

OccupyAll 
{
   "XClock"
   "xload"
   "XEyes"
   "xsm"
   "xconsole"
   "XVidCap"
   "sysload"
}

AlwaysOnTop
{
   #"XEyes"
   "XVidCap"
}

NoTitle 
{
   "TWM Icon Manager"
   "WorkSpaceManager"
   "XClock"
   "XEyes"
   "xload"
}

WindowRingExclude
{
   "TWM Icon Manager"
   "WorkSpaceManager"
   "XClock"
   "xsm"
   "xconsole"
   "stalonetray"
   "XLoad"
   "Gkrellm"
   "XEyes"
   "sysload"
   "NetBSD Logo"
   "releaseallkeys"
   "Ossxmix"
}

StartIconified 
{ 
}

NoBorder
{
}

Function "raise-move"          { f.raise f.deltastop f.forcemove }
Function "raise-and-resize"    { f.raise f.deltastop f.resize }

# These are basically essential for basic functionality.

Button1 =	: title		: f.function "raise-move"
Button2 =	: title		: f.function "raise-and-resize"
Button3 =	: title | frame	: f.menu "titleops"

Button1 =	: frame		: f.function "raise-and-resize"

Button1 =	: icon | iconmgr	: f.iconify
Button2 =	: icon			: f.move
Button3 =	: icon | iconmgr	: f.raiselower

#Button1 =	: root		: f.menu "NetBSD"
#Button2 =	: root		: f.menu "TwmAllWindows"
#Button3 =	: root		: f.menu "NetBSD"
Button1 =	: root		: f.menu "NetBSD"
Button2 =	: root		: f.menu "TwmKeys"
Button3 =	: root		: f.menu "TwmWindows"
Button3 = S	: root		: f.menu "TwmWorkspaces"

#
# Mod1 is the "Alt/Meta" key.
# Mod4 is the "OS" key.
#

Button1 = mod1	: window	: f.forcemove
Button1 = mod4	: window	: f.forcemove
Button3 = mod1	: window 	: f.resize
Button3 = mod4	: window 	: f.resize

"Up"     = mod4           : all : f.upworkspace
"Down"   = mod4           : all : f.downworkspace
"Left"   = mod4           : all : f.prevworkspace
"Right"  = mod4           : all : f.nextworkspace

"n"      = mod4 | s       : all : f.prevworkspace
"n"      = mod4           : all : f.nextworkspace

"Up"     = mod1 | control : all : f.upworkspace
"Down"   = mod1 | control : all : f.downworkspace
"Left"   = mod1 | control : all : f.prevworkspace
"Right"  = mod1 | control : all : f.nextworkspace

"1"      = mod1 | control : all : f.gotoworkspace "1"
"2"      = mod1 | control : all : f.gotoworkspace "2"
"3"      = mod1 | control : all : f.gotoworkspace "3"
"4"      = mod1 | control : all : f.gotoworkspace "4"
"5"      = mod1 | control : all : f.gotoworkspace "5"
"6"      = mod1 | control : all : f.gotoworkspace "6"
"7"      = mod1 | control : all : f.gotoworkspace "7"
"8"      = mod1 | control : all : f.gotoworkspace "8"
"9"      = mod1 | control : all : f.gotoworkspace "9"

"1"      = mod4 : all : f.gotoworkspace "1"
"2"      = mod4 : all : f.gotoworkspace "2"
"3"      = mod4 : all : f.gotoworkspace "3"
"4"      = mod4 : all : f.gotoworkspace "4"
"5"      = mod4 : all : f.gotoworkspace "5"
"6"      = mod4 : all : f.gotoworkspace "6"
"7"      = mod4 : all : f.gotoworkspace "7"
"8"      = mod4 : all : f.gotoworkspace "8"
"9"      = mod4 : all : f.gotoworkspace "9"

"XF86AudioRaiseVolume" = : all : !"mixerctl -w outputs.master+=5"
"XF86AudioLowerVolume" = : all : !"mixerctl -w outputs.master-=5"
#"XF86AudioMute"        = : all : !"mixerctl -w outputs.master=0"

#
# "Windows" style keyboard shortcuts
#

"Tab"    = mod1           : all : f.warpring "next"
"Tab"    = mod1 | s       : all : f.warpring "prev"
#"Tab"    = mod4           : all : f.warpring "next"
#"Tab"    = mod4 | s       : all : f.warpring "prev"
"Tab"    = mod4           : all : !"rofi -show window"
"space"  = mod1           : window : f.menu "titleops"
"F4"     = mod1           : window : f.delete

#
# "Mac" style keyboard shortcuts
#

#"w"      = mod4           : window : f.delete
"q"      = mod4 | s       : window : f.delete
"m"      = mod4 | s       : window : f.iconify
"m"      = mod4           : window : f.fullzoom

#
# "evilwm" style keyboard shortcuts
#

# it is useful to be able to spawn a terminal without clicking.
"Return" = mod1 | c : all : !"uxterm &"
"Return" = mod4 | s : all : !"uxterm &"
"Return" = mod4     : all : !"alacritty msg create-window &"

"slash"  = mod1 | c : all : f.menu "TwmAllWindows"
"slash"  = mod4 : all     : f.menu "TwmAllWindows"
"p"      = mod1 | c : all : f.menu "NetBSD"
"p"      = mod4 : all     : f.menu "NetBSD"


## vi-style directions
#"j"      = mod1 | control : window : f.jumpdown "10"
#"k"      = mod1 | control : window : f.jumpup "10"
#"h"      = mod1 | control : window : f.jumpleft "10"
#"l"      = mod1 | control : window : f.jumpright "10"
#
#"j"      = mod4 : window : f.jumpdown "10"
#"k"      = mod4 : window : f.jumpup "10"
#"h"      = mod4 : window : f.jumpleft "10"
#"l"      = mod4 : window : f.jumpright "10"
#
#"j"      = mod4 | s : window : f.changesize "bottom +10"
#"k"      = mod4 | s : window : f.changesize "bottom -10"
#"h"      = mod4 | s : window : f.changesize "right -10"
#"l"      = mod4 | s : window : f.changesize "right +10"
#
#"j"      = mod1 | c | s : window : f.changesize "bottom +10"
#"k"      = mod1 | c | s : window : f.changesize "bottom -10"
#"h"      = mod1 | c | s : window : f.changesize "right -10"
#"l"      = mod1 | c | s : window : f.changesize "right +10"


# vi-style directions
#move
"j"         = mod4 : window : f.jumpleft  "100"
"k"         = mod4 : window : f.jumpdown  "100"
"l"         = mod4 : window : f.jumpup    "100"
"semicolon" = mod4 : window : f.jumpright "100"

#fine move
"j"         = mod4 | c : window : f.jumpleft  "10"
"k"         = mod4 | c : window : f.jumpdown  "10"
"l"         = mod4 | c : window : f.jumpup    "10"
"semicolon" = mod4 | c : window : f.jumpright "10"

#resize
"j"         = mod4 | s : window : f.changesize "right  -10"
"k"         = mod4 | s : window : f.changesize "bottom +10"
"l"         = mod4 | s : window : f.changesize "bottom -10"
"semicolon" = mod4 | s : window : f.changesize "right  +10"


"d"      = mod4     : all : !"rofi -show drun &"
"i"      = mod4     : all : !"nice -n19 firefox140 &"
"i"      = mod4 | s : all : !"nice -n19 firefox140 --private-window &"
"d"      = mod4 | s : all : !"rofi -show run &"
"c"      = mod4 | s : all : f.twmrc
"r"      = mod4 | s : all : !"~/.local/bin/releaseallkeys >/tmp/releaseallkeys.txt 2>&1"
"period" = mod4     : all : !"~/bin/emoji-picker"
"p"      = mod4 | s : all : !"~/bin/blobcat &"
"g"      = mod4     : all : !"~/bin/findmenu &"

Pixmaps
{
	#TitleHighlight    "~/Pictures/titlebar-stipple.xbm"
	#TitleHighlight    "~/Pictures/titlebar-stipple2.xbm"
	#TitleHighlight    "~/Pictures/titlebar-stipple3.xbm"
	#TitleHighlight    "root_weave"
	#TitleHighlight    "gray1"
	#TitleHighlight    "dimple1"
	#TitleHighlight    "dimple3"
	#TitleHighlight    "wide_weave"
	TitleHighlight    "xpm:~/Pictures/titlebar-win98-1080.xpm"
}