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@xxxxxxx
Attachment:
signature.asc
Description: This is a digitally signed message part.