diff --git a/src/gtk-sat-module-popup.c b/src/gtk-sat-module-popup.c index c2d604a1..67405388 100644 --- a/src/gtk-sat-module-popup.c +++ b/src/gtk-sat-module-popup.c @@ -499,8 +499,9 @@ static void docking_state_cb(GtkWidget * menuitem, gpointer data) /** * Toggle screen state. * - * This function is intended to toggle between FULLSCREEN - * and WINDOW state. + * Toggle between FULLSCREEN and the module's previous state (DOCKED or + * WINDOW). Leaving fullscreen restores that state so a docked module is + * re-attached instead of left undocked. */ static void screen_state_cb(GtkWidget * menuitem, gpointer data) { @@ -515,6 +516,9 @@ static void screen_state_cb(GtkWidget * menuitem, gpointer data) { case GTK_SAT_MOD_STATE_DOCKED: + GTK_SAT_MODULE(module)->state_before_fullscreen = + GTK_SAT_MOD_STATE_DOCKED; + /* increase reference count of module */ g_object_ref(module); @@ -565,6 +569,9 @@ static void screen_state_cb(GtkWidget * menuitem, gpointer data) break; case GTK_SAT_MOD_STATE_WINDOW: + GTK_SAT_MODULE(module)->state_before_fullscreen = + GTK_SAT_MOD_STATE_WINDOW; + /* change internal state */ GTK_SAT_MODULE(module)->state = GTK_SAT_MOD_STATE_FULLSCREEN; gtk_window_fullscreen(GTK_WINDOW(GTK_SAT_MODULE(module)->win)); @@ -573,6 +580,36 @@ static void screen_state_cb(GtkWidget * menuitem, gpointer data) break; case GTK_SAT_MOD_STATE_FULLSCREEN: + /* Re-dock when fullscreen was entered from the notebook. */ + if (GTK_SAT_MODULE(module)->state_before_fullscreen == + GTK_SAT_MOD_STATE_DOCKED) + { + g_object_ref(module); + + if (GTK_SAT_MODULE(module)->tmgActive) + { + gtk_window_set_transient_for(GTK_WINDOW + (GTK_SAT_MODULE(module)->tmgWin), + GTK_WINDOW(app)); + } + + gtk_container_remove(GTK_CONTAINER(GTK_SAT_MODULE(module)->win), + module); + gtk_widget_destroy(GTK_SAT_MODULE(module)->win); + GTK_SAT_MODULE(module)->win = NULL; + + mod_mgr_dock_module(module); + + GTK_SAT_MODULE(module)->state = GTK_SAT_MOD_STATE_DOCKED; + + g_key_file_set_integer(GTK_SAT_MODULE(module)->cfgdata, + MOD_CFG_GLOBAL_SECTION, + MOD_CFG_STATE, GTK_SAT_MOD_STATE_DOCKED); + + g_object_unref(module); + break; + } + /* change internal state */ GTK_SAT_MODULE(module)->state = GTK_SAT_MOD_STATE_WINDOW; gtk_window_unfullscreen(GTK_WINDOW(GTK_SAT_MODULE(module)->win)); diff --git a/src/gtk-sat-module.c b/src/gtk-sat-module.c index 92b129ac..1658e46f 100644 --- a/src/gtk-sat-module.c +++ b/src/gtk-sat-module.c @@ -238,6 +238,7 @@ static void gtk_sat_module_init(GtkSatModule * module, module->lastSkgUpd = 0.0; module->state = GTK_SAT_MOD_STATE_DOCKED; + module->state_before_fullscreen = GTK_SAT_MOD_STATE_DOCKED; g_mutex_init(&module->busy); @@ -1047,6 +1048,16 @@ GtkWidget *gtk_sat_module_new(const gchar * cfgfile) module->state = GTK_SAT_MOD_STATE_DOCKED; } + /* Restored fullscreen already has a top-level window; exit to WINDOW. */ + if (module->state == GTK_SAT_MOD_STATE_FULLSCREEN) + { + module->state_before_fullscreen = GTK_SAT_MOD_STATE_WINDOW; + } + else + { + module->state_before_fullscreen = module->state; + } + /* time keeping */ module->rtNow = get_current_daynum(); module->rtPrev = get_current_daynum(); @@ -1356,6 +1367,8 @@ void gtk_sat_module_config_cb(GtkWidget * button, gpointer data) gtk_container_add(GTK_CONTAINER(module->win), GTK_WIDGET(module)); + module->state_before_fullscreen = GTK_SAT_MOD_STATE_WINDOW; + /* show window */ gtk_widget_show_all(module->win); diff --git a/src/gtk-sat-module.h b/src/gtk-sat-module.h index d4d8cd1d..3c338c02 100644 --- a/src/gtk-sat-module.h +++ b/src/gtk-sat-module.h @@ -82,6 +82,7 @@ struct _gtk_sat_module { guint32 timeout; /*!< Timeout value [msec] */ gtk_sat_mod_state_t state; /*!< The state of the module. */ + gtk_sat_mod_state_t state_before_fullscreen; /*!< State to restore after leaving fullscreen. */ guint timerid; /*!< The timeout ID (FIXME: REMOVE) */ GMutex busy; /*!< Flag indicating whether timeout has