Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Implement new window layouter #7

Closed
wants to merge 4 commits into from
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 37 additions & 16 deletions src/daemon/main.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
#![deny(clippy::implicit_return)]
#![allow(clippy::needless_return)]
use std::cmp::max;
use std::{
ffi::c_void,
io, mem,
Expand Down Expand Up @@ -42,6 +43,8 @@ use windows::{

mod workspace;

const ASPECT_RATIO_ADJUSTMENT: f64 = 0.0;

/// Daemon CLI. Manages client consoles and user input
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
Expand Down Expand Up @@ -70,16 +73,13 @@ impl Daemon {
disable_processed_input_mode();

let workspace_area = workspace::get_workspace_area(workspace::Scaling::Logical);
let number_of_consoles = self.hosts.len() as i32;
let number_of_consoles = self.hosts.len() as i32 + 1;

// The daemon console can be treated as a client console when it comes
// to figuring out where to put it on the screen.
// TODO: the daemon console should always be on the bottom left
let (x, y, width, height) = determine_client_spacial_attributes(
number_of_consoles,
number_of_consoles,
&workspace_area,
);
let (x, y, width, height) =
determine_client_spatial_attributes(0, number_of_consoles, &workspace_area);
arrange_daemon_console(x, y, width, height);

let _client_console_window_handles = launch_clients(
Expand Down Expand Up @@ -154,18 +154,39 @@ impl Daemon {
}
}

fn determine_client_spacial_attributes(
fn determine_client_spatial_attributes(
index: i32,
number_of_consoles: i32,
workspace_area: &workspace::WorkspaceArea,
) -> (i32, i32, i32, i32) {
// FIXME: if number of hosts is < 3 or =5 determination of client spacial attributes falls apart
let height_width_ratio = workspace_area.height as f64 / workspace_area.width as f64;
let number_of_columns = (number_of_consoles as f64 / height_width_ratio).sqrt() as i32;
let console_width = workspace_area.width / number_of_columns;
let console_height = (console_width as f64 * height_width_ratio) as i32;
let x = workspace_area.width / number_of_columns * (index % number_of_columns);
let y = index / number_of_columns * console_height;
let aspect_ratio = workspace_area.width as f64 / workspace_area.height as f64;

let grid_columns = max(
((number_of_consoles as f64).sqrt() * (aspect_ratio + ASPECT_RATIO_ADJUSTMENT)) as i32,
1,
);
let grid_rows = max(
(number_of_consoles as f64 / grid_columns as f64).ceil() as i32,
1,
);

let grid_column_index = index % grid_columns;
let grid_row_index = index / grid_columns;

let is_last_row = grid_row_index == grid_rows - 1;
let last_row_console_count = number_of_consoles % grid_columns;

let console_width = if is_last_row && last_row_console_count != 0 {
workspace_area.width / last_row_console_count
} else {
workspace_area.width / grid_columns
};

let console_height = workspace_area.height / grid_rows;

let x = grid_column_index * console_width;
let y = grid_row_index * console_height;

return (
workspace_area.x + x,
workspace_area.y + y,
Expand Down Expand Up @@ -246,8 +267,8 @@ async fn launch_clients(
let _username = username.clone();
let process_ids_arc = Arc::clone(&process_ids);
let future = tokio::spawn(async move {
let (x, y, width, height) = determine_client_spacial_attributes(
index as i32,
let (x, y, width, height) = determine_client_spatial_attributes(
index as i32 + 1,
number_of_consoles,
&workspace_area,
);
Expand Down