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 22:27:07.000000000 +0100 @@ -383,6 +383,10 @@ 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); +void (*Draw_string_backup)(int x, int y , unsigned char *s, int len, Bit8u attr); /* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */ @@ -486,6 +490,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 +1472,38 @@ * 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 = Draw_cursor_fake; + + 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); + + Draw_string_backup = Text_X.Draw_string; + Text_X.Draw_string = Draw_string_fake; + break; } @@ -1490,6 +1533,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; + Text_X.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 +1565,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,