first of all thanks!
But some remarks:
I'm sure Emacs should offer out-of-the-box internal concepts to allow IDEs like ECB setting up a window-management-engine as needed by a modern IDE - this includes stuff like preventing a window from being deleted by delete-other-windows and something more which has been already discussed...
But: I'm not sure if doing this a c-level is the right way. Why? IMHO ECB should be runable with Emacs as well with XEmacs. And if all these window-enhancements would be done at c-level at Emacs then the incompatibilities between Emacs and XEmacs would become more and more...
Of course Emacs and XEmacs are already quite incompatible but IMHO such important basic stuff like preventing windows from some operations should be a concept both flavors should support identically - at least concerning the programming interface a tool like ECB would see and use...
> I sent this patch to emacs-devel, but I think its quite relevant here
> well. My aim is to help delete the advice ECB uses, by implementing
> suitable C primitives.
> Any opinions?
> As discussed in the IDE threads, it would be desirable to be able to
> optionally change certain window operations.
> This patch makes it possible to disable delete-other-windows for a
> Its only lightly tested, and I offer it here mostly to discuss the
> To test:
> - make several windows
> - (set-window-operation-behaviour-flags (window-at 0 0)
> '(delete-other-windows t))
> The topmost window now wont go away even if you do c-x 1 in the other
> If the windows plist window-operation-behaviour-flags
> delete-other-windows is t, the window is not electable for deletion
> delete-other-windows is run.
> I chose this interface mostly for ease of implementation, but I think
> its ok in other regards as well.
> Next task is to do the same for other-window.
> === modified file 'src/window.c'
> --- src/window.c 2008-04-03 02:15:43 +0000
> +++ src/window.c 2008-04-25 22:10:09 +0000
> @@ -55,6 +55,7 @@
> Lisp_Object Qwindowp, Qwindow_live_p, Qwindow_configuration_p;
> Lisp_Object Qscroll_up, Qscroll_down;
> +Lisp_Object Qdelete_other_windows;
> Lisp_Object Qwindow_size_fixed;
> extern Lisp_Object Qleft_margin, Qright_margin;
> @@ -275,6 +276,7 @@
> p->frame = Qnil;
> p->display_table = Qnil;
> p->dedicated = Qnil;
> + p->window_operation_behaviour_flags = Qnil;
> p->pseudo_window_p = 0;
> bzero (&p->cursor, sizeof (p->cursor));
> bzero (&p->last_cursor, sizeof (p->last_cursor));
> @@ -1325,6 +1327,32 @@
> return w->dedicated;
> +DEFUN ("window-operation-behaviour-flags",
> Fwindow_operation_behaviour_flags, Swindow_operation_behaviour_flags,
> + 1, 1, 0, + doc: /* Return WINDOW's
> window_operation_behaviour_flags. + returns nil or a
> plist where keys are + window operations, values flags
> that might modify the operation behaviour'. */) + (window)
> + Lisp_Object window;
> + return decode_window (window)->window_operation_behaviour_flags;
> +DEFUN ("set-window-operation-behaviour-flags",
> Fset_window_operation_behaviour_flags, +
> Sset_window_operation_behaviour_flags, 2, 2, 0, + doc: /* set
> window operation flags */) + (window, arg)
> + Lisp_Object window, arg;
> + register struct window *w = decode_window (window);
> + w->window_operation_behaviour_flags = arg;
> + return w->window_operation_behaviour_flags;
> DEFUN ("window-display-table", Fwindow_display_table,
> Swindow_display_table, 0, 1, 0,
> doc: /* Return the display-table that WINDOW is using.
> @@ -2209,7 +2237,10 @@
> case DELETE_OTHER_WINDOWS:
> - if (!EQ (window, obj))
> + //
> + if ((!EQ (window, obj)) && //obj is not the current window
> + //current window doesnt have delete_other_windows
> disabled (t inhibits) + (NILP(Fplist_get
> Qdelete_other_windows)))) Fdelete_window (window); break;
> @@ -7398,6 +7429,10 @@
> syms_of_window ()
> + Qdelete_other_windows = intern ("delete-other-windows");
> + staticpro (&Qdelete_other_windows);
> Qscroll_up = intern ("scroll-up");
> staticpro (&Qscroll_up);
> @@ -7714,6 +7749,9 @@
> defsubr (&Sset_window_vscroll);
> defsubr (&Scompare_window_configurations);
> defsubr (&Swindow_list);
> + defsubr (&Swindow_operation_behaviour_flags);
> + defsubr (&Sset_window_operation_behaviour_flags);
> === modified file 'src/window.h'
> --- src/window.h 2008-01-29 02:05:10 +0000
> +++ src/window.h 2008-04-25 15:53:53 +0000
> @@ -229,6 +229,9 @@
> enlarged. */
> Lisp_Object orig_total_lines, orig_top_line;
> + /* a plist with flags that modifies behaviour of certain window
> operations*/ + Lisp_Object window_operation_behaviour_flags;
> /* No Lisp data may follow below this point without changing
> mark_object in alloc.c. The member current_matrix must be the
> first non-Lisp member. */