What is it?

I was tired of digging for folders and files, so I made a shortcut app.
You can do this with Windows shortcuts or tools like Rainmeter, but they’re too broad for my use.
So I rebuilt it with Flutter desktop.



Structure

Goal: a floating panel with program launches, site shortcuts, and folder shortcuts.
Windows shortcuts are enough, but mine kept disappearing when I cleaned the desktop.
So I made this.

✶ No input UI. Edit the accompanying json file instead.
✶ Fixed width. Height grows with the number of bookmarks.
✶ Use icons, but show a hover tooltip so I remember what each one is.



Package

Flutter Windows has matured enough to build an exe without much trouble.
Packages I used:



window manager

I picked the first package on pub.dev for controlling the window.
Not sure if it’s the best, but it does what I need.

init

 // Initialize the window manager
  await windowManager.ensureInitialized();

window manager

  double windowWidth = 240;
  double windowHeight = 340 + addsize();

  double posX = 1920 - windowWidth - 20; 
  double posY = 1080 - windowHeight - 50; 

  WindowOptions windowOptions = WindowOptions(
    size: Size(windowWidth, windowHeight),
    alwaysOnTop: true,
    minimumSize: Size(windowWidth, windowHeight),
    maximumSize: Size(windowWidth, windowHeight),
  );

window manager

  windowManager.waitUntilReadyToShow(windowOptions, () async {
    windowManager.setPosition(Offset(posX, posY));
    windowManager.setHasShadow(false);
    windowManager.setMaximizable(false);
    windowManager.setMinimizable(false);
    // windowManager.setClosable(false);
    windowManager.setPreventClose(true);
    windowManager.addListener(MyWindowListener());

    await windowManager.show();
    await windowManager.focus();
  });


flutter_acrylic

I wanted some visual style, so I used acrylic.
But the window border kept misaligning by ~5px, not sure if it’s Windows 10 or me.
So I ended up using transparent only.
It looked fine on Windows 10, but Windows 11 doesn’t seem to like it.

effect

  await Window.initialize();

  await Window.setEffect(
    effect: WindowEffect.acrylic,
    // color: fc.Colors.black.withAlpha(200),
    dark: true,
  );


system_tray

Because the window is always on top, it can get in the way.
I used system_tray to minimize it into the tray when needed.
The sample code works out of the box.



Result

Using a json file for bookmarks was convenient at first.
But once the list grows and changes often, it gets annoying.
I’ll need a settings page eventually.

img



end.