From a8abe40b1d677bd008e4ecd0dbcbc8dcce63bbce Mon Sep 17 00:00:00 2001 From: raveit65 Date: Sep 22 2016 14:15:51 +0000 Subject: fix terminal window position with geometry option --- diff --git a/mate-terminal.spec b/mate-terminal.spec index e289fbe..2ab5535 100644 --- a/mate-terminal.spec +++ b/mate-terminal.spec @@ -16,7 +16,7 @@ Summary: Terminal emulator for MATE Name: mate-terminal Version: %{branch}.1 %if 0%{?rel_build} -Release: 2%{?dist} +Release: 3%{?dist} %else Release: 0.2%{?git_rel}%{?dist} %endif @@ -44,6 +44,10 @@ Patch9: mate-terminal_0009-drop-old-code-for-VTE-0.38-it-was-used-in-GTK- # https://github.com/mate-desktop/mate-terminal/pull/139 Patch10: mate-terminal_0001-fix-resize-menu-buttons-122.patch Patch11: mate-terminal_0002-don-t-use-deprecated-gtk_window_parse_geometry.patch +# fix rhbz (#1377805) +# https://github.com/mate-desktop/mate-terminal/pull/142 +Patch12: mate-terminal_0003-fix-position-with-geometry-option.patch + BuildRequires: dconf-devel BuildRequires: desktop-file-utils @@ -77,6 +81,7 @@ clickable URLs. %patch9 -p1 -b .0009 %patch10 -p1 -b .0001 %patch11 -p1 -b .0002 +%patch12 -p1 -b .0003 NOCONFIGURE=1 ./autogen.sh @@ -126,6 +131,10 @@ fi %changelog +* Thu Sep 22 2016 Wolfgang Ulbrich - 1.14.1-3 +- fix rhbz (#1377805) +- fix terminal window position with geometry option + * Wed Sep 07 2016 Wolfgang Ulbrich - 1.14.1-2 - fix rhbz (#1357693) diff --git a/mate-terminal_0003-fix-position-with-geometry-option.patch b/mate-terminal_0003-fix-position-with-geometry-option.patch new file mode 100644 index 0000000..e63ae5f --- /dev/null +++ b/mate-terminal_0003-fix-position-with-geometry-option.patch @@ -0,0 +1,275 @@ +diff --git a/src/terminal-app.c b/src/terminal-app.c +index bfec5b5..d9cc0f0 100644 +--- a/src/terminal-app.c ++++ b/src/terminal-app.c +@@ -1849,10 +1849,10 @@ terminal_app_handle_options (TerminalApp *app, + "[window %p] applying geometry %s\n", + window, iw->geometry); + +- if (!terminal_window_set_size_force_grid (window, +- terminal_window_get_active (window), +- FALSE, +- iw->geometry)) ++ if (!terminal_window_update_size_set_geometry (window, ++ terminal_window_get_active (window), ++ FALSE, ++ iw->geometry)) + g_printerr (_("Invalid geometry string \"%s\"\n"), iw->geometry); + } + +diff --git a/src/terminal-screen.c b/src/terminal-screen.c +index 98c7b4d..69ede6f 100644 +--- a/src/terminal-screen.c ++++ b/src/terminal-screen.c +@@ -1112,7 +1112,7 @@ terminal_screen_change_font (TerminalScreen *screen) + terminal_screen_set_font (screen); + + window = terminal_screen_get_window (screen); +- terminal_window_set_size (window, screen, TRUE); ++ terminal_window_update_size (window, screen, TRUE); + } + + static void +diff --git a/src/terminal-window.c b/src/terminal-window.c +index d0c159b..7026c83 100644 +--- a/src/terminal-window.c ++++ b/src/terminal-window.c +@@ -480,13 +480,13 @@ terminal_window_XParseGeometry (const char *string, + + if (*strind != '\0') return (0); + +- if (x != NULL && mask & XValue) ++ if (mask & XValue) + *x = tempX; +- if (y != NULL && mask & YValue) ++ if (mask & YValue) + *y = tempY; +- if (width != NULL && mask & WidthValue) ++ if (mask & WidthValue) + *width = tempWidth; +- if (height != NULL && mask & HeightValue) ++ if (mask & HeightValue) + *height = tempHeight; + return (mask); + } +@@ -1087,7 +1087,7 @@ terminal_size_to_cb (GtkAction *action, + + vte_terminal_set_size (VTE_TERMINAL (priv->active_screen), width, height); + +- terminal_window_set_size (window, priv->active_screen, TRUE); ++ terminal_window_update_size (window, priv->active_screen, TRUE); + } + + static void +@@ -1262,7 +1262,7 @@ screen_resize_window_cb (TerminalScreen *screen, + if (screen != priv->active_screen) + return; + +- terminal_window_set_size (window, screen, TRUE); ++ terminal_window_update_size (window, screen, TRUE); + } + + static void +@@ -2434,7 +2434,7 @@ terminal_window_show (GtkWidget *widget) + #if 0 + /* At this point, we have our GdkScreen, and hence the right + * font size, so we can go ahead and size the window. */ +- terminal_window_set_size (window, priv->active_screen, FALSE); ++ terminal_window_update_size (window, priv->active_screen, FALSE); + #endif + } + +@@ -2709,7 +2709,7 @@ terminal_window_set_menubar_visible (TerminalWindow *window, + "[window %p] setting size after toggling menubar visibility\n", + window); + +- terminal_window_set_size (window, priv->active_screen, TRUE); ++ terminal_window_update_size (window, priv->active_screen, TRUE); + } + } + +@@ -2732,28 +2732,31 @@ terminal_window_get_notebook (TerminalWindow *window) + } + + void +-terminal_window_set_size (TerminalWindow *window, ++terminal_window_update_size (TerminalWindow *window, + TerminalScreen *screen, + gboolean even_if_mapped) + { +- terminal_window_set_size_force_grid (window, screen, even_if_mapped, NULL); ++ terminal_window_update_size_set_geometry (window, screen, ++ even_if_mapped, NULL); + } + + gboolean +-terminal_window_set_size_force_grid (TerminalWindow *window, +- TerminalScreen *screen, +- gboolean even_if_mapped, +- gchar *force_grid_string) ++terminal_window_update_size_set_geometry (TerminalWindow *window, ++ TerminalScreen *screen, ++ gboolean even_if_mapped, ++ gchar *geometry_string) + { + TerminalWindowPrivate *priv = window->priv; + GtkWidget *widget; + GtkWidget *app; + gboolean result; +- int parse_result; +- unsigned int force_grid_width, force_grid_height; ++ int geom_result; ++ gint force_pos_x = 0, force_pos_y = 0; ++ unsigned int force_grid_width = 0, force_grid_height = 0; + int grid_width, grid_height; + gint pixel_width, pixel_height; + GdkWindow *gdk_window; ++ GdkGravity pos_gravity; + + gdk_window = gtk_widget_get_window (GTK_WIDGET (window)); + result = TRUE; +@@ -2780,22 +2783,22 @@ terminal_window_set_size_force_grid (TerminalWindow *window, + g_assert (app != NULL); + + terminal_screen_get_size (screen, &grid_width, &grid_height); +- +- if (force_grid_string != NULL) ++ if (geometry_string != NULL) + { +- parse_result = terminal_window_XParseGeometry (force_grid_string, +- NULL, NULL, +- &force_grid_width, +- &force_grid_height); +- if (parse_result == NoValue) ++ geom_result = terminal_window_XParseGeometry (geometry_string, ++ &force_pos_x, ++ &force_pos_y, ++ &force_grid_width, ++ &force_grid_height); ++ if (geom_result == NoValue) + result = FALSE; + } + else +- parse_result = NoValue; ++ geom_result = NoValue; + +- if (parse_result & WidthValue) ++ if ((geom_result & WidthValue) != 0) + grid_width = force_grid_width; +- if (parse_result & HeightValue) ++ if ((geom_result & HeightValue) != 0) + grid_height = force_grid_height; + + /* the "old" struct members were updated by update_geometry */ +@@ -2814,11 +2817,47 @@ terminal_window_set_size_force_grid (TerminalWindow *window, + priv->old_chrome_width, priv->old_chrome_height, + pixel_width, pixel_height); + ++ pos_gravity = GDK_GRAVITY_NORTH_WEST; ++ if ((geom_result & XNegative) != 0 && (geom_result & YNegative) != 0) ++ pos_gravity = GDK_GRAVITY_SOUTH_EAST; ++ else if ((geom_result & XNegative) != 0) ++ pos_gravity = GDK_GRAVITY_NORTH_EAST; ++ else if ((geom_result & YNegative) != 0) ++ pos_gravity = GDK_GRAVITY_SOUTH_WEST; ++ ++ if ((geom_result & XValue) == 0) ++ force_pos_x = 0; ++ if ((geom_result & YValue) == 0) ++ force_pos_y = 0; ++ ++ if (pos_gravity == GDK_GRAVITY_SOUTH_EAST || ++ pos_gravity == GDK_GRAVITY_NORTH_EAST) ++ force_pos_x = gdk_screen_get_width (gtk_widget_get_screen (app)) - ++ pixel_width + force_pos_x; ++ if (pos_gravity == GDK_GRAVITY_SOUTH_WEST || ++ pos_gravity == GDK_GRAVITY_SOUTH_EAST) ++ force_pos_y = gdk_screen_get_height (gtk_widget_get_screen (app)) - ++ pixel_height + force_pos_y; ++ ++ /* we don't let you put a window offscreen; maybe some people would ++ * prefer to be able to, but it's kind of a bogus thing to do. ++ */ ++ if (force_pos_x < 0) ++ force_pos_x = 0; ++ if (force_pos_y < 0) ++ force_pos_y = 0; ++ + if (even_if_mapped && gtk_widget_get_mapped (app)) + gtk_window_resize (GTK_WINDOW (app), pixel_width, pixel_height); + else + gtk_window_set_default_size (GTK_WINDOW (app), pixel_width, pixel_height); + ++ if ((geom_result & XValue) != 0 || (geom_result & YValue) != 0) ++ { ++ gtk_window_set_gravity (GTK_WINDOW (app), pos_gravity); ++ gtk_window_move (GTK_WINDOW (app), force_pos_x, force_pos_y); ++ } ++ + return result; + } + +@@ -2976,7 +3015,7 @@ notebook_page_selected_callback (GtkWidget *notebook, + _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, + "[window %p] setting size after flipping notebook pages\n", + window); +- terminal_window_set_size (window, screen, TRUE); ++ terminal_window_update_size (window, screen, TRUE); + + terminal_window_update_tabs_menu_sensitivity (window); + terminal_window_update_encoding_menu_active_encoding (window); +@@ -3115,7 +3154,7 @@ notebook_page_removed_callback (GtkWidget *notebook, + pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook)); + if (pages == 1) + { +- terminal_window_set_size (window, priv->active_screen, TRUE); ++ terminal_window_update_size (window, priv->active_screen, TRUE); + } + else if (pages == 0) + { +@@ -3296,7 +3335,7 @@ terminal_window_update_geometry (TerminalWindow *window) + window); + } + +- /* We need these for the size calculation in terminal_window_set_size(), ++ /* We need these for the size calculation in terminal_window_update_size(), + * so we set them unconditionally. */ + priv->old_char_width = char_width; + priv->old_char_height = char_height; +@@ -4208,7 +4247,7 @@ tabs_detach_tab_callback (GtkAction *action, + terminal_window_move_screen (window, new_window, screen, -1); + + /* FIXME: this seems wrong if tabs are shown in the window */ +- terminal_window_set_size (new_window, screen, FALSE); ++ terminal_window_update_size (new_window, screen, FALSE); + + gtk_window_present_with_time (GTK_WINDOW (new_window), gtk_get_current_event_time ()); + } +diff --git a/src/terminal-window.h b/src/terminal-window.h +index 95ca805..4b8f846 100644 +--- a/src/terminal-window.h ++++ b/src/terminal-window.h +@@ -84,14 +84,15 @@ TerminalScreen* terminal_window_get_active (TerminalWindow *window); + GList* terminal_window_list_screen_containers (TerminalWindow *window); + + void terminal_window_update_geometry (TerminalWindow *window); +-void terminal_window_set_size (TerminalWindow *window, +- TerminalScreen *screen, +- gboolean even_if_mapped); ++void ++terminal_window_update_size (TerminalWindow *window, ++ TerminalScreen *screen, ++ gboolean even_if_mapped); + gboolean +-terminal_window_set_size_force_grid (TerminalWindow *window, +- TerminalScreen *screen, +- gboolean even_if_mapped, +- gchar *force_grid_string); ++terminal_window_update_size_set_geometry (TerminalWindow *window, ++ TerminalScreen *screen, ++ gboolean even_if_mapped, ++ gchar *geometry_string); + + GtkWidget* terminal_window_get_notebook (TerminalWindow *window); + +