Created
August 21, 2018 09:07
-
-
Save fdg-org/a61debccd7fccfbf504d2a9aff195ec0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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: >k::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