diff -Nur dosemu-1.4.0.orig/src/env/video/text.c dosemu-1.4.0.chng/src/env/video/text.c --- dosemu-1.4.0.orig/src/env/video/text.c 2007-05-04 07:59:48.000000000 +0200 +++ dosemu-1.4.0.chng/src/env/video/text.c 2008-04-21 22:36:23.000000000 +0200 @@ -96,6 +96,11 @@ return 1; } +struct text_system* registered_text_system(void) +{ + return Text; +} + /* * Draw a text string. * The attribute is the VGA color/mono text attribute. 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-04-21 23:03:06.000000000 +0200 @@ -383,6 +383,12 @@ static Atom comm_atom = None; static Boolean kdos_client = FALSE; /* started by kdos */ +static Boolean about_to_quit = FALSE; +static struct text_system* Text_Tmp; +extern struct text_system* registered_text_system(void); +void (*Draw_cursor_backup)(int x, int y, Bit8u attr, int first, int last, Boolean focus); +void (*Draw_string_backup)(int x, int y , unsigned char *s, int len, Bit8u attr); + /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -486,6 +492,16 @@ /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ +void Draw_cursor_fake(int x, int y, Bit8u attr, int first, int last, Boolean focus) +{ + return; +} + +void Draw_string_fake(int x, int y , unsigned char *s, int len, Bit8u attr) +{ + return; +} + /* utility function for opening a connection and making certain * I am either using or not using the X keyboard Extension. */ @@ -1458,9 +1474,40 @@ * 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; + Text_Tmp = registered_text_system(); + + Draw_cursor_backup = Text_Tmp->Draw_cursor; + Text_Tmp->Draw_cursor = Draw_cursor_fake; + + for (i = 0; i < 12; i++) + Text_Tmp->Draw_string(14, i+6, " " , 52, 0xf0); + + Text_Tmp->Draw_string(15, 7, " " , 50, 0x4f); + Text_Tmp->Draw_string(15, 8, " You are about to abort DosEmu session. " , 50, 0x4f); + Text_Tmp->Draw_string(15, 9, " This is not recomended way for closing DosEmu. " , 50, 0x4f); + Text_Tmp->Draw_string(15, 10, " Close all your programs and use exitemu command. " , 50, 0x4f); + Text_Tmp->Draw_string(15, 11, " " , 50, 0x4f); + Text_Tmp->Draw_string(15, 12, " Do you still want to continue? " , 50, 0x4f); + Text_Tmp->Draw_string(15, 13, " " , 50, 0x4f); + Text_Tmp->Draw_string(15, 14, " Y - abort DosEmu session " , 50, 0x4f); + Text_Tmp->Draw_string(15, 15, " N - continue DosEmu session " , 50, 0x4f); + Text_Tmp->Draw_string(15, 16, " " , 50, 0x4f); + + Text_Tmp->Draw_string(48, 10, "exitemu" , 7, 0x4a); + Text_Tmp->Draw_string(18, 14, "Y" , 1, 0x4e); + Text_Tmp->Draw_string(18, 15, "N" , 1, 0x4e); + + Draw_string_backup = Text_Tmp->Draw_string; + Text_Tmp->Draw_string = Draw_string_fake; + break; } @@ -1490,6 +1537,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_Tmp->Draw_cursor = Draw_cursor_backup; + Text_Tmp->Draw_string = Draw_string_backup; + if(vga.mode_class == TEXT) { + X_redraw_text_screen(); + } else { + dirty_all_video_pages(); + X_update_screen(); + } + } + break; + } + if((e.xkey.state & ControlMask) && (e.xkey.state & Mod1Mask)) { KeySym keysym = XKeycodeToKeysym(display, e.xkey.keycode, 0); if (keysym == grab_keysym) { @@ -1504,6 +1569,7 @@ break; } } + /* Clears the visible selection if the cursor is inside the selection */