from std/osproc import ProcessOption, startProcess, waitForExit, close from std/options import Option, some, get, isNone from std/strutils import splitLines from std/strformat import fmt import owlkettle, std/os const picturesDir = "/usr/share/tromjaro-welcome-app/pictures" desktopFile = "tromjaro-welcome-app.desktop" desktopFilePath = "/usr/share/applications" / desktopFile applicationID = "com.tromjaro.WelcomeApp" let autostartSymlinkPath = getConfigDir() / "autostart" / desktopFile const pages = [ ( title: "Welcome to TROMjaro", description: """ This operating system is trade-free. This means that you do not have to trade anything to us in order to use it. Not your data, not your attention, currency or anything else. There are no free trials here, no ads, and no trackers. """, image: "", buttonText: "TAKE A MINUTE TO CUSTOMIZE YOUR DESKTOP EXPERIENCE", buttonCommand: @[] ), ( title: "Choose a Layout", description: "Make it morph into any configuration you like!", image: "layout-switcher-thumbnail.png", buttonText: "OPEN THE LAYOUT SWITCHER", buttonCommand: @["/usr/bin/tromjaro-layout-switcher"] ), ( title: "Choose a Theme", description: "Choose between the many variations of themes that sync across different types of applications.", image: "theme-switcher-thumbnail.png", buttonText: "OPEN THE THEME SWITCHER", buttonCommand: @["/usr/bin/tromjaro-theme-switcher"] ), ( title: "Choose a Background", description: "Pick a cool background to go along with your theme!", image: "wallpapers-thumbnail.png", buttonText: "CHANGE THE WALLPAPER", buttonCommand: @["/usr/bin/xfdesktop-settings"] ), ( title: "Setup the Internet Content Blocker", description: "Setup your Operating System to block pesky ads and trackers, system-wide.", image: "tblock-thumbnail.png", buttonText: "SETUP INTERNET CONTENT BLOCKER", buttonCommand: @["/usr/bin/tblockg"] ), ( title: "Settings Manager", description: "If you want to do more tweaks, you will find all of the settings in one single place.", image: "settings-manager-thumbnail.png", buttonText: "OPEN SETTINGS MANAGER", buttonCommand: @["/usr/bin/xfce4-settings-manager"] ), ( title: "Support Us", description: "TROMjaro is one of the many trade-free projects that we are doing. Please support us if you can. Thank you!", image: "trom-projects-thumbnail.png", buttonText: "DONATE", buttonCommand: @["/usr/bin/xdg-open", "https://www.tromsite.com/donate/"] ) ] var pageNumber: int = 0 proc runBackgroundCommand(commandLine: seq[string]) = let process = startProcess("/usr/bin/setsid", args= @["-f"] & commandLine, options={poParentStreams}) discard process.waitForExit() process.close() var oldConfigDir: Option[string] configDirChanged: bool # Prevent loading GTK theme from ~/.config/gtk-4.0 directory when it is a symlink if symlinkExists(getConfigDir() / "gtk-4.0"): if existsEnv("XDG_CONFIG_HOME"): oldConfigDir = some(getEnv("XDG_CONFIG_HOME")) putEnv("XDG_CONFIG_HOME", "/dev/null") configDirChanged = true viewable App: hooks: build: # Reset the user's XDG_CONFIG_HOME variable back to what it was before if configDirChanged == true: if oldConfigDir.isNone(): delEnv("XDG_CONFIG_HOME") else: putEnv("XDG_CONFIG_HOME", get(oldConfigDir)) method view(app: AppState): Widget = result = gui: Window: title = "TROMjaro Welcome" defaultSize = (900, 600) iconName = "tromjaro-welcome-app" Box(orient = OrientY, margin = 20, spacing = 15): Label: useMarkup = true text = fmt"{pages[pageNumber].title}" for line in splitLines(pages[pageNumber].description): Label {.expand: false.}: useMarkup = true text = fmt"{line}" if pages[pageNumber].image != "": Box(margin = 20): Picture: Pixbuf = loadPixbuf(picturesDir / pages[pageNumber].image) Button {.vAlign: AlignCenter, hAlign: AlignCenter.}: text = pages[pageNumber].buttonText style = ButtonSuggested proc clicked() = let command: seq[string] = pages[pageNumber].buttonCommand if command.len() == 0: inc pageNumber return runBackgroundCommand(command) if pageNumber > 0: Box(orient = OrientX): Button {.hAlign: AlignStart, vAlign: AlignCenter.}: text = "Previous" proc clicked() = dec pageNumber if pageNumber == pages.high(): Button {.hAlign: AlignEnd, vAlign: AlignCenter.}: text = "Finish" proc clicked() = app.closeWindow() else: Button {.hAlign: AlignEnd, vAlign: AlignCenter.}: text = "Next" proc clicked() = inc pageNumber Box(orient = OrientX, spacing = 12): Label {.hAlign: AlignEnd.}: text = "Open this Welcome Screen on every boot" Switch {.vAlign: AlignCenter, hAlign: AlignStart.}: state = if fileExists(autostartSymlinkPath): true else: false proc changed(state: bool) = if state == true: if not symlinkExists(autostartSymlinkPath): try: createSymlink(desktopFilePath, autostartSymlinkPath) except: echo "Failed to create symlink!" else: if not tryRemoveFile(autostartSymlinkPath): echo "Failed to remove symlink!" brew(applicationID, gui(App()))