i3_template: new file for default config of i3.
This is apart of the new wm i3 update.
Signed-off-by: hazardchem <hazardchem@disroot.org>
---
v2 - sent as one git send-email as per aren's request
configs/appcfg/i3_template | 237 +++++++++++++++++++++++++++++++++++
scripts/core/sxmo_migrate.sh | 11 ++
2 files changed, 248 insertions(+)
create mode 100644 configs/appcfg/i3_template
diff --git a/configs/appcfg/i3_template b/configs/appcfg/i3_template
new file mode 100644
index 0000000..729a15a
--- /dev/null
+++ b/configs/appcfg/i3_template
@@ -0,0 +1,237 @@
+# Default config for i3
+#
+# Copy this to ~/.config/i3/config and edit it to your liking.
+#
+# Please see https://i3wm.org/docs/userguide.html for a complete reference!
+
+### Variables
+#
+# Logo key. Use Mod1 for Alt.
+set $mod Mod4
+# Home row direction keys, like vim
+set $left h
+set $down j
+set $up k
+set $right l
+# Your preferred terminal emulator
+set $term sxmo_terminal.sh
+# Your preferred application launcher
+# Note: pass the final command to i3msg so that the resulting window can be opened
+# on the original workspace that the command was run on.
+set $menu dmenu-run
+
+font pango:Sxmo 40px
+
+mode "menu" {
+ # This is slower than remapping the keys using a keymap, but we don't need
+ # to know the device names, so use it as a fallback so this functionality
+ # keeps working if a deviceprofile doesn't exist.
+ bindsym XF86PowerOff exec xdotool type Return
+ bindsym XF86AudioRaiseVolume exec xdotool type Up
+ bindsym XF86AudioLowerVolume exec xdotool type Down
+}
+
+### Key bindings
+#
+# Basics:
+#
+
+ # Start a terminal
+ bindsym $mod+Return exec $term
+
+ # Launch appmenu
+ bindsym $mod+p exec sxmo_appmenu.sh
+ bindsym $mod+Shift+p exec sxmo_appmenu.sh sys
+
+ # Wm menu switcher
+ bindsym $mod+i exec sxmo_wmmenu.sh windowswitcher
+
+ # Kill focused window
+ bindsym $mod+Shift+q kill
+
+ # Start your launcher
+ bindsym $mod+d exec $menu
+
+ # Drag floating windows by holding down $mod and left mouse button.
+ # Resize them with right mouse button + $mod.
+ # Despite the name, also works for non-floating windows.
+ # Change normal to inverse to use left mouse button for resizing and right
+ # mouse button for dragging.
+ floating_modifier $mod
+
+ # Reload the configuration file
+ bindsym $mod+Shift+c reload
+
+ # Exit i3 (logs you out of your i3 session)
+ bindsym $mod+Shift+e exec i3-nagbar -t warning -m 'You pressed the exit shortcut. Do you really want to exit i3? This will end your i3 session.' -b 'Yes, exit i3' 'i3-msg exit'
+#
+# Moving around:
+#
+ # Move your focus around
+ bindsym $mod+$left focus left
+ bindsym $mod+$down focus down
+ bindsym $mod+$up focus up
+ bindsym $mod+$right focus right
+ # Or use $mod+[up|down|left|right]
+ bindsym $mod+Left focus left
+ bindsym $mod+Down focus down
+ bindsym $mod+Up focus up
+ bindsym $mod+Right focus right
+
+ # Move the focused window with the same, but add Shift
+ bindsym $mod+Shift+$left move left
+ bindsym $mod+Shift+$down move down
+ bindsym $mod+Shift+$up move up
+ bindsym $mod+Shift+$right move right
+ # Ditto, with arrow keys
+ bindsym $mod+Shift+Left move left
+ bindsym $mod+Shift+Down move down
+ bindsym $mod+Shift+Up move up
+ bindsym $mod+Shift+Right move right
+
+ # Move the focused workspace to output
+ bindsym $mod+Shift+Ctrl+$left move workspace output left
+ bindsym $mod+Shift+Ctrl+$down move workspace output down
+ bindsym $mod+Shift+Ctrl+$up move workspace output up
+ bindsym $mod+Shift+Ctrl+$right move workspace output right
+#
+# Workspaces:
+#
+ # Switch to workspace
+ bindsym $mod+1 workspace number 1
+ bindsym $mod+2 workspace number 2
+ bindsym $mod+3 workspace number 3
+ bindsym $mod+4 workspace number 4
+ bindsym $mod+5 workspace number 5
+ bindsym $mod+6 workspace number 6
+ bindsym $mod+7 workspace number 7
+ bindsym $mod+8 workspace number 8
+ bindsym $mod+9 workspace number 9
+ bindsym $mod+0 workspace number 10
+ # Move focused container to workspace
+ bindsym $mod+Shift+1 move container to workspace number 1
+ bindsym $mod+Shift+2 move container to workspace number 2
+ bindsym $mod+Shift+3 move container to workspace number 3
+ bindsym $mod+Shift+4 move container to workspace number 4
+ bindsym $mod+Shift+5 move container to workspace number 5
+ bindsym $mod+Shift+6 move container to workspace number 6
+ bindsym $mod+Shift+7 move container to workspace number 7
+ bindsym $mod+Shift+8 move container to workspace number 8
+ bindsym $mod+Shift+9 move container to workspace number 9
+ bindsym $mod+Shift+0 move container to workspace number 10
+ # Note: workspaces can have any name you want, not just numbers.
+ # We just use 1-10 as the default.
+#
+# Layout stuff:
+#
+ # You can "split" the current object of your focus with
+ # $mod+b or $mod+v, for horizontal and vertical splits
+ # respectively.
+ bindsym $mod+b splith
+ bindsym $mod+v splitv
+
+ # Switch the current container between different layout styles
+ bindsym $mod+s layout stacking
+ bindsym $mod+w layout tabbed
+ bindsym $mod+e layout toggle split
+
+ # Make the current focus fullscreen
+ bindsym $mod+f fullscreen
+
+ # Toggle the current focus between tiling and floating mode
+ bindsym $mod+Shift+space floating toggle
+
+ # Swap focus between the tiling area and the floating area
+ bindsym $mod+space focus mode_toggle
+
+ # Move focus to the parent container
+ bindsym $mod+a focus parent
+
+ # Manual locker
+ bindsym $mod+g exec sxmo_state.sh set locker
+
+ # Shutdown
+ bindsym $mod+t exec sxmo_appmenu.sh power
+
+#
+# Scratchpad:
+#
+ # i3 has a "scratchpad", which is a bag of holding for windows.
+ # You can send windows there and get them back later.
+
+ # Move the currently focused window to the scratchpad
+ bindsym $mod+Shift+minus move scratchpad
+
+ # Show the next scratchpad window or hide the focused scratchpad window.
+ # If there are multiple scratchpad windows, this command cycles through them.
+ bindsym $mod+minus scratchpad show
+#
+# Resizing containers:
+#
+mode "resize" {
+ # left will shrink the containers width
+ # right will grow the containers width
+ # up will shrink the containers height
+ # down will grow the containers height
+ bindsym $left resize shrink width 30px
+ bindsym $down resize grow height 30px
+ bindsym $up resize shrink height 30px
+ bindsym $right resize grow width 30px
+
+ # Ditto, with arrow keys
+ bindsym Left resize shrink width 30px
+ bindsym Down resize grow height 30px
+ bindsym Up resize shrink height 30px
+ bindsym Right resize grow width 30px
+
+ # Return to default mode
+ bindsym Return mode "default"
+ bindsym Escape mode "default"
+}
+bindsym $mod+r mode "resize"
+
+#
+# Status Bar:
+#
+# Read `man 5 i3bar` for more information about this section.
+bar {
+ position top
+
+ # When the status_command prints a new line to stdout, i3bar updates.
+ # The default just shows the current date and time.
+ status_command sxmo_status_watch.sh -o plain
+ font pango:Sxmo 40px
+
+ padding 0 20px 8px 8px
+
+ colors {
+ statusline #ffffff
+ background #323232
+ inactive_workspace #323232 #323232 #ffffff
+
+ }
+}
+
+for_window [class="pinentry-.*"] floating enable
+for_window [class="st" title=".*sxmo/modem/.*/draft.txt.*"] resize set height 25
+for_window [class="megapixels"] inhibit_idle open
+for_window [class="ep[yr].*"] inhibit_idle visible
+for_window [class="tabbed"] border pixel 0
+no_focus [class="svkbd"]
+
+smart_gaps on
+
+# Need playerctl installed and running
+bindsym XF86AudioPlay exec playerctl play-pause
+bindsym XF86AudioStop exec playerctl stop
+bindsym XF86AudioNext exec playerctl next
+bindsym XF86AudioPrev exec playerctl previous
+
+bindsym XF86MonBrightnessUp exec sxmo_brightness.sh up
+bindsym XF86MonBrightnessDown exec sxmo_brightness.sh down
+
+bindsym Print exec sxmo_screenshot.sh
+
+bindsym button2 kill
+
+exec i3 --get-socketpath > "$XDG_RUNTIME_DIR"/sxmo.i3sock
diff --git a/scripts/core/sxmo_migrate.sh b/scripts/core/sxmo_migrate.sh
index fc722d6..0c48926 100755
--- a/scripts/core/sxmo_migrate.sh
+++ b/scripts/core/sxmo_migrate.sh
@@ -300,6 +300,10 @@ common() {
defaultconfig "$(xdg_data_path sxmo/appcfg/fontconfig.conf)" "$XDG_CONFIG_HOME/fontconfig/conf.d/50-sxmo.conf" 644
}
+i3() {
+ defaultconfig "$(xdg_data_path sxmo/appcfg/i3_template)" "$XDG_CONFIG_HOME/sxmo/i3" 644
+}
+
sway() {
defaultconfig "$(xdg_data_path sxmo/appcfg/sway_template)" "$XDG_CONFIG_HOME/sxmo/sway" 644
defaultconfig "$(xdg_data_path sxmo/appcfg/foot.ini)" "$XDG_CONFIG_HOME/foot/foot.ini" 644
@@ -347,12 +351,18 @@ for MODE in "$@"; do
case "$MODE" in
"interactive"|"all")
common
+ i3
sway
xorg
checkhooks
;;
"sync"|"reset")
case "$SXMO_WM" in
+ i3)
+ common
+ i3
+ xorg
+ ;;
sway)
common
sway
@@ -363,6 +373,7 @@ for MODE in "$@"; do
;;
*)
common
+ i3
sway
xorg
;;
--
2.48.1
sxmo_brun.sh: added i3 settings.
sxmo_dmenu.sh: added i3 settings.
sxmo_idle.sh: added i3 settings.
sxmo_killwindow.sh: added i3 setting.
sxmo_rotate.sh: added i3 settings.
sxmo_type.sh: added i3 setting.
sxmo_wm.sh: added i3 settings.
sxmo_wmmenu.sh: added i3 settings.
sxmo_hook_lisgdstart.sh: added i3 setting.
sxmo_hook_start.sh: added i3 setting.
sxmo_hook_unlock.sh: added i3 setting.
This is apart of the new wm i3 update. Origially these were seperate patches but
have been squashed
Signed-off-by: hazardchem <hazardchem@disroot.org>
---
configs/default_hooks/sxmo_hook_lisgdstart.sh | 18 +--
configs/default_hooks/sxmo_hook_start.sh | 2 +-
configs/default_hooks/sxmo_hook_unlock.sh | 2 +-
scripts/core/sxmo_bg.sh | 2 +-
scripts/core/sxmo_brun.sh | 2 +-
scripts/core/sxmo_dmenu.sh | 2 +-
scripts/core/sxmo_idle.sh | 2 +-
scripts/core/sxmo_killwindow.sh | 1 +
scripts/core/sxmo_rotate.sh | 4 +-
scripts/core/sxmo_type.sh | 2 +-
scripts/core/sxmo_wm.sh | 107 +++++++++++++++++-
scripts/core/sxmo_wmmenu.sh | 60 +++++++++-
12 files changed, 184 insertions(+), 20 deletions(-)
diff --git a/configs/default_hooks/sxmo_hook_lisgdstart.sh b/configs/default_hooks/sxmo_hook_lisgdstart.sh
index 812434a..8f4efce 100755
--- a/configs/default_hooks/sxmo_hook_lisgdstart.sh
+++ b/configs/default_hooks/sxmo_hook_lisgdstart.sh
@@ -10,14 +10,16 @@ LISGD_THRESHOLD="${SXMO_LISGD_THRESHOLD:-125}"
LISGD_THRESHOLD_PRESSED="${SXMO_LISGD_THRESHOLD_PRESSED:-60}"
LISGD_INPUT_DEVICE="${SXMO_LISGD_INPUT_DEVICE:-"/dev/input/by-path/first-touchscreen"}"
-if [ dwm = "$SXMO_WM" ]; then
- case "$(xrandr | grep primary | cut -d' ' -f 5)" in
- right) orientation=1;;
- left) orientation=3;;
- inverted) orientation=2;;
- *) orientation=0;;
- esac
-fi
+case "$SXMO_WM" in
+ dwm|i3)
+ case "$(xrandr | grep primary | cut -d' ' -f 5)" in
+ right) orientation=1;;
+ left) orientation=3;;
+ inverted) orientation=2;;
+ *) orientation=0;;
+ esac
+ ;;
+esac
#-g format:
# fingers,swipe,edge,distance,command
diff --git a/configs/default_hooks/sxmo_hook_start.sh b/configs/default_hooks/sxmo_hook_start.sh
index c6f300e..8fa5eef 100755
--- a/configs/default_hooks/sxmo_hook_start.sh
+++ b/configs/default_hooks/sxmo_hook_start.sh
@@ -54,7 +54,7 @@ case "$SXMO_WM" in
superctl start sxmo_menumode_toggler
superctl start bonsaid
;;
- dwm)
+ dwm|i3)
superctl start dunst
superctl start sxmo_xob
diff --git a/configs/default_hooks/sxmo_hook_unlock.sh b/configs/default_hooks/sxmo_hook_unlock.sh
index 48d8201..cca7543 100755
--- a/configs/default_hooks/sxmo_hook_unlock.sh
+++ b/configs/default_hooks/sxmo_hook_unlock.sh
@@ -28,7 +28,7 @@ else
exec sxmo_state.sh idle
"'
;;
- dwm)
+ dwm|i3)
sxmo_jobs.sh start idle_locker sxmo_idle.sh -w \
timeout "${SXMO_UNLOCK_IDLE_TIME:-120}" "sxmo_state.sh idle"
;;
diff --git a/scripts/core/sxmo_bg.sh b/scripts/core/sxmo_bg.sh
index 38f4f14..a7dbd3a 100644
--- a/scripts/core/sxmo_bg.sh
+++ b/scripts/core/sxmo_bg.sh
@@ -3,7 +3,7 @@
bg="$(sxmo_hook_wallpaper.sh)"
case "$SXMO_WM" in
- dwm)
+ dwm|i3)
exec feh "${1+--bg-$1}" "$bg"
;;
sway)
diff --git a/scripts/core/sxmo_brun.sh b/scripts/core/sxmo_brun.sh
index 990fc87..30bb85b 100644
--- a/scripts/core/sxmo_brun.sh
+++ b/scripts/core/sxmo_brun.sh
@@ -12,7 +12,7 @@ if [ -z "$SXMO_MENU" ]; then
sway)
SXMO_MENU=bemenu
;;
- dwm)
+ dwm|i3)
SXMO_MENU=dmenu
;;
esac
diff --git a/scripts/core/sxmo_dmenu.sh b/scripts/core/sxmo_dmenu.sh
index aef44ce..ddda27e 100755
--- a/scripts/core/sxmo_dmenu.sh
@@ -25,7 +25,7 @@ if [ -z "$SXMO_MENU" ]; then
sway)
SXMO_MENU=bemenu
;;
- dwm)
+ dwm|i3)
SXMO_MENU=dmenu
;;
esac
diff --git a/scripts/core/sxmo_idle.sh b/scripts/core/sxmo_idle.sh
index 81fd166..a5de8c7 100755
--- a/scripts/core/sxmo_idle.sh
+++ b/scripts/core/sxmo_idle.sh
@@ -61,7 +61,7 @@ xorgidle() {
}
case "$SXMO_WM" in
- dwm)
+ dwm|i3)
xorgidle "$@"
;;
*)
diff --git a/scripts/core/sxmo_killwindow.sh b/scripts/core/sxmo_killwindow.sh
index 4c8257c..318aad2 100755
--- a/scripts/core/sxmo_killwindow.sh
+++ b/scripts/core/sxmo_killwindow.sh
@@ -7,6 +7,7 @@
. sxmo_common.sh
case "$SXMO_WM" in
+ i3) i3-msg kill ;;
sway) swaymsg kill;;
dwm) xdotool windowkill "$(xdotool getactivewindow)";;
esac
diff --git a/scripts/core/sxmo_rotate.sh b/scripts/core/sxmo_rotate.sh
index f0bfc45..a31d839 100755
--- a/scripts/core/sxmo_rotate.sh
+++ b/scripts/core/sxmo_rotate.sh
@@ -116,7 +116,7 @@ isrotated() {
sway)
"swayisrotated"
;;
- dwm)
+ dwm|i3)
"xorgisrotated"
;;
esac
@@ -137,7 +137,7 @@ case "$SXMO_WM" in
sway)
"sway$1" "$@"
;;
- dwm)
+ dwm|i3)
"xorg$1" "$@"
;;
esac
diff --git a/scripts/core/sxmo_type.sh b/scripts/core/sxmo_type.sh
index 851c981..ed4430f 100755
--- a/scripts/core/sxmo_type.sh
+++ b/scripts/core/sxmo_type.sh
@@ -39,7 +39,7 @@ case "$SXMO_WM" in
sway)
wtype "$@"
;;
- dwm)
+ dwm|i3)
wtype_to_xdotool "$@"
;;
esac
diff --git a/scripts/core/sxmo_wm.sh b/scripts/core/sxmo_wm.sh
index 67360ac..8abb8c7 100755
--- a/scripts/core/sxmo_wm.sh
+++ b/scripts/core/sxmo_wm.sh
@@ -6,6 +6,10 @@
# shellcheck source=scripts/core/sxmo_common.sh
. sxmo_common.sh
+i3dpms() {
+ xorgdpms "$@"
+}
+
xorgdpms() {
STATE=off
if xset q | grep -q "Off: 3"; then
@@ -41,6 +45,10 @@ swaydpms() {
}
+i3inputevent() {
+ xorginputevent "$@"
+}
+
xorginputevent() {
if [ "$1" = "touchscreen" ]; then
TOUCH_POINTER_ID="$SXMO_TOUCHSCREEN_ID"
@@ -100,6 +108,23 @@ swayinputevent() {
fi
}
+i3focusedwindow() {
+ i3-msg -t get_tree | jq -r '
+ recurse(.nodes[]) |
+ select(.focused == true) |
+ {
+ app_id: (if .app_id != null then
+ .app_id
+ else
+ .window_properties.class
+ end),
+ name: .name,
+ } |
+ select(.app_id != null and .name != null) |
+ "app: " + .app_id, "title: " + .name
+ '
+}
+
xorgfocusedwindow() {
activeoutput="$(xprop -id "$(xdotool getactivewindow 2>/dev/null)" 2>/dev/null)"
printf %s "$activeoutput" | \
@@ -128,15 +153,33 @@ swayfocusedwindow() {
'
}
+i3paste () {
+ xclip -o
+}
+
swaypaste() {
wl-paste
}
xorgpaste() {
-
xclip -o
}
+i3exec() {
+ i3-msg exec -- "$@"
+}
+
+i3execwait() {
+ PIDFILE="$(mktemp)"
+ printf '"%s" & printf %%s "$!" > "%s"' "$*" "$PIDFILE" \
+ | xargs -I{} i3-msg exec -- '{}'
+ while : ; do
+ sleep 0.5
+ kill -0 "$(cat "$PIDFILE")" 2> /dev/null || break
+ done
+ rm "$PIDFILE"
+}
+
swayexec() {
swaymsg exec -- "$@"
}
@@ -166,6 +209,10 @@ xorgexecwait() {
exec "$@"
}
+i3togglelayout() {
+ i3-msg layout toggle splith splitv tabbed
+}
+
swaytogglelayout() {
swaymsg layout toggle splith splitv tabbed
}
@@ -177,6 +224,10 @@ xorgtogglelayout() {
xdotool key --clearmodifiers key Super+space
}
+i3switchfocus() {
+ sxmo_wmmenu.sh i3windowswitcher
+}
+
swayswitchfocus() {
sxmo_wmmenu.sh swaywindowswitcher
}
@@ -188,6 +239,32 @@ xorgswitchfocus() {
xdotool key --clearmodifiers Super+x
}
+_i3getcurrentworkspace() {
+ i3-msg -t get_workspaces | jq -r '.[] | select(.focused==true).name'
+}
+
+_i3getnextworkspace() {
+ value="$(($(_i3getcurrentworkspace)+1))"
+ if [ "$value" -eq "$((${SXMO_WORKSPACE_WRAPPING:-4}+1))" ]; then
+ printf 1
+ else
+ printf %s "$value"
+ fi
+}
+
+_i3getpreviousworkspace() {
+ value="$(($(_i3getcurrentworkspace)-1))"
+ if [ "$value" -lt 1 ]; then
+ if [ "${SXMO_WORKSPACE_WRAPPING:-4}" -ne 0 ]; then
+ printf %s "${SXMO_WORKSPACE_WRAPPING:-4}"
+ else
+ return 1 # cant have previous workspace
+ fi
+ else
+ printf %s "$value"
+ fi
+}
+
_swaygetcurrentworkspace() {
swaymsg -t get_outputs | \
jq -r '.[] | select(.focused) | .current_workspace'
@@ -215,6 +292,10 @@ _swaygetpreviousworkspace() {
fi
}
+i3nextworkspace() {
+ i3-msg "workspace $(_i3getnextworkspace)"
+}
+
swaynextworkspace() {
swaymsg "workspace $(_swaygetnextworkspace)"
}
@@ -226,6 +307,10 @@ xorgnextworkspace() {
xdotool key --clearmodifiers Super+Shift+r
}
+i3previousworkspace() {
+ _i3getpreviousworkspace | xargs -r i3-msg -- workspace
+}
+
swaypreviousworkspace() {
_swaygetpreviousworkspace | xargs -r swaymsg -- workspace
}
@@ -237,6 +322,10 @@ xorgpreviousworkspace() {
xdotool key --clearmodifiers Super+Shift+e
}
+i3movenextworkspace() {
+ i3-msg "move container to workspace $(_i3getnextworkspace)"
+}
+
swaymovenextworkspace() {
swaymsg "move container to workspace $(_swaygetnextworkspace)"
}
@@ -248,6 +337,10 @@ xorgmovenextworkspace() {
xdotool key --clearmodifiers Super+r
}
+i3movepreviousworkspace() {
+ _i3getpreviousworkspace | xargs -r i3-msg -- move container to workspace
+}
+
swaymovepreviousworkspace() {
_swaygetpreviousworkspace | xargs -r swaymsg -- move container to workspace
}
@@ -259,6 +352,10 @@ xorgmovepreviousworkspace() {
xdotool key --clearmodifiers Super+e
}
+i3workspace() {
+ i3-msg "workspace $1"
+}
+
swayworkspace() {
swaymsg "workspace $1"
}
@@ -270,6 +367,10 @@ xorgworkspace() {
xdotool key --clearmodifiers "Super+$1"
}
+i3moveworkspace() {
+ i3-msg "move container to workspace $1"
+}
+
swaymoveworkspace() {
swaymsg "move container to workspace $1"
}
@@ -281,6 +382,10 @@ xorgmoveworkspace() {
xdotool key --clearmodifiers "Super+shift+$1"
}
+i3togglebar() {
+ i3-msg bar mode toggle
+}
+
swaytogglebar() {
swaymsg bar mode toggle
}
diff --git a/scripts/core/sxmo_wmmenu.sh b/scripts/core/sxmo_wmmenu.sh
index 67f9f60..1073514 100755
--- a/scripts/core/sxmo_wmmenu.sh
@@ -160,6 +160,60 @@ EOF
done
}
+i3windowswitcher() {
+ SWITCHINDEX=0
+
+ while : ; do
+ FORMAT='"W:" + .workspace + " | " + .app_id + " - " + .name + " (" + .id + ")"'
+
+ WINDOWSLIST="$(
+ i3-msg -t get_tree |
+ jq -r ".nodes[]
+ | {output: .name, content: .nodes[]}
+ | {output: .output, workspace: .content.name, apps: .content
+ | ..
+ | {id: .id?|tostring, name: .name?, app_id: .app_id?, shell: .shell?}
+ | select(.app_id != null or .shell != null)}
+ | {output: .output, workspace: .workspace,
+ id: .apps.id, app_id: .apps.app_id, name: .apps.name }
+ | $FORMAT
+ | tostring
+ "
+ )"
+
+ # Get the container ID from the node tree
+ CHOICES="$(
+ cat <<EOF
+$icon_cls Close Menu
+$icon_arl Previous Workspace
+$icon_arr Next Workspace
+$WINDOWSLIST
+EOF
+ )"
+
+ PICKED="$(printf "%s" "$CHOICES" | dmenu -p "Switch menu" -I "$SWITCHINDEX")"
+ SWITCHINDEX="$(($(printf "%s" "$CHOICES" | grep -nm1 "^$PICKED$" | cut -d: -f1) -1))"
+
+ case "$PICKED" in
+ ""|"$icon_cls Close Menu")
+ return
+ ;;
+ "$icon_arr Next Workspace")
+ sxmo_wm.sh nextworkspace
+ ;;
+ "$icon_arl Previous Workspace")
+ sxmo_wm.sh previousworkspace
+ ;;
+ *)
+ # Requires the actual `id` to be at the end and between parentheses
+ CON_ID=${PICKED##*(}
+ CON_ID=${CON_ID%)}
+ i3-msg "[con_id=$CON_ID]" focus
+ ;;
+ esac
+ done
+}
+
swaywindowswitcher() {
SWITCHINDEX=0
@@ -218,5 +272,7 @@ if [ -n "$1" ]; then
"$SXMO_WM$1"
exit
fi
-
-"$SXMO_WM"wmmenu
+case "$SXMO_WM" in
+ dwm|i3) dwmwmmenu ;;
+ sway) swaywmmenu ;;
+esac
--
2.48.1
The following modifications were nessisary to allow another wm to exist in sxmo
ecosystem for starting the wm.
Added wm specific .desktop files that call the respective wm init scripts. This
path was decided after discussions on irc as the best path moving forward.
Modified contextmenu to set togglewm in power to call sxmo_togglewm.sh through
sxmo_power.sh.
Modified sxmo_power.sh to call sxmo_togglewm.sh instead of handling logic
internally.
sxmo_togglewm.sh: script to be called from sxmo_power.sh to facilitate switching
wms and will detect which wm you are currently running and will provide the
options of selecting the other options. Code was taken from sxmo_power.sh.
Added new desktop files to Makefile.
All these changes were needed together so they have been bundled.
Signed-off-by: hazardchem <hazardchem@disroot.org>
---
Makefile | 5 +-
configs/applications/swmo.desktop | 2 +-
configs/applications/sxmo.desktop | 2 +-
configs/applications/sxmo_i3.desktop | 5 ++
.../default_hooks/sxmo_hook_contextmenu.sh | 5 +-
.../core/{sxmo_xinit.sh => sxmo_dwminit.sh} | 0
scripts/core/sxmo_i3init.sh | 63 +++++++++++++++++++
scripts/core/sxmo_power.sh | 30 +--------
.../core/{sxmo_winit.sh => sxmo_swayinit.sh} | 0
scripts/core/sxmo_togglewm.sh | 33 ++++++++++
10 files changed, 110 insertions(+), 35 deletions(-)
create mode 100644 configs/applications/sxmo_i3.desktop
rename scripts/core/{sxmo_xinit.sh => sxmo_dwminit.sh} (100%)
create mode 100755 scripts/core/sxmo_i3init.sh
rename scripts/core/{sxmo_winit.sh => sxmo_swayinit.sh} (100%)
create mode 100755 scripts/core/sxmo_togglewm.sh
diff --git a/Makefile b/Makefile
index 5534cfd..acfde9f 100644
--- a/Makefile
+++ b/Makefile
@@ -98,7 +98,7 @@ programs/%.test: programs/%.c
clean:
rm -f ${PROGRAMS} ${DOCS} ${HTMLDOCS} programs/test_legacy_nerdfont programs/sxmo_status_led.test
-install: install-sway install-dwm install-scripts install-docs
+install: install-sway install-dwm install-i3 install-scripts install-docs
install-docs: $(DOCS)
cd docs && find . -type f -name '*.7' -exec install -D -m 0644 "{}" "$(DESTDIR)$(MANDIR)/man7/{}" \; && find . -type f -name '*.1' -exec install -D -m 0644 "{}" "$(DESTDIR)$(MANDIR)/man1/{}" \; && cd ..
@@ -112,6 +112,9 @@ install-sway:
install-dwm:
install -D -m 0644 -t $(DESTDIR)$(PREFIX)/share/xsessions/ configs/applications/sxmo.desktop
+install-i3:
+ install -D -m 0644 -t $(DESTDIR)$(PREFIX)/share/xsessions/ configs/applications/sxmo_i3.desktop
+
install-scripts: $(PROGRAMS)
cd configs && find . -type f -not -exec install -D -m 0644 "{}" "$(DESTDIR)$(PREFIX)/share/sxmo/{}" \; && cd ..
diff --git a/configs/applications/swmo.desktop b/configs/applications/swmo.desktop
index b8be34f..01f679e 100644
--- a/configs/applications/swmo.desktop
+++ b/configs/applications/swmo.desktop
@@ -1,5 +1,5 @@
[Desktop Entry]
Name=Swmo
-Exec=sxmo_winit.sh
+Exec=sxmo_swayinit.sh
Terminal=false
Type=Application
diff --git a/configs/applications/sxmo.desktop b/configs/applications/sxmo.desktop
index 30ef7d6..4ff5f70 100644
--- a/configs/applications/sxmo.desktop
+++ b/configs/applications/sxmo.desktop
@@ -1,5 +1,5 @@
[Desktop Entry]
Name=Sxmo
-Exec=sxmo_xinit.sh
+Exec=sxmo_dwminit.sh
Terminal=false
Type=Application
diff --git a/configs/applications/sxmo_i3.desktop b/configs/applications/sxmo_i3.desktop
new file mode 100644
index 0000000..1fcfdb8
--- /dev/null
+++ b/configs/applications/sxmo_i3.desktop
@@ -0,0 +1,5 @@
+[Desktop Entry]
+Name=Sxmo
+Exec=sxmo_i3init.sh
+Terminal=false
+Type=Application
diff --git a/configs/default_hooks/sxmo_hook_contextmenu.sh b/configs/default_hooks/sxmo_hook_contextmenu.sh
index 9c75275..2ffe846 100755
--- a/configs/default_hooks/sxmo_hook_contextmenu.sh
@@ -115,10 +115,7 @@ case "$WMCLASS" in
$icon_lck Lock ^ 0 ^ sxmo_state.sh set lock
$icon_lck Lock (Screen off) ^ 0 ^ sxmo_state.sh set screenoff
$icon_out Logout ^ 0 ^ confirm Logout && sxmo_power.sh logout
- $([ -f "$(xdg_data_path xsessions/sxmo.desktop)" ] &&
- [ -f "$(xdg_data_path wayland-sessions/swmo.desktop)" ] &&
- echo "$icon_rol Toggle WM ^ 0 ^ confirm Toggle && sxmo_power.sh togglewm"
- )
+ $icon_rol Toggle WM ^ 0 ^ sxmo_power.sh togglewm
$icon_rld Reboot ^ 0 ^ confirm Reboot && sxmo_power.sh reboot
$icon_pwr Poweroff ^ 0 ^ confirm Poweroff && sxmo_power.sh poweroff
"
diff --git a/scripts/core/sxmo_xinit.sh b/scripts/core/sxmo_dwminit.sh
similarity index 100%
rename from scripts/core/sxmo_xinit.sh
rename to scripts/core/sxmo_dwminit.sh
diff --git a/scripts/core/sxmo_i3init.sh b/scripts/core/sxmo_i3init.sh
new file mode 100755
index 0000000..d20de59
--- /dev/null
+++ b/scripts/core/sxmo_i3init.sh
@@ -0,0 +1,63 @@
+#!/bin/sh
+# SPDX-License-Identifier: AGPL-3.0-only
+# Copyright 2022 Sxmo Contributors
+
+# shellcheck source=scripts/core/sxmo_common.sh
+. sxmo_common.sh
+
+envvars() {
+ export SXMO_WM=i3
+ export XDG_CURRENT_DESKTOP=i3
+ [ -z "$SXMO_MENU" ] && export SXMO_MENU=dmenu
+ # shellcheck disable=SC2086
+ command -v $SXMO_TERMINAL "" >/dev/null || export SXMO_TERMINAL="st"
+ command -v "$KEYBOARD" >/dev/null || defaultkeyboard
+ [ -z "$MOZ_USE_XINPUT2" ] && export MOZ_USE_XINPUT2=1
+}
+
+defaults() {
+ xmodmap "$(xdg_data_path sxmo/appcfg/xmodmap_caps_esc)"
+ xsetroot -mod 29 29 -fg '#0b3a4c' -bg '#082430'
+ xset s off -dpms
+ [ -e "$HOME"/.Xresources ] && xrdb -merge "$HOME"/.Xresources
+ SCREENWIDTH=$(xrandr | grep "Screen 0" | cut -d" " -f 8)
+ SCREENHEIGHT=$(xrandr | grep "Screen 0" | cut -d" " -f 10 | tr -d ",")
+ if [ "$SCREENWIDTH" -lt 1024 ] || [ "$SCREENHEIGHT" -lt 768 ]; then
+ gsettings set org.gtk.Settings.FileChooser window-size "($SCREENWIDTH,$((SCREENHEIGHT / 2)))"
+ fi
+}
+
+defaultkeyboard() {
+ if command -v svkbd-mobile-intl >/dev/null; then
+ export KEYBOARD=svkbd-mobile-intl
+ elif command -v svkbd-mobile-plain >/dev/null; then
+ export KEYBOARD=svkbd-mobile-plain
+ else
+ #legacy
+ export KEYBOARD=svkbd-sxmo
+ fi
+}
+
+with_dbus() {
+ echo "$DBUS_SESSION_BUS_ADDRESS" > "$XDG_RUNTIME_DIR"/dbus.bus
+ # shellcheck source=configs/appcfg/xinit_template
+ . "$XDG_CONFIG_HOME"/sxmo/xinit
+ exec i3 -c "$XDG_CONFIG_HOME"/sxmo/i3
+}
+
+cleanup() {
+ sxmo_jobs.sh stop all
+ pkill svkbd
+ case "$SXMO_MENU" in
+ dmenu)
+ pkill dmenu
+ ;;
+ bemenu)
+ pkill bemenu
+ ;;
+ esac
+ pkill superd
+}
+
+# shellcheck source=scripts/core/sxmo_init.sh
+. sxmo_init.sh
diff --git a/scripts/core/sxmo_power.sh b/scripts/core/sxmo_power.sh
index b08d4c4..fc4ce2d 100755
--- a/scripts/core/sxmo_power.sh
+++ b/scripts/core/sxmo_power.sh
@@ -23,38 +23,12 @@ case "$1" in
logout)
sxmo_hook_logout.sh
case "$SXMO_WM" in
+ "i3") i3-msg exit ;;
"sway") swaymsg exit ;;
"dwm") pkill dwm ;;
esac
;;
- togglewm)
- case "$(realpath /var/lib/tinydm/default-session.desktop)" in
- *"swmo.desktop")
- if command -v dwm > /dev/null; then
- if doas tinydm-set-session -f -s "$(xdg_data_path xsessions/sxmo.desktop)"; then
- sxmo_hook_logout.sh
- swaymsg exit
- else
- sxmo_notify_user.sh "You do not have tinydm installed."
- fi
- else
- sxmo_notify_user.sh "You do not have dwm installed."
- fi
- ;;
- *"sxmo.desktop")
- if command -v sway >/dev/null; then
- if doas tinydm-set-session -f -s "$(xdg_data_path wayland-sessions/swmo.desktop)"; then
- sxmo_hook_logout.sh
- pkill dwm
- else
- sxmo_notify_user.sh "You do not have tinydm installed."
- fi
- else
- sxmo_notify_user.sh "You do not have sway installed."
- fi
- ;;
- esac
- ;;
+ togglewm) sxmo_togglewm.sh ;;
*)
usage
exit 1
diff --git a/scripts/core/sxmo_winit.sh b/scripts/core/sxmo_swayinit.sh
similarity index 100%
rename from scripts/core/sxmo_winit.sh
rename to scripts/core/sxmo_swayinit.sh
diff --git a/scripts/core/sxmo_togglewm.sh b/scripts/core/sxmo_togglewm.sh
new file mode 100755
index 0000000..d699c9b
--- /dev/null
+++ b/scripts/core/sxmo_togglewm.sh
@@ -0,0 +1,33 @@
+#!/bin/sh
+
+# SPDX-License-Identifier: AGPL-3.0-only
+# Copyright 2024 Sxmo Contributors
+. sxmo_common.sh
+
+switch_to() {
+ file="$(xdg_data_path "$1")"
+ if ! [ -e "$file" ]; then
+ sxmo_notify_user.sh "Selected window manager not found, please install relevent sxmo-ui package."
+ return
+ fi
+
+ if doas tinydm-set-session -f -s "$file"; then
+ sxmo_power.sh logout
+ else
+ sxmo_notify_user.sh "tinydm failed to change the session"
+ fi
+}
+
+CHOICE="$(grep -v "$SXMO_WM" <<-EOF | sxmo_dmenu.sh -p "Toggle WM"
+ i3
+ dwm
+ sway
+EOF
+)" || exit
+
+case "$CHOICE" in
+ 'Close Menu') exit ;;
+ i3) switch_to "xsessions/sxmo_i3.desktop" ;;
+ dwm) switch_to "xsessions/sxmo.desktop" ;;
+ sway) switch_to "wayland_sessions/swmo.desktop" ;;
+esac
--
2.48.1