tray code cleanup and fixes

* make tray icon reflect connection status again
 * prevent tray context menu popup on right click
 * display proxy settings tab only if enabled
pull/1/head
Heiko Hund 2010-04-23 12:57:00 +02:00
parent a43a0d2bb7
commit f373ca17f7
3 changed files with 367 additions and 484 deletions

49
main.c
View File

@ -201,8 +201,14 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated")); s_uTaskbarRestart = RegisterWindowMessage(TEXT("TaskbarCreated"));
/* Load application icon */
HICON hIcon = LoadLocalizedIcon(ID_ICO_APP);
if (hIcon) {
SendMessage(hwnd, WM_SETICON, (WPARAM) (ICON_SMALL), (LPARAM) (hIcon));
SendMessage(hwnd, WM_SETICON, (WPARAM) (ICON_BIG), (LPARAM) (hIcon));
}
CreatePopupMenus(); /* Create popup menus */ CreatePopupMenus(); /* Create popup menus */
LoadAppIcon(); /* Load App Icon */
ShowTrayIcon(); ShowTrayIcon();
if (o.allow_service[0]=='1' || o.service_only[0]=='1') if (o.allow_service[0]=='1' || o.service_only[0]=='1')
CheckServiceStatus(); // Check if service is running or not CheckServiceStatus(); // Check if service is running or not
@ -214,7 +220,7 @@ LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM
case WM_NOTIFYICONTRAY: case WM_NOTIFYICONTRAY:
OnNotifyTray(lParam); // Manages message from tray OnNotifyTray(lParam); // Manages message from tray
return TRUE; break;
case WM_COMMAND: case WM_COMMAND:
if ( (LOWORD(wParam) >= IDM_CONNECTMENU) && (LOWORD(wParam) < IDM_CONNECTMENU + MAX_CONFIGS) ) { if ( (LOWORD(wParam) >= IDM_CONNECTMENU) && (LOWORD(wParam) < IDM_CONNECTMENU + MAX_CONFIGS) ) {
@ -357,20 +363,29 @@ static void
ShowSettingsDialog() ShowSettingsDialog()
{ {
PROPSHEETPAGE psp[2]; PROPSHEETPAGE psp[2];
psp[0].dwSize = sizeof(PROPSHEETPAGE); int page_number = 0;
psp[0].dwFlags = PSP_DLGINDIRECT;
psp[0].hInstance = o.hInstance; /* Proxy tab */
psp[0].pResource = LocalizedDialogResource(ID_DLG_PROXY); if (o.allow_proxy[0] == '1' && o.service_only[0] == '0') {
psp[0].pfnDlgProc = ProxySettingsDialogFunc; psp[page_number].dwSize = sizeof(PROPSHEETPAGE);
psp[0].lParam = 0; psp[page_number].dwFlags = PSP_DLGINDIRECT;
psp[0].pfnCallback = NULL; psp[page_number].hInstance = o.hInstance;
psp[1].dwSize = sizeof(PROPSHEETPAGE); psp[page_number].pResource = LocalizedDialogResource(ID_DLG_PROXY);
psp[1].dwFlags = PSP_DLGINDIRECT; psp[page_number].pfnDlgProc = ProxySettingsDialogFunc;
psp[1].hInstance = o.hInstance; psp[page_number].lParam = 0;
psp[1].pResource = LocalizedDialogResource(ID_DLG_GENERAL); psp[page_number].pfnCallback = NULL;
psp[1].pfnDlgProc = LanguageSettingsDlgProc; ++page_number;
psp[1].lParam = 0; }
psp[1].pfnCallback = NULL;
/* General tab */
psp[page_number].dwSize = sizeof(PROPSHEETPAGE);
psp[page_number].dwFlags = PSP_DLGINDIRECT;
psp[page_number].hInstance = o.hInstance;
psp[page_number].pResource = LocalizedDialogResource(ID_DLG_GENERAL);
psp[page_number].pfnDlgProc = LanguageSettingsDlgProc;
psp[page_number].lParam = 0;
psp[page_number].pfnCallback = NULL;
++page_number;
PROPSHEETHEADER psh; PROPSHEETHEADER psh;
psh.dwSize = sizeof(PROPSHEETHEADER); psh.dwSize = sizeof(PROPSHEETHEADER);
@ -379,7 +394,7 @@ ShowSettingsDialog()
psh.hInstance = o.hInstance; psh.hInstance = o.hInstance;
psh.hIcon = LoadLocalizedIcon(ID_ICO_APP); psh.hIcon = LoadLocalizedIcon(ID_ICO_APP);
psh.pszCaption = LoadLocalizedString(IDS_SETTINGS_CAPTION); psh.pszCaption = LoadLocalizedString(IDS_SETTINGS_CAPTION);
psh.nPages = sizeof(psp) / sizeof(PROPSHEETPAGE); psh.nPages = page_number;
psh.nStartPage = 0; psh.nStartPage = 0;
psh.ppsp = (LPCPROPSHEETPAGE) &psp; psh.ppsp = (LPCPROPSHEETPAGE) &psp;
psh.pfnCallback = NULL; psh.pfnCallback = NULL;

464
tray.c
View File

@ -2,6 +2,7 @@
* OpenVPN-GUI -- A Windows GUI for OpenVPN. * OpenVPN-GUI -- A Windows GUI for OpenVPN.
* *
* Copyright (C) 2004 Mathias Sundman <mathias@nilings.se> * Copyright (C) 2004 Mathias Sundman <mathias@nilings.se>
* 2010 Heiko Hund <heikoh@users.sf.net>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -18,18 +19,11 @@
* distribution); if not, write to the Free Software Foundation, Inc., * distribution); if not, write to the Free Software Foundation, Inc.,
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#define _WIN32_IE 0x0500 #define _WIN32_IE 0x0500
#define NIF_INFO 0x00000010
// Notify Icon Infotip flags
#define NIIF_NONE 0x00000000
// icon flags are mutually exclusive
// and take only the lowest 2 bits
#define NIIF_INFO 0x00000001
#define NIIF_WARNING 0x00000002
#define NIIF_ERROR 0x00000003
#define NIIF_ICON_MASK 0x0000000F
#include <windows.h> #include <windows.h>
#include <shellapi.h>
#include <tchar.h> #include <tchar.h>
#include <time.h> #include <time.h>
@ -44,7 +38,7 @@
#include "openvpn-gui-res.h" #include "openvpn-gui-res.h"
#include "localization.h" #include "localization.h"
//POPUP MENU /* Popup Menus */
HMENU hMenu; HMENU hMenu;
HMENU hMenuConn[MAX_CONFIGS]; HMENU hMenuConn[MAX_CONFIGS];
HMENU hMenuService; HMENU hMenuService;
@ -52,154 +46,27 @@ HMENU hMenuService;
NOTIFYICONDATA ni; NOTIFYICONDATA ni;
extern options_t o; extern options_t o;
// Mouse clicks on tray
void OnNotifyTray(LPARAM lParam)
{
POINT pt; // point structure
int connected_config;
int i;
// Right click, show the menu /* Create popup menus */
switch(lParam) { void
case WM_RBUTTONDOWN: CreatePopupMenus()
/* Re-read configs and re-create menus if no connection is running */
if (CountConnState(disconnected) == o.num_configs)
{
DestroyPopupMenus();
BuildFileList();
CreatePopupMenus();
}
GetCursorPos(&pt); // get the cursors position
SetForegroundWindow(o.hWnd); // set the foreground window
TrackPopupMenu(hMenu,TPM_RIGHTALIGN,pt.x,pt.y,0,o.hWnd,NULL);// track the popup
break;
case WM_LBUTTONDOWN:
break;
case WM_LBUTTONDBLCLK:
if (o.service_only[0]=='1')
{
/* Start OpenVPN Service */
if (o.service_state == service_disconnected)
{
MyStartService();
}
else if (o.service_state == service_connected)
{
/* Stop OpenVPN service */
if (MessageBox(NULL, LoadLocalizedString(IDS_MENU_ASK_STOP_SERVICE), _T(PACKAGE_NAME), MB_YESNO | MB_SETFOREGROUND) == IDYES)
{
MyStopService();
}
}
}
else
{
/* Open Status window if only one connection is running */
connected_config = -1;
for (i=0; i < o.num_configs; i++)
{
if(o.conn[i].state != disconnected)
{
if (connected_config == -1)
{
connected_config = i;
}
else
{
connected_config = -1;
break;
}
}
}
if (connected_config != -1)
{
ShowWindow(o.conn[connected_config].hwndStatus, SW_SHOW);
SetForegroundWindow(o.conn[connected_config].hwndStatus);
}
/* Re-read configs and re-create menus if no connection is running */
if (CountConnState(disconnected) == o.num_configs)
{
DestroyPopupMenus();
BuildFileList();
CreatePopupMenus();
/* Start connection if only one config exist */
if ((o.num_configs == 1) && (o.conn[0].state == disconnected))
StartOpenVPN(0);
}
}
break;
}
PostMessage(o.hWnd,WM_NULL,0,0);// post a null message
}
void OnDestroyTray()
{
//Destroy popup menu
DestroyMenu(hMenu);
//Remove Icon from Tray
Shell_NotifyIcon(NIM_DELETE, &ni);
}
/* Create Popup Menus */
void CreatePopupMenus()
{ {
int i; int i;
/* Create Main menu */
hMenu=CreatePopupMenu();
/* Create a menu for every config */
for (i = 0; i < o.num_configs; i++) for (i = 0; i < o.num_configs; i++)
hMenuConn[i] = CreatePopupMenu(); hMenuConn[i] = CreatePopupMenu();
/* Create the Service Menu */
hMenuService = CreatePopupMenu(); hMenuService = CreatePopupMenu();
hMenu = CreatePopupMenu();
/* Put something on the menus */ if (o.num_configs == 1) {
CreateItemList(hMenu);
}
/* Destroy Popup Menus */
void DestroyPopupMenus()
{
int i;
/* Destroy Main menu */
DestroyMenu(hMenu);
/* Destroy all config submenus */
for (i=0; i < o.num_configs; i++)
DestroyMenu(hMenuConn[i]);
/* Destroy the Service Menu */
DestroyMenu(hMenuService);
}
void CreateItemList()
{
int i;
if (o.num_configs == 1)
{
/* Create Main menu with actions */ /* Create Main menu with actions */
if (o.service_only[0]=='0') if (o.service_only[0] == '0') {
{
AppendMenu(hMenu, MF_STRING, IDM_CONNECTMENU, LoadLocalizedString(IDS_MENU_CONNECT)); AppendMenu(hMenu, MF_STRING, IDM_CONNECTMENU, LoadLocalizedString(IDS_MENU_CONNECT));
AppendMenu(hMenu, MF_STRING, IDM_DISCONNECTMENU, LoadLocalizedString(IDS_MENU_DISCONNECT)); AppendMenu(hMenu, MF_STRING, IDM_DISCONNECTMENU, LoadLocalizedString(IDS_MENU_DISCONNECT));
AppendMenu(hMenu, MF_STRING, IDM_STATUSMENU, LoadLocalizedString(IDS_MENU_STATUS)); AppendMenu(hMenu, MF_STRING, IDM_STATUSMENU, LoadLocalizedString(IDS_MENU_STATUS));
AppendMenu(hMenu, MF_SEPARATOR, 0, 0); AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
} }
else else {
{
AppendMenu(hMenu, MF_STRING, IDM_SERVICE_START, LoadLocalizedString(IDS_MENU_SERVICEONLY_START)); AppendMenu(hMenu, MF_STRING, IDM_SERVICE_START, LoadLocalizedString(IDS_MENU_SERVICEONLY_START));
AppendMenu(hMenu, MF_STRING, IDM_SERVICE_STOP, LoadLocalizedString(IDS_MENU_SERVICEONLY_STOP)); AppendMenu(hMenu, MF_STRING, IDM_SERVICE_STOP, LoadLocalizedString(IDS_MENU_SERVICEONLY_STOP));
AppendMenu(hMenu, MF_STRING, IDM_SERVICE_RESTART, LoadLocalizedString(IDS_MENU_SERVICEONLY_RESTART)); AppendMenu(hMenu, MF_STRING, IDM_SERVICE_RESTART, LoadLocalizedString(IDS_MENU_SERVICEONLY_RESTART));
@ -207,82 +74,78 @@ void CreateItemList()
} }
AppendMenu(hMenu, MF_STRING, IDM_VIEWLOGMENU, LoadLocalizedString(IDS_MENU_VIEWLOG)); AppendMenu(hMenu, MF_STRING, IDM_VIEWLOGMENU, LoadLocalizedString(IDS_MENU_VIEWLOG));
if (o.allow_edit[0] == '1') if (o.allow_edit[0] == '1')
{
AppendMenu(hMenu, MF_STRING, IDM_EDITMENU, LoadLocalizedString(IDS_MENU_EDITCONFIG)); AppendMenu(hMenu, MF_STRING, IDM_EDITMENU, LoadLocalizedString(IDS_MENU_EDITCONFIG));
}
#ifndef DISABLE_CHANGE_PASSWORD #ifndef DISABLE_CHANGE_PASSWORD
if (o.allow_password[0] == '1') if (o.allow_password[0] == '1')
{
AppendMenu(hMenu, MF_STRING, IDM_PASSPHRASEMENU, LoadLocalizedString(IDS_MENU_PASSPHRASE)); AppendMenu(hMenu, MF_STRING, IDM_PASSPHRASEMENU, LoadLocalizedString(IDS_MENU_PASSPHRASE));
}
#endif #endif
AppendMenu(hMenu, MF_SEPARATOR, 0, 0); AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
if (o.allow_service[0] == '1' && o.service_only[0] == '0') if (o.allow_service[0] == '1' && o.service_only[0] == '0')
{ {
AppendMenu(hMenu, MF_POPUP, (UINT) hMenuService, LoadLocalizedString(IDS_MENU_SERVICE)); AppendMenu(hMenu, MF_POPUP, (UINT) hMenuService, LoadLocalizedString(IDS_MENU_SERVICE));
AppendMenu(hMenu, MF_SEPARATOR, 0, 0); AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
} }
//TODO: if (o.allow_proxy[0]=='1' && o.service_only[0]=='0')
AppendMenu(hMenu, MF_STRING ,IDM_SETTINGS, LoadLocalizedString(IDS_MENU_SETTINGS)); AppendMenu(hMenu, MF_STRING ,IDM_SETTINGS, LoadLocalizedString(IDS_MENU_SETTINGS));
AppendMenu(hMenu, MF_STRING ,IDM_ABOUT, LoadLocalizedString(IDS_MENU_ABOUT)); AppendMenu(hMenu, MF_STRING ,IDM_ABOUT, LoadLocalizedString(IDS_MENU_ABOUT));
AppendMenu(hMenu, MF_STRING ,IDM_CLOSE, LoadLocalizedString(IDS_MENU_CLOSE)); AppendMenu(hMenu, MF_STRING ,IDM_CLOSE, LoadLocalizedString(IDS_MENU_CLOSE));
SetMenuStatus(0, disconnected); SetMenuStatus(0, disconnected);
} }
else else {
{
/* Create Main menu with all connections */ /* Create Main menu with all connections */
int i;
for (i = 0; i < o.num_configs; i++) for (i = 0; i < o.num_configs; i++)
AppendMenu(hMenu, MF_POPUP, (UINT) hMenuConn[i], o.conn[i].config_name); AppendMenu(hMenu, MF_POPUP, (UINT) hMenuConn[i], o.conn[i].config_name);
if (o.num_configs > 0) if (o.num_configs > 0)
AppendMenu(hMenu, MF_SEPARATOR, 0, 0); AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
if (o.allow_service[0]=='1' && o.service_only[0]=='0')
{ if (o.service_only[0] == '0' && o.allow_service[0] == '1') {
AppendMenu(hMenu, MF_POPUP, (UINT) hMenuService, LoadLocalizedString(IDS_MENU_SERVICE)); AppendMenu(hMenu, MF_POPUP, (UINT) hMenuService, LoadLocalizedString(IDS_MENU_SERVICE));
AppendMenu(hMenu, MF_SEPARATOR, 0, 0); AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
} }
if (o.service_only[0]=='1') else if (o.service_only[0] == '1') {
{
AppendMenu(hMenu, MF_STRING, IDM_SERVICE_START, LoadLocalizedString(IDS_MENU_SERVICEONLY_START)); AppendMenu(hMenu, MF_STRING, IDM_SERVICE_START, LoadLocalizedString(IDS_MENU_SERVICEONLY_START));
AppendMenu(hMenu, MF_STRING, IDM_SERVICE_STOP, LoadLocalizedString(IDS_MENU_SERVICEONLY_STOP)); AppendMenu(hMenu, MF_STRING, IDM_SERVICE_STOP, LoadLocalizedString(IDS_MENU_SERVICEONLY_STOP));
AppendMenu(hMenu, MF_STRING, IDM_SERVICE_RESTART, LoadLocalizedString(IDS_MENU_SERVICEONLY_RESTART)); AppendMenu(hMenu, MF_STRING, IDM_SERVICE_RESTART, LoadLocalizedString(IDS_MENU_SERVICEONLY_RESTART));
AppendMenu(hMenu, MF_SEPARATOR, 0, 0); AppendMenu(hMenu, MF_SEPARATOR, 0, 0);
} }
//TODO: if (o.allow_proxy[0]=='1' && o.service_only[0]=='0')
AppendMenu(hMenu, MF_STRING ,IDM_SETTINGS, LoadLocalizedString(IDS_MENU_SETTINGS)); AppendMenu(hMenu, MF_STRING ,IDM_SETTINGS, LoadLocalizedString(IDS_MENU_SETTINGS));
AppendMenu(hMenu, MF_STRING ,IDM_ABOUT, LoadLocalizedString(IDS_MENU_ABOUT)); AppendMenu(hMenu, MF_STRING ,IDM_ABOUT, LoadLocalizedString(IDS_MENU_ABOUT));
AppendMenu(hMenu, MF_STRING ,IDM_CLOSE, LoadLocalizedString(IDS_MENU_CLOSE)); AppendMenu(hMenu, MF_STRING ,IDM_CLOSE, LoadLocalizedString(IDS_MENU_CLOSE));
/* Create PopUp menus for every connection */ /* Create popup menus for every connection */
for (i=0; i < o.num_configs; i++) for (i=0; i < o.num_configs; i++) {
{ if (o.service_only[0] == '0') {
if (o.service_only[0]=='0')
{
AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_CONNECTMENU + i, LoadLocalizedString(IDS_MENU_CONNECT)); AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_CONNECTMENU + i, LoadLocalizedString(IDS_MENU_CONNECT));
AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_DISCONNECTMENU + i, LoadLocalizedString(IDS_MENU_DISCONNECT)); AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_DISCONNECTMENU + i, LoadLocalizedString(IDS_MENU_DISCONNECT));
AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_STATUSMENU + i, LoadLocalizedString(IDS_MENU_STATUS)); AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_STATUSMENU + i, LoadLocalizedString(IDS_MENU_STATUS));
AppendMenu(hMenuConn[i], MF_SEPARATOR, 0, 0); AppendMenu(hMenuConn[i], MF_SEPARATOR, 0, 0);
} }
AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_VIEWLOGMENU + i, LoadLocalizedString(IDS_MENU_VIEWLOG)); AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_VIEWLOGMENU + i, LoadLocalizedString(IDS_MENU_VIEWLOG));
if (o.allow_edit[0]=='1') {
if (o.allow_edit[0] == '1')
AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_EDITMENU + i, LoadLocalizedString(IDS_MENU_EDITCONFIG)); AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_EDITMENU + i, LoadLocalizedString(IDS_MENU_EDITCONFIG));
}
#ifndef DISABLE_CHANGE_PASSWORD #ifndef DISABLE_CHANGE_PASSWORD
if (o.allow_password[0] == '1') if (o.allow_password[0] == '1')
{
AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_PASSPHRASEMENU + i, LoadLocalizedString(IDS_MENU_PASSPHRASE)); AppendMenu(hMenuConn[i], MF_STRING, (UINT_PTR) IDM_PASSPHRASEMENU + i, LoadLocalizedString(IDS_MENU_PASSPHRASE));
}
#endif #endif
SetMenuStatus(i, disconnected); SetMenuStatus(i, disconnected);
} }
} }
/* Create Service menu */ /* Create service menu */
if (o.allow_service[0] == '1' && o.service_only[0] == '0') if (o.allow_service[0] == '1' && o.service_only[0] == '0')
{ {
AppendMenu(hMenuService, MF_STRING, IDM_SERVICE_START, LoadLocalizedString(IDS_MENU_SERVICE_START)); AppendMenu(hMenuService, MF_STRING, IDM_SERVICE_START, LoadLocalizedString(IDS_MENU_SERVICE_START));
@ -294,131 +157,183 @@ void CreateItemList()
} }
BOOL LoadAppIcon() /* Destroy popup menus */
static void
DestroyPopupMenus()
{ {
int i;
for (i = 0; i < o.num_configs; i++)
DestroyMenu(hMenuConn[i]);
// Load icon from resource DestroyMenu(hMenuService);
HICON hIcon = LoadLocalizedIcon(ID_ICO_APP); DestroyMenu(hMenu);
if (hIcon) {
SendMessage(o.hWnd, WM_SETICON, (WPARAM) (ICON_SMALL), (LPARAM) (hIcon));
SendMessage(o.hWnd, WM_SETICON, (WPARAM) (ICON_BIG), (LPARAM) (hIcon)); //ALT+TAB icon
return TRUE;
}
return FALSE;
} }
void ShowTrayIcon() /*
* Handle mouse clicks on tray icon
*/
void
OnNotifyTray(LPARAM lParam)
{
POINT pt;
switch (lParam) {
case WM_RBUTTONUP:
/* Recreate popup menus */
DestroyPopupMenus();
if (CountConnState(disconnected) == o.num_configs)
BuildFileList();
CreatePopupMenus();
GetCursorPos(&pt);
SetForegroundWindow(o.hWnd);
TrackPopupMenu(hMenu, TPM_RIGHTALIGN, pt.x, pt.y, 0, o.hWnd, NULL);
PostMessage(o.hWnd, WM_NULL, 0, 0);
break;
case WM_LBUTTONDBLCLK:
if (o.service_only[0] == '1') {
/* Start or stop OpenVPN service */
if (o.service_state == service_disconnected) {
MyStartService();
}
else if (o.service_state == service_connected
&& MessageBox(NULL, LoadLocalizedString(IDS_MENU_ASK_STOP_SERVICE),
_T(PACKAGE_NAME), MB_YESNO | MB_SETFOREGROUND) == IDYES) {
MyStopService();
}
}
else {
int disconnected_conns = CountConnState(disconnected);
if (disconnected_conns == o.num_configs) {
/* Reread configs and recreate menus if no connection is running */
DestroyPopupMenus();
BuildFileList();
CreatePopupMenus();
/* Start connection if only one config exist */
if (o.num_configs == 1 && o.conn[0].state == disconnected)
StartOpenVPN(0);
}
else if (disconnected_conns == o.num_configs - 1) {
/* Show status window if only one connection is running */
int i;
for (i = 0; i < o.num_configs; i++) {
if (o.conn[i].state != disconnected) {
ShowWindow(o.conn[i].hwndStatus, SW_SHOW);
SetForegroundWindow(o.conn[i].hwndStatus);
break;
}
}
}
}
break;
}
}
void
OnDestroyTray()
{
DestroyMenu(hMenu);
Shell_NotifyIcon(NIM_DELETE, &ni);
}
void
ShowTrayIcon()
{ {
ni.cbSize = sizeof(ni); ni.cbSize = sizeof(ni);
ni.uID = 0; ni.uID = 0;
_tcsncpy(ni.szTip, LoadLocalizedString(IDS_TIP_DEFAULT), _tsizeof(ni.szTip));
ni.hWnd = o.hWnd; ni.hWnd = o.hWnd;
ni.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON; // We want to use icon, tip, and callback message ni.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON;
ni.uCallbackMessage = WM_NOTIFYICONTRAY; // Our custom callback message (WM_APP + 1) ni.uCallbackMessage = WM_NOTIFYICONTRAY;
//Load selected icon
ni.hIcon = LoadLocalizedIcon(ID_ICO_DISCONNECTED); ni.hIcon = LoadLocalizedIcon(ID_ICO_DISCONNECTED);
_tcsncpy(ni.szTip, LoadLocalizedString(IDS_TIP_DEFAULT), _tsizeof(ni.szTip));
Shell_NotifyIcon(NIM_ADD, &ni); Shell_NotifyIcon(NIM_ADD, &ni);
} }
/* SetTrayIcon(int connected) void
* connected=0 -> DisConnected SetTrayIcon(conn_state_t state)
* connected=1 -> Connecting
* connected=2 -> Connected
*/
void SetTrayIcon(conn_state_t connected)
{ {
TCHAR msg[500]; TCHAR msg[500];
TCHAR msg_connected[100]; TCHAR msg_connected[100];
TCHAR msg_connecting[100]; TCHAR msg_connecting[100];
TCHAR connected_since[50]; TCHAR connected_since[50];
int i, first_conn; int i, config = 0;
int config=0; BOOL first_conn;
UINT icon_id;
ni.cbSize = sizeof(ni);
ni.uID = 0;
ni.hWnd = o.hWnd;
ni.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON; // We want to use icon, tip, and callback message
ni.uCallbackMessage = WM_NOTIFYICONTRAY; // Our custom callback message (WM_APP + 1)
_tcsncpy(msg, LoadLocalizedString(IDS_TIP_DEFAULT), _tsizeof(ni.szTip)); _tcsncpy(msg, LoadLocalizedString(IDS_TIP_DEFAULT), _tsizeof(ni.szTip));
_tcsncpy(msg_connected, LoadLocalizedString(IDS_TIP_CONNECTED), _tsizeof(msg_connected)); _tcsncpy(msg_connected, LoadLocalizedString(IDS_TIP_CONNECTED), _tsizeof(msg_connected));
_tcsncpy(msg_connecting, LoadLocalizedString(IDS_TIP_CONNECTING), _tsizeof(msg_connecting)); _tcsncpy(msg_connecting, LoadLocalizedString(IDS_TIP_CONNECTING), _tsizeof(msg_connecting));
first_conn=1; first_conn = TRUE;
for (i=0; i < o.num_configs; i++) for (i = 0; i < o.num_configs; i++) {
{ if (o.conn[i].state == connected) {
if(o.conn[i].state == connected)
{
/* Append connection name to Icon Tip Msg */ /* Append connection name to Icon Tip Msg */
if (first_conn) _tcsncat(msg, (first_conn ? msg_connected : _T(", ")), _tsizeof(msg) - _tcslen(msg) - 1);
_tcsncat(msg, msg_connected, _tsizeof(msg) - _tcslen(msg) - 1);
else
_tcsncat(msg, _T(", "), _tsizeof(msg) - _tcslen(msg) - 1);
_tcsncat(msg, o.conn[i].config_name, _tsizeof(msg) - _tcslen(msg) - 1); _tcsncat(msg, o.conn[i].config_name, _tsizeof(msg) - _tcslen(msg) - 1);
first_conn=0; first_conn = FALSE;
config = i; config = i;
} }
} }
first_conn=1; first_conn = TRUE;
for (i=0; i < o.num_configs; i++) for (i = 0; i < o.num_configs; i++) {
{ if (o.conn[i].state == connecting || o.conn[i].state == reconnecting) {
if((o.conn[i].state == connecting) ||
(o.conn[i].state == reconnecting))
{
/* Append connection name to Icon Tip Msg */ /* Append connection name to Icon Tip Msg */
if (first_conn) _tcsncat(msg, (first_conn ? msg_connecting : _T(", ")), _tsizeof(msg) - _tcslen(msg) - 1);
_tcsncat(msg, msg_connecting, _tsizeof(msg) - _tcslen(msg) - 1);
else
_tcsncat(msg, _T(", "), _tsizeof(msg) - _tcslen(msg) - 1);
_tcsncat(msg, o.conn[i].config_name, _tsizeof(msg) - _tcslen(msg) - 1); _tcsncat(msg, o.conn[i].config_name, _tsizeof(msg) - _tcslen(msg) - 1);
first_conn=0; first_conn = FALSE;
} }
} }
if (CountConnState(connected) == 1) if (CountConnState(connected) == 1) {
{ /* Append "Connected since and assigned IP" to message */
/* Append "Connected Since and Assigned IP msg" */
time_t con_time;
con_time=time(NULL);
_tcsftime(connected_since, _tsizeof(connected_since), _T("%b %d, %H:%M"), _tcsftime(connected_since, _tsizeof(connected_since), _T("%b %d, %H:%M"),
localtime(&o.conn[config].connected_since)); localtime(&o.conn[config].connected_since));
_tcsncat(msg, LoadLocalizedString(IDS_TIP_CONNECTED_SINCE), _tsizeof(msg) - _tcslen(msg) - 1); _tcsncat(msg, LoadLocalizedString(IDS_TIP_CONNECTED_SINCE), _tsizeof(msg) - _tcslen(msg) - 1);
_tcsncat(msg, connected_since, _tsizeof(msg) - _tcslen(msg) - 1); _tcsncat(msg, connected_since, _tsizeof(msg) - _tcslen(msg) - 1);
if (_tcslen(o.conn[config].ip) > 0)
{ if (_tcslen(o.conn[config].ip) > 0) {
TCHAR assigned_ip[100]; TCHAR assigned_ip[100];
_sntprintf_0(assigned_ip, LoadLocalizedString(IDS_TIP_ASSIGNED_IP), o.conn[config].ip); _sntprintf_0(assigned_ip, LoadLocalizedString(IDS_TIP_ASSIGNED_IP), o.conn[config].ip);
_tcsncat(msg, assigned_ip, _tsizeof(msg) - _tcslen(msg) - 1); _tcsncat(msg, assigned_ip, _tsizeof(msg) - _tcslen(msg) - 1);
} }
} }
_tcsncpy(ni.szTip, msg, _tsizeof(ni.szTip)); icon_id = ID_ICO_CONNECTING;
if (state == connected)
icon_id = ID_ICO_CONNECTED;
else if (state == disconnected)
icon_id = ID_ICO_DISCONNECTED;
//Load selected icon ni.cbSize = sizeof(ni);
if (connected==2) ni.uID = 0;
ni.hIcon = LoadLocalizedIcon(ID_ICO_CONNECTED); ni.hWnd = o.hWnd;
else if (connected==1) ni.hIcon = LoadLocalizedIcon(icon_id);
ni.hIcon = LoadLocalizedIcon(ID_ICO_CONNECTING); ni.uFlags = NIF_MESSAGE | NIF_TIP | NIF_ICON;
else if (connected==0) ni.uCallbackMessage = WM_NOTIFYICONTRAY;
ni.hIcon = LoadLocalizedIcon(ID_ICO_DISCONNECTED); _tcsncpy(ni.szTip, msg, _tsizeof(ni.szTip));
Shell_NotifyIcon(NIM_MODIFY, &ni); Shell_NotifyIcon(NIM_MODIFY, &ni);
} }
void ShowTrayBalloon(TCHAR *infotitle_msg, TCHAR *info_msg)
void
ShowTrayBalloon(TCHAR *infotitle_msg, TCHAR *info_msg)
{ {
ni.cbSize = sizeof(ni); ni.cbSize = sizeof(ni);
ni.uID = 0; ni.uID = 0;
ni.hWnd = o.hWnd; ni.hWnd = o.hWnd;
ni.uFlags = NIF_INFO; /* We want to show a balloon */ ni.uFlags = NIF_INFO;
ni.uTimeout = 5000; ni.uTimeout = 5000;
ni.dwInfoFlags = NIIF_INFO; /* Show an Info Icon */ ni.dwInfoFlags = NIIF_INFO;
_tcsncpy(ni.szInfo, info_msg, _tsizeof(ni.szInfo)); _tcsncpy(ni.szInfo, info_msg, _tsizeof(ni.szInfo));
_tcsncpy(ni.szInfoTitle, infotitle_msg, _tsizeof(ni.szInfoTitle)); _tcsncpy(ni.szInfoTitle, infotitle_msg, _tsizeof(ni.szInfoTitle));
@ -426,80 +341,51 @@ void ShowTrayBalloon(TCHAR *infotitle_msg, TCHAR *info_msg)
} }
void SetMenuStatus (int config, conn_state_t state) void
{ SetMenuStatus(int config, conn_state_t state)
/* bCheck values:
* 0 - Not Connected
* 1 - Connecting
* 2 - Connected
* 4 - Disconnecting
*/
unsigned int iState;
if (o.num_configs == 1)
{
if (state == disconnected)
{ {
if (o.num_configs == 1) {
if (state == disconnected) {
EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_ENABLED); EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_ENABLED);
EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_GRAYED); EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_GRAYED);
EnableMenuItem(hMenu, IDM_STATUSMENU, MF_GRAYED); EnableMenuItem(hMenu, IDM_STATUSMENU, MF_GRAYED);
} }
if (state == connecting) else if (state == connecting || state == connected) {
{
EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_GRAYED); EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_GRAYED);
EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_ENABLED); EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_ENABLED);
EnableMenuItem(hMenu, IDM_STATUSMENU, MF_ENABLED); EnableMenuItem(hMenu, IDM_STATUSMENU, MF_ENABLED);
} }
if (state == connected) else if (state == disconnecting) {
{
EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_GRAYED);
EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_ENABLED);
EnableMenuItem(hMenu, IDM_STATUSMENU, MF_ENABLED);
}
if (state == disconnecting)
{
EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_GRAYED); EnableMenuItem(hMenu, IDM_CONNECTMENU, MF_GRAYED);
EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_GRAYED); EnableMenuItem(hMenu, IDM_DISCONNECTMENU, MF_GRAYED);
EnableMenuItem(hMenu, IDM_STATUSMENU, MF_ENABLED); EnableMenuItem(hMenu, IDM_STATUSMENU, MF_ENABLED);
} }
} }
else else {
{ UINT iState = (state == connected || state == disconnecting) ? MF_CHECKED : MF_UNCHECKED;
iState = ((state == connected) || (state == disconnecting)) ?
MF_CHECKED : MF_UNCHECKED ;
CheckMenuItem(hMenu, (UINT) hMenuConn[config], iState); CheckMenuItem(hMenu, (UINT) hMenuConn[config], iState);
if (state == disconnected) if (state == disconnected) {
{
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_CONNECTMENU + config, MF_ENABLED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_CONNECTMENU + config, MF_ENABLED);
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_DISCONNECTMENU + config, MF_GRAYED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_DISCONNECTMENU + config, MF_GRAYED);
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_STATUSMENU + config, MF_GRAYED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_STATUSMENU + config, MF_GRAYED);
} }
if (state == connecting) else if (state == connecting || state == connected) {
{
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_CONNECTMENU + config, MF_GRAYED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_CONNECTMENU + config, MF_GRAYED);
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_DISCONNECTMENU + config, MF_ENABLED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_DISCONNECTMENU + config, MF_ENABLED);
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_STATUSMENU + config, MF_ENABLED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_STATUSMENU + config, MF_ENABLED);
} }
if (state == connected) else if (state == disconnecting) {
{
EnableMenuItem(hMenuConn[config], (UINT_PTR)IDM_CONNECTMENU + config, MF_GRAYED);
EnableMenuItem(hMenuConn[config], (UINT_PTR)IDM_DISCONNECTMENU + config, MF_ENABLED);
EnableMenuItem(hMenuConn[config], (UINT_PTR)IDM_STATUSMENU + config, MF_ENABLED);
}
if (state == disconnecting)
{
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_CONNECTMENU + config, MF_GRAYED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_CONNECTMENU + config, MF_GRAYED);
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_DISCONNECTMENU + config, MF_GRAYED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_DISCONNECTMENU + config, MF_GRAYED);
EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_STATUSMENU + config, MF_ENABLED); EnableMenuItem(hMenuConn[config], (UINT_PTR) IDM_STATUSMENU + config, MF_ENABLED);
} }
} }
} }
void SetServiceMenuStatus()
void
SetServiceMenuStatus()
{ {
HMENU hMenuHandle; HMENU hMenuHandle;
@ -511,30 +397,20 @@ void SetServiceMenuStatus()
else else
hMenuHandle = hMenuService; hMenuHandle = hMenuService;
if (o.service_state == service_noaccess
if ((o.service_state == service_noaccess) || || o.service_state == service_connecting) {
(o.service_state == service_connecting))
{
/* Service is disabled */
EnableMenuItem(hMenuHandle, IDM_SERVICE_START, MF_GRAYED); EnableMenuItem(hMenuHandle, IDM_SERVICE_START, MF_GRAYED);
EnableMenuItem(hMenuHandle, IDM_SERVICE_STOP, MF_GRAYED); EnableMenuItem(hMenuHandle, IDM_SERVICE_STOP, MF_GRAYED);
EnableMenuItem(hMenuHandle, IDM_SERVICE_RESTART, MF_GRAYED); EnableMenuItem(hMenuHandle, IDM_SERVICE_RESTART, MF_GRAYED);
} }
else if (o.service_state == service_connected) else if (o.service_state == service_connected) {
{
/* Service is running */
EnableMenuItem(hMenuHandle, IDM_SERVICE_START, MF_GRAYED); EnableMenuItem(hMenuHandle, IDM_SERVICE_START, MF_GRAYED);
EnableMenuItem(hMenuHandle, IDM_SERVICE_STOP, MF_ENABLED); EnableMenuItem(hMenuHandle, IDM_SERVICE_STOP, MF_ENABLED);
EnableMenuItem(hMenuHandle, IDM_SERVICE_RESTART, MF_ENABLED); EnableMenuItem(hMenuHandle, IDM_SERVICE_RESTART, MF_ENABLED);
} }
else else {
{
/* Service is not running */
EnableMenuItem(hMenuHandle, IDM_SERVICE_START, MF_ENABLED); EnableMenuItem(hMenuHandle, IDM_SERVICE_START, MF_ENABLED);
EnableMenuItem(hMenuHandle, IDM_SERVICE_STOP, MF_GRAYED); EnableMenuItem(hMenuHandle, IDM_SERVICE_STOP, MF_GRAYED);
EnableMenuItem(hMenuHandle, IDM_SERVICE_RESTART, MF_GRAYED); EnableMenuItem(hMenuHandle, IDM_SERVICE_RESTART, MF_GRAYED);
} }
} }

