[PATCH v3] gnome-dictionary: set a default value for the sidebar width
- From: Guido Trentalancia <guido trentalancia com>
- To: gnome-utils-list gnome org
- Subject: [PATCH v3] gnome-dictionary: set a default value for the sidebar width
- Date: Sun, 08 Oct 2017 00:06:04 +0200
If it is not possible to load the window state (for example, it is
the first time that the application runs), set a default value (33%)
for the sidebar width.
This fixes bug #788621 which was causing the sidebar to extend to
the whole window (sidebar_width = 0, i.e. 100%), thus hiding the
main panel and rendering the application basically unusable when
the sidebar was enabled.
The second version of this patch introduced further fixes to the
window resizing code (the sidebar panel is correctly resized upon
window resizing or window minimization/maximization).
This third version includes support for the correct migration from
the old window state format to the new format (sidebar width as a
percentage instead of pixels).
Signed-off-by: Guido Trentalancia <guido trentalancia com>
---
src/gdict-window.c | 78 ++++++++++++++++++++++++++++++++++++-----------------
src/gdict-window.h | 2 -
2 files changed, 54 insertions(+), 26 deletions(-)
--- a/src/gdict-window.c 2017-09-12 10:08:25.000000000 +0200
+++ b/src/gdict-window.c 2017-10-07 23:58:14.416918469 +0200
@@ -704,7 +704,7 @@ gdict_window_store_state (GdictWindow *w
g_key_file_set_integer (state_key, "WindowState", "Height", window->current_height);
g_key_file_set_boolean (state_key, "WindowState", "IsMaximized", window->is_maximized);
g_key_file_set_boolean (state_key, "WindowState", "SidebarVisible", window->sidebar_visible);
- g_key_file_set_integer (state_key, "WindowState", "SidebarWidth", window->sidebar_width);
+ g_key_file_set_double (state_key, "WindowState", "SidebarWidthPercentage",
window->sidebar_width_percentage);
page_id = gdict_sidebar_current_page (GDICT_SIDEBAR (window->sidebar));
if (page_id == NULL)
@@ -788,11 +788,11 @@ gdict_window_load_state (GdictWindow *wi
window->sidebar_visible = FALSE;
}
- window->sidebar_width = g_key_file_get_integer (state_key, "WindowState", "SidebarWidth", &error);
+ window->sidebar_width_percentage = g_key_file_get_double (state_key, "WindowState",
"SidebarWidthPercentage", &error);
if (error != NULL)
{
g_clear_error (&error);
- window->sidebar_width = -1;
+ window->sidebar_width_percentage = -1;
}
window->sidebar_page = g_key_file_get_string (state_key, "WindowState", "SidebarPage", &error);
@@ -1114,12 +1114,38 @@ gdict_window_state_event_cb (GtkWidget
gpointer user_data)
{
GdictWindow *window = GDICT_WINDOW (widget);
-
+
if (event->new_window_state & GDK_WINDOW_STATE_MAXIMIZED)
window->is_maximized = TRUE;
else
window->is_maximized = FALSE;
-
+
+ gtk_window_get_size (GTK_WINDOW (window),
+ &window->current_width,
+ &window->current_height);
+
+ /* Resize the panel as the window is minimised/maximised */
+ gtk_paned_set_position (GTK_PANED (window->main_pane),
+ window->current_width * (1.0 - window->sidebar_width_percentage));
+
+ return FALSE;
+}
+
+static gboolean
+gdict_window_size_allocate_event_cb (GtkWidget *widget,
+ GdkEventWindowState *event,
+ gpointer user_data)
+{
+ GdictWindow *window = GDICT_WINDOW (widget);
+
+ gtk_window_get_size (GTK_WINDOW (window),
+ &window->current_width,
+ &window->current_height);
+
+ /* Resize the panel as the window is resized */
+ gtk_paned_set_position (GTK_PANED (window->main_pane),
+ window->current_width * (1.0 - window->sidebar_width_percentage));
+
return FALSE;
}
@@ -1293,17 +1319,8 @@ static void
gdict_window_size_allocate (GtkWidget *widget,
GtkAllocation *allocation)
{
- GdictWindow *window = GDICT_WINDOW (widget);
-
if (GTK_WIDGET_CLASS (gdict_window_parent_class)->size_allocate != NULL)
GTK_WIDGET_CLASS (gdict_window_parent_class)->size_allocate (widget, allocation);
-
- if (!window->is_maximized)
- {
- gtk_window_get_size (GTK_WINDOW (widget),
- &window->current_width,
- &window->current_height);
- }
}
static void
@@ -1312,14 +1329,19 @@ gdict_window_handle_notify_position_cb (
gpointer user_data)
{
GdictWindow *window = GDICT_WINDOW (user_data);
- gint window_width, pos;
- GtkAllocation allocation;
+ gint pos;
+ gdouble new_sidebar_width_percentage;
+ gdouble diff_sidebar_width_percentage;
+
+ pos = gtk_paned_get_position (GTK_PANED (window->main_pane));
+
+ new_sidebar_width_percentage = 1.0 - pos / (gdouble) window->current_width;
+ diff_sidebar_width_percentage = fabs (window->sidebar_width_percentage - new_sidebar_width_percentage);
+ if (pos < window->current_width && diff_sidebar_width_percentage > 1e-2)
+ window->sidebar_width_percentage = new_sidebar_width_percentage;
- pos = gtk_paned_get_position (GTK_PANED (widget));
- gtk_widget_get_allocation (GTK_WIDGET (window), &allocation);
- window_width = allocation.width;
-
- window->sidebar_width = window_width - pos;
+ gtk_paned_set_position (GTK_PANED (window->main_pane),
+ window->current_width * (1.0 - window->sidebar_width_percentage));
}
static void
@@ -1330,7 +1352,6 @@ gdict_window_constructed (GObject *gobje
GtkWidget *button;
PangoFontDescription *font_desc;
gchar *font_name;
- GtkAllocation allocation;
GMenu *menu;
window = GDICT_WINDOW (gobject);
@@ -1340,6 +1361,10 @@ gdict_window_constructed (GObject *gobje
/* recover the state */
gdict_window_load_state (window);
+ /* Set a default value for the sidebar width (percentage) */
+ if (window->sidebar_width_percentage <= 0)
+ window->sidebar_width_percentage = 0.3333;
+
/* build menus */
g_action_map_add_action_entries (G_ACTION_MAP (window),
entries, G_N_ELEMENTS (entries),
@@ -1496,7 +1521,7 @@ gdict_window_constructed (GObject *gobje
}
pango_font_description_free (font_desc);
-
+
gtk_window_set_title (GTK_WINDOW (window), _("Dictionary"));
gtk_window_set_default_size (GTK_WINDOW (window),
window->default_width,
@@ -1504,8 +1529,6 @@ gdict_window_constructed (GObject *gobje
if (window->is_maximized)
gtk_window_maximize (GTK_WINDOW (window));
- gtk_widget_get_allocation (GTK_WIDGET (window), &allocation);
- gtk_paned_set_position (GTK_PANED (window->main_pane), allocation.width - window->sidebar_width);
if (window->sidebar_page != NULL)
gdict_sidebar_view_page (GDICT_SIDEBAR (window->sidebar), window->sidebar_page);
else
@@ -1517,6 +1540,9 @@ gdict_window_constructed (GObject *gobje
g_signal_connect (window, "window-state-event",
G_CALLBACK (gdict_window_state_event_cb),
NULL);
+ g_signal_connect (window, "size-allocate",
+ G_CALLBACK (gdict_window_size_allocate_event_cb),
+ NULL);
g_signal_connect (window->main_pane, "notify::position",
G_CALLBACK (gdict_window_handle_notify_position_cb),
window);
@@ -1665,6 +1691,8 @@ gdict_window_init (GdictWindow *window)
window->default_width = -1;
window->default_height = -1;
+ window->current_width = -1;
+ window->current_height = -1;
window->is_maximized = FALSE;
window->sidebar_visible = FALSE;
window->sidebar_page = NULL;
--- a/src/gdict-window.h 2017-09-12 10:08:25.000000000 +0200
+++ b/src/gdict-window.h 2017-10-07 16:51:02.475112313 +0200
@@ -99,7 +99,7 @@ struct _GdictWindow
gint default_height;
gint current_width;
gint current_height;
- gint sidebar_width;
+ gdouble sidebar_width_percentage;
gchar *sidebar_page;
[
Date Prev][Date Next] [
Thread Prev][Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]