mirror of https://github.com/OpenVPN/openvpn-gui
Fix exit handling while in modal loops
PostThreadMessage used to trigger exit event gets lost while in modal dialog loops such as auth dialog. Replace it by PostMessage and handle it in the status window callback. Fixes openvpn processes left behind if exit is pressed while user-auth dialog is active. Changes after feedback: - Use PostMessage correctly in SuspendOpenVPN() (error pointed out by leobasilio@gmail.com). Signed-off-by: Selva Nair <selva.nair@gmail.com>pull/48/head
parent
2dd468d23c
commit
9fb33d0bee
51
openvpn.c
51
openvpn.c
|
@ -848,6 +848,27 @@ StatusDialogFunc(HWND hwndDlg, UINT msg, WPARAM wParam, LPARAM lParam)
|
|||
case WM_DESTROY:
|
||||
PostQuitMessage(0);
|
||||
break;
|
||||
|
||||
case WM_OVPN_STOP:
|
||||
c = (connection_t *) GetProp(hwndDlg, cfgProp);
|
||||
c->state = disconnecting;
|
||||
RunDisconnectScript(c, false);
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_DISCONNECT), FALSE);
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), FALSE);
|
||||
SetMenuStatus(c, disconnecting);
|
||||
SetDlgItemText(c->hwndStatus, ID_TXT_STATUS, LoadLocalizedString(IDS_NFO_STATE_WAIT_TERM));
|
||||
SetEvent(c->exit_event);
|
||||
break;
|
||||
|
||||
case WM_OVPN_SUSPEND:
|
||||
c = (connection_t *) GetProp(hwndDlg, cfgProp);
|
||||
c->state = suspending;
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_DISCONNECT), FALSE);
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), FALSE);
|
||||
SetMenuStatus(c, disconnecting);
|
||||
SetDlgItemText(c->hwndStatus, ID_TXT_STATUS, LoadLocalizedString(IDS_NFO_STATE_WAIT_TERM));
|
||||
SetEvent(c->exit_event);
|
||||
break;
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
|
@ -913,31 +934,7 @@ ThreadOpenVPNStatus(void *p)
|
|||
continue;
|
||||
}
|
||||
|
||||
if (msg.hwnd == NULL)
|
||||
{
|
||||
switch (msg.message)
|
||||
{
|
||||
case WM_OVPN_STOP:
|
||||
c->state = disconnecting;
|
||||
RunDisconnectScript(c, false);
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_DISCONNECT), FALSE);
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), FALSE);
|
||||
SetMenuStatus(c, disconnecting);
|
||||
SetDlgItemText(c->hwndStatus, ID_TXT_STATUS, LoadLocalizedString(IDS_NFO_STATE_WAIT_TERM));
|
||||
SetEvent(c->exit_event);
|
||||
break;
|
||||
|
||||
case WM_OVPN_SUSPEND:
|
||||
c->state = suspending;
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_DISCONNECT), FALSE);
|
||||
EnableWindow(GetDlgItem(c->hwndStatus, ID_RESTART), FALSE);
|
||||
SetMenuStatus(c, disconnecting);
|
||||
SetDlgItemText(c->hwndStatus, ID_TXT_STATUS, LoadLocalizedString(IDS_NFO_STATE_WAIT_TERM));
|
||||
SetEvent(c->exit_event);
|
||||
break;
|
||||
}
|
||||
}
|
||||
else if (IsDialogMessage(c->hwndStatus, &msg) == 0)
|
||||
if (IsDialogMessage(c->hwndStatus, &msg) == 0)
|
||||
{
|
||||
TranslateMessage(&msg);
|
||||
DispatchMessage(&msg);
|
||||
|
@ -1158,14 +1155,14 @@ out:
|
|||
void
|
||||
StopOpenVPN(connection_t *c)
|
||||
{
|
||||
PostThreadMessage(c->threadId, WM_OVPN_STOP, 0, 0);
|
||||
PostMessage(c->hwndStatus, WM_OVPN_STOP, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
SuspendOpenVPN(int config)
|
||||
{
|
||||
PostThreadMessage(o.conn[config].threadId, WM_OVPN_SUSPEND, 0, 0);
|
||||
PostMessage(o.conn[config].hwndStatus, WM_OVPN_SUSPEND, 0, 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
Loading…
Reference in New Issue