mirror of
https://github.com/danbulant/cushy
synced 2026-07-05 19:20:36 +00:00
Window::on_init
This commit is contained in:
parent
b5cdb93bb5
commit
229bbd4913
3 changed files with 50 additions and 9 deletions
|
|
@ -150,6 +150,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
|
||||||
closing automatically when the final window is closed.
|
closing automatically when the final window is closed.
|
||||||
- `WindowBehavior::initialized` is invoked once the window has been fully
|
- `WindowBehavior::initialized` is invoked once the window has been fully
|
||||||
initialized.
|
initialized.
|
||||||
|
- `Window::on_init` is a new callback that is invoked before the winit window is
|
||||||
|
initialized.
|
||||||
|
|
||||||
|
|
||||||
[139]: https://github.com/khonsulabs/cushy/issues/139
|
[139]: https://github.com/khonsulabs/cushy/issues/139
|
||||||
|
|
|
||||||
15
Cargo.lock
generated
15
Cargo.lock
generated
|
|
@ -123,8 +123,9 @@ checksum = "4e1496f8fb1fbf272686b8d37f523dab3e4a7443300055e74cdaa449f3114356"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "appit"
|
name = "appit"
|
||||||
version = "0.3.2"
|
version = "0.4.0"
|
||||||
source = "git+https://github.com/khonsulabs/appit#57acfd2e15523a160fbfd0db4c91d2407ed8d4c5"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "75ed795976c3816aeceb52f1971d3e27f5403d58b16531edea7fe97f63e75f08"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"winit",
|
"winit",
|
||||||
]
|
]
|
||||||
|
|
@ -175,9 +176,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayref"
|
name = "arrayref"
|
||||||
version = "0.3.8"
|
version = "0.3.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "9d151e35f61089500b617991b791fc8bfd237ae50cd5950803758a179b41e67a"
|
checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "arrayvec"
|
name = "arrayvec"
|
||||||
|
|
@ -1311,7 +1312,7 @@ checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc"
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "kludgine"
|
name = "kludgine"
|
||||||
version = "0.10.0"
|
version = "0.10.0"
|
||||||
source = "git+https://github.com/khonsulabs/kludgine#236c9773a323ee63dc38bdfa78476ff336547640"
|
source = "git+https://github.com/khonsulabs/kludgine#aa0d2fe77a92a034f7481a239e4f223a651a8c2a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ahash",
|
"ahash",
|
||||||
"alot",
|
"alot",
|
||||||
|
|
@ -1963,9 +1964,9 @@ dependencies = [
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "once_cell"
|
name = "once_cell"
|
||||||
version = "1.19.0"
|
version = "1.20.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92"
|
checksum = "33ea5043e58958ee56f3e15a90aee535795cd7dfd319846288d93c5b57d85cbe"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "orbclient"
|
name = "orbclient"
|
||||||
|
|
|
||||||
|
|
@ -39,7 +39,7 @@ use kludgine::shapes::Shape;
|
||||||
use kludgine::wgpu::{self, CompositeAlphaMode, COPY_BYTES_PER_ROW_ALIGNMENT};
|
use kludgine::wgpu::{self, CompositeAlphaMode, COPY_BYTES_PER_ROW_ALIGNMENT};
|
||||||
use kludgine::{Color, DrawableExt, Kludgine, KludgineId, Origin, Texture};
|
use kludgine::{Color, DrawableExt, Kludgine, KludgineId, Origin, Texture};
|
||||||
use parking_lot::{Mutex, MutexGuard};
|
use parking_lot::{Mutex, MutexGuard};
|
||||||
use sealed::{Ize, WindowExecute};
|
use sealed::{Ize, PreShowCallback, WindowExecute};
|
||||||
use tracing::Level;
|
use tracing::Level;
|
||||||
use unicode_segmentation::UnicodeSegmentation;
|
use unicode_segmentation::UnicodeSegmentation;
|
||||||
|
|
||||||
|
|
@ -525,6 +525,7 @@ where
|
||||||
pending: PendingWindow,
|
pending: PendingWindow,
|
||||||
attributes: WindowAttributes,
|
attributes: WindowAttributes,
|
||||||
on_closed: Option<OnceCallback>,
|
on_closed: Option<OnceCallback>,
|
||||||
|
on_init: Option<PreShowCallback>,
|
||||||
on_open: Option<OnceCallback<WindowHandle>>,
|
on_open: Option<OnceCallback<WindowHandle>>,
|
||||||
inner_size: Option<Dynamic<Size<UPx>>>,
|
inner_size: Option<Dynamic<Size<UPx>>>,
|
||||||
zoom: Option<Dynamic<Fraction>>,
|
zoom: Option<Dynamic<Fraction>>,
|
||||||
|
|
@ -647,6 +648,7 @@ where
|
||||||
enabled_buttons: None,
|
enabled_buttons: None,
|
||||||
fullscreen: None,
|
fullscreen: None,
|
||||||
shortcuts: Value::default(),
|
shortcuts: Value::default(),
|
||||||
|
on_init: None,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -970,6 +972,15 @@ where
|
||||||
self
|
self
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// Invokes `on_init` before the window initialization begins.
|
||||||
|
pub fn on_init<Function>(mut self, on_init: Function) -> Self
|
||||||
|
where
|
||||||
|
Function: FnOnce(&winit::window::Window) + Send + 'static,
|
||||||
|
{
|
||||||
|
self.on_init = Some(PreShowCallback(Box::new(Some(on_init))));
|
||||||
|
self
|
||||||
|
}
|
||||||
|
|
||||||
/// Invokes `on_close` when this window is closed.
|
/// Invokes `on_close` when this window is closed.
|
||||||
pub fn on_close<Function>(mut self, on_close: Function) -> Self
|
pub fn on_close<Function>(mut self, on_close: Function) -> Self
|
||||||
where
|
where
|
||||||
|
|
@ -1094,6 +1105,7 @@ where
|
||||||
title: this.title,
|
title: this.title,
|
||||||
redraw_status: this.pending.0.redraw_status.clone(),
|
redraw_status: this.pending.0.redraw_status.clone(),
|
||||||
on_open: this.on_open,
|
on_open: this.on_open,
|
||||||
|
on_init: this.on_init,
|
||||||
on_closed: this.on_closed,
|
on_closed: this.on_closed,
|
||||||
transparent: this.attributes.transparent,
|
transparent: this.attributes.transparent,
|
||||||
attributes: Some(this.attributes),
|
attributes: Some(this.attributes),
|
||||||
|
|
@ -2390,13 +2402,20 @@ where
|
||||||
{
|
{
|
||||||
type Context = sealed::Context<T::Context>;
|
type Context = sealed::Context<T::Context>;
|
||||||
|
|
||||||
|
fn pre_initialize(context: &Self::Context, winit: &winit::window::Window) {
|
||||||
|
let Some(mut on_init) = context.settings.borrow_mut().on_init.take() else {
|
||||||
|
return;
|
||||||
|
};
|
||||||
|
on_init.0.pre_show(winit);
|
||||||
|
}
|
||||||
|
|
||||||
fn initialize(
|
fn initialize(
|
||||||
window: kludgine::app::Window<'_, WindowCommand>,
|
window: kludgine::app::Window<'_, WindowCommand>,
|
||||||
graphics: &mut kludgine::Graphics<'_>,
|
graphics: &mut kludgine::Graphics<'_>,
|
||||||
context: Self::Context,
|
context: Self::Context,
|
||||||
) -> Self {
|
) -> Self {
|
||||||
context.pending.opened(window.handle());
|
context.pending.opened(window.handle());
|
||||||
let settings = context.settings.borrow_mut();
|
let settings = context.settings.borrow();
|
||||||
let cushy = settings.cushy.clone();
|
let cushy = settings.cushy.clone();
|
||||||
let _guard = cushy.enter_runtime();
|
let _guard = cushy.enter_runtime();
|
||||||
let mut window = RunningWindow::new(
|
let mut window = RunningWindow::new(
|
||||||
|
|
@ -2833,6 +2852,7 @@ pub(crate) mod sealed {
|
||||||
use figures::units::{Px, UPx};
|
use figures::units::{Px, UPx};
|
||||||
use figures::{Fraction, Point, Size};
|
use figures::{Fraction, Point, Size};
|
||||||
use image::{DynamicImage, RgbaImage};
|
use image::{DynamicImage, RgbaImage};
|
||||||
|
use kludgine::app::winit;
|
||||||
use kludgine::app::winit::event::Modifiers;
|
use kludgine::app::winit::event::Modifiers;
|
||||||
use kludgine::app::winit::window::{Fullscreen, UserAttentionType, WindowButtons, WindowLevel};
|
use kludgine::app::winit::window::{Fullscreen, UserAttentionType, WindowButtons, WindowLevel};
|
||||||
use kludgine::Color;
|
use kludgine::Color;
|
||||||
|
|
@ -2873,6 +2893,7 @@ pub(crate) mod sealed {
|
||||||
pub cursive_font_family: FontFamilyList,
|
pub cursive_font_family: FontFamilyList,
|
||||||
pub font_data_to_load: FontCollection,
|
pub font_data_to_load: FontCollection,
|
||||||
pub on_open: Option<OnceCallback<WindowHandle>>,
|
pub on_open: Option<OnceCallback<WindowHandle>>,
|
||||||
|
pub on_init: Option<PreShowCallback>,
|
||||||
pub on_closed: Option<OnceCallback>,
|
pub on_closed: Option<OnceCallback>,
|
||||||
pub vsync: bool,
|
pub vsync: bool,
|
||||||
pub multisample_count: NonZeroU32,
|
pub multisample_count: NonZeroU32,
|
||||||
|
|
@ -2960,6 +2981,22 @@ pub(crate) mod sealed {
|
||||||
fn load_image(data: &[u8], size: Size<UPx>) -> DynamicImage;
|
fn load_image(data: &[u8], size: Size<UPx>) -> DynamicImage;
|
||||||
fn pixel_color(location: Point<UPx>, data: &[u8], size: Size<UPx>) -> Color;
|
fn pixel_color(location: Point<UPx>, data: &[u8], size: Size<UPx>) -> Color;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub struct PreShowCallback(pub Box<dyn PreShowFn>);
|
||||||
|
|
||||||
|
pub trait PreShowFn: Send + 'static {
|
||||||
|
fn pre_show(&mut self, winit: &winit::window::Window);
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<F> PreShowFn for Option<F>
|
||||||
|
where
|
||||||
|
F: FnOnce(&winit::window::Window) + Send + 'static,
|
||||||
|
{
|
||||||
|
fn pre_show(&mut self, winit: &winit::window::Window) {
|
||||||
|
let Some(this) = self.take() else { return };
|
||||||
|
this(winit);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Controls whether the light or dark theme is applied.
|
/// Controls whether the light or dark theme is applied.
|
||||||
|
|
@ -3561,6 +3598,7 @@ impl StandaloneWindowBuilder {
|
||||||
enabled_buttons: Value::dynamic(WindowButtons::all()),
|
enabled_buttons: Value::dynamic(WindowButtons::all()),
|
||||||
fullscreen: Value::default(),
|
fullscreen: Value::default(),
|
||||||
shortcuts: Value::default(),
|
shortcuts: Value::default(),
|
||||||
|
on_init: None,
|
||||||
},
|
},
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue