From 062fe508b49038a6b2253604774e876f417c923e Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jan=20Dj=C3=A4rv?= Date: Tue, 23 Mar 2010 11:37:18 +0100 Subject: [PATCH] Save and restore window configs in C. Removes race for C-x 7 f. --- lisp/native-tabs.el | 22 ---------------------- src/gtkutil.c | 37 ++++++++++++++++++++++++++++++++++++- 2 files changed, 36 insertions(+), 23 deletions(-) diff --git a/lisp/native-tabs.el b/lisp/native-tabs.el index 443931f3860..3fa76f0b10a 100644 --- a/lisp/native-tabs.el +++ b/lisp/native-tabs.el @@ -35,26 +35,6 @@ (declare-function tab-next "xfns.c" ()) (declare-function tab-previous "xfns.c" ()) -(defun handle-tab-event (event) - "Handle tab-changed-event to change tabs on the frame in EVENT." - (interactive "e") - (let* ((keys (nth 1 event)) - (new-tab (car keys)) - (old-tab (cdr keys)) - (frame (nth 2 event)) - (configs (frame-parameter frame 'tab-config)) - (new-config (assoc new-tab configs)) - (old-config (assoc old-tab configs))) - (if old-config - (setcdr old-config (current-window-configuration)) - (setq configs (append configs - (list (cons old-tab - (current-window-configuration)))))) - (set-frame-parameter frame 'tab-config configs) - (if new-config - (set-window-configuration (cdr new-config)) - (delete-other-windows)))) - (defun find-file-new-tab (filename &optional wildcards) "Edit file FILENAME, in a new tab. @@ -81,8 +61,6 @@ expand wildcards (if any) and visit multiple files." (if (featurep 'tabs) (progn - (define-key special-event-map [tab-changed-event] - 'handle-tab-event) (global-set-key "\C-x7\C-f" 'find-file-new-tab) (global-set-key "\C-x70" 'tab-delete) (global-set-key "\C-x71" 'tab-delete-other) diff --git a/src/gtkutil.c b/src/gtkutil.c index 956826be336..3fe05e2d129 100644 --- a/src/gtkutil.c +++ b/src/gtkutil.c @@ -758,7 +758,16 @@ xg_pix_to_gcolor (w, pixel, c) Tab functions ***********************************************************************/ #define XG_TAB_KEY "emacs-tab-key" +#define XG_TAB_CONFIG_KEY "emacs-tab-config-key" static int xg_tab_nr; +static xg_list_node tabs_gc_list; + +typedef struct tabs_gc_data_ +{ + xg_list_node ptrs; + Lisp_Object object; +} tabs_gc_data; + static void xg_check_show_tabs (FRAME_PTR f, @@ -816,6 +825,7 @@ xg_switch_page_cb (GtkNotebook *wnote, GList *children = old ? GTK_FIXED (old)->children : NULL; GSList *todo = NULL, *iter; char *key = g_object_get_data (G_OBJECT (w), XG_TAB_KEY); + tabs_gc_data *conf = g_object_get_data (G_OBJECT (w), XG_TAB_CONFIG_KEY); if (!w->window) gtk_widget_realize (w); FRAME_GTK_WIDGET (f) = w; @@ -849,11 +859,22 @@ xg_switch_page_cb (GtkNotebook *wnote, if (old) { - char *oldkey = g_object_get_data (G_OBJECT (old), XG_TAB_KEY); struct input_event event; Lisp_Object frame; + char *oldkey = g_object_get_data (G_OBJECT (old), XG_TAB_KEY); + tabs_gc_data *oconf = g_object_get_data (G_OBJECT (old), + XG_TAB_CONFIG_KEY); + if (!oconf) + { + oconf = xmalloc (sizeof(*oconf)); + g_object_set_data (G_OBJECT (old), XG_TAB_CONFIG_KEY, oconf); + xg_list_insert (&tabs_gc_list, &oconf->ptrs); + } + XSETFRAME (frame, f); + oconf->object = Fcurrent_window_configuration (frame); + EVENT_INIT (event); event.kind = TAB_CHANGED_EVENT; event.frame_or_window = frame; @@ -861,6 +882,11 @@ xg_switch_page_cb (GtkNotebook *wnote, make_string (oldkey, strlen (oldkey))); kbd_buffer_store_event (&event); } + + if (conf) + Fset_window_configuration (conf->object); + else + Fdelete_other_windows (Qnil); } xg_check_show_tabs (f, wnote); UNBLOCK_INPUT; @@ -871,6 +897,12 @@ xg_fixed_destroy_cb (GtkWidget *widget, gpointer client_data) { char *key = g_object_get_data (G_OBJECT (widget), XG_TAB_KEY); + tabs_gc_data *conf = g_object_get_data (G_OBJECT (widget), XG_TAB_CONFIG_KEY); + if (conf) + { + xg_list_remove (&tabs_gc_list, &conf->ptrs); + xfree (conf); + } xfree (key); } @@ -2143,6 +2175,8 @@ xg_mark_data () if (! NILP (cb_data->help)) mark_object (cb_data->help); } + for (iter = tabs_gc_list.next; iter; iter = iter->next) + mark_object (((tabs_gc_data *) iter)->object); } @@ -4575,6 +4609,7 @@ xg_initialize () id_to_widget.max_size = id_to_widget.used = 0; id_to_widget.widgets = 0; xg_tab_nr = 1; + tabs_gc_list.prev = tabs_gc_list.next = 0; /* Remove F10 as a menu accelerator, it does not mix well with Emacs key bindings. It doesn't seem to be any way to remove properties, -- 2.39.5