Giter VIP home page Giter VIP logo

exquisitew's Introduction

ExquisiteW

ExquisiteW is a customizable GUI driven window manager utility for Windows 10 that lets you create custom window layouts and then quickly move and resize windows to zones using a GUI or keyboard shortcuts.

After layouts have been configured, and ExquisiteW is running, you can use ExquisiteW to move and resize the window under the mouse to a specific zones in one of 2 ways:

  1. Activate the ExquisiteW GUI (using your configured trigger) and then either:
    • Click on the zone you want
    • Press the zone's activator key
  2. Press the global keyboard shortcut you have defined for the zone

GUI with multiple monitors

ExquisiteW was inspired by Exquisite and the beta version was written in AutoHotKey by Malcev.

Table of Contents

Features

  • Custom layouts (currently through a JSON configuration file)
  • GUI for moving + resizing the window under the mouse
  • Customizable keyboard shortcuts
  • Multi-monitor support to move + resize a window to another monitor from the GUI

How It Works

  • ExquisiteW uses layouts to define a set of zones
  • You can have multiple layouts
    • A layout represents the usable area of a monitor (the taskbar is automatically excluded)
    • A layout is a 12 row by 12 column representation of a a monitor (for the same reason as the inspiration for ExquisiteW)
  • Each layout can have multiple zones
    • A zone represents the location and area of the monitor where you want a window to be moved and resized to

layout example

Getting It

Requirements

* I only have Windows 10 machines. I do not have access to Windows 11 (nor do I really want it). If you have Windows 11 and are willing to help me test ExquisiteW, please contact me.

Installation

  1. Go to https://github.com/imthenachoman/ExquisiteW/releases
  2. Download the latest release ZIP file
  3. Extract the ZIP file to wherever you like/want
  4. Edit settings.ini and layouts.json to your liking
  5. Run/execute ExquisiteW.ahk

You'll get a notification letting you know it's running, along with what ExquisiteW's GUI activation trigger is.

started notification

Using It

  • You can customize the global shortcut/trigger used to show ExquisiteW's GUI
  • ExquisiteW's GUI will show you all of your configured layouts
    • Each layout will have 1+ buttons to represent each zone in that layout
    • Each button/zone will be visually placed in the layout to represent the area of the monitor the window will be moved and resized to
    • Clicking on a zone, or pressing the zone's activator key, will move and resize the window that was under the mouse when you activated the GUI
    • If you have multiple monitors, ExquisiteW's GUI will let you select the monitor you want to move and resize the window to
  • You can configure a global shortcut/trigger for a specific zone
    • This will let you move and resize the window under the mouse without opening ExquisiteW's GUI

Configuration File Specification

There are two configuration files used by ExquisiteW:

settings.ini

This is a standard INI file with some global, non-layout specific settings.

Section General

Setting Valid Options Default Description
Update Check Frequency whole number greater than -1 24 How often to check for updates, in hours:
  • -1 = check once at start up
  • 0 = do not check for updates
  • X = check every X hours

Section Layout Selector

Setting Valid Options Default Description
Close After Selection 1 or 0 1
  • 0 = leave ExquisiteW's GUI open after you select a zone
  • 1 = close it
Opacity whole number from 0 to 100 100
  • 0 = make ExquisiteW's GUI completely transparent
  • ... = percent transparent
  • 100 = completely opaque
Trigger AHK HotKey ^!d (ctrl + alt + d) The global keyboard shortcut to show ExquisiteW's GUI when the mouse is over a window/application that can be resized
Number Of Layouts In A Row whole number greater than 3 4 Number of layouts per row in ExquisiteW's GUI; 3 is the minimum
Layout Box Width In Pixels whole number greater than 50 200 Width of each layout (in pixels) in ExquisiteW's GUI; 50 is the minimum
Layout Box Height In Pixels whole number greater than 50 125 Height of each layout (in pixels) in ExquisiteW's GUI; 50 is the minimum

layouts.json

layouts.json is a JSON formatted configuration file where layouts are defined. The structure of layouts.json is below. See layouts.json for a real example.

