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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox