diff --git a/rofi_menu.pl b/rofi_menu.pl new file mode 100755 index 0000000..b0310dc --- /dev/null +++ b/rofi_menu.pl @@ -0,0 +1,158 @@ +#!/usr/bin/env perl + +use strict; +use warnings; +use Data::Dumper; + +# Launch this with 'rofi' with something like this: +# +# % rofi -show Select -modes "Select:~/bin/rofi_menu.pl" + +my $selection = $ARGV[0]; + +my $app = {}; + +if (defined $selection) { + select_option($app, $selection); +} else { + show_options($app); +} + +# ----------- +# Subroutines +# ----------- +sub show_options { + my ($app) = @_; + + my @categories = qw(Apps Tools Settings); + print join ("\n", @categories); +} + +# ----------- +sub select_option { + my ($app, $selection) = @_; + + warn "Selected: $selection\n"; + + if ($selection eq 'Apps') { + show_apps($app); + } elsif ($selection eq 'Tools') { + show_tools($app); + } elsif ($selection eq 'Settings') { + show_settings($app); + } elsif (my ($sub_app) = $selection =~ /^Apps:(.*)/) { + app_launch($app, $sub_app); + } elsif (my ($sub_tool) = $selection =~ /^Tools:(.*)/) { + tool_launch($app, $sub_tool); + } elsif (my ($sub_setting) = $selection =~ /^Settings:(.*)/) { + setting_launch($app, $sub_setting); + } +} + +# ----------- +sub show_apps { + my ($app) = @_; + my @apps = qw(Gimp VSCode Antigravity Chrome); + + print join ("\n", map { "Apps:$_" } @apps); +} + +# ----------- +sub show_tools { + my ($app) = @_; + my @apps = qw(Neovide Wezterm Calculator Audio); + + print join ("\n", map { "Tools:$_" } @apps); +} + +# ----------- +sub show_settings { + my ($app) = @_; + my @apps = qw(Neovim Ghostty Git MPD ncmpcpp); + + print join ("\n", map { "Settings:$_" } @apps); +} + +# ----------- +sub app_launch { + my ($app, $sub_app) = @_; + + if ($sub_app eq "Gimp") { + launch_program($app, '/usr/bin/gimp'); + } elsif ($sub_app eq "Antigravity") { + launch_program($app, '~/bin/dwl_antigravity'); + } elsif ($sub_app eq "VSCode") { + launch_program($app, '/opt/vscode/VSCode-linux-x64/code', + '--enable-features=UseOzonePlatform,WaylandWindowDecorations', + '--ozone-platform-hint=auto', + '--unity-launch'); + } elsif ($sub_app eq "Chrome") { + launch_program($app, 'chromium', + '--enable-features=UseOzonePlatform,WaylandWindowDecorations', + '--ozone-platform=wayland', + '--ozone-platform-hint=auto', + '--unity-launch'); + } +} + +# ----------- +sub tool_launch { + my ($app, $sub_tool) = @_; + + if ($sub_tool eq "Neovide") { + launch_program($app, 'neovide', '--fork'); + } elsif ($sub_tool eq "Wezterm") { + launch_program($app, 'wezterm'); + } elsif ($sub_tool eq "Calculator") { + launch_program($app, 'gnome-calculator'); + } elsif ($sub_tool eq "Audio") { + launch_program($app, 'rofi', '-show', 'menu', + '-modes', 'menu:~/bin/rofi_sound.pl'); + } +} + +# ----------- +sub setting_launch { + my ($app, $sub_setting) = @_; + + if ($sub_setting eq "Neovim") { + launch_program($app, 'neovide', '--fork', '~/.config/nvim/init.lua'); + } elsif ($sub_setting eq "Ghostty") { + launch_program($app, 'neovide', '--fork', '~/.config/ghostty/config'); + } elsif ($sub_setting eq "Git") { + launch_program($app, 'neovide', '--fork', '~/.gitconfig'); + } elsif ($sub_setting eq "MPD") { + launch_program($app, 'neovide', '--fork', '~/.config/mpd/mpd.conf'); + } elsif ($sub_setting eq "ncmpcpp") { + launch_program($app, 'neovide', '--fork', '~/.config/ncmpcpp/config'); + } +} + +# ----------- +sub launch_program { + my ($app, @program) = @_; + + my $prog = join(' ', @program); + system("nohup $prog > /dev/null 2>&1 &"); + + exit(0); + + # my $pid = fork(); + + # die "launch_program: couldn't fork: $!" unless defined $pid; + + # if ($pid == 0) { + # # Child process + # # Detach from the parent process's session to survive terminal closure + # # (optional but recommended for complete daemonization) + # # Use 'setsid()' if available/needed. A simple exit of the parent may suffice. + + # # Execute the new program in place of the child process + # exec(@program) or die "Couldn't exec your program: $!"; + # } else { + # # Parent process + # print "Launched child process with PID $pid\n"; + # # Parent can do other things here, or simply exit + # exit(0); # Exit the parent script + # } +}