(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.
(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)
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,
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;
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;
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;
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);
}
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);
}
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,