mirror of
https://github.com/duncs/clusterssh.git
synced 2025-07-03 01:43:25 +00:00
Take into account WM decorations when tiling
Not all window managers support this but they won't be any worse off than they are now.
This commit is contained in:
parent
c83e9e785f
commit
b7b7ca70ac
3 changed files with 47 additions and 2 deletions
|
@ -27,6 +27,7 @@ require Tk::Dialog;
|
|||
require Tk::LabEntry;
|
||||
use X11::Protocol;
|
||||
use X11::Protocol::Constants qw/ Shift Mod5 ShiftMask /;
|
||||
use X11::Protocol::WM;
|
||||
use vars qw/ %keysymtocode %keycodetosym /;
|
||||
use X11::Keysyms '%keysymtocode', 'MISCELLANY', 'XKB_KEYS', '3270', 'LATIN1',
|
||||
'LATIN2', 'LATIN3', 'LATIN4', 'KATAKANA', 'ARABIC', 'CYRILLIC', 'GREEK',
|
||||
|
@ -887,6 +888,17 @@ sub show_console() {
|
|||
return $self;
|
||||
}
|
||||
|
||||
# set the first argument to the second if the first is undefined
|
||||
# the equivalent of //= but works in older Perls (e.g. 5.8)
|
||||
sub slash_slash_equal(\$$) {
|
||||
|
||||
if (! defined(${$_[0]})) {
|
||||
${$_[0]} = $_[1];
|
||||
}
|
||||
|
||||
return ${$_[0]};
|
||||
}
|
||||
|
||||
# leave function def open here so we can be flexible in how it's called
|
||||
sub retile_hosts {
|
||||
my ( $self, $force ) = @_;
|
||||
|
@ -986,6 +998,28 @@ sub retile_hosts {
|
|||
|
||||
$self->config->dump("noexit") if ( $self->options->debug > 1 );
|
||||
|
||||
# now find the size of the window decorations
|
||||
if (! exists($self->config->{internal_terminal_wm_decoration_left})) {
|
||||
|
||||
# use the first window as exemplary
|
||||
my($wid) = $servers{(keys(%servers))[0]}{wid};
|
||||
|
||||
if (defined($wid)) {
|
||||
# get the WM decoration sizes
|
||||
($self->config->{internal_terminal_wm_decoration_left},
|
||||
$self->config->{internal_terminal_wm_decoration_right},
|
||||
$self->config->{internal_terminal_wm_decoration_top},
|
||||
$self->config->{internal_terminal_wm_decoration_bottom}) =
|
||||
X11::Protocol::WM::get_net_frame_extents($xdisplay, $wid);
|
||||
}
|
||||
|
||||
# in case the WM call failed we set some defaults
|
||||
slash_slash_equal($self->config->{internal_terminal_wm_decoration_left}, 0);
|
||||
slash_slash_equal($self->config->{internal_terminal_wm_decoration_right}, 0);
|
||||
slash_slash_equal($self->config->{internal_terminal_wm_decoration_top}, 0);
|
||||
slash_slash_equal($self->config->{internal_terminal_wm_decoration_bottom}, 0);
|
||||
}
|
||||
|
||||
# now we have the info, plot first window position
|
||||
my @hosts;
|
||||
my ( $current_x, $current_y, $current_row, $current_col ) = 0;
|
||||
|
@ -1049,14 +1083,18 @@ sub retile_hosts {
|
|||
$current_x
|
||||
+= $self->config->{terminal_reserve_left}
|
||||
+ $self->config->{terminal_reserve_right}
|
||||
+ $self->config->{internal_terminal_width};
|
||||
+ $self->config->{internal_terminal_width}
|
||||
+ $self->config->{internal_terminal_wm_decoration_left}
|
||||
+ $self->config->{internal_terminal_wm_decoration_right};
|
||||
|
||||
$current_col += 1;
|
||||
if ( $current_col == $self->config->{internal_columns} ) {
|
||||
$current_y
|
||||
+= $self->config->{terminal_reserve_top}
|
||||
+ $self->config->{terminal_reserve_bottom}
|
||||
+ $self->config->{internal_terminal_height};
|
||||
+ $self->config->{internal_terminal_height}
|
||||
+ $self->config->{internal_terminal_wm_decoration_top}
|
||||
+ $self->config->{internal_terminal_wm_decoration_bottom};
|
||||
$current_x = $self->config->{screen_reserve_left}
|
||||
+ $self->config->{terminal_reserve_left};
|
||||
$current_row++;
|
||||
|
@ -2239,6 +2277,11 @@ the code until this time.
|
|||
|
||||
=item resolve_names
|
||||
|
||||
=item slash_slash_equal
|
||||
|
||||
An implementation of the //= operator that works on older Perls.
|
||||
slash_slash_equal($a, 0) is equivalent to $a //= 0
|
||||
|
||||
=item retile_hosts
|
||||
|
||||
=item run
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue