Fix some more problems in MEOW mode, #3957

This commit is contained in:
heckflosse
2017-07-16 18:00:43 +02:00
parent cfa7e335fa
commit 164c577b24
5 changed files with 83 additions and 29 deletions

View File

@@ -32,7 +32,7 @@ bool EditWindow::isMultiDisplayEnabled()
}
// Should only be created once, auto-creates window on correct display
EditWindow* EditWindow::getInstance(RTWindow* p)
EditWindow* EditWindow::getInstance(RTWindow* p, bool restore)
{
struct EditWindowInstance
{
@@ -44,11 +44,13 @@ EditWindow* EditWindow::getInstance(RTWindow* p)
};
static EditWindowInstance instance_(p);
if(restore) {
instance_.editWnd.restoreWindow();
}
return &instance_.editWnd;
}
EditWindow::EditWindow (RTWindow* p) : parent(p) , isFullscreen(false)
EditWindow::EditWindow (RTWindow* p) : parent(p) , isFullscreen(false), isClosed(true)
{
Glib::ustring fName = "rt-logo-tiny.png";
@@ -64,10 +66,8 @@ EditWindow::EditWindow (RTWindow* p) : parent(p) , isFullscreen(false)
set_modal(false);
set_resizable(true);
set_default_size(options.meowWidth, options.meowHeight);
//set_parent(*parent);
property_destroy_with_parent().set_value(false);
//signal_window_state_event().connect( sigc::mem_fun(*this, &EditWindow::on_window_state_event) );
mainNB = Gtk::manage (new Gtk::Notebook ());
mainNB->set_scrollable (true);
@@ -80,29 +80,45 @@ EditWindow::EditWindow (RTWindow* p) : parent(p) , isFullscreen(false)
add (*mainBox);
if(!is_maximized()) {
}
void EditWindow::restoreWindow() {
if(isClosed) {
int meowMonitor = 0;
if(isMultiDisplayEnabled()) {
if(options.meowMonitor >= 0) { // use display from last session if available
meowMonitor = std::min(options.meowMonitor, Gdk::Screen::get_default()->get_n_monitors());
} else { // Determine the other display
const Glib::RefPtr< Gdk::Window >& wnd = p->get_window();
meowMonitor = p->get_screen()->get_monitor_at_window(wnd) == 0 ? 1 : 0;
const Glib::RefPtr< Gdk::Window >& wnd = parent->get_window();
meowMonitor = parent->get_screen()->get_monitor_at_window(wnd) == 0 ? 1 : 0;
}
}
Gdk::Rectangle lMonitorRect;
get_screen()->get_monitor_geometry(meowMonitor, lMonitorRect);
move(lMonitorRect.get_x(), lMonitorRect.get_y());
maximize();
show_all ();
if(!options.meowFullScreen) {
setFullScreen(false);
if(options.meowMaximized) {
move(lMonitorRect.get_x(), lMonitorRect.get_y());
maximize();
} else {
fullscreen();
setFullScreen(true);
resize(options.meowWidth, options.meowHeight);
if(options.meowX <= lMonitorRect.get_x() + lMonitorRect.get_width() && options.meowY <= lMonitorRect.get_y() + lMonitorRect.get_height()) {
move(options.meowX, options.meowY);
} else {
move(lMonitorRect.get_x(), lMonitorRect.get_y());
}
}
show_all();
isFullscreen = options.meowFullScreen;
if(isFullscreen) {
fullscreen();
}
isClosed = false;
}
}
void EditWindow::on_realize ()
@@ -114,8 +130,12 @@ void EditWindow::on_realize ()
bool EditWindow::on_configure_event(GdkEventConfigure* event)
{
if (!is_maximized() && get_realized() && is_visible()) {
get_size(options.meowWidth, options.meowHeight);
if (get_realized() && is_visible()) {
if(!is_maximized()) {
get_position(options.meowX, options.meowY);
get_size(options.meowWidth, options.meowHeight);
}
options.meowMaximized = is_maximized();
}
return Gtk::Widget::on_configure_event(event);
@@ -220,7 +240,9 @@ void EditWindow::toFront ()
// when using MEOW mode on a single monitor we need to present the secondary window.
// If we don't it will stay in background when opening 2nd, 3rd... editor, which is annoying
// It will also deiconify the window
present();
if(!isMultiDisplayEnabled()) {
present();
}
}
bool EditWindow::keyPressed (GdkEventKey* event)
@@ -253,6 +275,18 @@ void EditWindow::toggleFullscreen ()
options.meowFullScreen = isFullscreen = !isFullscreen;
}
void EditWindow::writeOptions() {
if(is_visible()) {
if(isMultiDisplayEnabled()) {
options.meowMonitor = get_screen()->get_monitor_at_window(get_window());
}
options.meowMaximized = is_maximized();
get_position(options.meowX, options.meowY);
get_size(options.meowWidth,options.meowHeight);
}
}
bool EditWindow::on_delete_event(GdkEventAny* event)
{
@@ -260,12 +294,9 @@ bool EditWindow::on_delete_event(GdkEventAny* event)
return true;
}
if(isMultiDisplayEnabled()) {
options.meowMonitor = get_screen()->get_monitor_at_window(get_window());
}
writeOptions();
hide();
unmaximize();
isClosed = true;
return false;
}