Accepting request 412601 from GNOME:Next

- Update gnome-terminal-resize-fix.patch with latest revision of
  the patches, still not accepted upstream (bgo#760944 bsc#987859).

- Add gnome-terminal-resize-fix.patch: Fix resizing of
  gnome-terminal, patches from upstream bug (bgo#760944).

OBS-URL: https://build.opensuse.org/request/show/412601
OBS-URL: https://build.opensuse.org/package/show/GNOME:Factory/gnome-terminal?expand=0&rev=166
This commit is contained in:
Bjørn Lie 2016-07-21 17:07:23 +00:00 committed by Git OBS Bridge
parent 923c6023ed
commit a244fe2fcc
3 changed files with 390 additions and 0 deletions

View File

@ -0,0 +1,375 @@
From 82be23534eb5f0394b3e6c40992ad36d37dfea6d Mon Sep 17 00:00:00 2001
From: Sorokin Alexei <sor.alexei@meowr.ru>
Date: Mon, 7 Mar 2016 21:45:46 +0000
Subject: [PATCH 1/2] Fix chunked resize and --geometry option
Was caused by https://git.gnome.org/browse/gtk+/commit/?id=08974a1
https://bugzilla.gnome.org/show_bug.cgi?id=760944
---
src/terminal-options.c | 4 ----
src/terminal-window.c | 19 +++++++++++++------
2 files changed, 13 insertions(+), 10 deletions(-)
diff --git a/src/terminal-options.c b/src/terminal-options.c
index cc51cf6..723ecfe 100644
--- a/src/terminal-options.c
+++ b/src/terminal-options.c
@@ -583,10 +583,6 @@ option_geometry_callback (const gchar *option_name,
{
TerminalOptions *options = data;
- /* See https://bugzilla.gnome.org/show_bug.cgi?id=760944 */
- if (gtk_check_version (3, 19, 5) == NULL)
- return unsupported_option_callback (option_name, value, data, error);
-
if (options->initial_windows)
{
InitialWindow *iw;
diff --git a/src/terminal-window.c b/src/terminal-window.c
index 80e54b0..1e60697 100644
--- a/src/terminal-window.c
+++ b/src/terminal-window.c
@@ -3571,8 +3571,9 @@ terminal_window_update_geometry (TerminalWindow *window)
GtkWidget *widget;
GdkGeometry hints;
GtkBorder padding;
- int char_width;
- int char_height;
+ GtkRequisition toplevel_request, widget_request;
+ int base_width, base_height;
+ int char_width, char_height;
if (priv->active_screen == NULL)
return;
@@ -3596,8 +3597,14 @@ terminal_window_update_geometry (TerminalWindow *window)
padding.top + padding.bottom != priv->old_base_height ||
widget != (GtkWidget*) priv->old_geometry_widget)
{
- hints.base_width = padding.left + padding.right;
- hints.base_height = padding.top + padding.bottom;
+ gtk_widget_get_preferred_size (GTK_WIDGET (window), NULL, &toplevel_request);
+ gtk_widget_get_preferred_size (widget, NULL, &widget_request);
+
+ base_width = toplevel_request.width - widget_request.width;
+ base_height = toplevel_request.height - widget_request.height;
+
+ hints.base_width = base_width + padding.left + padding.right;
+ hints.base_height = base_height + padding.top + padding.bottom;
#define MIN_WIDTH_CHARS 4
#define MIN_HEIGHT_CHARS 1
@@ -3605,12 +3612,12 @@ terminal_window_update_geometry (TerminalWindow *window)
hints.width_inc = char_width;
hints.height_inc = char_height;
- /* min size is min size of just the geometry widget, remember. */
+ /* min size is min size of the whole window, remember. */
hints.min_width = hints.base_width + hints.width_inc * MIN_WIDTH_CHARS;
hints.min_height = hints.base_height + hints.height_inc * MIN_HEIGHT_CHARS;
gtk_window_set_geometry_hints (GTK_WINDOW (window),
- widget,
+ NULL,
&hints,
GDK_HINT_RESIZE_INC |
GDK_HINT_MIN_SIZE |
--
2.8.1
From e517e6944d27f4975083eac1efbdad6687524f56 Mon Sep 17 00:00:00 2001
From: Simon McVittie <smcv@debian.org>
Date: Mon, 6 Jun 2016 09:40:32 +0100
Subject: [PATCH 2/2] Replace no-op gtk_window_resize_to_geometry by
calculating new size
Together with the previous commit, this fixes a regression in
GNOME 3.20: anything that would alter the Terminal size, for example
a font size change or the 80x24, 80x43 etc. menu items, did nothing.
Signed-off-by: Simon McVittie <smcv@debian.org>
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=760944
---
src/terminal-window.c | 168 +++++++++++++++++++++++++++++++++++++++++---------
1 file changed, 140 insertions(+), 28 deletions(-)
diff --git a/src/terminal-window.c b/src/terminal-window.c
index 1e60697..82b1b10 100644
--- a/src/terminal-window.c
+++ b/src/terminal-window.c
@@ -72,11 +72,30 @@ struct _TerminalWindowPrivate
GtkWidget *menubar;
TerminalMdiContainer *mdi_container;
+ GtkWidget *main_vbox;
TerminalScreen *active_screen;
+
+ /* Size of a character cell in pixels */
int old_char_width;
int old_char_height;
- int old_base_width;
- int old_base_height;
+
+ /* Width and height added to the actual terminal grid by "chrome" inside
+ * what was traditionally the X11 window: menu bar, title bar,
+ * style-provided padding. This must be included when resizing the window
+ * and also included in geometry hints. */
+ int old_chrome_width;
+ int old_chrome_height;
+
+ /* Width and height added to the window by client-side decorations.
+ * This must be included in geometry hints but must not be included when
+ * resizing the window. */
+ int old_csd_width;
+ int old_csd_height;
+
+ /* Width and height of the padding around the geometry widget. */
+ int old_padding_width;
+ int old_padding_height;
+
void *old_geometry_widget; /* only used for pointer value as it may be freed */
GtkWidget *confirm_close_dialog;
@@ -88,6 +107,8 @@ struct _TerminalWindowPrivate
guint disposed : 1;
guint present_on_insert : 1;
+ guint realized : 1;
+
/* Workaround until gtk+ bug #535557 is fixed */
guint icon_title_set : 1;
};
@@ -2287,6 +2308,12 @@ terminal_window_realize (GtkWidget *widget)
/* Need to do this now since this requires the window to be realized */
if (priv->active_screen != NULL)
sync_screen_icon_title (priv->active_screen, NULL, window);
+
+ /* Now that we've been realized, we should know precisely how large the
+ * client-side decorations are going to be. Recalculate the geometry hints,
+ * export them to the windowing system, and resize the window accordingly. */
+ priv->realized = TRUE;
+ terminal_window_update_size (window);
}
static gboolean
@@ -2621,7 +2648,6 @@ terminal_window_init (TerminalWindow *window)
GtkActionGroup *action_group;
GtkAction *action;
GtkUIManager *manager;
- GtkWidget *main_vbox;
GError *error;
GtkWindowGroup *window_group;
GtkAccelGroup *accel_group;
@@ -2651,7 +2677,7 @@ terminal_window_init (TerminalWindow *window)
priv->active_screen = NULL;
- main_vbox = gtk_bin_get_child (GTK_BIN (window));
+ priv->main_vbox = gtk_bin_get_child (GTK_BIN (window));
priv->mdi_container = TERMINAL_MDI_CONTAINER (terminal_notebook_new ());
@@ -2686,13 +2712,19 @@ terminal_window_init (TerminalWindow *window)
g_signal_connect (priv->mdi_container, "create-window",
G_CALLBACK (handle_tab_droped_on_desktop), window);
- gtk_box_pack_end (GTK_BOX (main_vbox), GTK_WIDGET (priv->mdi_container), TRUE, TRUE, 0);
+ gtk_box_pack_end (GTK_BOX (priv->main_vbox), GTK_WIDGET (priv->mdi_container), TRUE, TRUE, 0);
gtk_widget_show (GTK_WIDGET (priv->mdi_container));
priv->old_char_width = -1;
priv->old_char_height = -1;
- priv->old_base_width = -1;
- priv->old_base_height = -1;
+
+ priv->old_chrome_width = -1;
+ priv->old_chrome_height = -1;
+ priv->old_csd_width = -1;
+ priv->old_csd_height = -1;
+ priv->old_padding_width = -1;
+ priv->old_padding_height = -1;
+
priv->old_geometry_widget = NULL;
/* GAction setup */
@@ -2753,7 +2785,7 @@ terminal_window_init (TerminalWindow *window)
#endif
priv->menubar = gtk_ui_manager_get_widget (manager, "/menubar");
- gtk_box_pack_start (GTK_BOX (main_vbox),
+ gtk_box_pack_start (GTK_BOX (priv->main_vbox),
priv->menubar,
FALSE, FALSE, 0);
@@ -3209,13 +3241,41 @@ terminal_window_update_size (TerminalWindow *window)
{
TerminalWindowPrivate *priv = window->priv;
int grid_width, grid_height;
+ int pixel_width, pixel_height;
+ GdkWindow *gdk_window;
+
+ gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
+
+ if (gdk_window != NULL &&
+ (gdk_window_get_state (gdk_window) &
+ (GDK_WINDOW_STATE_MAXIMIZED | GDK_WINDOW_STATE_TILED)))
+ {
+ /* Don't adjust the size of maximized or tiled (snapped, half-maximized)
+ * windows: if we do, there will be ugly gaps of up to 1 character cell
+ * around otherwise tiled windows. */
+ return;
+ }
/* be sure our geometry is up-to-date */
terminal_window_update_geometry (window);
terminal_screen_get_size (priv->active_screen, &grid_width, &grid_height);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY,
+ "[window %p] size is %dx%d cells of %dx%d px\n",
+ window, grid_width, grid_height,
+ priv->old_char_width, priv->old_char_height);
+
+ /* the "old" struct members were updated by update_geometry */
+ pixel_width = priv->old_chrome_width + grid_width * priv->old_char_width;
+ pixel_height = priv->old_chrome_height + grid_height * priv->old_char_height;
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY,
+ "[window %p] %dx%d + %dx%d = %dx%d\n",
+ window, grid_width * priv->old_char_width,
+ grid_height * priv->old_char_height,
+ priv->old_chrome_width, priv->old_chrome_height,
+ pixel_width, pixel_height);
- gtk_window_resize_to_geometry (GTK_WINDOW (window), grid_width, grid_height);
+ gtk_window_resize (GTK_WINDOW (window), pixel_width, pixel_height);
}
void
@@ -3571,9 +3631,11 @@ terminal_window_update_geometry (TerminalWindow *window)
GtkWidget *widget;
GdkGeometry hints;
GtkBorder padding;
- GtkRequisition toplevel_request, widget_request;
- int base_width, base_height;
+ GtkRequisition toplevel_request, vbox_request, widget_request;
+ int grid_width, grid_height;
int char_width, char_height;
+ int chrome_width, chrome_height;
+ int csd_width, csd_height;
if (priv->active_screen == NULL)
return;
@@ -3586,25 +3648,68 @@ terminal_window_update_geometry (TerminalWindow *window)
* window, but that doesn't make too much sense.
*/
terminal_screen_get_cell_size (priv->active_screen, &char_width, &char_height);
-
+
+ terminal_screen_get_size (priv->active_screen, &grid_width, &grid_height);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "%dx%d cells of %dx%d px = %dx%d px\n",
+ grid_width, grid_height, char_width, char_height,
+ char_width * grid_width, char_height * grid_height);
+
gtk_style_context_get_padding(gtk_widget_get_style_context(widget),
gtk_widget_get_state_flags(widget),
&padding);
- if (char_width != priv->old_char_width ||
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "padding = %dx%d px\n",
+ padding.left + padding.right,
+ padding.top + padding.bottom);
+
+ gtk_widget_get_preferred_size (priv->main_vbox, NULL, &vbox_request);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "content area requests %dx%d px\n",
+ vbox_request.width, vbox_request.height);
+
+ gtk_widget_get_preferred_size (GTK_WIDGET (window), NULL, &toplevel_request);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "window requests %dx%d px\n",
+ toplevel_request.width, toplevel_request.height);
+
+ chrome_width = vbox_request.width - (char_width * grid_width);
+ chrome_height = vbox_request.height - (char_height * grid_height);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "chrome: %dx%d px\n",
+ chrome_width, chrome_height);
+
+ csd_width = toplevel_request.width - vbox_request.width;
+ csd_height = toplevel_request.height - vbox_request.height;
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "CSDs: %dx%d px%s\n",
+ csd_width, csd_height,
+ priv->realized ? "" : " (just a guess)");
+
+ gtk_widget_get_preferred_size (widget, NULL, &widget_request);
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "terminal widget requests %dx%d px\n",
+ widget_request.width, widget_request.height);
+
+ if (!priv->realized)
+ {
+ /* Don't actually set the geometry hints until we have been realized,
+ * because we don't know precisely how large the client-side decorations
+ * are going to be. We also avoid setting priv->old_csd_width or
+ * priv->old_csd_height, so that next time through this function we'll
+ * definitely recalculate the hints.
+ *
+ * Similarly, the size request doesn't seem to include the padding
+ * until we've been redrawn at least once. Don't resize the window
+ * until we've done that. */
+ _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, "not realized yet\n");
+ }
+ else if (char_width != priv->old_char_width ||
char_height != priv->old_char_height ||
- padding.left + padding.right != priv->old_base_width ||
- padding.top + padding.bottom != priv->old_base_height ||
+ padding.left + padding.right != priv->old_padding_width ||
+ padding.top + padding.bottom != priv->old_padding_height ||
+ chrome_width != priv->old_chrome_width ||
+ chrome_height != priv->old_chrome_height ||
+ csd_width != priv->old_csd_width ||
+ csd_height != priv->old_csd_height ||
widget != (GtkWidget*) priv->old_geometry_widget)
{
- gtk_widget_get_preferred_size (GTK_WIDGET (window), NULL, &toplevel_request);
- gtk_widget_get_preferred_size (widget, NULL, &widget_request);
-
- base_width = toplevel_request.width - widget_request.width;
- base_height = toplevel_request.height - widget_request.height;
-
- hints.base_width = base_width + padding.left + padding.right;
- hints.base_height = base_height + padding.top + padding.bottom;
+ hints.base_width = chrome_width + csd_width;
+ hints.base_height = chrome_height + csd_height;
#define MIN_WIDTH_CHARS 4
#define MIN_HEIGHT_CHARS 1
@@ -3632,11 +3737,9 @@ terminal_window_update_geometry (TerminalWindow *window)
hints.min_height,
hints.width_inc,
hints.height_inc);
-
- priv->old_char_width = hints.width_inc;
- priv->old_char_height = hints.height_inc;
- priv->old_base_width = hints.base_width;
- priv->old_base_height = hints.base_height;
+
+ priv->old_csd_width = csd_width;
+ priv->old_csd_height = csd_height;
priv->old_geometry_widget = widget;
}
else
@@ -3645,6 +3748,15 @@ terminal_window_update_geometry (TerminalWindow *window)
"[window %p] hints: increment unchanged, not setting\n",
window);
}
+
+ /* We need these for the size calculation in terminal_window_update_size()
+ * (at least under GTK >= 3.19), so we set them unconditionally. */
+ priv->old_char_width = char_width;
+ priv->old_char_height = char_height;
+ priv->old_chrome_width = chrome_width;
+ priv->old_chrome_height = chrome_height;
+ priv->old_padding_width = padding.left + padding.right;
+ priv->old_padding_height = padding.top + padding.bottom;
}
static void
--
2.8.1

