From d9d6d46c3ce3b716dc1cc8e0eb6a16b5c1cd630a Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Sun, 29 Sep 2024 17:43:45 +0900 Subject: [PATCH 01/13] Updated to set the window size in the object properties when creating the window --- src/platform_impl/linux/wayland/header.rs | 3 +++ src/platform_impl/linux/window.rs | 19 ++++++++++--------- 2 files changed, 13 insertions(+), 9 deletions(-) diff --git a/src/platform_impl/linux/wayland/header.rs b/src/platform_impl/linux/wayland/header.rs index 480eb4c85..cc9928761 100644 --- a/src/platform_impl/linux/wayland/header.rs +++ b/src/platform_impl/linux/wayland/header.rs @@ -14,6 +14,7 @@ impl WlHeader { event_box.set_above_child(true); event_box.set_visible(true); event_box.set_can_focus(false); + event_box.set_height_request(40); event_box.add(&header); window.set_titlebar(Some(&event_box)); @@ -33,4 +34,6 @@ impl WlHeader { } }); } + + } diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 5d988e93a..0ed10de9f 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -106,8 +106,17 @@ impl Window { .inner_size .map(|size| size.to_logical::(win_scale_factor as f64).into()) .unwrap_or((800, 600)); + window.set_default_size(1, 1); - window.resize(width, height); + + let default_vbox = if pl_attribs.default_vbox { + let box_ = gtk::Box::new(gtk::Orientation::Vertical, 0); + box_.set_size_request(width, height); + window.add(&box_); + Some(box_) + } else { + None + }; if attributes.maximized { let maximize_process = util::WindowMaximizeProcess::new(window.clone(), attributes.resizable); @@ -155,14 +164,6 @@ impl Window { } } - let default_vbox = if pl_attribs.default_vbox { - let box_ = gtk::Box::new(gtk::Orientation::Vertical, 0); - window.add(&box_); - Some(box_) - } else { - None - }; - // Rest attributes window.set_title(&attributes.title); if let Some(Fullscreen::Borderless(m)) = &attributes.fullscreen { From cbb00e03cca02df5847542caac2df3a820868431 Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Sun, 29 Sep 2024 17:47:40 +0900 Subject: [PATCH 02/13] Code format linting --- src/platform_impl/linux/wayland/header.rs | 2 -- src/platform_impl/linux/window.rs | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/platform_impl/linux/wayland/header.rs b/src/platform_impl/linux/wayland/header.rs index cc9928761..451f44ada 100644 --- a/src/platform_impl/linux/wayland/header.rs +++ b/src/platform_impl/linux/wayland/header.rs @@ -34,6 +34,4 @@ impl WlHeader { } }); } - - } diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 0ed10de9f..bd4b81097 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -106,7 +106,7 @@ impl Window { .inner_size .map(|size| size.to_logical::(win_scale_factor as f64).into()) .unwrap_or((800, 600)); - + window.set_default_size(1, 1); let default_vbox = if pl_attribs.default_vbox { From 721cc724eb3727a55d16915bb5340f30de3921f6 Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Sun, 29 Sep 2024 18:03:35 +0900 Subject: [PATCH 03/13] Added the changes to the .changes file. --- .changes/wayland-inner-size.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changes/wayland-inner-size.md diff --git a/.changes/wayland-inner-size.md b/.changes/wayland-inner-size.md new file mode 100644 index 000000000..1596a731d --- /dev/null +++ b/.changes/wayland-inner-size.md @@ -0,0 +1,5 @@ +--- +"tao": patch +--- + +On Linux Wayland, fixed the inaccurately applied `inner_size` when creating a new window. \ No newline at end of file From e3ab31e665d45bdbb497f5c873d5c9f95ef69bd8 Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Sun, 29 Sep 2024 20:26:06 +0900 Subject: [PATCH 04/13] Update set_size_request --- src/platform_impl/linux/window.rs | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index bd4b81097..24adab9cb 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -108,15 +108,7 @@ impl Window { .unwrap_or((800, 600)); window.set_default_size(1, 1); - - let default_vbox = if pl_attribs.default_vbox { - let box_ = gtk::Box::new(gtk::Orientation::Vertical, 0); - box_.set_size_request(width, height); - window.add(&box_); - Some(box_) - } else { - None - }; + window.resize(width, height); if attributes.maximized { let maximize_process = util::WindowMaximizeProcess::new(window.clone(), attributes.resizable); @@ -133,6 +125,18 @@ impl Window { // Set Min/Max Size util::set_size_constraints(&window, attributes.inner_size_constraints); + let min_inner_size = attributes + .inner_size_constraints + .min_size_physical::(win_scale_factor as f64); + let default_vbox = if pl_attribs.default_vbox { + let box_ = gtk::Box::new(gtk::Orientation::Vertical, 0); + box_.set_size_request(min_inner_size.width as i32, min_inner_size.height as i32); + window.add(&box_); + Some(box_) + } else { + None + }; + // Set Position if let Some(position) = attributes.position { let (x, y): (i32, i32) = position.to_logical::(win_scale_factor as f64).into(); From a25e54cb79f1c4c1c20ceb8bd23163150a28bd4f Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Mon, 30 Sep 2024 20:53:22 +0900 Subject: [PATCH 05/13] Update the height dynamically instead of using a hardcoded value. --- src/platform_impl/linux/wayland/header.rs | 18 +++++++++++++++--- src/platform_impl/linux/window.rs | 8 ++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/platform_impl/linux/wayland/header.rs b/src/platform_impl/linux/wayland/header.rs index 451f44ada..2ad3e25af 100644 --- a/src/platform_impl/linux/wayland/header.rs +++ b/src/platform_impl/linux/wayland/header.rs @@ -1,4 +1,8 @@ -use gtk::{prelude::*, ApplicationWindow, EventBox, HeaderBar}; +use gtk::{ + glib::{self}, + prelude::*, + ApplicationWindow, EventBox, HeaderBar, +}; pub struct WlHeader; @@ -14,9 +18,17 @@ impl WlHeader { event_box.set_above_child(true); event_box.set_visible(true); event_box.set_can_focus(false); - event_box.set_height_request(40); - event_box.add(&header); + let header_clone = header.clone(); + let event_box_clone = event_box.clone(); + glib::idle_add_local(move || { + let allocated_height = header_clone.allocated_height(); + event_box_clone.set_height_request(allocated_height); + header_clone.set_height_request(allocated_height); + glib::ControlFlow::Break + }); + + event_box.add(&header); window.set_titlebar(Some(&event_box)); Self::connect_resize_window(&header, window); } diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 24adab9cb..3af491c62 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -107,8 +107,12 @@ impl Window { .map(|size| size.to_logical::(win_scale_factor as f64).into()) .unwrap_or((800, 600)); - window.set_default_size(1, 1); - window.resize(width, height); + let window_clone = window.clone(); + glib::idle_add_local(move || { + window_clone.set_default_size(1, 1); + window_clone.resize(width, height); + glib::ControlFlow::Break + }); if attributes.maximized { let maximize_process = util::WindowMaximizeProcess::new(window.clone(), attributes.resizable); From acdd0ba3d6686c0ff091d855065f3e38fd1f925d Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Tue, 1 Oct 2024 00:04:22 +0900 Subject: [PATCH 06/13] Add a width property to the header --- src/platform_impl/linux/wayland/header.rs | 6 +++--- src/platform_impl/linux/window.rs | 16 +++++++++------- 2 files changed, 12 insertions(+), 10 deletions(-) diff --git a/src/platform_impl/linux/wayland/header.rs b/src/platform_impl/linux/wayland/header.rs index 2ad3e25af..a8c8c7805 100644 --- a/src/platform_impl/linux/wayland/header.rs +++ b/src/platform_impl/linux/wayland/header.rs @@ -7,7 +7,7 @@ use gtk::{ pub struct WlHeader; impl WlHeader { - pub fn setup(window: &ApplicationWindow, title: &str) { + pub fn setup(window: &ApplicationWindow, title: &str, min_width: i32) { let header = HeaderBar::builder() .show_close_button(true) .decoration_layout("menu:minimize,maximize,close") @@ -23,8 +23,8 @@ impl WlHeader { let event_box_clone = event_box.clone(); glib::idle_add_local(move || { let allocated_height = header_clone.allocated_height(); - event_box_clone.set_height_request(allocated_height); - header_clone.set_height_request(allocated_height); + event_box_clone.set_size_request(min_width, allocated_height); + header_clone.set_size_request(min_width, allocated_height); glib::ControlFlow::Break }); diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 3af491c62..113934a18 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -89,9 +89,15 @@ impl Window { } let window = window_builder.build(); + let win_scale_factor = window.scale_factor(); + let min_inner_size = attributes + .inner_size_constraints + .min_size_physical::(win_scale_factor as f64); + let min_width = min_inner_size.width.max(1); + let min_height = min_inner_size.height.max(1); if is_wayland { - WlHeader::setup(&window, &attributes.title); + WlHeader::setup(&window, &attributes.title, min_width); } let window_id = WindowId(window.id()); @@ -101,7 +107,6 @@ impl Window { .insert(window_id); // Set Width/Height & Resizable - let win_scale_factor = window.scale_factor(); let (width, height) = attributes .inner_size .map(|size| size.to_logical::(win_scale_factor as f64).into()) @@ -109,7 +114,7 @@ impl Window { let window_clone = window.clone(); glib::idle_add_local(move || { - window_clone.set_default_size(1, 1); + window_clone.set_default_size(min_width, min_height); window_clone.resize(width, height); glib::ControlFlow::Break }); @@ -129,12 +134,9 @@ impl Window { // Set Min/Max Size util::set_size_constraints(&window, attributes.inner_size_constraints); - let min_inner_size = attributes - .inner_size_constraints - .min_size_physical::(win_scale_factor as f64); let default_vbox = if pl_attribs.default_vbox { let box_ = gtk::Box::new(gtk::Orientation::Vertical, 0); - box_.set_size_request(min_inner_size.width as i32, min_inner_size.height as i32); + box_.set_size_request(min_width, min_height); window.add(&box_); Some(box_) } else { From 94ac49f609e83b4fbfd87bf7b890a9b6fdfd442e Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Tue, 1 Oct 2024 16:37:45 +0900 Subject: [PATCH 07/13] Update the window size event --- src/platform_impl/linux/event_loop.rs | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/platform_impl/linux/event_loop.rs b/src/platform_impl/linux/event_loop.rs index d5ce7e21b..d701e8fb6 100644 --- a/src/platform_impl/linux/event_loop.rs +++ b/src/platform_impl/linux/event_loop.rs @@ -567,7 +567,13 @@ impl EventLoop { log::warn!("Failed to send window moved event to event channel: {}", e); } - let (w, h) = event.size(); + let (w, h) = if let Some(child) = window.child() { + let allocation = child.allocation(); + (allocation.width() as u32, allocation.height() as u32) + } else { + event.size() + }; + if let Err(e) = tx_clone.send(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Resized( From 752a94d7972a4d8861537556789f673eb713cc8f Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Tue, 1 Oct 2024 16:38:33 +0900 Subject: [PATCH 08/13] Code format linting --- src/platform_impl/linux/event_loop.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/platform_impl/linux/event_loop.rs b/src/platform_impl/linux/event_loop.rs index d701e8fb6..43916857f 100644 --- a/src/platform_impl/linux/event_loop.rs +++ b/src/platform_impl/linux/event_loop.rs @@ -573,7 +573,7 @@ impl EventLoop { } else { event.size() }; - + if let Err(e) = tx_clone.send(Event::WindowEvent { window_id: RootWindowId(id), event: WindowEvent::Resized( From 28197f55830b306732cd2c39c41b26f9fbd07f7c Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Tue, 1 Oct 2024 17:32:04 +0900 Subject: [PATCH 09/13] Updated the idle_add function to execute only once --- src/platform_impl/linux/wayland/header.rs | 3 +-- src/platform_impl/linux/window.rs | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/src/platform_impl/linux/wayland/header.rs b/src/platform_impl/linux/wayland/header.rs index a8c8c7805..ecef960dc 100644 --- a/src/platform_impl/linux/wayland/header.rs +++ b/src/platform_impl/linux/wayland/header.rs @@ -21,11 +21,10 @@ impl WlHeader { let header_clone = header.clone(); let event_box_clone = event_box.clone(); - glib::idle_add_local(move || { + glib::idle_add_local_once(move || { let allocated_height = header_clone.allocated_height(); event_box_clone.set_size_request(min_width, allocated_height); header_clone.set_size_request(min_width, allocated_height); - glib::ControlFlow::Break }); event_box.add(&header); diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 113934a18..8cd7a9d46 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -113,10 +113,9 @@ impl Window { .unwrap_or((800, 600)); let window_clone = window.clone(); - glib::idle_add_local(move || { + glib::idle_add_local_once(move || { window_clone.set_default_size(min_width, min_height); window_clone.resize(width, height); - glib::ControlFlow::Break }); if attributes.maximized { From f22f3bedab0b4fa3a6f1a434e8ebd0755c1476d9 Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Wed, 2 Oct 2024 18:48:13 +0900 Subject: [PATCH 10/13] Update the window resize --- src/platform_impl/linux/window.rs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 8cd7a9d46..f5307bee3 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -114,13 +114,13 @@ impl Window { let window_clone = window.clone(); glib::idle_add_local_once(move || { - window_clone.set_default_size(min_width, min_height); + window_clone.set_resizable(true); window_clone.resize(width, height); }); if attributes.maximized { let maximize_process = util::WindowMaximizeProcess::new(window.clone(), attributes.resizable); - glib::idle_add_local_full(glib::Priority::HIGH_IDLE, move || { + glib::idle_add_local_full(glib::Priority::DEFAULT_IDLE, move || { let mut maximize_process = maximize_process.borrow_mut(); maximize_process.next_step() }); @@ -335,7 +335,7 @@ impl Window { preferred_theme: RefCell::new(preferred_theme), }; - win.set_skip_taskbar(pl_attribs.skip_taskbar); + let _ = win.set_skip_taskbar(pl_attribs.skip_taskbar); Ok(win) } From 971de4f80ff741c05b1da1a12a08def09c187e57 Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Wed, 2 Oct 2024 20:07:50 +0900 Subject: [PATCH 11/13] Revert --- src/platform_impl/linux/window.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index f5307bee3..c6b50143c 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -115,6 +115,7 @@ impl Window { let window_clone = window.clone(); glib::idle_add_local_once(move || { window_clone.set_resizable(true); + window_clone.set_default_size(min_width, min_height); window_clone.resize(width, height); }); From a96dd7fd968b837d7b913667b173ff8f8bc65999 Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Fri, 4 Oct 2024 20:42:36 +0900 Subject: [PATCH 12/13] Update the title that affects the inner size --- src/platform_impl/linux/wayland/header.rs | 28 +++++++++++++++++++++-- src/platform_impl/linux/window.rs | 1 - 2 files changed, 26 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/linux/wayland/header.rs b/src/platform_impl/linux/wayland/header.rs index ecef960dc..a653fe0be 100644 --- a/src/platform_impl/linux/wayland/header.rs +++ b/src/platform_impl/linux/wayland/header.rs @@ -1,7 +1,8 @@ use gtk::{ glib::{self}, + pango, prelude::*, - ApplicationWindow, EventBox, HeaderBar, + Align, ApplicationWindow, EventBox, HeaderBar, Label, }; pub struct WlHeader; @@ -11,9 +12,13 @@ impl WlHeader { let header = HeaderBar::builder() .show_close_button(true) .decoration_layout("menu:minimize,maximize,close") - .title(title) .build(); + let title_label = Label::new(Some(title)); + title_label.set_ellipsize(gtk::pango::EllipsizeMode::End); + title_label.set_single_line_mode(true); + title_label.set_halign(Align::Center); + let event_box = EventBox::new(); event_box.set_above_child(true); event_box.set_visible(true); @@ -27,11 +32,30 @@ impl WlHeader { header_clone.set_size_request(min_width, allocated_height); }); + header.set_custom_title(Some(&title_label)); event_box.add(&header); window.set_titlebar(Some(&event_box)); + + //Set title font width + let context = title_label.pango_context(); + let font_description = context.font_description().unwrap(); + let font_size = (font_description.size() / pango::SCALE) as f64; + let char_width = font_size * 2.0; + + Self::connect_configure_event(window, &title_label, char_width); Self::connect_resize_window(&header, window); } + fn connect_configure_event(window: &ApplicationWindow, title_label: &Label, char_width: f64) { + let title_label_clone = title_label.clone(); + window.connect_configure_event(move |_, event| { + let (width, _) = event.size(); + let max_chars = (width as f64 / char_width).floor() as i32; + title_label_clone.set_max_width_chars(if width < 220 { 0 } else { max_chars }); + false + }); + } + fn connect_resize_window(header: &HeaderBar, window: &ApplicationWindow) { let header_weak = header.downgrade(); window.connect_resizable_notify(move |window| { diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index c6b50143c..f9fb9095a 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -114,7 +114,6 @@ impl Window { let window_clone = window.clone(); glib::idle_add_local_once(move || { - window_clone.set_resizable(true); window_clone.set_default_size(min_width, min_height); window_clone.resize(width, height); }); From 77b40c2e4ed010af63a5f2b94666cda261da5da0 Mon Sep 17 00:00:00 2001 From: Chooooooo Date: Thu, 7 Nov 2024 21:40:46 +0900 Subject: [PATCH 13/13] Update new Window event loop prioriy --- src/platform_impl/linux/wayland/header.rs | 3 ++- src/platform_impl/linux/window.rs | 5 +++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/src/platform_impl/linux/wayland/header.rs b/src/platform_impl/linux/wayland/header.rs index a653fe0be..343034f3f 100644 --- a/src/platform_impl/linux/wayland/header.rs +++ b/src/platform_impl/linux/wayland/header.rs @@ -26,10 +26,11 @@ impl WlHeader { let header_clone = header.clone(); let event_box_clone = event_box.clone(); - glib::idle_add_local_once(move || { + glib::idle_add_local_full(glib::Priority::HIGH_IDLE, move || { let allocated_height = header_clone.allocated_height(); event_box_clone.set_size_request(min_width, allocated_height); header_clone.set_size_request(min_width, allocated_height); + glib::ControlFlow::Break }); header.set_custom_title(Some(&title_label)); diff --git a/src/platform_impl/linux/window.rs b/src/platform_impl/linux/window.rs index 525e81240..f1306b164 100644 --- a/src/platform_impl/linux/window.rs +++ b/src/platform_impl/linux/window.rs @@ -117,14 +117,15 @@ impl Window { .unwrap_or((800, 600)); let window_clone = window.clone(); - glib::idle_add_local_once(move || { + glib::idle_add_local_full(glib::Priority::HIGH_IDLE, move || { window_clone.set_default_size(min_width, min_height); window_clone.resize(width, height); + glib::ControlFlow::Break }); if attributes.maximized { let maximize_process = util::WindowMaximizeProcess::new(window.clone(), attributes.resizable); - glib::idle_add_local_full(glib::Priority::DEFAULT_IDLE, move || { + glib::idle_add_local_full(glib::Priority::HIGH_IDLE, move || { let mut maximize_process = maximize_process.borrow_mut(); maximize_process.next_step() });