[Message Prev][Message Next][Thread Prev][Thread Next][Message Index][Thread Index]
[MD:1062]Click-out-of-PopupMenu freezes Meadow.
- X-ml-count: 1062
- Subject: [MD:1062]Click-out-of-PopupMenu freezes Meadow.
- From: kyota@xxxxxxxxxxxxx (Kyotaro HORIGUCHI)
- Date: Thu, 4 Mar 1999 21:28:32 +0900
- X-mailer: Mew version 1.94b8 on Emacs 20.3 / Mule 4.0 (HANANOEN)
堀口です.
まえから気になっていたのですが, ポップアップメニューを出してその
外をクリックしたときに 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;
}