To:
[email protected]
Subject: Patch 6.1a.036
Fcc: outbox
From: Bram Moolenaar <
[email protected]>
MIME-Version: 1.0
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 8bit
------------
Patch 6.1a.036
Problem: GTK: the save-yourself event was not handled.
Solution: Catch the save-yourself event and preserve swap files. (Neil Bird)
Files: src/gui_gtk_x11.c
*** ../vim61a.035/src/gui_gtk_x11.c Sat Mar 2 11:20:06 2002
--- src/gui_gtk_x11.c Thu Mar 7 19:12:53 2002
***************
*** 115,124 ****
#define DFLT_FONT "-adobe-courier-medium-r-normal-*-14-*-*-*-m-*-*-*"
/*
! * Atom used to communicate save yourself from the X11 session manager. There
! * is no need to move this into the GUI struct, since this should be always
! * constant.
*/
static GdkAtom save_yourself_atom = GDK_NONE;
/*
--- 115,124 ----
#define DFLT_FONT "-adobe-courier-medium-r-normal-*-14-*-*-*-m-*-*-*"
/*
! * Atoms used to communicate save-yourself from the X11 session manager. There
! * is no need to move them into the GUI struct, since they should be constant.
*/
+ static GdkAtom wm_protocols_atom = GDK_NONE;
static GdkAtom save_yourself_atom = GDK_NONE;
/*
***************
*** 491,497 ****
{
if (e->type == GDK_PROPERTY_NOTIFY
&& GDK_WINDOW_XWINDOW(e->window) == commWindow
! && e->atom == commProperty && e->state == GDK_PROPERTY_NEW_VALUE)
{
XEvent xev;
--- 491,498 ----
{
if (e->type == GDK_PROPERTY_NOTIFY
&& GDK_WINDOW_XWINDOW(e->window) == commWindow
! && e->atom == commProperty
! && e->state == (guint)GDK_PROPERTY_NEW_VALUE)
{
XEvent xev;
***************
*** 1561,1574 ****
}
#endif /* GTK_DND */
- #if 0
- /* Not used yet, because I don't know how to catch the WM_SAVE_YOURSELF event.
- */
/*
* Setup the WM_PROTOCOLS to indicate we want the WM_SAVE_YOURSELF event.
* This is an ugly use of X functions. GTK doesn't offer an alternative.
*/
! static void
setup_save_yourself(void)
{
Atom *existing;
--- 1562,1572 ----
}
#endif /* GTK_DND */
/*
* Setup the WM_PROTOCOLS to indicate we want the WM_SAVE_YOURSELF event.
* This is an ugly use of X functions. GTK doesn't offer an alternative.
*/
! static void
setup_save_yourself(void)
{
Atom *existing;
***************
*** 1601,1607 ****
XFree(existing);
}
}
! #endif
/*
* Setup the window icon & xcmdsrv comm after the main window has been realized.
--- 1599,1646 ----
XFree(existing);
}
}
!
! /*
! * GDK handler for X ClientMessage events.
! */
! /*ARGSUSED*/
! static GdkFilterReturn
! gdk_wm_protocols_filter(GdkXEvent *xev, GdkEvent *event, gpointer data)
! {
! /* From example in gdkevents.c/gdk_wm_protocols_filter */
! XEvent *xevent = (XEvent *)xev;
!
! if (xevent != NULL)
! {
! if ((Atom)(xevent->xclient.data.l[0]) == save_yourself_atom)
! {
! out_flush();
! ml_sync_all(FALSE, FALSE); /* preserve all swap files */
!
! /* Set the window's WM_COMMAND property, to let the window manager
! * know we are done saving ourselves. We don't want to be
! * restarted, thus set argv to NULL. */
! XSetCommand(gui.dpy, GDK_WINDOW_XWINDOW(gui.mainwin->window),
! NULL, 0);
! }
!
! /*
! * Functionality from gdkevents.c/gdk_wm_protocols_filter;
! * Registering this filter apparently overrides the default GDK one,
! * so we need to perform its functionality. There seems no way to
! * register for WM_PROTOCOLS, and only process the WM_SAVE_YOURSELF
! * bit; it's all or nothing.
! */
! else if ((Atom)(xevent->xclient.data.l[0]) == gdk_wm_delete_window)
! {
! event->any.type = GDK_DELETE;
! return GDK_FILTER_TRANSLATE;
! }
! }
!
! return GDK_FILTER_REMOVE;
! }
!
/*
* Setup the window icon & xcmdsrv comm after the main window has been realized.
***************
*** 1668,1678 ****
gdk_window_set_icon(gui.mainwin->window, NULL, icon, icon_mask);
}
! #if 0
/* Setup to indicate to the window manager that we want to catch the
* WM_SAVE_YOURSELF event. */
setup_save_yourself();
- #endif
#ifdef FEAT_CLIENTSERVER
if (serverName == NULL && serverDelayedStartName != NULL)
--- 1707,1719 ----
gdk_window_set_icon(gui.mainwin->window, NULL, icon, icon_mask);
}
! /* Register a handler for WM_SAVE_YOURSELF with GDK's low-level X I/F */
! gdk_add_client_message_filter(wm_protocols_atom,
! gdk_wm_protocols_filter, NULL);
!
/* Setup to indicate to the window manager that we want to catch the
* WM_SAVE_YOURSELF event. */
setup_save_yourself();
#ifdef FEAT_CLIENTSERVER
if (serverName == NULL && serverDelayedStartName != NULL)
***************
*** 1933,1938 ****
--- 1974,1980 ----
GTK_SIGNAL_FUNC(drawarea_realize_cb), NULL);
gui.visibility = GDK_VISIBILITY_UNOBSCURED;
+ wm_protocols_atom = gdk_atom_intern("WM_PROTOCOLS", FALSE);
save_yourself_atom = gdk_atom_intern("WM_SAVE_YOURSELF", FALSE);
reread_rcfiles_atom = gdk_atom_intern("_GTK_READ_RCFILES", FALSE);
***************
*** 2088,2094 ****
{
if (event->message_type == save_yourself_atom)
{
! /* NOTE: this is never reached! */
out_flush();
ml_sync_all(FALSE, FALSE); /* preserve all swap files */
return TRUE;
--- 2130,2136 ----
{
if (event->message_type == save_yourself_atom)
{
! /* NOTE: this is never reached! See gdk_wm_protocols_filter(). */
out_flush();
ml_sync_all(FALSE, FALSE); /* preserve all swap files */
return TRUE;
*** ../vim61a.035/src/version.c Thu Mar 7 20:14:43 2002
--- src/version.c Thu Mar 7 20:15:47 2002
***************
*** 608,609 ****
--- 608,611 ----
{ /* Add new patch number below this line */
+ /**/
+ 36,
/**/
--
hundred-and-one symptoms of being an internet addict:
183. You move your coffeemaker next to your computer.
/// Bram Moolenaar --
[email protected] --
http://www.moolenaar.net \\\
/// Creator of Vim --
http://vim.sf.net --
ftp://ftp.vim.org/pub/vim \\\
\\\ Project leader for A-A-P --
http://www.a-a-p.org ///
\\\ Help me helping AIDS orphans in Uganda -
http://iccf-holland.org ///