View File

@ -1,3 +1,15 @@
-------------------------------------------------------------------
Thu Jul 21 18:07:36 CEST 2016 - fcrozat@suse.com
- Update gnome-terminal-resize-fix.patch with latest revision of
the patches, still not accepted upstream (bgo#760944 bsc#987859).
-------------------------------------------------------------------
Tue May 24 10:53:39 UTC 2016 - zaitor@opensuse.org
- Add gnome-terminal-resize-fix.patch: Fix resizing of
gnome-terminal, patches from upstream bug (bgo#760944).
-------------------------------------------------------------------
Tue May 24 10:52:39 UTC 2016 - mgorse@suse.com

View File

@ -24,6 +24,8 @@ License: GPL-3.0+ and LGPL-2.1+
Group: System/X11/Terminals
Url: http://www.gnome.org
Source: http://download.gnome.org/sources/gnome-terminal/3.20/%{name}-%{version}.tar.xz
# PATCH-FIX-UPSTREAM gnome-terminal-resize-fix.patch bgo#760944 zaitor@opensuse.org -- Fix resizing of gnome-terminal, patches from upstream bug.
Patch0: gnome-terminal-resize-fix.patch
BuildRequires: fdupes
# Needed for search provider. It should not be needed in my opionion, we have to take this up with upstream, or just provide search provider interface definition file as source.
BuildRequires: gnome-shell
@ -81,6 +83,7 @@ arbitrary folders.
%lang_package
%prep
%setup -q
%patch0 -p1
translation-update-upstream
%build