Skip to content

Instantly share code, notes, and snippets.

@fdg-org
Created August 21, 2018 09:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save fdg-org/a61debccd7fccfbf504d2a9aff195ec0 to your computer and use it in GitHub Desktop.
Save fdg-org/a61debccd7fccfbf504d2a9aff195ec0 to your computer and use it in GitHub Desktop.
/* Cargo.toml
[package]
name = "show-gnome-maximize-bug"
version = "0.1.0"
authors = ["Frank Drolshagen <fdg.org@gmail.com>"]
[dependencies.gtk]
version = "0.4.1"
features = ["v3_10"]
[dependencies.gdk]
version = "0.8.0"
[dependencies.gio]
version = "0.4.1"
*/
extern crate gtk;
extern crate gdk;
extern crate gio;
use gtk::prelude::*;
use gio::prelude::*;
use std::env::args;
use std::rc::Rc;
use std::cell::RefCell;
struct WindowState {
is_fullscreen: bool,
is_maximized: bool,
}
impl WindowState {
fn new() -> WindowState {
WindowState {
is_fullscreen: false,
is_maximized: false,
}
}
}
fn main() {
let app = gtk::Application::new("org.fdg.show-gnome-maximize-bug",
gio::ApplicationFlags::empty())
.expect("Initializition failed");
let window_state = WindowState::new();
let window_state_ref = Rc::new(RefCell::new(window_state));
app.connect_activate({
let window_state_clone = window_state_ref.clone();
move |app| {
start_gui(app, &window_state_clone);
}
});
app.run(&args().collect::<Vec<_>>());
}
fn start_gui(app: &gtk::Application, window_state_orig: &Rc<RefCell<WindowState>>) {
let window_state_local = WindowState::new();
let window_state_local_ref = Rc::new(RefCell::new(window_state_local));
{
let window_state_borrow = window_state_orig.borrow();
let mut window_state_local_mut = window_state_local_ref.borrow_mut();
window_state_local_mut.is_fullscreen = window_state_borrow.is_fullscreen;
window_state_local_mut.is_maximized = window_state_borrow.is_maximized;
}
let window = gtk::ApplicationWindow::new(app);
let button_box = gtk::ButtonBox::new(gtk::Orientation::Horizontal);
let button_fullscreen = gtk::Button::new_with_label("Fullscreen");
button_fullscreen.connect_clicked({
let window_clone = window.clone();
move |_| {
window_clone.fullscreen();
}
});
button_box.add(&button_fullscreen);
let button_unfullscreen = gtk::Button::new_with_label("Unfullscreen");
button_unfullscreen.connect_clicked({
let window_clone = window.clone();
move |_| {
window_clone.unfullscreen();
}
});
button_box.add(&button_unfullscreen);
window.add(&button_box);
window.connect_window_state_event({
let window_state_local_clone = window_state_local_ref.clone();
move |_, event| {
let changed_window_state = event.get_changed_mask();
let new_window_state = event.get_new_window_state();
println!();
println!("--- new window state event received - start processing ------------------------------------------");
println!("changed_window_state: {:?}", changed_window_state);
println!("new_window_state: {:?}", new_window_state);
let mut window_state_local_mut = window_state_local_clone.borrow_mut();
if (new_window_state & gdk::WindowState::FULLSCREEN) == gdk::WindowState::FULLSCREEN {
window_state_local_mut.is_fullscreen = true;
} else {
window_state_local_mut.is_fullscreen = false;
}
println!("window_state_local_mut.is_fullscreen: {:?}", window_state_local_mut.is_fullscreen);
if (new_window_state & gdk::WindowState::MAXIMIZED) == gdk::WindowState::MAXIMIZED {
window_state_local_mut.is_maximized = true;
} else {
// block "workaround"
/*
if ! (window_state_local_mut.is_fullscreen && window_state_local_mut.is_maximized) {
window_state_local_mut.is_maximized = false;
}
*/
window_state_local_mut.is_maximized = false; // line "bug"
}
println!("window_state_local_mut.is_maximized: {:?}", window_state_local_mut.is_maximized);
println!("--- end processing ------------------------------------------------------------------------");
println!();
Inhibit(false)
}
});
window.connect_delete_event({
let window_state_orig_clone = window_state_orig.clone();
let window_state_local_clone = window_state_local_ref.clone();
move |win, _| {
let window_state_local_borrow = window_state_local_clone.borrow();
let mut window_state_orig_mut = window_state_orig_clone.borrow_mut();
println!("=== window delete event received");
println!("window_state.is_fullscreen: {}", window_state_local_borrow.is_fullscreen);
println!("window_state.is_maximized: {}", window_state_local_borrow.is_maximized);
window_state_orig_mut.is_fullscreen = window_state_local_borrow.is_fullscreen;
window_state_orig_mut.is_maximized = window_state_local_borrow.is_maximized;
win.destroy();
Inhibit(false)
}
});
window.show_all();
{
let window_state_local_borrow = window_state_local_ref.borrow();
if window_state_local_borrow.is_maximized {
window.maximize();
};
if window_state_local_borrow.is_fullscreen {
window.fullscreen();
};
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment