Re: Trapping dosemu exit

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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.


[Index of Archives]     [Linux Console]     [Linux Audio]     [Linux for Hams]     [Kernel Newbies]     [Security]     [Netfilter]     [Bugtraq]     [Yosemite Camping]     [Yosemite Hiking]     [MIPS Linux]     [ARM Linux]     [Linux RAID]     [Samba]     [Linux Media]     [Fedora Users]

  Powered by Linux