A graphical application to enhance user experience with Ubuntu on WSL during the distro installation process.

Ubuntu WSL Splash

TODO: Place a CI badge here.

TODO: Put a nice screenshot here when we get one.

A graphical application to enhance user experience with Ubuntu on WSL during the distro installation process.

Getting Started

TODO: Add some nice content here.

Contributing

See our contributor guidelines.

License

The Ubuntu Desktop Installer is licensed under the GNU General Public License version 3.

Comments
  • Added LogView widget

    Added LogView widget

    • Will be used to display what would be printed to the launcher console.
    • Shamelessly copied from github.com/jpnurmi/ubuntu-desktop-installer.

    It is the black component of the screenshot below: image

  • Post WM_CUSTOM_CLOSE instead of calling DestroyWindow()

    Post WM_CUSTOM_CLOSE instead of calling DestroyWindow()

    FlutterWindow parent class has some business logic to perform on close (see the code snippet below). Calling DistroyWindow() is part of that. Doing as previously done (calling DestroyWindow() as part of the method channel handler) may skip part of that logic. That could be a cause for the access violation we noticed in the dumps if some other part of the framework attempts to dereference any of the structures cleaned up during the potentially skipped handler.

    PostMessage, on the other, won't wait the message to be handled, thus the framework has the chance to do whatever it needs to. Posting a custom message allows the WndProc to call DestroyWindow, avoiding any possibility of ownership issues.

    void Win32Window::Destroy() {
      OnDestroy();
    
      if (window_handle_) {
        DestroyWindow(window_handle_);
        window_handle_ = nullptr;
      }
      if (g_active_window_count == 0) {
        WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
      }
    }
    
    
    LRESULT
    Win32Window::MessageHandler(HWND hwnd,
                                UINT const message,
                                WPARAM const wparam,
                                LPARAM const lparam) noexcept {
      switch (message) {
        case WM_DESTROY:
          window_handle_ = nullptr;
          Destroy();
          if (quit_on_close_) {
            PostQuitMessage(0);
          }
          return 0;
    
    ...
    
  • Matches the design team output

    Matches the design team output

    This PR updates the slide show contents to match the output from the design team.

    The window has been scaled a little bit and forced centering the user's main display as a partial workaround to ensure the OOBE will not catch user's attention before the right time. There is another side of this work on WSL launcher itself to find and control the visibility of the OOBE window as the main way of reaching this aim, so the window resizing and positioning is just a secondary measure.

    Design screenshots and text can be found in the document: https://docs.google.com/document/d/16JdUzXox6bYDrsrrDvZ66LJskhy6qBxVyWBh2J7RobM/preview

    This is how it looks now:

    https://user-images.githubusercontent.com/11138291/161046142-b61c505d-6e65-449c-bfb1-822ffc8e6cdf.mp4

  • Integrating the pieces

    Integrating the pieces

    It turns out that due the simplicity of this app I could keep the state management in one single top-level widget. Thus no need for the provider package.

    AppHome handles the InstallerStateController, making sure it's disposed in the end and reacts to its state change thru the method _buildStatusTile() which builds the pieces of the ListTile that are affected by the state changes.

    I didn't make it stateless because I needed to ensure the controller's dispose() method is called. I could have wrapped it in a Provider, but that would be the single reason why I'd bring that dependency to this project. So, to my understanding that is the perfect use case for a stateful widget, even though I don't need to call setState()

  • Stdin transformer to fix broken lines

    Stdin transformer to fix broken lines

    By design this project is meant to display in the LogView widget the contents that would be printed in the launcher process stdout. That is achieved by having the launcher redirecting its output to a pipe whose read end is inherited as the stdin of this Flutter app.

    When building the proof of concept I noticed a fairly consistent behavior of stdin.transform(systemEncoding.decoder) stream interpreting line breaks just after the first character. I did some investigation on the C++ side, but nothing was conclusive enough, so I preferred to perform this quick fix and investigate further later on, since I don't really have a clue about what causes that behavior at this point after the first investigation steps being done.

    The fix implemented in the POC was just adding some more state to an already stateful widget. The need for state is what motivates writting a transformer class instead of just a function.

    As demonstrated in the test file it is meant to be passed straight into stdin.transform().

    void _transformerAssert(
        {required Iterable<String> input, required Iterable<String> output}) {
      final fakeStdin = StreamController<List<int>>();
      final stringStdin = Stream.fromIterable(input);
      fakeStdin.addStream(stringStdin.transform(systemEncoding.encoder));
    
      final resultStream = fakeStdin.stream.transform(StdinTransformer());
    
      expect(resultStream, emitsInOrder(output));
    }
    
  • Enables producing a full PDB out of the splash app

    Enables producing a full PDB out of the splash app

    A bare bones Flutter app on Windows is made of the flutter_windows.dll (provided by the framework) and the application runner executable compiled with Visual Studio build tools, with the build system (aka solutions and vcxproj files) generated by a set of CMakelists.txt files.

    Program debug database is supplied for the dll, but not for the application runner. Enabling the build system to generate it requires one-line addition to enable it, per instructions found in this comment on Flutter repository.

  • Reduces error notifications

    Reduces error notifications

    The setup GUI is more verbose nowadays. Error messages are shown even when it heals itself. This regex change makes the splash react only to errors coming from the launcher.

    Here is an example that would cause the InstallerStateController to react as if an irrecoverable error has happened. Notice that after a few SocketExceptions we finally get a connection. That's a normal behavior due the late server startup. The regex match is due "(OS Error: " part of the log.

    2022-07-27 12:47:45.733412 INFO subiquity_server: Waiting server up to 30 seconds
    2022-07-27 12:47:45.734439 ERROR subiquity_server: SocketException: Connection failed (OS Error: No such file or directory, errno = 2), address = /run/subiquity/socket, port = 0
    2022-07-27 12:47:46.736066 ERROR subiquity_server: SocketException: Connection failed (OS Error: No such file or directory, errno = 2), address = /run/subiquity/socket, port = 0
    2022-07-27 12:47:47.737158 ERROR subiquity_server: SocketException: Connection failed (OS Error: No such file or directory, errno = 2), address = /run/subiquity/socket, port = 0
    2022-07-27 12:47:48.740348 INFO subiquity_client: Opening socket to Endpoint(/run/subiquity/socket )
    
  • Make the custom exit dialog non-dismissible

    Make the custom exit dialog non-dismissible

    https://github.com/ubuntu/WSL/issues/177 documents the possibility of dismissing the dialog that notifies the user when its time to leave the slide show and interact with the OOBE, halting the installation. Making the dialog non-dismissible gives time for the user to acknowledge the notification and automatically close out in case it doesn't react on time, moving the installation forward.

    This closes https://github.com/ubuntu/WSL/issues/177 while we prepare the redesign that will remove the dialog in favor of something smoother.

  • Translations into pt_BR

    Translations into pt_BR

    Portugal variant requires more skilled translator. Brazilian one is being handled here, but the arb workflow wouldn't accept it without the more general pt version.

  • Rename assets and fix missing 'u'

    Rename assets and fix missing 'u'

    When attempted to package the Flutter build artifacts using Visual Studio, MSBuild failed to understand the '%20' in asset files names, added by Flutter because the original assets have spaces in their file names. Removing the spaces in the original files solve the issue.

    Also, this fixes a typo causing a missing 'u' in the 'Ubuntu' name, as you may recall 😅

  • Enables custom messaging for hiding the window

    Enables custom messaging for hiding the window

    The state in which the WSL launcher application was expected to close the splash actually works best by hiding the splash instead.

    This PR changes the semantic and behavior of the message WM_USER+7 from custom closing to custom hiding (thus the renaming) and adds another message for the actual close, which doesn't require method calls from the higher level API.

  • gui not working well from select your language when graphic card is radeon (maybe)

    gui not working well from select your language when graphic card is radeon (maybe)

    My computers that has nvidia gpu work well, but any computer has radeon graphic card, is screened by half triangle section color inversed.

    image

    When I close the window, I initialize with only root user.

    Can I install ubuntu without splash?

Make your Pop!_OS (Ubuntu Linux) shortcut key experience more like Mac OS

Meta Mac Enables a Mac OS-like shortcut key experience on Pop!_OS (and most Ubuntu-based Linux distros). Installation Download or git clone this repos

Jun 28, 2022
Homefront: The Revolution mod to restore and enhance the Timesplitters 2 port.
Homefront: The Revolution mod to restore and enhance the Timesplitters 2 port.

Introduction What Is TS2 Redux? TS2 Redux is a fan-made project which aims to fix and enhance the port of TimeSplitters 2 (TS2) contained in the 2016

Sep 15, 2022
Slackware for Windows Subsystem for Linux (WSL)
 Slackware for Windows Subsystem for Linux (WSL)

WSLackware: Slackware on Windows! Slackware for Windows Subsystem for Linux (WSL) WSLackware is an unofficial version of Slackware for Windows Subsyst

Sep 19, 2022
Pardus WSL package

PardusWSL https://dogukan.dev/pardus-wsl-kurulumu.html Pardus on WSL (Windows 10 FCU or later) based on DistroLauncher ?? Requirements Windows 10 1709

Mar 7, 2022
This repository provides you the material of installation the Catalana Hackintosh

VivoBook Asus X542UQ laptop Catalina 10.15.7 Hackintosh This repository provides you the material of installation the Catalana Hackintosh with Opencor

Oct 9, 2021
Ziggified GLFW bindings with 100% API coverage, zero-fuss installation, cross compilation, and more.

mach/glfw - Ziggified GLFW bindings Ziggified GLFW bindings that Mach engine uses, with 100% API coverage, zero-fuss installation, cross compilation,

Sep 27, 2022
PHP Encoder, protect PHP scripts in PHP 8 and PHP 7, High Performance, Compitable with X86_64, MIPS, ARM platform and Ubuntu/Centos/OpenWRT system.

What's FRICC2? FRICC2 is a PHP Script encryption tool. When you are developing a commercial software using PHP, the script can be distributed as encry

Oct 2, 2022
Deepin Wine for Ubuntu/Debian
Deepin Wine for Ubuntu/Debian

Deepin wine for Ubuntu and Debian 一、项目介绍 Deepin-wine 环境的 Ubuntu/Debian 移植版 使用deepin原版二进制文件,解决依赖问题 仅供个人研究学习使用 刚刚适配debian,可能在安装或运行上还存在问题,欢迎反馈! Gitee用户遇到

Sep 28, 2022
Yet another matrix client. Click packaging for locally running on Ubuntu Touch

Cinny Click Packaging Cinny is a Matrix client focusing primarily on simple, elegant and secure interface. License Cinny source package licensed under

Jun 24, 2022
Process Ghosting - a PE injection technique, similar to Process Doppelgänging, but using a delete-pending file instead of a transacted file
Process Ghosting - a PE injection technique, similar to Process Doppelgänging, but using a delete-pending file instead of a transacted file

Process Ghosting This is my implementation of the technique presented by Gabriel Landau: https://www.elastic.co/blog/process-ghosting-a-new-executable

Sep 27, 2022
EarlyBird process hollowing technique (BOF) - Spawns a process in a suspended state, inject shellcode, hijack main thread with APC, and execute shellcode
EarlyBird process hollowing technique (BOF) - Spawns a process in a suspended state, inject shellcode, hijack main thread with APC, and execute shellcode

HOLLOW - Cobalt Strike BOF Authors: Bobby Cooke (@0xBoku) Justin Hamilton (@JTHam0) Octavio Paguaga (@OakTree__) Matt Kingstone (@n00bRage) Beacon Obj

Sep 28, 2022
A refactored Proof-of-concept originally developed in 2017 to print all function calls with their arguments data types and values using Ptrace during program execution.

print-function-args-debugger A refactored Proof-of-concept originally developed in 2017 to print all function calls with their arguments data types an

Jun 17, 2022
A rosbag2 recorder node that backs up split files to an external location during recording

System Data Recorder (SDR) A lifecycle node and executable for recording topic data to a rosbag2 bag, while simultaneously copying the split bag files

Aug 31, 2022
An App created during the hackaTum 2021
An App created during the hackaTum 2021

FlowingBlue A project created in 36 hours for the HackaTUM Hackathon. Created By Mohamed Dhia Nouri: @theKooker Dylan Alyandi: @WoodRawr Alexander Hof

Nov 21, 2021
VEX v5 Pro program that records driver movements and plays them back during the autonomous period.

Autonomous Recorder This code was written for team 5588R, but it can be easily modified to work with your team's robot. Notes Code isn't fully finishe

Jun 21, 2022
Contains a sudoku solver - OCR. Project done with classmates during third semester at EPITA.

sudokUwU sudokUwU is a sudoku solver made by 4 students at EPITA. This project is a mandatory work from S3 cycle! The Team Johan Tran Adrian Grillet V

May 5, 2022
This repo contains information about EDRs that can be useful during red team exercise.

EDRs This repo contains information about EDRs that can be useful during red team exercise. patch_syscall_dynamically64.c This proof-of-concept is res

Sep 24, 2022
C parsing, semantic analys, generate a graph from a source code. An educational project during my third year of Computer Science Licence.

Pour compiler le programme, il suffit d'exécuter compiler.sh avec la commande "./compiler.sh" en se trouvant dans le dossier racine du projet. Un fich

Feb 3, 2022
OffensivePH - use old Process Hacker driver to bypass several user-mode access controls

offensiveph OffensivePH is a post-exploitation tool that utilizes an old Process Hacker driver to bypass several user-mode access controls. Usage Comp

Sep 23, 2022