commit ebdbc88034e563df4b6e815a52f5752cdc0fe25f Author: Luxferre Date: Tue Jun 2 17:42:56 2026 +0300 first upload diff --git a/.roidrc b/.roidrc new file mode 100644 index 0000000..d7458e6 --- /dev/null +++ b/.roidrc @@ -0,0 +1,89 @@ +# .roidrc: a compact, single-file Bash shell environment tweaker +# for rooted Void Linux environments like Roid or Voideck +# Only include in the interactive sessions, e.g. for bash: +# [[ $- == *i* ]] && . $HOME/.roidrc +# Core deps: less, nano (8.x+), sed, ed, rlwrap, curl, openssh, dtach +# Created by Luxferre in 2026, released into public domain + +# override the editor (needs Nano 8 and up) and pager +export EDITOR='nano -FEDSMAGic/max%_T2' +export PAGER='less -RXF' +alias nn="$EDITOR" +alias pg="$PAGER" + +# edit and/or live-reload this very file +alias reload-rc=". $BASH_SOURCE" +alias edit-rc="$EDITOR $BASH_SOURCE && . $BASH_SOURCE" + +# get the most recent command run on this shell +alias lastcmd='history | tail -q -n 2 | head -q -n 1 | sed "s/^[[:space:]]*[0-9]*[[:space:]]*//"' + +# custom alias management framework (defalias/toalias/savealias) +alias defalias='___(){ __="$1";shift;alias $__="_$__(){ $*; };_$__";unset __; };___' +defalias toalias 'defalias "$1" "$(lastcmd)";alias "$1"' +defalias savealias "[ -n \"\$1\" ] && echo \"alias \$(alias \$1 | sed 's/^alias //')\" >> $BASH_SOURCE" + +# most important aliases +alias rw='rlwrap -R' +alias ee='rlwrap -R ed -p:' +alias eer='sudo rlwrap -R ed -p:' +defalias l 'ls -lahF --time-style=long-iso --color=always $* | less -RXF' +defalias sshed 'f="$(mktemp)";scp $1 $f && $EDITOR $f && scp $f $1 && rm -f $f && unset f' +alias dl='curl -sSLO' + +# less important aliases +alias n='echo -e "$(date -Im)\t$*" >> ~/n' +defalias r13 'echo "$*" | tr "A-Za-z" "N-ZA-Mn-za-m"' +alias websrv='python3 -m http.server' +alias gcm='git commit -a -m' +alias gp='git push origin' +alias gpm='git push origin master' +alias jpm-build='jpm clean && jpm build --build-type=release --ldflags="-s"' +alias jpm-build-static='jpm clean && jpm build --build-type=release --ldflags="-s" --janet-cflags="-static"' + +# Void-specific aliases +alias pkgadd='xbps-install -Sy' +alias pkgdel='xbps-remove -oy' +alias pkgsearch='xbps-query -Rs' +alias sysup='xbps-install -Suy && vkpurge rm all && xbps-remove -OOoy' +alias sysclean='vkpurge rm all && xbps-remove -OOoy' + +# Roid-specific aliases +alias tmhome='cd $TERMUX_HOME' +alias gui='exec termux-x11 :0 -xstartup "dbus-launch --exit-with-session i3"' + +# OpenSSL-based vault helper +ovault() { + local pw="$4" + local op='-d' + [ "$1" = 'e' ] && op='-e' + if [ -z "$pw" ]; then + read -rs -p 'Enter vault password: ' pw + fi + openssl aes-256-cbc $op -pbkdf2 -iter 100000 -pass pass:"$pw" -in "$2" -out "$3" +} + +# dmux, a simple dtach based terminal session manager, as a Bash function +dmux() { + local SDIR="$HOME/.dtsess" SPFILE="$SDIR/.list" sname + local -a MENU + mkdir -p "$SDIR" + touch "$SPFILE" + mapfile -t MENU < "$SPFILE" + if [[ -z "$(ls -1 "$SDIR")" ]]; then + for sname in "${MENU[@]}"; do + dtach -n "$SDIR/$sname" $SHELL + done + fi + PS3='Select a session: ' + while true; do + select sname in "${MENU[@]}" New Quit; do break; done + [[ "$sname" = 'Quit' ]] && printf '\033[0m' && break + [[ "$sname" = 'New' ]] && read -r -p 'New session name: ' sname + [[ -n "$sname" ]] && printf '\033[0m' && dtach -A "$SDIR/$sname" $SHELL + ls -1 "$SDIR" > "$SPFILE" + mapfile -t MENU < "$SPFILE" + done +} + +# ...custom saved aliases will go here diff --git a/README.md b/README.md new file mode 100644 index 0000000..3c12512 --- /dev/null +++ b/README.md @@ -0,0 +1,78 @@ +# Roid: an easy Void Linux installation toolkit for Termux environments on top of Android OS + +The Roid toolkit allows you to turn any Android device that can run Termux (and Termux-X11, if you need a GUI desktop) into a full-featured [Void Linux](https://voidlinux.org/) PC. + +Only tested on ARM64. Other hardware platforms may or may not work. + +## Features + +* Full (glibc-based) Void Linux installation for your smartphone/tablet architecture (usually ARM64) +* Convenient shell aliases inside the environment (see [.roidrc](.roidrc)) +* Sound support out of the box (via PulseAudio) +* A set of development tools out of the box (GCC, Make, Autotools, Perl, Tcl, Python, Janet, S-Lang, Lua, Expect etc) +* (Opt-out) 3D-accelerated X11 GUI desktop environment (i3, st-sx, Fira Code, Noto Fonts etc) + +## Prerequisites + +* Android 8 or later. +* [Termux](https://termux.dev/en/) installed and prepared with `termux-change-repo` and `termux-setup-storage`. It's also strongly recommended to select "Acquire wakelock" in the notification bar before starting the installation. +* [Termux-X11](https://github.com/termux/termux-x11) installed from GH releases in case you need a GUI desktop. **Note**: not all Android flavors are supported by Termux-X11. +* Git installed within Termux itself: `pkg updrade -y && pkg install -y git` + +## Installation + +Run from within the Termux shell: + +```sh +git clone --depth 1 https://codeberg.org/luxferre/roid.git ~/roid +sh ~/roid/install +``` + +In case you don't need a GUI desktop, run `NOX=y sh ~/roid/install` instead. + +After the process completes, you need to fully exit the Termux shell and re-enter it before you can start Void. + +## CLI usage + +From the Termux environment, just type `void` to enter the Void Linux shell. You're ready to go. Your original Termux home path is available in the `$TERMUX_HOME` environment variable. + +Alternatively, if you don't want to enter the shell but just run a command inside Void Linux and then return to Termux, type `voidrun [command]` instead. + +## Desktop GUI usage (requires Termux-X11) + +1. Open Termux-X11 in the background. +2. Switch to Termux (make sure the wakelock is on!) and type `void` to enter the shell. +3. Type `gui` to start the desktop environment. +4. Switch to Termux-X11 to start using the environment. + +Having at least an external keyboard connected to your device is highly recommended for better desktop experience. + +After exiting the Void Linux shell and before exiting Termux, it's advisable to run the `roidclean` command to stop the PulseAudio and 3D acceleration servers. + +## Uninstallation + +To fully uninstall Void Linux set up by Roid, exit the Void shell and then run either this: + +``` +roidclean +pd remove void-glibc-full +sed -i '/ROID_INST/d' ~/.profile +sed -i '/ROID_INST/d' ~/.bashrc +pkg remove -y proot-distro pulseaudio x11-repo termux-x11-nightly virglrenderer-android +pkg autoremove -y +exit +``` + +or this (if you still have the original `~/roid` directory in place): + +``` +sh ~/roid/uninstall +rm -rf ~/roid +exit +``` + +Upon re-entering the Termux shell, no traces of the installation should be found. + +## Credits + +Created by Luxferre in 2026, released into the public domain with no warranties. diff --git a/dunstrc b/dunstrc new file mode 100644 index 0000000..bc356d5 --- /dev/null +++ b/dunstrc @@ -0,0 +1,436 @@ +# See dunst(5) for all configuration options + +[global] + ### Display ### + + # Which monitor should the notifications be displayed on. + monitor = 0 + + # Display notification on focused monitor. Possible modes are: + # mouse: follow mouse pointer + # keyboard: follow window with keyboard focus + # none: don't follow anything + # + # "keyboard" needs a window manager that exports the + # _NET_ACTIVE_WINDOW property. + # This should be the case for almost all modern window managers. + # + # If this option is set to mouse or keyboard, the monitor option + # will be ignored. + follow = mouse + + ### Geometry ### + + # dynamic width from 0 to 300 + # width = (0, 300) + # constant width of 300 + width = (300, 300) + + # The maximum height of a single notification, excluding the frame. + height = (0, 300) + + # Position the notification in the top right corner + origin = top-right + + # Offset from the origin + offset = (10, 50) + + # Scale factor. It is auto-detected if value is 0. + scale = 0 + + # Maximum number of notification (0 means no limit) + notification_limit = 0 + + ### Progress bar ### + + # Turn on the progess bar. It appears when a progress hint is passed with + # for example dunstify -h int:value:12 + progress_bar = true + + # Set the progress bar height. This includes the frame, so make sure + # it's at least twice as big as the frame width. + progress_bar_height = 10 + + # Set the frame width of the progress bar + progress_bar_frame_width = 1 + + # Set the minimum width for the progress bar + progress_bar_min_width = 150 + + # Set the maximum width for the progress bar + progress_bar_max_width = 300 + + + # Show how many messages are currently hidden (because of + # notification_limit). + indicate_hidden = yes + + # The transparency of the window. Range: [0; 100]. + # This option will only work if a compositing window manager is + # present (e.g. xcompmgr, compiz, etc.). (X11 only) + transparency = 15 + + # Draw a line of "separator_height" pixel height between two + # notifications. + # Set to 0 to disable. + separator_height = 1 + + # Padding between text and separator. + padding = 8 + + # Horizontal padding. + horizontal_padding = 10 + + # Padding between text and icon. + text_icon_padding = 0 + + # Defines width in pixels of frame around the notification window. + # Set to 0 to disable. + frame_width = 0 + + # Defines color of the frame around the notification window. + frame_color = "#282a36" + + # Define a color for the separator. + # possible values are: + # * auto: dunst tries to find a color fitting to the background; + # * foreground: use the same color as the foreground; + # * frame: use the same color as the frame; + # * anything else will be interpreted as a X color. + separator_color = frame + + # Sort messages by urgency. + sort = yes + + # Don't remove messages, if the user is idle (no mouse or keyboard input) + # for longer than idle_threshold seconds. + # Set to 0 to disable. + # A client can set the 'transient' hint to bypass this. See the rules + # section for how to disable this if necessary + idle_threshold = 120 + + ### Text ### + + font = Fira Code 10 + + # The spacing between lines. If the height is smaller than the + # font height, it will get raised to the font height. + line_height = 0 + + # Possible values are: + # full: Allow a small subset of html markup in notifications: + # bold + # italic + # strikethrough + # underline + # + # For a complete reference see + # . + # + # strip: This setting is provided for compatibility with some broken + # clients that send markup even though it's not enabled on the + # server. Dunst will try to strip the markup but the parsing is + # simplistic so using this option outside of matching rules for + # specific applications *IS GREATLY DISCOURAGED*. + # + # no: Disable markup parsing, incoming notifications will be treated as + # plain text. Dunst will not advertise that it has the body-markup + # capability if this is set as a global setting. + # + # It's important to note that markup inside the format option will be parsed + # regardless of what this is set to. + markup = full + + # The format of the message. Possible variables are: + # %a appname + # %s summary + # %b body + # %i iconname (including its path) + # %I iconname (without its path) + # %p progress value if set ([ 0%] to [100%]) or nothing + # %n progress value if set without any extra characters + # %% Literal % + # Markup is allowed + format = "%s %p\n%b" + + # Alignment of message text. + # Possible values are "left", "center" and "right". + alignment = left + + # Vertical alignment of message text and icon. + # Possible values are "top", "center" and "bottom". + vertical_alignment = center + + # Show age of message if message is older than show_age_threshold + # seconds. + # Set to -1 to disable. + show_age_threshold = 60 + + # Specify where to make an ellipsis in long lines. + # Possible values are "start", "middle" and "end". + ellipsize = middle + + # Ignore newlines '\n' in notifications. + ignore_newline = no + + # Stack together notifications with the same content + stack_duplicates = true + + # Hide the count of stacked notifications with the same content + hide_duplicate_count = false + + # Display indicators for URLs (U) and actions (A). + show_indicators = yes + + ### Icons ### + + # Align icons left/right/off + icon_position = left + + # Scale small icons up to this size, set to 0 to disable. Helpful + # for e.g. small files or high-dpi screens. In case of conflict, + # max_icon_size takes precedence over this. + min_icon_size = 0 + + # Scale larger icons down to this size, set to 0 to disable + max_icon_size = 64 + + # Paths to default icons. + icon_path = /usr/share/icons/gnome/16x16/status/:/usr/share/icons/gnome/16x16/devices/ + + ### History ### + + # Should a notification popped up from history be sticky or timeout + # as if it would normally do. + sticky_history = yes + + # Maximum amount of notifications kept in history + history_length = 20 + + ### Misc/Advanced ### + + # dmenu path. + dmenu = /usr/bin/dmenu -p dunst: + + # Browser for opening urls in context menu. + browser = /usr/bin/firefox -new-tab + + # Always run rule-defined scripts, even if the notification is suppressed + always_run_script = true + + # Define the title of the windows spawned by dunst + title = Dunst + + # Define the class of the windows spawned by dunst + class = Dunst + + # Define the corner radius of the notification window + # in pixel size. If the radius is 0, you have no rounded + # corners. + # The radius will be automatically lowered if it exceeds half of the + # notification height to avoid clipping text and/or icons. + corner_radius = 0 + + # Ignore the dbus closeNotification message. + # Useful to enforce the timeout set by dunst configuration. Without this + # parameter, an application may close the notification sent before the + # user defined timeout. + ignore_dbusclose = false + + ### Wayland ### + # These settings are Wayland-specific. They have no effect when using X11 + + # Uncomment this if you want to let notications appear under fullscreen + # applications (default: overlay) + # layer = top + + # Set this to true to use X11 output on Wayland. + force_xwayland = false + + ### Legacy + + # Use the Xinerama extension instead of RandR for multi-monitor support. + # This setting is provided for compatibility with older nVidia drivers that + # do not support RandR and using it on systems that support RandR is highly + # discouraged. + # + # By enabling this setting dunst will not be able to detect when a monitor + # is connected or disconnected which might break follow mode if the screen + # layout changes. + force_xinerama = false + + ### mouse + + # Defines list of actions for each mouse event + # Possible values are: + # * none: Don't do anything. + # * do_action: Invoke the action determined by the action_name rule. If there is no + # such action, open the context menu. + # * open_url: If the notification has exactly one url, open it. If there are multiple + # ones, open the context menu. + # * close_current: Close current notification. + # * close_all: Close all notifications. + # * context: Open context menu for the notification. + # * context_all: Open context menu for all notifications. + # These values can be strung together for each mouse event, and + # will be executed in sequence. + mouse_left_click = close_current + mouse_middle_click = do_action, close_current + mouse_right_click = close_all + +# Experimental features that may or may not work correctly. Do not expect them +# to have a consistent behaviour across releases. +[experimental] + # Calculate the dpi to use on a per-monitor basis. + # If this setting is enabled the Xft.dpi value will be ignored and instead + # dunst will attempt to calculate an appropriate dpi value for each monitor + # using the resolution and physical size. This might be useful in setups + # where there are multiple screens with very different dpi values. + per_monitor_dpi = false + + +[urgency_low] + # IMPORTANT: colors have to be defined in quotation marks. + # Otherwise the "#" and following would be interpreted as a comment. + background = "#282a36" + foreground = "#6272a4" + timeout = 10 + # Icon for notifications with low urgency, uncomment to enable + #new_icon = /path/to/icon + +[urgency_normal] + background = "#282a36" + foreground = "#bd93f9" + timeout = 10 + # Icon for notifications with normal urgency, uncomment to enable + #new_icon = /path/to/icon + +[urgency_critical] + background = "#ff5555" + foreground = "#f8f8f2" + frame_color = "#ff5555" + timeout = 0 + # Icon for notifications with critical urgency, uncomment to enable + #new_icon = /path/to/icon + +# Every section that isn't one of the above is interpreted as a rules to +# override settings for certain messages. +# +# Messages can be matched by +# appname (discouraged, see desktop_entry) +# body +# category +# desktop_entry +# icon +# match_transient +# msg_urgency +# stack_tag +# summary +# +# and you can override the +# background +# foreground +# format +# frame_color +# fullscreen +# new_icon +# set_stack_tag +# set_transient +# set_category +# timeout +# urgency +# skip_display +# history_ignore +# action_name +# word_wrap +# ellipsize +# alignment +# +# Shell-like globbing will get expanded. +# +# Instead of the appname filter, it's recommended to use the desktop_entry filter. +# GLib based applications export their desktop-entry name. In comparison to the appname, +# the desktop-entry won't get localized. +# +# SCRIPTING +# You can specify a script that gets run when the rule matches by +# setting the "script" option. +# The script will be called as follows: +# script appname summary body icon urgency +# where urgency can be "LOW", "NORMAL" or "CRITICAL". +# +# NOTE: It might be helpful to run dunst -print in a terminal in order +# to find fitting options for rules. + +# Disable the transient hint so that idle_threshold cannot be bypassed from the +# client +#[transient_disable] +# match_transient = yes +# set_transient = no +# +# Make the handling of transient notifications more strict by making them not +# be placed in history. +#[transient_history_ignore] +# match_transient = yes +# history_ignore = yes + +# fullscreen values +# show: show the notifications, regardless if there is a fullscreen window opened +# delay: displays the new notification, if there is no fullscreen window active +# If the notification is already drawn, it won't get undrawn. +# pushback: same as delay, but when switching into fullscreen, the notification will get +# withdrawn from screen again and will get delayed like a new notification +#[fullscreen_delay_everything] +# fullscreen = delay +#[fullscreen_show_critical] +# msg_urgency = critical +# fullscreen = show + +#[espeak] +# summary = "*" +# script = dunst_espeak.sh + +#[script-test] +# summary = "*script*" +# script = dunst_test.sh + +#[ignore] +# # This notification will not be displayed +# summary = "foobar" +# skip_display = true + +#[history-ignore] +# # This notification will not be saved in history +# summary = "foobar" +# history_ignore = yes + +#[skip-display] +# # This notification will not be displayed, but will be included in the history +# summary = "foobar" +# skip_display = yes + +#[signed_on] +# appname = Pidgin +# summary = "*signed on*" +# urgency = low +# +#[signed_off] +# appname = Pidgin +# summary = *signed off* +# urgency = low +# +#[says] +# appname = Pidgin +# summary = *says* +# urgency = critical +# +#[twitter] +# appname = Pidgin +# summary = *twitter.com* +# urgency = normal +# +#[stack-volumes] +# appname = "some_volume_notifiers" +# set_stack_tag = "volume" +# +# vim: ft=cfg diff --git a/i3autostart b/i3autostart new file mode 100755 index 0000000..5df920f --- /dev/null +++ b/i3autostart @@ -0,0 +1,8 @@ +#!/bin/sh +setxkbmap -option "grp:caps_toggle,grp_led:scroll,terminate:ctrl_alt_bksp" -layout "us,ua,ru" -variant "altgr-weur,phonetic,phonetic_mac" +picom --backend xrender -b +feh --bg-fill ~/.config/i3/wallpaper.png & +dunst & +# fcitx5 -d +sleep 1 +volumeicon & diff --git a/i3config b/i3config new file mode 100644 index 0000000..2a00f25 --- /dev/null +++ b/i3config @@ -0,0 +1,191 @@ +# i3 config file (v4) +# +# Please see https://i3wm.org/docs/userguide.html for a complete reference! + +set $mod Mod4 + +# Font for window titles. Will also be used by the bar unless a different font +# is used in the bar {} block below. +font pango:Fira Code 12 + +# Start XDG autostart .desktop files using dex. See also +# https://wiki.archlinux.org/index.php/XDG_Autostart +exec --no-startup-id dex --autostart --environment i3 & + +# The combination of xss-lock, nm-applet and pactl is a popular choice, so +# they are included here as an example. Modify as you see fit. + +# xss-lock grabs a logind suspend inhibit lock and will use i3lock to lock the +# screen before suspend. Use loginctl lock-session to lock your screen. +exec --no-startup-id xss-lock --transfer-sleep-lock -- i3lock --nofork -i $HOME/.config/i3/wallpaper.png & + +# Use pactl to adjust volume in PulseAudio. +set $refresh_i3status killall -SIGUSR1 i3status +bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ +10% && $refresh_i3status +bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume @DEFAULT_SINK@ -10% && $refresh_i3status +bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute @DEFAULT_SINK@ toggle && $refresh_i3status +bindsym XF86AudioMicMute exec --no-startup-id pactl set-source-mute @DEFAULT_SOURCE@ toggle && $refresh_i3status +# Use Mouse+$mod to drag floating windows to their wanted position +floating_modifier $mod + +# move tiling windows via drag & drop by left-clicking into the title bar, +# or left-clicking anywhere into the window while holding the floating modifier. +tiling_drag modifier titlebar + +# start a terminal +bindsym $mod+Return exec i3-sensible-terminal + +# kill focused window +bindsym $mod+Shift+q kill + +# A more modern dmenu replacement is rofi: +bindsym $mod+space exec "rofi -modi drun,run -show drun" + +# change focus +bindsym $mod+j focus left +bindsym $mod+k focus down +bindsym $mod+l focus up +bindsym $mod+semicolon focus right + +# alternatively, you can use the cursor keys: +bindsym $mod+Left focus left +bindsym $mod+Down focus down +bindsym $mod+Up focus up +bindsym $mod+Right focus right + +# move focused window +bindsym $mod+Shift+j move left +bindsym $mod+Shift+k move down +bindsym $mod+Shift+i move up +bindsym $mod+Shift+semicolon move right + +# alternatively, you can use the cursor 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 + +# split in horizontal orientation +bindsym $mod+h split h + +# split in vertical orientation +bindsym $mod+v split v + +# enter fullscreen mode for the focused container +bindsym $mod+f fullscreen toggle + +# change container layout (stacked, tabbed, toggle split) +bindsym $mod+s layout stacking +bindsym $mod+w layout tabbed +bindsym $mod+e layout toggle split + +# toggle tiling / floating +bindsym $mod+Shift+space floating toggle + +# change focus between tiling / floating windows +bindsym $mod+Control+space focus mode_toggle + +# focus the parent container +bindsym $mod+a focus parent + +# focus the child container +#bindsym $mod+d focus child + +# Define names for default workspaces for which we configure key bindings later on. +# We use variables to avoid repeating the names in multiple places. +set $ws1 "1" +set $ws2 "2" +set $ws3 "3" +set $ws4 "4" +set $ws5 "5" +set $ws6 "6" +set $ws7 "7" +set $ws8 "8" +set $ws9 "9" +set $ws10 "10" + +# switch to workspace +bindsym $mod+1 workspace number $ws1 +bindsym $mod+2 workspace number $ws2 +bindsym $mod+3 workspace number $ws3 +bindsym $mod+4 workspace number $ws4 +bindsym $mod+5 workspace number $ws5 +bindsym $mod+6 workspace number $ws6 +bindsym $mod+7 workspace number $ws7 +bindsym $mod+8 workspace number $ws8 +bindsym $mod+9 workspace number $ws9 +bindsym $mod+0 workspace number $ws10 + +# move focused container to workspace +bindsym $mod+Shift+1 move container to workspace number $ws1 +bindsym $mod+Shift+2 move container to workspace number $ws2 +bindsym $mod+Shift+3 move container to workspace number $ws3 +bindsym $mod+Shift+4 move container to workspace number $ws4 +bindsym $mod+Shift+5 move container to workspace number $ws5 +bindsym $mod+Shift+6 move container to workspace number $ws6 +bindsym $mod+Shift+7 move container to workspace number $ws7 +bindsym $mod+Shift+8 move container to workspace number $ws8 +bindsym $mod+Shift+9 move container to workspace number $ws9 +bindsym $mod+Shift+0 move container to workspace number $ws10 + +# reload the configuration file +bindsym $mod+Shift+c reload +# restart i3 inplace (preserves your layout/session, can be used to upgrade i3) +bindsym $mod+Shift+r restart +# exit i3 (logs you out of your X 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 X session.' -B 'Yes, exit i3' 'i3-msg exit'" + +# resize window (you can also use the mouse for that) +mode "resize" { + # These bindings trigger as soon as you enter the resize mode + + # Pressing left will shrink the window’s width. + # Pressing right will grow the window’s width. + # Pressing up will shrink the window’s height. + # Pressing down will grow the window’s height. + bindsym j resize shrink width 10 px or 10 ppt + bindsym k resize grow height 10 px or 10 ppt + bindsym l resize shrink height 10 px or 10 ppt + bindsym semicolon resize grow width 10 px or 10 ppt + + # same bindings, but for the arrow keys + bindsym Left resize shrink width 10 px or 10 ppt + bindsym Down resize grow height 10 px or 10 ppt + bindsym Up resize shrink height 10 px or 10 ppt + bindsym Right resize grow width 10 px or 10 ppt + + # back to normal: Enter or Escape or $mod+r + bindsym Return mode "default" + bindsym Escape mode "default" + bindsym $mod+r mode "default" +} + +bindsym $mod+r mode "resize" + +# Start i3bar to display a workspace bar (plus the system information i3status +# finds out, if available) +bar { + status_command bash ~/.config/i3/status_wrapper.sh + position top + output $primary +} + +for_window [class="^.*"] border pixel 2 +hide_edge_borders smart +default_orientation auto + +# window to workspace assignments +assign [class="st"] $ws1 + +bindsym $mod+Shift+l exec "i3lock -i $HOME/.config/i3/wallpaper.png" + +# screenshots +# capture full screen on the main monitor +bindsym $mod+Shift+s exec "scrot -z -M 0 -e 'dunstify \\"Screenshot taken\\" $f'" +# capture selection +bindsym $mod+Control+s exec "scrot -s -f -z -e 'dunstify \\"Screenshot taken\\" $f'" +# capture focused window +bindsym $mod+Mod1+s exec "scrot -u -z -e 'dunstify \\"Screenshot taken\\" $f'" + +exec_always --no-startup-id autotiling & +exec --no-startup-id ~/.config/i3/autostart & diff --git a/install b/install new file mode 100644 index 0000000..b50d49b --- /dev/null +++ b/install @@ -0,0 +1,63 @@ +#!/bin/sh +# Roid: barebones Void Linux setup script for Termux environment +# includes sound support via PulseAudio server +# and X11 graphics support via Termux-X11 server +# Set NOX=y to disable graphics package installation +# and NOEXTRAS=y to disable extra CLI package installation +# (or BAREBONES=y to disable both at once) +# Created by Luxferre in 2026, released into the public domain + +# Non-GUI packages +BASE_PKGS='base-container-full void-repo-nonfree base-devel curl git nano mc pulseaudio alsa-plugins-pulseaudio' +EXTRA_PKGS='libcurl-devel dtach fzf tcl tcllib tcltls janet jpm expect zip p7zip unrar rlwrap jq yq miller htop the_silver_searcher gnupg pass progress discount aria2 rsync aerc netcat socat websocat nmap lynx ImageMagick mpg123 mpv sox ffmpeg dumbplay yt-dlp' + +# GUI packages +X11_PKGS='xcursor-themes xcursor-vanilla-dmz-aa setxkbmap xkb-switch xdg-utils xdg-user-dirs xsel xss-lock xdotool xrandr xmodmap' +X_APPS='dbus mesa mesa-dri mesa-demos mesa-vaapi glxinfo dex i3 i3lock i3status i3cat i3wsr rofi autotiling scrot dunst picom feh volumeicon' +FONT_PKGS='noto-fonts-ttf noto-fonts-ttf-extra noto-fonts-cjk noto-fonts-emoji noto-fonts-ttf-variable liberation-fonts-ttf font-firacode fonts-roboto-ttf' +GUI_PKGS="$X11_PKGS $FONT_PKGS $X_APPS" + +if [ "$BAREBONES" = "y" ]; then + NOX=y + NOEXTRAS=y +fi +[ -z "$NOX" ] && NOX=n +[ -z "$NOEXTRAS" ] && NOEXTRAS=n + +echo 'Setting up host environment...' +pkg upgrade -y +pkg install -y proot-distro pulseaudio +cat >> $HOME/.profile <<'EOF' +pulseaudio --start --exit-idle-time=-1 # ROID_INST +pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1 # ROID_INST +EOF +if [ "$NOX" = "n" ]; then + pkg install -y x11-repo + pkg install -y termux-x11-nightly virglrenderer-android + echo 'virgl_test_server_android & # ROID_INST' >> $HOME/.profile +fi +cat >> $HOME/.bashrc <<'EOF' +alias void="proot-distro login -P -e TERMUX_HOME=$HOME void-glibc-full" # ROID_INST +alias voidrun='proot-distro run -P void-glibc-full --' # ROID_INST +alias roidclean='killall pulseaudio virgl_test_server_android' # ROID_INST +EOF +echo 'Installing Void Linux...' +proot-distro install ghcr.io/void-linux/void-glibc-full +echo 'Base distro setup...' +proot-distro run void-glibc-full -- sh -c "xbps-install -Suyy && xbps-install -Sy $BASE_PKGS" +if [ "$NOEXTRAS" = "n" ]; then + echo 'Extra package setup...' + proot-distro run void-glibc-full -- sh -c "xbps-install -Suy && xbps-install -Sy $EXTRA_PKGS" +fi +if [ "$NOX" = "n" ]; then + echo 'GUI setup...' + proot-distro run void-glibc-full -- sh -c "xbps-install -Suyy && xbps-install -Sy $GUI_PKGS" +fi +echo 'Post-installation steps (CLI)...' +proot-distro run void-glibc-full -e TERMUX_HOME=$HOME -- sh $HOME/roid/postinstall-cli +if [ "$NOX" = "n" ]; then + echo 'Post-installation steps (GUI)...' + proot-distro run void-glibc-full -- sh -c "ln -s $TMPDIR/.virgl_test /tmp/" + proot-distro run void-glibc-full -e TERMUX_HOME=$HOME -- sh $HOME/roid/postinstall-gui +fi +echo 'Done. Restart the Termux shell to take effect, then type void to start the OS' diff --git a/postinstall-cli b/postinstall-cli new file mode 100644 index 0000000..c9b2274 --- /dev/null +++ b/postinstall-cli @@ -0,0 +1,15 @@ +#!/bin/sh +# Roid post-installation steps for CLI environment + +cat > /root/.bash_profile <<'EOF' +export LC_ALL=C.UTF-8 +export LANG=C.UTF-8 +[[ -f /root/.bashrc ]] && [[ $- == *i* ]] && . /root/.bashrc +EOF + +cat > /root/.bashrc <<'EOF' +PS1='\W # ' +. /root/roidrc +EOF + +cp $TERMUX_HOME/roid/.roidrc /root/.roidrc diff --git a/postinstall-gui b/postinstall-gui new file mode 100644 index 0000000..73aa641 --- /dev/null +++ b/postinstall-gui @@ -0,0 +1,67 @@ +#!/bin/sh +# Roid post-installation steps for GUI desktop environment +# !!!under construction!!! + +# system DPI (TBD how to handle it more correctly) +SYSDPI=144 + +cd /root + +cat >> .bash_profile <<'EOF' +export DISPLAY=:0 +export GALLIUM_DRIVER=virpipe +EOF + +# install st +echo 'Installing st...' +git clone https://github.com/veltza/st-sx.git +cd st-sx +sed -i 's/Liberation Mono:pixelsize=12/Fira Code:size=14/g' config.def.h +sed -i 's|/bin/sh|/bin/bash|g' config.def.h +sed -i 's/st-256color/xterm-256color/g' config.def.h +sed -i 's/alpha = 0.8;/alpha = 0.9;/g' config.def.h +sed -i 's/ligatures = 0;/ligatures = 1;/g' config.def.h +make +sudo make install +cd .. +rm -rf st-sx + +echo 'Preparing i3 configuration...' +mkdir -p .config/i3 +cat > .config/i3/status_wrapper.sh <<'EOF' +#!/bin/bash +i3status | while : +do + read line + LAYOUT=$(xkb-switch -p | cut -f 1 -d '(') + echo "${line/[/$LAYOUT}" || exit 1 +done +EOF +cp $TERMUX_HOME/roid/i3config .config/i3/config +cp $TERMUX_HOME/roid/i3autostart .config/i3/autostart +cp $TERMUX_HOME/roid/wallpaper.png .config/i3/wallpaper.png +chmod +x .config/i3/autostart + +echo 'Preparing Rofi configuration...' +mkdir -p .config/rofi +cat > .config/rofi/config.rasi < .Xresources <