Skip to content

Commit

Permalink
Added set_fullscreen API to WindowAdapter. (#4286)
Browse files Browse the repository at this point in the history
See #3283
  • Loading branch information
qhua948 committed Jan 9, 2024
1 parent 2efd2bc commit 779aff0
Show file tree
Hide file tree
Showing 6 changed files with 36 additions and 7 deletions.
17 changes: 16 additions & 1 deletion internal/backends/qt/qt_window.rs
Expand Up @@ -1533,7 +1533,7 @@ impl WindowAdapter for QtWindow {
let fullscreen = std::env::var("SLINT_FULLSCREEN").is_ok();
cpp! {unsafe [widget_ptr as "QWidget*", fullscreen as "bool"] {
if (fullscreen) {
widget_ptr->setWindowState(Qt::WindowFullScreen);
widget_ptr->setWindowState(widget_ptr->windowState() | Qt::WindowFullScreen);
}
widget_ptr->show();
}};
Expand Down Expand Up @@ -1702,6 +1702,21 @@ impl WindowAdapter for QtWindow {
}};
}

fn set_fullscreen(&self, fullscreen: bool) {
let widget_ptr = self.widget_ptr();
cpp! {unsafe [widget_ptr as "QWidget*", fullscreen as "bool"] {
// Depending on the request, we either set or clear the fullscreen bits.
// See also: https://doc.qt.io/qt-6/qt.html#WindowState-enum
const auto state = widget_ptr->windowState();
if (fullscreen) {
widget_ptr->setWindowState(state | Qt::WindowFullScreen);
} else {
widget_ptr->setWindowState(state & ~Qt::WindowFullScreen);
}
}
};
}

fn internal(&self, _: i_slint_core::InternalToken) -> Option<&dyn WindowAdapterInternal> {
Some(self)
}
Expand Down
8 changes: 8 additions & 0 deletions internal/backends/winit/winitwindowadapter.rs
Expand Up @@ -553,6 +553,14 @@ impl WindowAdapter for WinitWindowAdapter {
});
}

fn set_fullscreen(&self, fullscreen: bool) {
if fullscreen {
self.winit_window.set_fullscreen(Some(winit::window::Fullscreen::Borderless(None)));
} else {
self.winit_window.set_fullscreen(None);
}
}

fn internal(&self, _: corelib::InternalToken) -> Option<&dyn WindowAdapterInternal> {
Some(self)
}
Expand Down
5 changes: 5 additions & 0 deletions internal/core/api.rs
Expand Up @@ -446,6 +446,11 @@ impl Window {
crate::window::WindowAdapter::set_size(&*self.0.window_adapter(), size);
}

/// Set or unset the window to display fullscreen.
pub fn set_fullscreen(&self, fullscreen: bool) {
self.0.window_adapter().set_fullscreen(fullscreen);
}

/// Dispatch a window event to the scene.
///
/// Use this when you're implementing your own backend and want to forward user input events.
Expand Down
3 changes: 3 additions & 0 deletions internal/core/window.rs
Expand Up @@ -132,6 +132,9 @@ pub trait WindowAdapter {
/// be called again.
fn update_window_properties(&self, _properties: WindowProperties<'_>) {}

/// Set to display the window as fullscreen.
fn set_fullscreen(&self, _fullscreen: bool) {}

#[doc(hidden)]
fn internal(&self, _: crate::InternalToken) -> Option<&dyn WindowAdapterInternal> {
None
Expand Down
4 changes: 0 additions & 4 deletions tools/lsp/main.rs
Expand Up @@ -239,10 +239,6 @@ fn main() {
if !args.backend.is_empty() {
std::env::set_var("SLINT_BACKEND", &args.backend);
}
if args.fullscreen {
// TODO: Have an API to set the Window fullscreen #3283
std::env::set_var("SLINT_FULLSCREEN", "1");
}

#[cfg(feature = "preview-engine")]
{
Expand Down
6 changes: 4 additions & 2 deletions tools/lsp/preview/native.rs
Expand Up @@ -150,7 +150,7 @@ pub fn open_ui(sender: &ServerNotifier) {
}

fn open_ui_impl(preview_state: &mut PreviewState) {
let (default_style, show_preview_ui) = {
let (default_style, show_preview_ui, fullscreen) = {
let cache = super::CONTENT_CACHE.get_or_init(Default::default).lock().unwrap();
let style = cache.config.style.clone();
let style = if style.is_empty() {
Expand All @@ -163,12 +163,14 @@ fn open_ui_impl(preview_state: &mut PreviewState) {
.hide_ui
.or_else(|| CLI_ARGS.with(|args| args.get().map(|a| a.no_toolbar.clone())))
.unwrap_or(false);
(style, !hide_ui)
let fullscreen = CLI_ARGS.with(|args| args.get().map(|a| a.fullscreen).unwrap_or_default());
(style, !hide_ui, fullscreen)
};

// TODO: Handle Error!
let ui = preview_state.ui.get_or_insert_with(|| super::ui::create_ui(default_style).unwrap());
ui.set_show_preview_ui(show_preview_ui);
ui.window().set_fullscreen(fullscreen);
ui.window().on_close_requested(|| {
let mut cache = super::CONTENT_CACHE.get_or_init(Default::default).lock().unwrap();
cache.ui_is_visible = false;
Expand Down

0 comments on commit 779aff0

Please sign in to comment.