From: "Rafał Cygnarowski" <zswi@pers.pl>
To: linux-msdos@vger.kernel.org, bambang <bpranoto@gmail.com>
Subject: Re: Trapping dosemu exit
Date: Wed, 30 Jan 2008 12:19:48 +0100 [thread overview]
Message-ID: <200801301219.53908.zswi@pers.pl> (raw)
In-Reply-To: <1196829301.19107.9.camel@bambang-desktop>
[-- Attachment #1: Type: text/plain, Size: 5443 bytes --]
Dnia środa, 5 grudnia 2007, bambang napisał:
> Hi all,
>
> We use dosemu 1.4.0 to access Novell Netware in Graphics terminal.
>
> Everything goes well except one little problem: It's often the users
> exit the dosemu by directly closing the dosemu window thus not logging
> out from the novell connection. Obviously, the novell connection still
> left opened and causing problems.
>
> Is there a way to trap dosemu terminating event, so we can force a
> logout or warn the user and reject the termination.
Because I suffer from the same reason and I found a little bit time to solve
this problem, here is a patch for X plugin (and only X and not SDL).
Please use it with caution - it's not well tested yet.
---------------------------------------------------------------------------------
diff -Nur dosemu-1.4.0.orig/src/plugin/X/X.c dosemu-1.4.0.chng/src/plugin/X/X.c
--- dosemu-1.4.0.orig/src/plugin/X/X.c 2007-05-04 07:59:48.000000000 +0200
+++ dosemu-1.4.0.chng/src/plugin/X/X.c 2008-01-30 12:09:47.000000000 +0100
@@ -383,6 +383,9 @@
static Atom comm_atom = None;
static Boolean kdos_client = FALSE; /* started by kdos */
+static Boolean about_to_quit = FALSE;
+extern struct text_system Text_X;
+void (*Draw_cursor_backup)(int x, int y, Bit8u attr, int first, int last, Boolean focus);
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
@@ -1434,6 +1437,7 @@
case FocusIn:
X_printf("X: focus in\n");
+ if (about_to_quit) break;
if (vga.mode_class == TEXT) text_gain_focus();
if (config.X_background_pause && !dosemu_user_froze) unfreeze_dosemu ();
have_focus = TRUE;
@@ -1441,6 +1445,7 @@
case FocusOut:
X_printf("X: focus out\n");
+ if (about_to_quit) break;
if (mainwindow == fullscreenwindow) break;
if (vga.mode_class == TEXT) text_lose_focus();
output_byte_8042(port60_buffer | 0x80);
@@ -1458,9 +1463,36 @@
* atom, it means the window manager wants us to die.
*/
if(e.xclient.message_type == proto_atom && *e.xclient.data.l == delete_atom) {
+ int i;
+
X_printf("X: got window delete message\n");
- /* XXX - Is it ok to call this from a SIGALRM handler? */
- leavedos(0);
+
+ if (about_to_quit)
+ break;
+
+ about_to_quit = TRUE;
+ Draw_cursor_backup = Text_X.Draw_cursor;
+ Text_X.Draw_cursor = NULL;
+ freeze_dosemu();
+
+ for (i = 0; i < 12; i++)
+ Text_X.Draw_string(14, i+6, " " , 52, 0xf0);
+
+ Text_X.Draw_string(15, 7, " " , 50, 0x4f);
+ Text_X.Draw_string(15, 8, " You are about to abort DosEmu session. " , 50, 0x4f);
+ Text_X.Draw_string(15, 9, " This is not recomended way for closing DosEmu. " , 50, 0x4f);
+ Text_X.Draw_string(15, 10, " Close all your programs and use exitemu command. " , 50, 0x4f);
+ Text_X.Draw_string(15, 11, " " , 50, 0x4f);
+ Text_X.Draw_string(15, 12, " Do you still want to continue? " , 50, 0x4f);
+ Text_X.Draw_string(15, 13, " " , 50, 0x4f);
+ Text_X.Draw_string(15, 14, " Y - abort DosEmu session " , 50, 0x4f);
+ Text_X.Draw_string(15, 15, " N - continue DosEmu session " , 50, 0x4f);
+ Text_X.Draw_string(15, 16, " " , 50, 0x4f);
+
+ Text_X.Draw_string(48, 10, "exitemu" , 7, 0x4a);
+ Text_X.Draw_string(18, 14, "Y" , 1, 0x4e);
+ Text_X.Draw_string(18, 15, "N" , 1, 0x4e);
+
break;
}
@@ -1490,6 +1522,24 @@
keyrel_pending = 0;
}
+ if (about_to_quit) {
+ KeySym keysym = XKeycodeToKeysym(display, e.xkey.keycode, 0);
+ if (keysym == XK_Y || keysym == XK_y) {
+ leavedos(0);
+ } else if (keysym == XK_N || keysym == XK_n) {
+ about_to_quit = FALSE;
+ Text_X.Draw_cursor = Draw_cursor_backup;
+ if(vga.mode_class == TEXT) {
+ X_redraw_text_screen();
+ } else {
+ dirty_all_video_pages();
+ X_update_screen();
+ }
+ unfreeze_dosemu();
+ }
+ break;
+ }
+
if((e.xkey.state & ControlMask) && (e.xkey.state & Mod1Mask)) {
KeySym keysym = XKeycodeToKeysym(display, e.xkey.keycode, 0);
if (keysym == grab_keysym) {
@@ -1504,6 +1554,7 @@
break;
}
}
+
/*
Clears the visible selection if the cursor is inside the selection
*/
diff -Nur dosemu-1.4.0.orig/src/plugin/X/X_font.c dosemu-1.4.0.chng/src/plugin/X/X_font.c
--- dosemu-1.4.0.orig/src/plugin/X/X_font.c 2007-05-04 07:59:48.000000000 +0200
+++ dosemu-1.4.0.chng/src/plugin/X/X_font.c 2008-01-30 10:04:00.000000000 +0100
@@ -195,8 +195,7 @@
text_colors[i] = xc.pixel;
}
-
-static struct text_system Text_X =
+struct text_system Text_X =
{
X_draw_string,
X_draw_line,
---------------------------------------------------------------------------------
Regards,
--
Rafał Cygnarowski
rafi@pers.pl
[-- Attachment #2: This is a digitally signed message part. --]
[-- Type: application/pgp-signature, Size: 189 bytes --]
next prev parent reply other threads:[~2008-01-30 11:19 UTC|newest]
Thread overview: 5+ messages / expand[flat|nested] mbox.gz Atom feed top
2007-12-05 4:35 Trapping dosemu exit bambang
2008-01-30 11:19 ` Rafał Cygnarowski [this message]
2008-01-30 22:38 ` Rafał Cygnarowski
2008-01-31 0:14 ` James Courtier-Dutton
2008-01-31 7:46 ` Bambang P
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200801301219.53908.zswi@pers.pl \
--to=zswi@pers.pl \
--cc=bpranoto@gmail.com \
--cc=linux-msdos@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.