Dnia środa, 30 stycznia 2008, Rafał Cygnarowski napisał:
> 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.

Updated patch without freeze_dosemu() and unfreeze_dosemu() functions:

--------------------------------------------------------------------------
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,
--------------------------------------------------------------------------


Regards,
-- 
Rafał Cygnarowski
[EMAIL PROTECTED]

Attachment: signature.asc
Description: This is a digitally signed message part.

Reply via email to