{
    "windowPaddingInPixels" : number,    //optional
    "padAtMonitorEdges"     : bool,      //optional
    "layouts"               : [
        {
            "name"                  : string,
            "windowPaddingInPixels" : number,    //optional
            "padAtMonitorEdges"     : bool,      //optional
            "zones" : [
                {
                    "topLeftRowNumber"      : 0-12,
                    "topLeftColumnNumber"   : 0-12,
                    "numberOfRows"          : 1-12,
                    "numberOfColumns"       : 1-12,
                    "activator"             : single letter,                 //optional
                    "hotkey"                : AutoHotKey HotKey,             //optional
                    "windowPaddingInPixels" : whole number greater than 1,   //optional
                    "padAtMonitorEdges"     : bool                           //optional
                },
                {...}
            ]
        },
        {...}
    ]
}
Property Valid Options Description
windowPaddingInPixels number Global window padding for all zones in all layouts (see windowPaddingInPixels)
padAtMonitorEdges true or false Global setting for if padding should be added when a window is at the edge of the monitor (see padAtMonitorEdges)
layouts * array of layouts All of the layouts
layouts[].name * string Name of the layout to show in the GUI
layouts[].windowPaddingInPixels number Window padding for all of zones in this layout (see windowPaddingInPixels)
layouts[].padAtMonitorEdges number Setting for this layout for if padding should be added when a window is at the edge of the monitor (see padAtMonitorEdges)
layouts[].zones * array of zones All of the zones for this layout
layouts[].zones[].topLeftRowNumber * 0 - 11 Row number of the top left corner of the window (see How It Works)
layouts[].zones[].topLeftColumnNumber * 0 - 11 Column number of the top left corner of the window (see How It Works)
layouts[].zones[].numberOfRows * 1 - 12 Height of the window, in number of rows (see How It Works)
layouts[].zones[].numberOfColumns * 1 - 12 Width of the window, in number of columns (see How It Works)
layouts[].zones[].activator letter Single letter to activate a zone/button in the GUI
layouts[].zones[].hotkey AHK HotKey Global shortcut to activate a zone without the GUI (see layouts[].zones[].hotkey)
layouts[].zones[].windowPaddingInPixels number Window padding for this zone in this layout (see windowPaddingInPixels)
layouts[].zones[].padAtMonitorEdges number Setting for this zone in this layout for if padding should be added when a window is at the edge of the monitor (see padAtMonitorEdges)

* required properties

windowPaddingInPixels

  • You can add a custom padding (in pixels) around a window when it is moved and resized
  • Window padding can be set in 3 places:
    • globally, for all layouts, by setting the windowPaddingInPixels property at the root of layouts.json
    • for all zones of a specific layout by setting the windowPaddingInPixels property for a layout
    • for a specific zone by setting the windowPaddingInPixels property of a specific zone
  • If windowPaddingInPixels is not set for a zone, it will use the value of windowPaddingInPixels for the layout
  • If windowPaddingInPixels is not set for a layout, it will use the global value of windowPaddingInPixels

padAtMonitorEdges

  • If you have set windowPaddingInPixels then padding will be added to all four sides of the window
  • If the window is at the edge of the monitor, you may not want padding added to that edge
  • This lets you disable padding at the edge
  • This setting can be set in 3 places:
    • globally, for all layouts, by setting the padAtMonitorEdges property at the root of layouts.json
    • for all zones of a specific layout by setting the padAtMonitorEdges property for a layout
    • for a specific zone by setting the padAtMonitorEdges property of a specific zone
  • If padAtMonitorEdges is not set for a zone, it will use the value of padAtMonitorEdges for the layout
  • If padAtMonitorEdges is not set for a layout, it will use the global value of padAtMonitorEdges

layouts[].zones[].hotkey

  • This is an AutoHotKey HotKey
  • If set, a global keyboard shortcut will be created and associated to the zone
  • When the ExquisiteW GUI is not active, and this keyboard shortcut is used, the current window under the mouse will be moved and resized according to the zone's configuration

AutoHotKey Hotkeys

Since ExquisiteW is written in AutoHotKey, it uses AHK's structure for defining hotkeys. You can read about it and see examples at https://www.autohotkey.com/docs/v2/Hotkeys.htm.

Limitations And Known Bugs

Issue Type Details
No support for administrator windows limitation ExquisiteW cannot move and resize windows running as an administrator.
Not monitor/desktop change aware limitation ExquisiteW does not know when your monitor arrangement/configuration changes, or your desktop changes. You will need to manually reload ExquisiteW when you make those kinds of changes.

Support / Help

You can get support/help in one of two ways:

Inspiration

  • My daily driver is Linux (Debian + KDE Plasma)
  • Exquisite (without the W) is a window manager for KDE written by qewer33
  • It is the best window manager I have ever seen
  • I still use Windows 10 on some machines
  • Windows 10 built-in window snapping is adequate
  • FancyZones (part of PowerToys) is awesome but you have to drag/drop windows and that's a lot of mouse travel (especially on an ultrawide monitor)

So I* decided to build a Windows clone of Exquisite.

Disclaimer: I didn't know AutoHotKey when I started. I reached out to Malcev who created the beta version for me. I took his's code -- with his permission -- and ran with it. (In the interest of transprency, I paid him for his work.)

Credits

exquisitew's People

Contributors

imthenachoman avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar

Forkers

stares

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.