diff options
author | Egmont Koblinger <egmont@gmail.com> | 2014-12-11 20:20:37 +0100 |
---|---|---|
committer | Egmont Koblinger <egmont@gmail.com> | 2014-12-11 20:20:37 +0100 |
commit | 4ab677d4d8d273a969093b29b375c8054416df2e (patch) | |
tree | 1f0e74f6ed17c3847f2b734a0de3f912a44ed26b | |
parent | a72436b76c25ec33cdf11d8731b866052aa0724a (diff) | |
download | vte-4ab677d4d8d273a969093b29b375c8054416df2e.tar.gz |
emulation: Change window manipulation sequences only perform one action
https://bugzilla.gnome.org/show_bug.cgi?id=741402
-rw-r--r-- | src/vteseq.c | 396 |
1 files changed, 200 insertions, 196 deletions
diff --git a/src/vteseq.c b/src/vteseq.c index 629f6c1f..4d2b461a 100644 --- a/src/vteseq.c +++ b/src/vteseq.c @@ -2860,7 +2860,8 @@ vte_sequence_handler_soft_reset (VteTerminal *terminal, GValueArray *params) /* Window manipulation control sequences. Most of these are considered * bad ideas, but they're implemented as signals which the application - * is free to ignore, so they're harmless. */ + * is free to ignore, so they're harmless. Handle at most one action, + * see bug 741402. */ static void vte_sequence_handler_window_manipulation (VteTerminal *terminal, GValueArray *params) { @@ -2874,202 +2875,205 @@ vte_sequence_handler_window_manipulation (VteTerminal *terminal, GValueArray *pa widget = &terminal->widget; - for (i = 0; ((params != NULL) && (i < params->n_values)); i++) { - arg1 = arg2 = -1; - if (i + 1 < params->n_values) { - value = g_value_array_get_nth(params, i + 1); - if (G_VALUE_HOLDS_LONG(value)) { - arg1 = g_value_get_long(value); - } - } - if (i + 2 < params->n_values) { - value = g_value_array_get_nth(params, i + 2); - if (G_VALUE_HOLDS_LONG(value)) { - arg2 = g_value_get_long(value); - } - } - value = g_value_array_get_nth(params, i); - if (!G_VALUE_HOLDS_LONG(value)) { - continue; - } - param = g_value_get_long(value); - switch (param) { - case 1: - _vte_debug_print(VTE_DEBUG_PARSE, - "Deiconifying window.\n"); - vte_terminal_emit_deiconify_window(terminal); - break; - case 2: - _vte_debug_print(VTE_DEBUG_PARSE, - "Iconifying window.\n"); - vte_terminal_emit_iconify_window(terminal); - break; - case 3: - if ((arg1 != -1) && (arg2 != -2)) { - _vte_debug_print(VTE_DEBUG_PARSE, - "Moving window to " - "%ld,%ld.\n", arg1, arg2); - vte_terminal_emit_move_window(terminal, - arg1, arg2); - i += 2; - } - break; - case 4: - if ((arg1 != -1) && (arg2 != -1)) { - _vte_debug_print(VTE_DEBUG_PARSE, - "Resizing window " - "(to %ldx%ld pixels, grid size %ldx%ld).\n", - arg2, arg1, - arg2 / terminal->pvt->char_width, - arg1 / terminal->pvt->char_height); - vte_terminal_emit_resize_window(terminal, - arg2 / terminal->pvt->char_width, - arg1 / terminal->pvt->char_height); - i += 2; - } - break; - case 5: - _vte_debug_print(VTE_DEBUG_PARSE, "Raising window.\n"); - vte_terminal_emit_raise_window(terminal); - break; - case 6: - _vte_debug_print(VTE_DEBUG_PARSE, "Lowering window.\n"); - vte_terminal_emit_lower_window(terminal); - break; - case 7: - _vte_debug_print(VTE_DEBUG_PARSE, - "Refreshing window.\n"); - _vte_invalidate_all(terminal); - vte_terminal_emit_refresh_window(terminal); - break; - case 8: - if ((arg1 != -1) && (arg2 != -1)) { - _vte_debug_print(VTE_DEBUG_PARSE, - "Resizing window " - "(to %ld columns, %ld rows).\n", - arg2, arg1); - vte_terminal_emit_resize_window(terminal, arg2, arg1); - i += 2; - } - break; - case 9: - switch (arg1) { - case 0: - _vte_debug_print(VTE_DEBUG_PARSE, - "Restoring window.\n"); - vte_terminal_emit_restore_window(terminal); - break; - case 1: - _vte_debug_print(VTE_DEBUG_PARSE, - "Maximizing window.\n"); - vte_terminal_emit_maximize_window(terminal); - break; - default: - break; - } - i++; - break; - case 11: - /* If we're unmapped, then we're iconified. */ - g_snprintf(buf, sizeof(buf), - _VTE_CAP_CSI "%dt", - 1 + !gtk_widget_get_mapped(widget)); - _vte_debug_print(VTE_DEBUG_PARSE, - "Reporting window state %s.\n", - gtk_widget_get_mapped(widget) ? - "non-iconified" : "iconified"); - vte_terminal_feed_child(terminal, buf, -1); - break; - case 13: - /* Send window location, in pixels. */ - gdk_window_get_origin(gtk_widget_get_window(widget), - &width, &height); - g_snprintf(buf, sizeof(buf), - _VTE_CAP_CSI "3;%d;%dt", - width + terminal->pvt->padding.left, - height + terminal->pvt->padding.top); - _vte_debug_print(VTE_DEBUG_PARSE, - "Reporting window location" - "(%d++,%d++).\n", - width, height); - vte_terminal_feed_child(terminal, buf, -1); - break; - case 14: - /* Send window size, in pixels. */ - g_snprintf(buf, sizeof(buf), - _VTE_CAP_CSI "4;%d;%dt", - (int)(terminal->pvt->row_count * terminal->pvt->char_height), - (int)(terminal->pvt->column_count * terminal->pvt->char_width)); - _vte_debug_print(VTE_DEBUG_PARSE, - "Reporting window size " - "(%dx%d)\n", - (int)(terminal->pvt->row_count * terminal->pvt->char_height), - (int)(terminal->pvt->column_count * terminal->pvt->char_width)); + if (params == NULL || params->n_values == 0) { + return; + } + value = g_value_array_get_nth(params, 0); + if (!G_VALUE_HOLDS_LONG(value)) { + return; + } + param = g_value_get_long(value); - vte_terminal_feed_child(terminal, buf, -1); - break; - case 18: - /* Send widget size, in cells. */ - _vte_debug_print(VTE_DEBUG_PARSE, - "Reporting widget size.\n"); - g_snprintf(buf, sizeof(buf), - _VTE_CAP_CSI "8;%ld;%ldt", - terminal->pvt->row_count, - terminal->pvt->column_count); - vte_terminal_feed_child(terminal, buf, -1); - break; - case 19: - _vte_debug_print(VTE_DEBUG_PARSE, - "Reporting screen size.\n"); - gscreen = gtk_widget_get_screen(widget); - height = gdk_screen_get_height(gscreen); - width = gdk_screen_get_width(gscreen); - g_snprintf(buf, sizeof(buf), - _VTE_CAP_CSI "9;%ld;%ldt", - height / terminal->pvt->char_height, - width / terminal->pvt->char_width); - vte_terminal_feed_child(terminal, buf, -1); - break; - case 20: - /* Report a static icon title, since the real - icon title should NEVER be reported, as it - creates a security vulnerability. See - http://marc.info/?l=bugtraq&m=104612710031920&w=2 - and CVE-2003-0070. */ - _vte_debug_print(VTE_DEBUG_PARSE, - "Reporting fake icon title.\n"); - /* never use terminal->pvt->icon_title here! */ - g_snprintf (buf, sizeof (buf), - _VTE_CAP_OSC "LTerminal" _VTE_CAP_ST); - vte_terminal_feed_child(terminal, buf, -1); - break; - case 21: - /* Report a static window title, since the real - window title should NEVER be reported, as it - creates a security vulnerability. See - http://marc.info/?l=bugtraq&m=104612710031920&w=2 - and CVE-2003-0070. */ - _vte_debug_print(VTE_DEBUG_PARSE, - "Reporting fake window title.\n"); - /* never use terminal->pvt->window_title here! */ - g_snprintf (buf, sizeof (buf), - _VTE_CAP_OSC "lTerminal" _VTE_CAP_ST); - vte_terminal_feed_child(terminal, buf, -1); - break; - default: - if (param >= 24) { - _vte_debug_print(VTE_DEBUG_PARSE, - "Resizing to %ld rows.\n", - param); - /* Resize to the specified number of - * rows. */ - vte_terminal_emit_resize_window(terminal, - terminal->pvt->column_count, - param); - } - break; - } - } + arg1 = arg2 = -1; + if (params->n_values > 1) { + value = g_value_array_get_nth(params, 1); + if (G_VALUE_HOLDS_LONG(value)) { + arg1 = g_value_get_long(value); + } + } + if (params->n_values > 2) { + value = g_value_array_get_nth(params, 2); + if (G_VALUE_HOLDS_LONG(value)) { + arg2 = g_value_get_long(value); + } + } + + switch (param) { + case 1: + _vte_debug_print(VTE_DEBUG_PARSE, + "Deiconifying window.\n"); + vte_terminal_emit_deiconify_window(terminal); + break; + case 2: + _vte_debug_print(VTE_DEBUG_PARSE, + "Iconifying window.\n"); + vte_terminal_emit_iconify_window(terminal); + break; + case 3: + if ((arg1 != -1) && (arg2 != -1)) { + _vte_debug_print(VTE_DEBUG_PARSE, + "Moving window to " + "%ld,%ld.\n", arg1, arg2); + vte_terminal_emit_move_window(terminal, + arg1, arg2); + i += 2; + } + break; + case 4: + if ((arg1 != -1) && (arg2 != -1)) { + _vte_debug_print(VTE_DEBUG_PARSE, + "Resizing window " + "(to %ldx%ld pixels, grid size %ldx%ld).\n", + arg2, arg1, + arg2 / terminal->pvt->char_width, + arg1 / terminal->pvt->char_height); + vte_terminal_emit_resize_window(terminal, + arg2 / terminal->pvt->char_width, + arg1 / terminal->pvt->char_height); + i += 2; + } + break; + case 5: + _vte_debug_print(VTE_DEBUG_PARSE, "Raising window.\n"); + vte_terminal_emit_raise_window(terminal); + break; + case 6: + _vte_debug_print(VTE_DEBUG_PARSE, "Lowering window.\n"); + vte_terminal_emit_lower_window(terminal); + break; + case 7: + _vte_debug_print(VTE_DEBUG_PARSE, + "Refreshing window.\n"); + _vte_invalidate_all(terminal); + vte_terminal_emit_refresh_window(terminal); + break; + case 8: + if ((arg1 != -1) && (arg2 != -1)) { + _vte_debug_print(VTE_DEBUG_PARSE, + "Resizing window " + "(to %ld columns, %ld rows).\n", + arg2, arg1); + vte_terminal_emit_resize_window(terminal, arg2, arg1); + i += 2; + } + break; + case 9: + switch (arg1) { + case 0: + _vte_debug_print(VTE_DEBUG_PARSE, + "Restoring window.\n"); + vte_terminal_emit_restore_window(terminal); + break; + case 1: + _vte_debug_print(VTE_DEBUG_PARSE, + "Maximizing window.\n"); + vte_terminal_emit_maximize_window(terminal); + break; + default: + break; + } + i++; + break; + case 11: + /* If we're unmapped, then we're iconified. */ + g_snprintf(buf, sizeof(buf), + _VTE_CAP_CSI "%dt", + 1 + !gtk_widget_get_mapped(widget)); + _vte_debug_print(VTE_DEBUG_PARSE, + "Reporting window state %s.\n", + gtk_widget_get_mapped(widget) ? + "non-iconified" : "iconified"); + vte_terminal_feed_child(terminal, buf, -1); + break; + case 13: + /* Send window location, in pixels. */ + gdk_window_get_origin(gtk_widget_get_window(widget), + &width, &height); + g_snprintf(buf, sizeof(buf), + _VTE_CAP_CSI "3;%d;%dt", + width + terminal->pvt->padding.left, + height + terminal->pvt->padding.top); + _vte_debug_print(VTE_DEBUG_PARSE, + "Reporting window location" + "(%d++,%d++).\n", + width, height); + vte_terminal_feed_child(terminal, buf, -1); + break; + case 14: + /* Send window size, in pixels. */ + g_snprintf(buf, sizeof(buf), + _VTE_CAP_CSI "4;%d;%dt", + (int)(terminal->pvt->row_count * terminal->pvt->char_height), + (int)(terminal->pvt->column_count * terminal->pvt->char_width)); + _vte_debug_print(VTE_DEBUG_PARSE, + "Reporting window size " + "(%dx%d)\n", + (int)(terminal->pvt->row_count * terminal->pvt->char_height), + (int)(terminal->pvt->column_count * terminal->pvt->char_width)); + + vte_terminal_feed_child(terminal, buf, -1); + break; + case 18: + /* Send widget size, in cells. */ + _vte_debug_print(VTE_DEBUG_PARSE, + "Reporting widget size.\n"); + g_snprintf(buf, sizeof(buf), + _VTE_CAP_CSI "8;%ld;%ldt", + terminal->pvt->row_count, + terminal->pvt->column_count); + vte_terminal_feed_child(terminal, buf, -1); + break; + case 19: + _vte_debug_print(VTE_DEBUG_PARSE, + "Reporting screen size.\n"); + gscreen = gtk_widget_get_screen(widget); + height = gdk_screen_get_height(gscreen); + width = gdk_screen_get_width(gscreen); + g_snprintf(buf, sizeof(buf), + _VTE_CAP_CSI "9;%ld;%ldt", + height / terminal->pvt->char_height, + width / terminal->pvt->char_width); + vte_terminal_feed_child(terminal, buf, -1); + break; + case 20: + /* Report a static icon title, since the real + icon title should NEVER be reported, as it + creates a security vulnerability. See + http://marc.info/?l=bugtraq&m=104612710031920&w=2 + and CVE-2003-0070. */ + _vte_debug_print(VTE_DEBUG_PARSE, + "Reporting fake icon title.\n"); + /* never use terminal->pvt->icon_title here! */ + g_snprintf (buf, sizeof (buf), + _VTE_CAP_OSC "LTerminal" _VTE_CAP_ST); + vte_terminal_feed_child(terminal, buf, -1); + break; + case 21: + /* Report a static window title, since the real + window title should NEVER be reported, as it + creates a security vulnerability. See + http://marc.info/?l=bugtraq&m=104612710031920&w=2 + and CVE-2003-0070. */ + _vte_debug_print(VTE_DEBUG_PARSE, + "Reporting fake window title.\n"); + /* never use terminal->pvt->window_title here! */ + g_snprintf (buf, sizeof (buf), + _VTE_CAP_OSC "lTerminal" _VTE_CAP_ST); + vte_terminal_feed_child(terminal, buf, -1); + break; + default: + if (param >= 24) { + _vte_debug_print(VTE_DEBUG_PARSE, + "Resizing to %ld rows.\n", + param); + /* Resize to the specified number of + * rows. */ + vte_terminal_emit_resize_window(terminal, + terminal->pvt->column_count, + param); + } + break; + } } /* Internal helper for setting/querying special colors */ |