34
tray.h
View File

@ -2,6 +2,7 @@
* OpenVPN-GUI -- A Windows GUI for OpenVPN. * OpenVPN-GUI -- A Windows GUI for OpenVPN.
* *
* Copyright (C) 2004 Mathias Sundman <mathias@nilings.se> * Copyright (C) 2004 Mathias Sundman <mathias@nilings.se>
* 2010 Heiko Hund <heikoh@users.sf.net>
* *
* This program is free software; you can redistribute it and/or modify * This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by * it under the terms of the GNU General Public License as published by
@ -19,22 +20,17 @@
* 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/ */
#ifndef TRAY_H
#define TRAY_H
#include "options.h" #include "options.h"
#define WM_NOTIFYICONTRAY (WM_APP + 1) #define WM_NOTIFYICONTRAY (WM_APP + 1)
//Popup Menu items
#define IDM_SETTINGS 221 #define IDM_SETTINGS 221
#define IDM_ABOUT 222 #define IDM_ABOUT 222
#define IDM_CLOSE 223 #define IDM_CLOSE 223
#define IDM_TEXT_CONN1 "Office"
#define IDM_CONN1 301
#define IDM_TEXT_CONN2 "Home"
#define IDM_CONN2 302
#define IDM_CONNECTMENU 300 #define IDM_CONNECTMENU 300
#define IDM_DISCONNECTMENU 400 #define IDM_DISCONNECTMENU 400
#define IDM_STATUSMENU 500 #define IDM_STATUSMENU 500
@ -42,22 +38,18 @@
#define IDM_EDITMENU 700 #define IDM_EDITMENU 700
#define IDM_PASSPHRASEMENU 800 #define IDM_PASSPHRASEMENU 800
/* Service submenu */
#define IDM_SERVICEMENU 900 #define IDM_SERVICEMENU 900
#define IDM_SERVICE_START 901 #define IDM_SERVICE_START 901
#define IDM_SERVICE_STOP 902 #define IDM_SERVICE_STOP 902
#define IDM_SERVICE_RESTART 903 #define IDM_SERVICE_RESTART 903
void CreatePopupMenus();
void OnNotifyTray(LPARAM);
void OnDestroyTray(void);
void ShowTrayIcon();
void SetTrayIcon(conn_state_t);
void SetMenuStatus(int, conn_state_t);
void SetServiceMenuStatus();
void ShowTrayBalloon(TCHAR *, TCHAR *);
void CreatePopupMenus(); //Create popup menus #endif
void DestroyPopupMenus(); //Destroy popup menus
void OnNotifyTray(LPARAM lParam); //Tray message (mouse clicks on tray icon)
void OnDestroyTray(void); //WM_DESTROY message
void ShowTrayIcon(); //Put app icon in systray
void SetTrayIcon(conn_state_t connected); //Change systray icon
BOOL LoadAppIcon(); //Application icon
void CreateItemList(); //Crate Popup menu
void SetMenuStatus (int config, conn_state_t state); //Mark connection as connected/disconnected
void SetServiceMenuStatus(); //Diabled Service menu items.
void ShowTrayBalloon(TCHAR *infotitle_msg, TCHAR *info_msg);