baskerville / bspwm

A tiling window manager based on binary space partitioning
BSD 2-Clause "Simplified" License
7.77k stars 415 forks source link

Sticky Tile/Virtual Monitors #85

Closed Stebalien closed 8 years ago

Stebalien commented 10 years ago

First off, these are more way out there proposals than immediate feature requests.


It would be kind of nice to have a "sticky" top level leaf. That is, a frame with a fixed location and size that contains all sticky windows. This would be extremely useful for chat windows etc.

Switching desktops: switch_desktops

Resizing (no change but preserved across desktops): resize

Move within frame: move

Move out of frame (unsticky): unsticky

Initialize frame: sticky

The actual location of the sticky frame would probably have to be defined through a monitor specific setting.


Another possible (more general but more complex solution) is a "virtual monitor" system. That is, a monitor could be broken up into any number of virtual monitors in a tree structure. These virtual monitors would all contain their own sets of virtual desktops. However, this is probably unnecessarily complicated.

baskerville commented 10 years ago

I think I get the general idea: the sticky state shall propagates upward and I shall generalize the transfer_node function to handle internal (i.e. non-leaf) nodes.

A few remarks:

Stebalien commented 10 years ago

To give you a general idea of what I'm looking for, I currently do something like this by creating a 250px wide "gutter" on the right hand side of my screen (using bspc config right_padding 250), float the sticky windows, and then manually tile them in the gutter.

  • There's no top level leaves: non-leaf nodes are internal nodes.

Sorry, top level "branch".

  • When I read this: a frame with a fixed location and size it seems to me like you're trying to make a subtree of tiled windows behave like a floating window.

Not precisely floating. Basically, I want to split the monitor in two. One half holds the normal desktops and the other a set of tiled sticky windows:

               MonitorA
                  |
       +---------------------+
       |                     |
       v                     |
    Desktops                 |
       |                     |
 ----+-+-+-----+             |
 |   |   |     |             |
 v   v   v     v             v
One Two Three Four      Sticky Tile

+-------+--------+                       +-------+--------+
|       |        |                       |       |        |
| One   | Sticky | --------------------> | Two   | Sticky |
|       | Frame  |  bspc desktop -f Two  |       | Frame  |
+-------+--------+                       +-------+--------+
  • I'm not sure what the following sentence means: Resizing (no change but preserved across desktops).

Resizing the sticky "tile" would be just like resizing a normal fence.

  • The screenshot for Move out of frame (unsticky) seems wrong?

It is. Sorry, I don't have the originals anymore. Basically, moving a window out of this special frame would move it into the normal desktop (make it not sticky). Moving a window Into the sticky frame would make it sticky.

  • I don't get Initialize frame.

You're right, that is extremely unclear. Basically, my idea was that a zero-width sticky frame would always exist. Moving a window into it would make it visible. That is, given a sticky frame on the right and a window up against the right edge, moving the window to the right again would make it sticky.

Also, two screenshots (the sticky windows are intentionally misaligned to make it clear that they are actually floating): screen-2013-12-18-180947 screen-2013-12-18-180953

smlb commented 10 years ago

It would be a really nice feature.

windelicato commented 10 years ago

You could generalize this into something like HLWM's frames. A virtual window container that can have states similar to that of windows (in this case, "sticky"). To recreate this chat window example, you could create a frame, mark it as sticky, and move your chat clients into it. This would be extremely powerful.

suptimal commented 8 years ago

u could use the current git version:

bspc wm -a <name> WxH+X+Y adds a new monitor.

so on a 1920x1080 real monitor u could add 2 virtual monitors 1600x1080+0+0 and 320x1080+1600+0.

neeasade commented 8 years ago

@blendi-93 my impression was the goal of this was something like what @windelicato mentioned, a maybe generic way to group/frame leaf nodes together and treat them as a singular leaf node.

edit: maybe I should just play with with the monitor commands more and see possibilities there.

baskerville commented 8 years ago

As of eb07d2f, non-leaf nodes can be flagged as sticky…

But @blendi-93's suggestion probably better fulfills the original intent.

Stebalien commented 8 years ago

Thanks!

dieggsy commented 5 years ago

@Stebalien how exactly are you achieving the original desired effect? i'm having trouble following... in particular, i'd like a tiled sticky node to keep its size across desktops.

Stebalien commented 5 years ago

Unfortunately, I've become enlightened in the church of Emacs and am now an EXWM user. I can't remember how I got this working.