[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]

[MD:1062]Click-out-of-PopupMenu freezes Meadow.



堀口です.

 まえから気になっていたのですが, ポップアップメニューを出してその
外をクリックしたときに Meadow が固まりませんか?

 原因がわかったので直してみました.

 まず, 原因は以下のとおりでした.

 EmacsTranslateMessage@xxxxxxxxxx の中の case WM_EMACS_POPUP_MENU 
の処理で, PeekMessage で WM_COMMAND が来たらメインスレッドにメニュー
終了のメッセージを送るところがあります.

 ところがここで PeekMessage したメッセージが期待通りのメッセージ
でなかった場合は再度 PeekMessage をするという無限ループになってい
ました.

 一方ユーザが出てきたメニューの外をクリックすると受け取るメッセー
ジは WM_COMMAND ではなく WM_LBUTTONDOWN であるために無限に 
PeekMessage を繰り返すループに陥って固まっていました.



 これに対して, WM_EMACS_POPUP_MENU の処理の中でループを行うのをや
めて, かつ受け取ったメッセージが期待通りでなかった場合にもメイン
スレッドにメッセージを送ってメニュー処理が終了できるようにするこ
とで問題が起きなくなりました.

 パッチを添付します.
-- 
堀口恭太郎 
*** mw32term.c.org	Sun Feb 21 07:41:00 1999
--- mw32term.c	Thu Mar 04 21:21:10 1999
***************
*** 3585,3590 ****
--- 3585,3591 ----
  	    int flag;
  	    UINT track_flag;
  	    LPPOINT lppos;
+ 	    MSG msg2;
  
  	    lppos = (LPPOINT)msg.lParam;
  	    track_flag = TPM_LEFTALIGN;
***************
*** 3601,3625 ****
  	      POST_THREAD_INFORM_MESSAGE (main_thread_id,
  					  WM_EMACS_POPUP_MENU_REPLY,
  					  (WPARAM) 0, (LPARAM) 0);
! 	    while(1)
  	      {
! 		MSG msg2;
! 
! 		if (!PeekMessage(&msg2, msg.hwnd, 0, 0, PM_REMOVE))
! 		  {
! 		    POST_THREAD_INFORM_MESSAGE (main_thread_id,
! 						WM_EMACS_POPUP_MENU_REPLY,
! 						(WPARAM) 0, (LPARAM) 0);
! 		    break;
! 		  }
! 		if ((msg2.message == WM_COMMAND) && (HIWORD(msg2.wParam) == 0))
! 		  {
! 		    POST_THREAD_INFORM_MESSAGE (main_thread_id,
! 						WM_EMACS_POPUP_MENU_REPLY,
! 						(WPARAM) msg2.wParam, (LPARAM) 0);
! 		    break;
! 		  }
  	      }
  	    break;
  	  }
  
--- 3602,3625 ----
  	      POST_THREAD_INFORM_MESSAGE (main_thread_id,
  					  WM_EMACS_POPUP_MENU_REPLY,
  					  (WPARAM) 0, (LPARAM) 0);
! 	    
! 	    if (!PeekMessage(&msg2, msg.hwnd, 0, 0, PM_REMOVE))
  	      {
! 		POST_THREAD_INFORM_MESSAGE (main_thread_id,
! 					    WM_EMACS_POPUP_MENU_REPLY,
! 					    (WPARAM) 0, (LPARAM) 0);
! 	      }
! 	    else if ((msg2.message == WM_COMMAND) && 
! 		     (HIWORD(msg2.wParam) == 0))
! 	      {
! 		POST_THREAD_INFORM_MESSAGE (main_thread_id,
! 					    WM_EMACS_POPUP_MENU_REPLY,
! 					    (WPARAM) msg2.wParam, (LPARAM) 0);
  	      }
+ 	    else
+ 	      POST_THREAD_INFORM_MESSAGE (main_thread_id,
+ 					  WM_EMACS_POPUP_MENU_REPLY,
+ 					  (WPARAM) 0, (LPARAM) 0);
  	    break;
  	  }