add back --geometry positioning support

was removed in 0e9e88a,
based on https://github.com/GNOME/gtk/commit/f37a062
master-1.22
Alexei Sorokin 2016-09-22 15:58:49 +03:00
parent 966d73bdad
commit 8fdadba380
4 changed files with 82 additions and 42 deletions

View File

@ -1849,10 +1849,10 @@ terminal_app_handle_options (TerminalApp *app,
"[window %p] applying geometry %s\n", "[window %p] applying geometry %s\n",
window, iw->geometry); window, iw->geometry);
if (!terminal_window_set_size_force_grid (window, if (!terminal_window_update_size_set_geometry (window,
terminal_window_get_active (window), terminal_window_get_active (window),
FALSE, FALSE,
iw->geometry)) iw->geometry))
g_printerr (_("Invalid geometry string \"%s\"\n"), iw->geometry); g_printerr (_("Invalid geometry string \"%s\"\n"), iw->geometry);
} }

View File

@ -1112,7 +1112,7 @@ terminal_screen_change_font (TerminalScreen *screen)
terminal_screen_set_font (screen); terminal_screen_set_font (screen);
window = terminal_screen_get_window (screen); window = terminal_screen_get_window (screen);
terminal_window_set_size (window, screen, TRUE); terminal_window_update_size (window, screen, TRUE);
} }
static void static void

View File

