diff --git a/mousepad/mousepad-window-ui.xml b/mousepad/mousepad-window-ui.xml index f960bc6..812b4d1 100644 --- a/mousepad/mousepad-window-ui.xml +++ b/mousepad/mousepad-window-ui.xml @@ -73,6 +73,7 @@ + @@ -156,4 +157,9 @@ + + + + + diff --git a/mousepad/mousepad-window.c b/mousepad/mousepad-window.c index b789d71..c3fd219 100644 --- a/mousepad/mousepad-window.c +++ b/mousepad/mousepad-window.c @@ -225,6 +225,16 @@ static void mousepad_window_button_close_tab (MousepadD MousepadWindow *window); static gboolean mousepad_window_delete_event (MousepadWindow *window, GdkEvent *event); +static gboolean mousepad_window_motion_notify_event (MousepadWindow *window, + GdkEventMotion *event, + gpointer user_data); +static gboolean mousepad_window_notebook_enter_notify_event (GtkWidget *widget, + GdkEventCrossing *event, + gpointer user_data); +static gboolean mousepad_window_show_fs_toolbar_timeout (MousepadWindow *window); +static void mousepad_window_state_event (GtkWidget *widget, + GdkEventWindowState *event, + gpointer user_data); /* actions */ static void mousepad_window_action_new (GtkAction *action, @@ -347,6 +357,8 @@ static void mousepad_window_action_contents (GtkAction MousepadWindow *window); static void mousepad_window_action_about (GtkAction *action, MousepadWindow *window); +static void mousepad_window_action_fullscreen (GtkWidget *widget, + MousepadWindow *window); @@ -379,6 +391,8 @@ struct _MousepadWindow GtkUIManager *ui_manager; guint gomenu_merge_id; guint recent_merge_id; + guint toolbar_fullscreen_merge_id; + guint toolbar_unfullscreen_merge_id; /* main window widgets */ GtkWidget *box; @@ -386,6 +400,12 @@ struct _MousepadWindow GtkWidget *search_bar; GtkWidget *statusbar; GtkWidget *replace_dialog; + GtkWidget *menubar; + GtkWidget *toolbar; + + /* handle toolbar timer to show or hide */ + guint show_fs_toolbar_timeout_id; + gboolean fs_toolbar_sticky; /* support to remember window geometry */ guint save_geometry_timer_id; @@ -435,6 +455,8 @@ static const GtkActionEntry action_entries[] = { "view-menu", NULL, N_("_View"), NULL, NULL, NULL, }, { "font", GTK_STOCK_SELECT_FONT, N_("Select F_ont..."), NULL, N_("Change the editor font"), G_CALLBACK (mousepad_window_action_select_font), }, + { "fullscreen", GTK_STOCK_FULLSCREEN, N_("_Fullscreen"), "F11", N_("Switch to fullscreen"), G_CALLBACK (mousepad_window_action_fullscreen), }, + { "unfullscreen", GTK_STOCK_LEAVE_FULLSCREEN, N_ ("_Leave Fullscreen"), NULL, N_ ("Leave fullscreen"), G_CALLBACK (mousepad_window_action_fullscreen), }, { "color-scheme-menu", NULL, N_("_Color Scheme"), NULL, NULL, NULL, }, { "text-menu", NULL, N_("_Text"), NULL, NULL, NULL, }, @@ -546,7 +568,6 @@ static void mousepad_window_init (MousepadWindow *window) { GtkAccelGroup *accel_group; - GtkWidget *menubar; GtkWidget *label; GtkWidget *separator; GtkWidget *ebox; @@ -561,9 +582,13 @@ mousepad_window_init (MousepadWindow *window) window->update_go_menu_id = 0; window->gomenu_merge_id = 0; window->recent_merge_id = 0; + window->toolbar_fullscreen_merge_id = 0; + window->toolbar_unfullscreen_merge_id = 0; window->search_bar = NULL; window->statusbar = NULL; window->replace_dialog = NULL; + window->menubar = NULL; + window->toolbar = NULL; window->active = NULL; window->recent_manager = NULL; @@ -633,9 +658,36 @@ mousepad_window_init (MousepadWindow *window) gtk_container_add (GTK_CONTAINER (window), window->box); gtk_widget_show (window->box); - menubar = gtk_ui_manager_get_widget (window->ui_manager, "/main-menu"); - gtk_box_pack_start (GTK_BOX (window->box), menubar, FALSE, FALSE, 0); - gtk_widget_show (menubar); + window->menubar = gtk_ui_manager_get_widget (window->ui_manager, "/main-menu"); + gtk_box_pack_start (GTK_BOX (window->box), window->menubar, FALSE, FALSE, 0); + gtk_widget_show (window->menubar); + + /* apend the fullscreen toolbar */ + window->toolbar = gtk_ui_manager_get_widget (window->ui_manager, "/toolbar"); + gtk_box_pack_start (GTK_BOX (window->box), window->toolbar, FALSE, FALSE, 0); + gtk_widget_hide (window->toolbar); + + window->toolbar_fullscreen_merge_id = gtk_ui_manager_new_merge_id (window->ui_manager); + window->toolbar_unfullscreen_merge_id = gtk_ui_manager_new_merge_id (window->ui_manager); + gtk_ui_manager_add_ui (window->ui_manager, + window->toolbar_fullscreen_merge_id, + "/toolbar/placeholder-fullscreen", + "fullscreen", + "fullscreen", + GTK_UI_MANAGER_TOOLITEM, + FALSE); + + /* get the fullscreen toolbar separator and tell it to expand */ + separator = gtk_ui_manager_get_widget (window->ui_manager, "/toolbar/separator-1"); + gtk_separator_tool_item_set_draw (GTK_SEPARATOR_TOOL_ITEM (separator), FALSE); + gtk_tool_item_set_expand (GTK_TOOL_ITEM (separator), TRUE); + gtk_widget_show (separator); + + /* signal for handling the mouse motion event */ + g_signal_connect (G_OBJECT (window), "motion-notify-event", G_CALLBACK (mousepad_window_motion_notify_event), window); + + /* signal for handling the window state */ + g_signal_connect (G_OBJECT (window), "window-state-event", G_CALLBACK (mousepad_window_state_event), NULL); /* check if we need to add the root warning */ if (G_UNLIKELY (geteuid () == 0)) @@ -690,6 +742,7 @@ mousepad_window_init (MousepadWindow *window) g_signal_connect (G_OBJECT (window->notebook), "page-removed", G_CALLBACK (mousepad_window_notebook_removed), window); g_signal_connect (G_OBJECT (window->notebook), "button-press-event", G_CALLBACK (mousepad_window_notebook_button_press_event), window); g_signal_connect (G_OBJECT (window->notebook), "button-release-event", G_CALLBACK (mousepad_window_notebook_button_release_event), window); + g_signal_connect (G_OBJECT (window->notebook), "enter-notify-event", G_CALLBACK (mousepad_window_notebook_enter_notify_event), window); #if GTK_CHECK_VERSION (2,12,0) g_signal_connect (G_OBJECT (window->notebook), "create-window", G_CALLBACK (mousepad_window_notebook_create_window), window); #endif @@ -705,7 +758,6 @@ mousepad_window_init (MousepadWindow *window) /* allow drops in the window */ gtk_drag_dest_set (GTK_WIDGET (window), GTK_DEST_DEFAULT_MOTION | GTK_DEST_DEFAULT_DROP, drop_targets, G_N_ELEMENTS (drop_targets), GDK_ACTION_COPY | GDK_ACTION_MOVE); g_signal_connect (G_OBJECT (window), "drag-data-received", G_CALLBACK (mousepad_window_drag_data_received), window); - } @@ -3193,6 +3245,131 @@ mousepad_window_delete_event (MousepadWindow *window, +static gboolean +mousepad_window_motion_notify_event (MousepadWindow *window, + GdkEventMotion *event, + gpointer user_data) +{ + gint width, height; + if(gdk_window_get_state(GTK_WIDGET(window)->window) & GDK_WINDOW_STATE_FULLSCREEN) + { + gdk_drawable_get_size (GDK_DRAWABLE(GTK_WIDGET(window)->window), &width, &height); + + if ((event->x_root == 0) || (event->y_root == 0) || (((gint)event->x_root) == (width-1)) || (((gint)event->y_root) == (height-1))) + { + gtk_widget_show (window->toolbar); + window->fs_toolbar_sticky = TRUE; + + if (window->show_fs_toolbar_timeout_id > 0) + { + g_source_remove (window->show_fs_toolbar_timeout_id); + window->show_fs_toolbar_timeout_id = 0; + } + } + } + return TRUE; +} + + + +static gboolean +mousepad_window_notebook_enter_notify_event (GtkWidget *widget, + GdkEventCrossing *event, + gpointer user_data) +{ + MousepadWindow *window = MOUSEPAD_WINDOW (user_data); + if (gdk_window_get_state (GTK_WIDGET (window)->window) & GDK_WINDOW_STATE_FULLSCREEN) + { + window->fs_toolbar_sticky = FALSE; + if (window->show_fs_toolbar_timeout_id > 0) + { + g_source_remove (window->show_fs_toolbar_timeout_id); + window->show_fs_toolbar_timeout_id = 0; + } + window->show_fs_toolbar_timeout_id = g_timeout_add (500, (GSourceFunc)mousepad_window_show_fs_toolbar_timeout, window); + } + + return TRUE; +} + + + +static gboolean +mousepad_window_show_fs_toolbar_timeout (MousepadWindow *window) +{ + gtk_widget_hide (window->toolbar); + return FALSE; +} + + + +static void +mousepad_window_state_event (GtkWidget *widget, + GdkEventWindowState *event, + gpointer user_data) +{ + MousepadWindow *window = MOUSEPAD_WINDOW (widget); + + if (event->changed_mask & GDK_WINDOW_STATE_FULLSCREEN) + { + if (event->new_window_state & GDK_WINDOW_STATE_FULLSCREEN) + { + gtk_ui_manager_add_ui ( + window->ui_manager, + window->toolbar_unfullscreen_merge_id, + "/toolbar/placeholder-fullscreen", + "unfullscreen", + "unfullscreen", + GTK_UI_MANAGER_TOOLITEM, + FALSE); + gtk_ui_manager_remove_ui ( + window->ui_manager, + window->toolbar_fullscreen_merge_id); + + gtk_widget_hide (window->menubar); + gtk_widget_show (window->toolbar); + gtk_widget_hide (window->statusbar); + + if (window->fs_toolbar_sticky) + { + if (window->show_fs_toolbar_timeout_id > 0) + { + g_source_remove (window->show_fs_toolbar_timeout_id); + window->show_fs_toolbar_timeout_id = 0; + } + + window->show_fs_toolbar_timeout_id = g_timeout_add (500, (GSourceFunc)mousepad_window_show_fs_toolbar_timeout, window); + } + } + else + { + gtk_ui_manager_add_ui ( + window->ui_manager, + window->toolbar_fullscreen_merge_id, + "/toolbar/placeholder-fullscreen", + "fullscreen", + "fullscreen", + GTK_UI_MANAGER_TOOLITEM, + FALSE); + gtk_ui_manager_remove_ui ( + window->ui_manager, + window->toolbar_unfullscreen_merge_id); + + if (window->show_fs_toolbar_timeout_id > 0) + { + g_source_remove (window->show_fs_toolbar_timeout_id); + window->show_fs_toolbar_timeout_id = 0; + } + + gtk_widget_show (window->menubar); + gtk_widget_hide (window->toolbar); + gtk_widget_show (window->statusbar); + } + } +} + + + static void mousepad_window_menu_color_schemes (MousepadWindow *window) { @@ -5097,3 +5274,21 @@ mousepad_window_action_about (GtkAction *action, /* show about dialog */ mousepad_dialogs_show_about (GTK_WINDOW (window)); } + + + +static void +mousepad_window_action_fullscreen (GtkWidget *widget, + MousepadWindow *window) +{ + if (gdk_window_get_state (GTK_WIDGET (window)->window) & GDK_WINDOW_STATE_FULLSCREEN) + { + /* leave fullscreen mode */ + gtk_window_unfullscreen (GTK_WINDOW (window)); + } + else + { + /* enter fullscreen mode */ + gtk_window_fullscreen (GTK_WINDOW (window)); + } +}