diff options
Diffstat (limited to 'plugins/VoiceService/src/popup.cpp')
-rw-r--r-- | plugins/VoiceService/src/popup.cpp | 212 |
1 files changed, 212 insertions, 0 deletions
diff --git a/plugins/VoiceService/src/popup.cpp b/plugins/VoiceService/src/popup.cpp new file mode 100644 index 0000000000..a643850295 --- /dev/null +++ b/plugins/VoiceService/src/popup.cpp @@ -0,0 +1,212 @@ +/* +Copyright (C) 2005 Ricardo Pescuma Domenecci + +This is free software; you can redistribute it and/or +modify it under the terms of the GNU Library General Public +License as published by the Free Software Foundation; either +version 2 of the License, or (at your option) any later version. + +This is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +Library General Public License for more details. + +You should have received a copy of the GNU Library General Public +License along with this file; see the file license.txt. If +not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. +*/ + +#include "stdafx.h" + +// Prototypes ///////////////////////////////////////////////////////////////////////////////////// + +#define WMU_ACTION (WM_USER + 1) + + +LRESULT CALLBACK PopupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); + +HWND hPopupWindow = NULL; + + +static LRESULT CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); +static LRESULT CALLBACK DumbPopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam); + + + +// Functions ////////////////////////////////////////////////////////////////////////////////////// + + +// Initializations needed by popups +void InitPopups() +{ + // window needed for popup commands + hPopupWindow = CreateWindowEx(WS_EX_TOOLWINDOW, _T("static"), _T(MODULE_NAME) _T("_PopupWindow"), + 0, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, HWND_DESKTOP, + NULL, g_plugin.getInst(), NULL); + SetWindowLongPtr(hPopupWindow, GWLP_WNDPROC, (LPARAM)PopupWndProc); +} + + +// Deinitializations needed by popups +void DeInitPopups() +{ +} + +void ShowPopup(MCONTACT hContact, const wchar_t *title, const wchar_t *description, ...) +{ + if (!opts.popup_enable) + return; + + wchar_t text[1024]; + + va_list va; + va_start(va, description); + _vsntprintf(text, _countof(text), description, va); + va_end(va); + + ShowPopupEx(hContact, title, text, (void*)hContact, POPUP_TYPE_NORMAL, &opts); +} + +// Show an popup +void ShowPopupEx(MCONTACT hContact, const wchar_t *title, const wchar_t *description, + void *plugin_data, int type, const Options *op) +{ + // Make popup + POPUPDATAW ppd; + + ZeroMemory(&ppd, sizeof(ppd)); + ppd.lchContact = hContact; + ppd.lchIcon = (HICON)LoadImage(GetModuleHandle(NULL), MAKEINTRESOURCE(174), IMAGE_ICON, 16, 16, LR_DEFAULTCOLOR); + + if (title != NULL) + lstrcpyn(ppd.lpwzContactName, title, _countof(ppd.lpwzContactName)); + else if (hContact != NULL) + lstrcpyn(ppd.lpwzContactName, Clist_GetContactDisplayName(hContact, 0), _countof(ppd.lpwzContactName)); + + if (description != NULL) + lstrcpyn(ppd.lpwzText, description, _countof(ppd.lpwzText)); + + if (type == POPUP_TYPE_NORMAL || type == POPUP_TYPE_TEST) { + if (op->popup_use_default_colors) { + ppd.colorBack = 0; + ppd.colorText = 0; + } + else if (op->popup_use_win_colors) { + ppd.colorBack = GetSysColor(COLOR_BTNFACE); + ppd.colorText = GetSysColor(COLOR_WINDOWTEXT); + } + else { + ppd.colorBack = op->popup_bkg_color; + ppd.colorText = op->popup_text_color; + } + } + else // if (type == POPUP_TYPE_ERROR) + { + ppd.colorBack = RGB(200, 0, 0); + ppd.colorText = RGB(255, 255, 255); + } + + if (type == POPUP_TYPE_NORMAL) { + ppd.PluginWindowProc = PopupDlgProc; + ppd.PluginData = plugin_data; + } + else // if (type == POPUP_TYPE_TEST || type == POPUP_TYPE_ERROR) + { + ppd.PluginWindowProc = DumbPopupDlgProc; + } + + if (type == POPUP_TYPE_NORMAL || type == POPUP_TYPE_TEST) { + switch (op->popup_delay_type) { + case POPUP_DELAY_CUSTOM: + ppd.iSeconds = opts.popup_timeout; + break; + + case POPUP_DELAY_PERMANENT: + ppd.iSeconds = -1; + break; + + //case POPUP_DELAY_DEFAULT: + default: + ppd.iSeconds = 0; + break; + } + } + else // if (type == POPUP_TYPE_ERROR) + { + ppd.iSeconds = 0; + } + + // Now that every field has been filled, we want to see the popup. + PUAddPopupW(&ppd); +} + +// Show an error popup +void ShowErrPopup(const wchar_t *description, const wchar_t *title) +{ + ShowPopupEx(NULL, title == NULL ? _T(MODULE_NAME) _T(" Error") : title, description, + NULL, POPUP_TYPE_ERROR, NULL); +} + +void ShowTestPopup(const wchar_t *title, const wchar_t *description, const Options *op) +{ + ShowPopupEx(NULL, title, description, NULL, POPUP_TYPE_TEST, op); +} + +// Handle to the hidden windows to handle actions for popup clicks +// wParam has the number of MOTD in case of WMU_SHOW_MOTD_DETAILS +LRESULT CALLBACK PopupWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ + if (uMsg == WMU_ACTION) { + // if (lParam == POPUP_ACTION_OPENHISTORY) + // { + // CallService(MS_HISTORY_SHOWCONTACTHISTORY, wParam, 0); + // } + } + return DefWindowProc(hWnd, uMsg, wParam, lParam); +} + + +// Handle to popup events +static LRESULT CALLBACK PopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + case WM_COMMAND: + SendMessage(hPopupWindow, WMU_ACTION, (WPARAM)PUGetPluginData(hWnd), opts.popup_left_click_action); + + if (opts.popup_left_click_action != POPUP_ACTION_DONOTHING) + PUDeletePopup(hWnd); + + return TRUE; + + case WM_CONTEXTMENU: + SendMessage(hPopupWindow, WMU_ACTION, (WPARAM)PUGetPluginData(hWnd), opts.popup_right_click_action); + + if (opts.popup_right_click_action != POPUP_ACTION_DONOTHING) + PUDeletePopup(hWnd); + + return TRUE; + + case UM_FREEPLUGINDATA: + return TRUE; + } + + return DefWindowProc(hWnd, message, wParam, lParam); +} + + +// Handle to popup events +static LRESULT CALLBACK DumbPopupDlgProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) +{ + switch (message) { + case WM_COMMAND: + case WM_CONTEXTMENU: + PUDeletePopup(hWnd); + return TRUE; + + case UM_FREEPLUGINDATA: + return TRUE; + } + + return DefWindowProc(hWnd, message, wParam, lParam); +} |