@ -480,13 +480,13 @@ terminal_window_XParseGeometry (const char *string,
if (*strind != '\0') return (0); if (*strind != '\0') return (0);
if (x != NULL && mask & XValue) if (mask & XValue)
*x = tempX; *x = tempX;
if (y != NULL && mask & YValue) if (mask & YValue)
*y = tempY; *y = tempY;
if (width != NULL && mask & WidthValue) if (mask & WidthValue)
*width = tempWidth; *width = tempWidth;
if (height != NULL && mask & HeightValue) if (mask & HeightValue)
*height = tempHeight; *height = tempHeight;
return (mask); return (mask);
} }
@ -1087,7 +1087,7 @@ terminal_size_to_cb (GtkAction *action,
vte_terminal_set_size (VTE_TERMINAL (priv->active_screen), width, height); 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 static void
@ -1262,7 +1262,7 @@ screen_resize_window_cb (TerminalScreen *screen,
if (screen != priv->active_screen) if (screen != priv->active_screen)
return; return;
terminal_window_set_size (window, screen, TRUE); terminal_window_update_size (window, screen, TRUE);
} }
static void static void
@ -2434,7 +2434,7 @@ terminal_window_show (GtkWidget *widget)
#if 0 #if 0
/* At this point, we have our GdkScreen, and hence the right /* At this point, we have our GdkScreen, and hence the right
* font size, so we can go ahead and size the window. */ * 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 #endif
} }
@ -2709,7 +2709,7 @@ terminal_window_set_menubar_visible (TerminalWindow *window,
"[window %p] setting size after toggling menubar visibility\n", "[window %p] setting size after toggling menubar visibility\n",
window); 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 void
terminal_window_set_size (TerminalWindow *window, terminal_window_update_size (TerminalWindow *window,
TerminalScreen *screen, TerminalScreen *screen,
gboolean even_if_mapped) 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 gboolean
terminal_window_set_size_force_grid (TerminalWindow *window, terminal_window_update_size_set_geometry (TerminalWindow *window,
TerminalScreen *screen, TerminalScreen *screen,
gboolean even_if_mapped, gboolean even_if_mapped,
gchar *force_grid_string) gchar *geometry_string)
{ {
TerminalWindowPrivate *priv = window->priv; TerminalWindowPrivate *priv = window->priv;
GtkWidget *widget; GtkWidget *widget;
GtkWidget *app; GtkWidget *app;
gboolean result; gboolean result;
int parse_result; int geom_result;
unsigned int force_grid_width, force_grid_height; gint force_pos_x = 0, force_pos_y = 0;
unsigned int force_grid_width = 0, force_grid_height = 0;
int grid_width, grid_height; int grid_width, grid_height;
gint pixel_width, pixel_height; gint pixel_width, pixel_height;
GdkWindow *gdk_window; GdkWindow *gdk_window;
GdkGravity pos_gravity;
gdk_window = gtk_widget_get_window (GTK_WIDGET (window)); gdk_window = gtk_widget_get_window (GTK_WIDGET (window));
result = TRUE; result = TRUE;
@ -2780,22 +2783,22 @@ terminal_window_set_size_force_grid (TerminalWindow *window,
g_assert (app != NULL); g_assert (app != NULL);
terminal_screen_get_size (screen, &grid_width, &grid_height); terminal_screen_get_size (screen, &grid_width, &grid_height);
if (geometry_string != NULL)
if (force_grid_string != NULL)
{ {
parse_result = terminal_window_XParseGeometry (force_grid_string, geom_result = terminal_window_XParseGeometry (geometry_string,
NULL, NULL, &force_pos_x,
&force_grid_width, &force_pos_y,
&force_grid_height); &force_grid_width,
if (parse_result == NoValue) &force_grid_height);
if (geom_result == NoValue)
result = FALSE; result = FALSE;
} }
else else
parse_result = NoValue; geom_result = NoValue;
if (parse_result & WidthValue) if ((geom_result & WidthValue) != 0)
grid_width = force_grid_width; grid_width = force_grid_width;
if (parse_result & HeightValue) if ((geom_result & HeightValue) != 0)
grid_height = force_grid_height; grid_height = force_grid_height;
/* the "old" struct members were updated by update_geometry */ /* 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, priv->old_chrome_width, priv->old_chrome_height,
pixel_width, pixel_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)) if (even_if_mapped && gtk_widget_get_mapped (app))
gtk_window_resize (GTK_WINDOW (app), pixel_width, pixel_height); gtk_window_resize (GTK_WINDOW (app), pixel_width, pixel_height);
else else
gtk_window_set_default_size (GTK_WINDOW (app), pixel_width, pixel_height); 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; return result;
} }
@ -2976,7 +3015,7 @@ notebook_page_selected_callback (GtkWidget *notebook,
_terminal_debug_print (TERMINAL_DEBUG_GEOMETRY, _terminal_debug_print (TERMINAL_DEBUG_GEOMETRY,
"[window %p] setting size after flipping notebook pages\n", "[window %p] setting size after flipping notebook pages\n",
window); 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_tabs_menu_sensitivity (window);
terminal_window_update_encoding_menu_active_encoding (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)); pages = gtk_notebook_get_n_pages (GTK_NOTEBOOK (notebook));
if (pages == 1) 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) else if (pages == 0)
{ {
@ -3296,7 +3335,7 @@ terminal_window_update_geometry (TerminalWindow *window)
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. */ * so we set them unconditionally. */
priv->old_char_width = char_width; priv->old_char_width = char_width;
priv->old_char_height = char_height; 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); terminal_window_move_screen (window, new_window, screen, -1);
/* FIXME: this seems wrong if tabs are shown in the window */ /* 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 ()); gtk_window_present_with_time (GTK_WINDOW (new_window), gtk_get_current_event_time ());
} }

View File

@ -84,14 +84,15 @@ TerminalScreen* terminal_window_get_active (TerminalWindow *window);
GList* terminal_window_list_screen_containers (TerminalWindow *window); GList* terminal_window_list_screen_containers (TerminalWindow *window);
void terminal_window_update_geometry (TerminalWindow *window); void terminal_window_update_geometry (TerminalWindow *window);
void terminal_window_set_size (TerminalWindow *window, void
TerminalScreen *screen, terminal_window_update_size (TerminalWindow *window,
gboolean even_if_mapped); TerminalScreen *screen,
gboolean even_if_mapped);
gboolean gboolean
terminal_window_set_size_force_grid (TerminalWindow *window, terminal_window_update_size_set_geometry (TerminalWindow *window,
TerminalScreen *screen, TerminalScreen *screen,
gboolean even_if_mapped, gboolean even_if_mapped,
gchar *force_grid_string); gchar *geometry_string);
GtkWidget* terminal_window_get_notebook (TerminalWindow *window); GtkWidget* terminal_window_get_notebook (TerminalWindow *window);