From 1914d6f60f4ad92c0efa45a6559a51421bfcaf1e Mon Sep 17 00:00:00 2001 From: George Hazan Date: Sun, 25 Nov 2012 16:17:46 +0000 Subject: fix for popups that use icons controlled by icolib git-svn-id: http://svn.miranda-ng.org/main/trunk@2490 1316c22d-e87f-b044-9b9b-93d7a3e3ba9c --- plugins/YAPP/src/common.h | 13 +- plugins/YAPP/src/popwin.cpp | 977 ++++++++++++++++++++---------------------- plugins/YAPP/src/services.cpp | 117 +++-- plugins/YAPP/src/yapp.cpp | 32 +- 4 files changed, 538 insertions(+), 601 deletions(-) (limited to 'plugins/YAPP') diff --git a/plugins/YAPP/src/common.h b/plugins/YAPP/src/common.h index 1b2a52b74b..e8aa204340 100644 --- a/plugins/YAPP/src/common.h +++ b/plugins/YAPP/src/common.h @@ -51,6 +51,7 @@ #include #include #include +#include #include #include @@ -79,7 +80,8 @@ typedef int (CALLBACK *PFNLVCOMPARE)(LPARAM, LPARAM, LPARAM); #endif -typedef struct { +struct PopupData +{ int cbSize; int flags; // OR of PDF_* flags below HANDLE hContact; @@ -99,11 +101,14 @@ typedef struct { WNDPROC windowProc; // optional custom window procedure int timeout; // -1 == infinite, 0 == default, otherwise timeout in seconds void *opaque; -} PopupData; -#define PDF_UNICODE 0x0001 + void SetIcon(HICON); +}; -#define PDF_TCHAR PDF_UNICODE +#define PDF_UNICODE 0x0001 +#define PDF_ICOLIB 0x0002 + +#define PDF_TCHAR PDF_UNICODE // windowProc messages #define PM_INIT (WM_USER + 0x0202) // message sent to your windowProc after the window has been initialized diff --git a/plugins/YAPP/src/popwin.cpp b/plugins/YAPP/src/popwin.cpp index 59178f328f..a24178f16e 100644 --- a/plugins/YAPP/src/popwin.cpp +++ b/plugins/YAPP/src/popwin.cpp @@ -151,7 +151,8 @@ void BroadcastMessage(UINT msg, WPARAM wParam, LPARAM lParam) { } } -struct PopupWindowData { +struct PopupWindowData +{ PopupData *pd; int new_x, new_y; bool is_round, av_is_round, mouse_in, close_on_leave; @@ -165,582 +166,534 @@ struct PopupWindowData { HANDLE hNotify; }; -LRESULT CALLBACK PopupWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { +LRESULT CALLBACK PopupWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) +{ PopupWindowData *pwd = (PopupWindowData *)GetWindowLongPtr(hwnd, GWLP_USERDATA); PopupData *pd = 0; if (pwd) pd = pwd->pd; switch(uMsg) { - case WM_CREATE: - { - CREATESTRUCT *cs = (CREATESTRUCT *)lParam; - pwd = (PopupWindowData *)mir_alloc(sizeof(PopupWindowData)); - pd = (PopupData *)cs->lpCreateParams; - pwd->pd = pd; - pwd->hNotify = 0; - - trimW(pwd->pd->pwzTitle); - trimW(pwd->pd->pwzText); - - pwd->is_round = options.round; - pwd->av_is_round = options.av_round; - pwd->mouse_in = pwd->close_on_leave = false; - pwd->custom_col = (pd->colorBack != pd->colorText); - - pwd->tb_height = pwd->av_height = pwd->text_height = pwd->time_height = pwd->time_width = 0; - pwd->have_av = false; - - if (pwd->custom_col) { - pwd->bkBrush = CreateSolidBrush(pd->colorBack); - - //pwd->barBrush = CreateSolidBrush(pd->colorBack / 2); // make sidebar a dark version of the bg - //DWORD darkBg = (((pd->colorBack & 0xff0000) >> 1) & 0xff0000) + (((pd->colorBack & 0xff00) >> 1) & 0xff00) + (((pd->colorBack & 0xff) >> 1) & 0xff); - //DWORD darkBg = (pdColorBack >> 1) & 0x7f7f7f; // equivalent to above :) - - DWORD darkBg = pd->colorBack - ((pd->colorBack >> 2) & 0x3f3f3f); // 3/4 of current individual RGB components - pwd->barBrush = CreateSolidBrush(darkBg); // make sidebar a dark version of the bg - pwd->underlineBrush = CreateSolidBrush(pd->colorBack); // make sidebar a dark version of the bg - } else { - pwd->bkBrush = CreateSolidBrush(colBg); - pwd->barBrush = CreateSolidBrush(colSidebar); - pwd->underlineBrush = CreateSolidBrush(colTitleUnderline); - } + case WM_CREATE: + { + CREATESTRUCT *cs = (CREATESTRUCT *)lParam; + pwd = (PopupWindowData *)mir_alloc(sizeof(PopupWindowData)); + pd = (PopupData *)cs->lpCreateParams; + pwd->pd = pd; + pwd->hNotify = 0; + + trimW(pwd->pd->pwzTitle); + trimW(pwd->pd->pwzText); + + pwd->is_round = options.round; + pwd->av_is_round = options.av_round; + pwd->mouse_in = pwd->close_on_leave = false; + pwd->custom_col = (pd->colorBack != pd->colorText); + + pwd->tb_height = pwd->av_height = pwd->text_height = pwd->time_height = pwd->time_width = 0; + pwd->have_av = false; + + if (pwd->custom_col) { + pwd->bkBrush = CreateSolidBrush(pd->colorBack); + DWORD darkBg = pd->colorBack - ((pd->colorBack >> 2) & 0x3f3f3f); // 3/4 of current individual RGB components + pwd->barBrush = CreateSolidBrush(darkBg); // make sidebar a dark version of the bg + pwd->underlineBrush = CreateSolidBrush(pd->colorBack); // make sidebar a dark version of the bg + } + else { + pwd->bkBrush = CreateSolidBrush(colBg); + pwd->barBrush = CreateSolidBrush(colSidebar); + pwd->underlineBrush = CreateSolidBrush(colTitleUnderline); + } + + if (options.border) pwd->bPen = (HPEN)CreatePen(PS_SOLID, 1, colBorder); + else pwd->bPen = CreatePen(PS_SOLID, 1, pwd->custom_col ? pd->colorBack : colBg); - if (options.border) pwd->bPen = (HPEN)CreatePen(PS_SOLID, 1, colBorder); - else pwd->bPen = CreatePen(PS_SOLID, 1, pwd->custom_col ? pd->colorBack : colBg); - - SYSTEMTIME st; - GetLocalTime(&st); - GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, 0, pwd->tbuff, 128); + SYSTEMTIME st; + GetLocalTime(&st); + GetTimeFormat(LOCALE_USER_DEFAULT, TIME_NOSECONDS, &st, 0, pwd->tbuff, 128); - SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pwd); + SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pwd); - if (pd->timeout == -1 || (pd->timeout == 0 && options.default_timeout == -1)) { - // make a really long timeout - say 7 days? ;) - SetTimer(hwnd, ID_CLOSETIMER, 7 * 24 * 60 * 60 * 1000, 0); + if (pd->timeout == -1 || (pd->timeout == 0 && options.default_timeout == -1)) { + // make a really long timeout - say 7 days? ;) + SetTimer(hwnd, ID_CLOSETIMER, 7 * 24 * 60 * 60 * 1000, 0); + } else { + if (pd->timeout == 0) { + SetTimer(hwnd, ID_CLOSETIMER, options.default_timeout * 1000, 0); } else { - if (pd->timeout == 0) { - SetTimer(hwnd, ID_CLOSETIMER, options.default_timeout * 1000, 0); - } else { - SetTimer(hwnd, ID_CLOSETIMER, pd->timeout * 1000, 0); - } + SetTimer(hwnd, ID_CLOSETIMER, pd->timeout * 1000, 0); } - - AddWindowToStack(hwnd); // this updates our size } - // transparency + AddWindowToStack(hwnd); // this updates our size + } + + // transparency #ifdef WS_EX_LAYERED - SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); + SetWindowLongPtr(hwnd, GWL_EXSTYLE, GetWindowLongPtr(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED); #endif #ifdef CS_DROPSHADOW - if (options.drop_shadow) { - SetClassLong(hwnd, GCL_STYLE, CS_DROPSHADOW); - } + if (options.drop_shadow) { + SetClassLong(hwnd, GCL_STYLE, CS_DROPSHADOW); + } #endif #ifdef LWA_ALPHA - if (MySetLayeredWindowAttributes) { - MySetLayeredWindowAttributes(hwnd, RGB(0,0,0), (int)(options.opacity / 100.0 * 255), LWA_ALPHA); - if (options.trans_bg) { - COLORREF bg; - if (pd->colorBack == pd->colorText) - bg = colBg; - else - bg = pd->colorBack; - MySetLayeredWindowAttributes(hwnd, bg, 0, LWA_COLORKEY); - } + if (MySetLayeredWindowAttributes) { + MySetLayeredWindowAttributes(hwnd, RGB(0,0,0), (int)(options.opacity / 100.0 * 255), LWA_ALPHA); + if (options.trans_bg) { + COLORREF bg; + if (pd->colorBack == pd->colorText) + bg = colBg; + else + bg = pd->colorBack; + MySetLayeredWindowAttributes(hwnd, bg, 0, LWA_COLORKEY); } + } #endif - PostMessage(hwnd, PM_INIT, (WPARAM)hwnd, 0); - return 0; - case WM_MOUSEMOVE: - if (pwd && !pwd->mouse_in) { - pwd->mouse_in = true; - global_mouse_in++; - TRACKMOUSEEVENT tme = { sizeof(tme) }; - tme.dwFlags = TME_LEAVE; - tme.hwndTrack = hwnd; - TrackMouseEvent(&tme); - } - break; - case WM_MOUSELEAVE: - if (pwd && pwd->mouse_in) { - pwd->mouse_in = false; - global_mouse_in--; + PostMessage(hwnd, PM_INIT, (WPARAM)hwnd, 0); + return 0; + case WM_MOUSEMOVE: + if (pwd && !pwd->mouse_in) { + pwd->mouse_in = true; + global_mouse_in++; + TRACKMOUSEEVENT tme = { sizeof(tme) }; + tme.dwFlags = TME_LEAVE; + tme.hwndTrack = hwnd; + TrackMouseEvent(&tme); + } + break; + case WM_MOUSELEAVE: + if (pwd && pwd->mouse_in) { + pwd->mouse_in = false; + global_mouse_in--; + } + return 0; + case WM_LBUTTONUP: + // fake STN_CLICKED notification + SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(0, STN_CLICKED), 0); + break; + case WM_TIMER: + if (wParam == ID_CLOSETIMER) { + KillTimer(hwnd, ID_CLOSETIMER); + if (pwd->mouse_in || (options.global_hover && global_mouse_in)) + SetTimer(hwnd, ID_CLOSETIMER, 800, 0); // reset timer if mouse in window - allow another 800 ms + else { + PostMessage(hwnd, PM_DESTROY, 0, 0); } - return 0; - case WM_LBUTTONUP: - // fake STN_CLICKED notification - SendMessage(hwnd, WM_COMMAND, MAKEWPARAM(0, STN_CLICKED), 0); - break; - case WM_TIMER: - if (wParam == ID_CLOSETIMER) { - KillTimer(hwnd, ID_CLOSETIMER); - if (pwd->mouse_in || (options.global_hover && global_mouse_in)) - SetTimer(hwnd, ID_CLOSETIMER, 800, 0); // reset timer if mouse in window - allow another 800 ms - else { - PostMessage(hwnd, PM_DESTROY, 0, 0); - } + return TRUE; + } else if (wParam == ID_MOVETIMER) { + RECT r; + GetWindowRect(hwnd, &r); + + if (r.left == pwd->new_x && r.top == pwd->new_y) { + KillTimer(hwnd, ID_MOVETIMER); return TRUE; - } else if (wParam == ID_MOVETIMER) { - RECT r; - GetWindowRect(hwnd, &r); - - if (r.left == pwd->new_x && r.top == pwd->new_y) { - KillTimer(hwnd, ID_MOVETIMER); - return TRUE; - } - int adj_x = (pwd->new_x - r.left) / 4, adj_y = (pwd->new_y - r.top) / 4; - if (adj_x == 0) adj_x = (pwd->new_x - r.left); - if (adj_y == 0) adj_y = (pwd->new_y - r.top); - - int x = r.left + adj_x, y = r.top + adj_y; - //SetWindowPos(hwnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE | SWP_NOREDRAW | SWP_NOCOPYBITS); - SetWindowPos(hwnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - - - /* - // clip to monitor bounds (paints badly!) - //HDC hdc = GetDC(hwnd); - HMONITOR hMonitor = MonitorFromRect(&r, MONITOR_DEFAULTTONEAREST); - MONITORINFO mi; - mi.cbSize = sizeof(mi); - GetMonitorInfo(hMonitor, &mi); - - POINT p[2]; - p[0].x = mi.rcWork.left; p[0].y = mi.rcWork.top; p[1].x = mi.rcWork.right; p[1].y = mi.rcWork.bottom; - //LPtoDP(hdc, p, 2); - ScreenToClient(hwnd, &p[0]); ScreenToClient(hwnd, &p[1]); - - HRGN hMonRgn = CreateRectRgn(p[0].x, p[0].y, p[1].x, p[1].y); - //ReleaseDC(hwnd, hdc); - - RECT cr; GetClientRect(hwnd, &cr); - HRGN hWndRgn = CreateRectRgn(cr.left, cr.top, cr.right + 3, cr.bottom + 3); - CombineRgn(hMonRgn, hMonRgn, hWndRgn, RGN_AND); - - // round corners + } + int adj_x = (pwd->new_x - r.left) / 4, adj_y = (pwd->new_y - r.top) / 4; + if (adj_x == 0) adj_x = (pwd->new_x - r.left); + if (adj_y == 0) adj_y = (pwd->new_y - r.top); + + int x = r.left + adj_x, y = r.top + adj_y; + SetWindowPos(hwnd, 0, x, y, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); + + if (!IsWindowVisible(hwnd)) { + ShowWindow(hwnd, SW_SHOWNOACTIVATE); + UpdateWindow(hwnd); + } + return TRUE; + } + break; + case WM_ERASEBKGND: + { + HDC hdc = (HDC) wParam; + RECT r, r_bar; + GetClientRect(hwnd, &r); + + // bg + FillRect(hdc, &r, pwd->bkBrush); + // sidebar + r_bar = r; + r_bar.right = r.left + options.sb_width; + FillRect(hdc, &r_bar, pwd->barBrush); + // border + if (options.border) { + + HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, GetStockObject(NULL_BRUSH)); + HPEN hOldPen = (HPEN)SelectObject(hdc, pwd->bPen); + + int h = 0; if (options.round) { - HRGN hRgn1; - int v,h, w=10; + int v; + int w=14; h=(r.right-r.left)>(w*2)?w:(r.right-r.left); v=(r.bottom-r.top)>(w*2)?w:(r.bottom-r.top); h=(hhave_av || options.time_layout == PT_WITHAV)) { + RECT avr; + avr.top = options.av_padding; + + if (options.av_layout == PAV_LEFT) { + avr.left = r.left + options.av_padding; + if (pwd->have_av && options.time_layout == PT_WITHAV) avr.right = avr.left + max(pwd->real_av_width, pwd->time_width); + else if (pwd->have_av) avr.right = avr.left + pwd->real_av_width; + else avr.right = avr.left + pwd->time_width; + r.left = avr.right; + } else if (options.av_layout == PAV_RIGHT) { + avr.right = r.right - options.av_padding; + if (pwd->have_av && options.time_layout == PT_WITHAV) avr.left = avr.right - max(pwd->real_av_width, pwd->time_width); + else if (pwd->have_av) avr.left = avr.right - pwd->real_av_width; + else avr.left = avr.right - pwd->time_width; + r.right = avr.left; + } - if (!IsWindowVisible(hwnd)) { - ShowWindow(hwnd, SW_SHOWNOACTIVATE); - UpdateWindow(hwnd); + if (options.time_layout == PT_WITHAV) { + avr.top = options.padding; + avr.bottom = avr.top + pwd->time_height; + if (pwd->custom_col) SetTextColor(ps.hdc, pd->colorText); + else SetTextColor(ps.hdc, colTime); + if (hFontTime) SelectObject(hdc, (HGDIOBJ)hFontTime); + DrawText(ps.hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &avr, DT_VCENTER | DT_CENTER | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); + avr.top = avr.bottom + options.av_padding; } - return TRUE; - } - break; - case WM_ERASEBKGND: - { - HDC hdc = (HDC) wParam; - RECT r, r_bar; - GetClientRect(hwnd, &r); - - // bg - FillRect(hdc, &r, pwd->bkBrush); - // sidebar - r_bar = r; - r_bar.right = r.left + options.sb_width; - FillRect(hdc, &r_bar, pwd->barBrush); - // border - if (options.border) { - - HBRUSH hOldBrush = (HBRUSH)SelectObject(hdc, GetStockObject(NULL_BRUSH)); - HPEN hOldPen = (HPEN)SelectObject(hdc, pwd->bPen); - - int h = 0; - if (options.round) { - int v; - int w=14; - h=(r.right-r.left)>(w*2)?w:(r.right-r.left); - v=(r.bottom-r.top)>(w*2)?w:(r.bottom-r.top); - h=(hhave_av) { + // correct for wider time + if (options.time_layout == PT_WITHAV && pwd->time_width > options.av_size) { + avr.left = avr.left + (pwd->time_width - pwd->real_av_width) / 2; + avr.right = avr.left + pwd->real_av_width; } - RoundRect(hdc, 0, 0, (r.right - r.left), (r.bottom - r.top), h, h); + avr.bottom = avr.top + pwd->real_av_height; - SelectObject(hdc, hOldBrush); - SelectObject(hdc, hOldPen); + AVATARDRAWREQUEST adr = {0}; + adr.cbSize = sizeof(adr); + adr.hContact = pd->hContact; + adr.hTargetDC = ps.hdc; + adr.rcDraw = avr; + adr.dwFlags = (pwd->av_is_round ? AVDRQ_ROUNDEDCORNER : 0); + adr.radius = 5; //(pwd->av_is_round ? 5 : 0); + + CallService(MS_AV_DRAWAVATAR, 0, (LPARAM)&adr); } + } + // title icon + int iconx, textxmin = r.left + options.padding, textxmax = r.right - options.padding; + if (pd->hIcon) { + if (options.right_icon) { + iconx = r.right - (16 + options.padding); + textxmax -= 16 + options.padding; + } else { + iconx = r.left + options.padding; + textxmin += 16 + options.padding; + } + DrawIconEx(ps.hdc, iconx, options.padding + (pwd->tb_height - 16) / 2, pd->hIcon, 16, 16, 0, NULL, DI_NORMAL); } - return TRUE; - case WM_PAINT: - { - RECT r; - //if (GetUpdateRect(hwnd, &r, TRUE)) { - PAINTSTRUCT ps; - BeginPaint(hwnd, &ps); - HDC hdc = ps.hdc; + + // title time + if (options.time_layout == PT_LEFT || options.time_layout == PT_RIGHT) { + RECT ttr; + ttr.top = r.top + options.padding; ttr.bottom = ttr.top + pwd->tb_height; + if (pwd->custom_col) SetTextColor(ps.hdc, pd->colorText); + else SetTextColor(ps.hdc, colTime); + if (hFontTime) SelectObject(hdc, (HGDIOBJ)hFontTime); + switch(options.time_layout) { + case PT_LEFT: + ttr.left = textxmin; ttr.right = ttr.left + pwd->time_width; + textxmin += pwd->time_width + options.padding; + DrawText(ps.hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &ttr, DT_VCENTER | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); + break; + case PT_RIGHT: + ttr.right = textxmax; ttr.left = ttr.right - pwd->time_width; + textxmax -= pwd->time_width + options.padding; + DrawText(ps.hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &ttr, DT_VCENTER | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); + break; + default: + break; + } + } + + if (textxmin < options.sb_width) textxmin = options.sb_width + options.padding / 2; + + // title text + if (hFontFirstLine) SelectObject(ps.hdc, (HGDIOBJ)hFontFirstLine); + RECT tr; + tr.left = r.left + options.padding + options.text_indent; tr.right = textxmax; tr.top = r.top + options.padding; tr.bottom = tr.top + pwd->tb_height; + + if (pwd->custom_col) SetTextColor(ps.hdc, pd->colorText); + else SetTextColor(ps.hdc, colFirstLine); + TCHAR *title = mir_u2t(pd->pwzTitle); + DrawText(ps.hdc, title, (int)_tcslen(title), &tr, DT_VCENTER | DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE | DT_NOPREFIX); + mir_free(title); + + // title underline + RECT tur; + tur.left = r.left + options.sb_width + options.padding; + tur.right = r.right - options.padding; + tur.top = tr.bottom + options.padding/2; + tur.bottom = tur.top + 1; + FillRect(ps.hdc, &tur, pwd->underlineBrush); + + // second line(s) + if (pd->pwzText[0]) { + if (hFontSecondLine) SelectObject(ps.hdc, (HGDIOBJ)hFontSecondLine); + if (!pwd->custom_col) + SetTextColor(ps.hdc, colSecondLine); + + // expand text if no avatar and the time isn't too large + if (options.av_layout != PAV_NONE && options.time_layout == PT_WITHAV && pwd->time_height <= pwd->tb_height && !pwd->have_av) GetClientRect(hwnd, &r); - // text background - //if (pwd->custom_col) SetBkColor(ps.hdc, pd->colorBack); - //else SetBkColor(ps.hdc, colBg); - SetBkMode(hdc, TRANSPARENT); - - // avatar & time if with avatar - if (options.av_layout != PAV_NONE && (pwd->have_av || options.time_layout == PT_WITHAV)) { - RECT avr; - avr.top = options.av_padding; - - if (options.av_layout == PAV_LEFT) { - avr.left = r.left + options.av_padding; - if (pwd->have_av && options.time_layout == PT_WITHAV) avr.right = avr.left + max(pwd->real_av_width, pwd->time_width); - else if (pwd->have_av) avr.right = avr.left + pwd->real_av_width; - else avr.right = avr.left + pwd->time_width; - r.left = avr.right; - } else if (options.av_layout == PAV_RIGHT) { - avr.right = r.right - options.av_padding; - if (pwd->have_av && options.time_layout == PT_WITHAV) avr.left = avr.right - max(pwd->real_av_width, pwd->time_width); - else if (pwd->have_av) avr.left = avr.right - pwd->real_av_width; - else avr.left = avr.right - pwd->time_width; - r.right = avr.left; - } - - if (options.time_layout == PT_WITHAV) { - avr.top = options.padding; - avr.bottom = avr.top + pwd->time_height; - if (pwd->custom_col) SetTextColor(ps.hdc, pd->colorText); - else SetTextColor(ps.hdc, colTime); - if (hFontTime) SelectObject(hdc, (HGDIOBJ)hFontTime); - DrawText(ps.hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &avr, DT_VCENTER | DT_CENTER | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); - avr.top = avr.bottom + options.av_padding; - } - - if (pwd->have_av) { - // correct for wider time - if (options.time_layout == PT_WITHAV && pwd->time_width > options.av_size) { - avr.left = avr.left + (pwd->time_width - pwd->real_av_width) / 2; - avr.right = avr.left + pwd->real_av_width; - } - avr.bottom = avr.top + pwd->real_av_height; - - AVATARDRAWREQUEST adr = {0}; - adr.cbSize = sizeof(adr); - adr.hContact = pd->hContact; - adr.hTargetDC = ps.hdc; - adr.rcDraw = avr; - adr.dwFlags = (pwd->av_is_round ? AVDRQ_ROUNDEDCORNER : 0); - adr.radius = 5; //(pwd->av_is_round ? 5 : 0); - - CallService(MS_AV_DRAWAVATAR, 0, (LPARAM)&adr); - } - } - - // title icon - int iconx, textxmin = r.left + options.padding, textxmax = r.right - options.padding; - if (pd->hIcon) { - if (options.right_icon) { - iconx = r.right - (16 + options.padding); - textxmax -= 16 + options.padding; - } else { - iconx = r.left + options.padding; - textxmin += 16 + options.padding; - } - DrawIconEx(ps.hdc, iconx, options.padding + (pwd->tb_height - 16) / 2, pd->hIcon, 16, 16, 0, NULL, DI_NORMAL); - } + TCHAR *text = mir_u2t(pd->pwzText); + tr.left = r.left + options.padding + options.text_indent; tr.right = r.right - options.padding; tr.top = tr.bottom + options.padding; tr.bottom = r.bottom - options.padding; + DrawText(ps.hdc, text, (int)_tcslen(text), &tr, DT_NOPREFIX | DT_WORDBREAK | DT_EXTERNALLEADING | DT_TOP | DT_LEFT | DT_WORD_ELLIPSIS); + mir_free(text); + } - // title time - if (options.time_layout == PT_LEFT || options.time_layout == PT_RIGHT) { - RECT ttr; - ttr.top = r.top + options.padding; ttr.bottom = ttr.top + pwd->tb_height; - if (pwd->custom_col) SetTextColor(ps.hdc, pd->colorText); - else SetTextColor(ps.hdc, colTime); - if (hFontTime) SelectObject(hdc, (HGDIOBJ)hFontTime); - switch(options.time_layout) { - case PT_LEFT: - ttr.left = textxmin; ttr.right = ttr.left + pwd->time_width; - textxmin += pwd->time_width + options.padding; - DrawText(ps.hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &ttr, DT_VCENTER | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); - break; - case PT_RIGHT: - ttr.right = textxmax; ttr.left = ttr.right - pwd->time_width; - textxmax -= pwd->time_width + options.padding; - DrawText(ps.hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &ttr, DT_VCENTER | DT_LEFT | DT_SINGLELINE | DT_NOPREFIX); - break; - default: - break; - } - } + EndPaint(hwnd, &ps); + } + return 0; - if (textxmin < options.sb_width) textxmin = options.sb_width + options.padding / 2; + case WM_DESTROY: + if (pwd->mouse_in) global_mouse_in--; - // title text - if (hFontFirstLine) SelectObject(ps.hdc, (HGDIOBJ)hFontFirstLine); - RECT tr; - tr.left = r.left + options.padding + options.text_indent; tr.right = textxmax; tr.top = r.top + options.padding; tr.bottom = tr.top + pwd->tb_height; - - if (pwd->custom_col) SetTextColor(ps.hdc, pd->colorText); - else SetTextColor(ps.hdc, colFirstLine); - TCHAR *title = mir_u2t(pd->pwzTitle); - DrawText(ps.hdc, title, (int)_tcslen(title), &tr, DT_VCENTER | DT_LEFT | DT_END_ELLIPSIS | DT_SINGLELINE | DT_NOPREFIX); - mir_free(title); - - // title underline - RECT tur; - tur.left = r.left + options.sb_width + options.padding; - tur.right = r.right - options.padding; - tur.top = tr.bottom + options.padding/2; - tur.bottom = tur.top + 1; - FillRect(ps.hdc, &tur, pwd->underlineBrush); - - // second line(s) - if (pd->pwzText[0]) { - if (hFontSecondLine) SelectObject(ps.hdc, (HGDIOBJ)hFontSecondLine); - if (!pwd->custom_col) - SetTextColor(ps.hdc, colSecondLine); - - // expand text if no avatar and the time isn't too large - if (options.av_layout != PAV_NONE && options.time_layout == PT_WITHAV && pwd->time_height <= pwd->tb_height && !pwd->have_av) - GetClientRect(hwnd, &r); - - TCHAR *text = mir_u2t(pd->pwzText); - tr.left = r.left + options.padding + options.text_indent; tr.right = r.right - options.padding; tr.top = tr.bottom + options.padding; tr.bottom = r.bottom - options.padding; - DrawText(ps.hdc, text, (int)_tcslen(text), &tr, DT_NOPREFIX | DT_WORDBREAK | DT_EXTERNALLEADING | DT_TOP | DT_LEFT | DT_WORD_ELLIPSIS); - mir_free(text); - } + ShowWindow(hwnd, SW_HIDE); - EndPaint(hwnd, &ps); - //} - } - return 0; + DeleteObject(pwd->bkBrush); + DeleteObject(pwd->bPen); + DeleteObject(pwd->barBrush); + DeleteObject(pwd->underlineBrush); + KillTimer(hwnd, ID_MOVETIMER); + KillTimer(hwnd, ID_CLOSETIMER); - case WM_DESTROY: - if (pwd->mouse_in) global_mouse_in--; + RemoveWindowFromStack(hwnd); - ShowWindow(hwnd, SW_HIDE); + SendMessage(hwnd, PM_DIENOTIFY, 0, 0); - DeleteObject(pwd->bkBrush); - DeleteObject(pwd->bPen); - DeleteObject(pwd->barBrush); - DeleteObject(pwd->underlineBrush); + if (pd) { + pd->SetIcon(NULL); + mir_free(pd->pwzTitle); + mir_free(pd->pwzText); + mir_free(pd); + } + mir_free(pwd); pwd = 0; pd = 0; + SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); + break; + + case PUM_UPDATERGN: + // round corners + if (pwd->is_round) { + HRGN hRgn1; + RECT r; + + int v,h; + int w=11; + GetWindowRect(hwnd,&r); + h=(r.right-r.left)>(w*2)?w:(r.right-r.left); + v=(r.bottom-r.top)>(w*2)?w:(r.bottom-r.top); + h=(hnew_x = (int)wParam; + pwd->new_y = (int)lParam; + SetTimer(hwnd, ID_MOVETIMER, 10, 0); + } else { + SetWindowPos(hwnd, 0, (int)wParam, (int)lParam, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); + if (!IsWindowVisible(hwnd)) { + ShowWindow(hwnd, SW_SHOWNOACTIVATE); + UpdateWindow(hwnd); + } + } + return TRUE; - RemoveWindowFromStack(hwnd); + case PUM_SETTEXT: + replaceStrT(pd->ptzText, (TCHAR*)lParam); + InvalidateRect(hwnd, 0, TRUE); + RepositionWindows(); + return TRUE; - SendMessage(hwnd, PM_DIENOTIFY, 0, 0); + case PUM_GETCONTACT: + { + HANDLE *phContact = (HANDLE *)wParam; + *phContact = pd->hContact; + if (lParam) SetEvent((HANDLE)lParam); + } + return TRUE; - if (pd) { - mir_free(pd->pwzTitle); - mir_free(pd->pwzText); - mir_free(pd); + case PUM_GETHEIGHT: + { + int *pHeight = (int *)wParam; + HDC hdc = GetDC(hwnd); + SIZE size; + + // time_height + width + if (options.time_layout != PT_NONE) { + SIZE size_t; + if (hFontTime) SelectObject(hdc, (HGDIOBJ)hFontTime); + GetTextExtentPoint32(hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &size_t); + pwd->time_height = size_t.cy; + pwd->time_width = size_t.cx; } - mir_free(pwd); pwd = 0; pd = 0; - SetWindowLongPtr(hwnd, GWLP_USERDATA, 0); - break; - case PUM_UPDATERGN: - // round corners - if (pwd->is_round) { - HRGN hRgn1; - RECT r; - - int v,h; - int w=11; - GetWindowRect(hwnd,&r); - h=(r.right-r.left)>(w*2)?w:(r.right-r.left); - v=(r.bottom-r.top)>(w*2)?w:(r.bottom-r.top); - h=(hpwzTitle); + GetTextExtentPoint32(hdc, title, (int)_tcslen(title), &size); + mir_free(title); + pwd->tb_height = size.cy; + if (options.time_layout == PT_LEFT || options.time_layout == PT_RIGHT) { + if (pwd->tb_height < pwd->time_height) pwd->tb_height = pwd->time_height; } - return TRUE; - - case PUM_MOVE: - if (options.animate) { - KillTimer(hwnd, ID_MOVETIMER); - pwd->new_x = (int)wParam; - pwd->new_y = (int)lParam; - SetTimer(hwnd, ID_MOVETIMER, 10, 0); - } else { - SetWindowPos(hwnd, 0, (int)wParam, (int)lParam, 0, 0, SWP_NOZORDER | SWP_NOSIZE | SWP_NOACTIVATE); - if (!IsWindowVisible(hwnd)) { - ShowWindow(hwnd, SW_SHOWNOACTIVATE); - UpdateWindow(hwnd); + if (pwd->tb_height < 16) pwd->tb_height = 16; + + // avatar height + if (options.av_layout != PAV_NONE && ServiceExists(MS_AV_DRAWAVATAR)) { + AVATARCACHEENTRY *ace = (AVATARCACHEENTRY *)CallService(MS_AV_GETAVATARBITMAP, (WPARAM)pd->hContact, 0); + if (ace && (ace->dwFlags & AVS_BITMAP_VALID) && !(ace->dwFlags & AVS_HIDEONCLIST)) { + if (ace->bmHeight >= ace->bmWidth) { + pwd->real_av_height = options.av_size; + pwd->real_av_width = options.av_size * ace->bmWidth / ace->bmHeight; + } else { + pwd->real_av_height = options.av_size * ace->bmHeight / ace->bmWidth; + pwd->real_av_width = options.av_size; + } + pwd->have_av = true; + pwd->av_height = pwd->real_av_height; } } - return TRUE; - case PUM_SETTEXT: - replaceStrT(pd->ptzText, (TCHAR*)lParam); - InvalidateRect(hwnd, 0, TRUE); - RepositionWindows(); - return TRUE; - - case PUM_GETCONTACT: - { - HANDLE *phContact = (HANDLE *)wParam; - *phContact = pd->hContact; - if (lParam) SetEvent((HANDLE)lParam); + // text height + if (pd->pwzText[0]) { + RECT r; + r.left = r.top = 0; + r.right = options.win_width - 2 * options.padding - options.text_indent; + if (pwd->have_av && options.time_layout == PT_WITHAV) + r.right -= (max(options.av_size, pwd->time_width) + options.padding); + else if (pwd->have_av) + r.right -= (options.av_size + options.padding); + else if (options.av_layout != PAV_NONE && options.time_layout == PT_WITHAV && pwd->time_height >= pwd->tb_height) + r.right -= pwd->time_width + options.padding; + + if (hFontSecondLine) SelectObject(hdc, (HGDIOBJ)hFontSecondLine); + TCHAR *text = mir_u2t(pd->pwzText); + DrawText(hdc, text, (int)_tcslen(text), &r, DT_CALCRECT | DT_NOPREFIX | DT_WORDBREAK | DT_EXTERNALLEADING | DT_TOP | DT_LEFT | DT_WORD_ELLIPSIS); + pwd->text_height = r.bottom; + mir_free(text); } - return TRUE; - case PUM_GETHEIGHT: - { - int *pHeight = (int *)wParam; - HDC hdc = GetDC(hwnd); - SIZE size; - - // time_height + width - if (options.time_layout != PT_NONE) { - SIZE size_t; - if (hFontTime) SelectObject(hdc, (HGDIOBJ)hFontTime); - GetTextExtentPoint32(hdc, pwd->tbuff, (int)_tcslen(pwd->tbuff), &size_t); - pwd->time_height = size_t.cy; - pwd->time_width = size_t.cx; - } - // titlebar height - if (hFontFirstLine) SelectObject(hdc, (HGDIOBJ)hFontFirstLine); - TCHAR *title = mir_u2t(pd->pwzTitle); - GetTextExtentPoint32(hdc, title, (int)_tcslen(title), &size); - mir_free(title); - pwd->tb_height = size.cy; - if (options.time_layout == PT_LEFT || options.time_layout == PT_RIGHT) { - if (pwd->tb_height < pwd->time_height) pwd->tb_height = pwd->time_height; - } - if (pwd->tb_height < 16) pwd->tb_height = 16; - - // avatar height - if (options.av_layout != PAV_NONE && ServiceExists(MS_AV_DRAWAVATAR)) { - AVATARCACHEENTRY *ace = (AVATARCACHEENTRY *)CallService(MS_AV_GETAVATARBITMAP, (WPARAM)pd->hContact, 0); - if (ace && (ace->dwFlags & AVS_BITMAP_VALID) && !(ace->dwFlags & AVS_HIDEONCLIST)) { - if (ace->bmHeight >= ace->bmWidth) { - pwd->real_av_height = options.av_size; - pwd->real_av_width = options.av_size * ace->bmWidth / ace->bmHeight; - } else { - pwd->real_av_height = options.av_size * ace->bmHeight / ace->bmWidth; - pwd->real_av_width = options.av_size; - } - pwd->have_av = true; - pwd->av_height = pwd->real_av_height; - } - } + ReleaseDC(hwnd, hdc); - // text height - if (pd->pwzText[0]) { - RECT r; - r.left = r.top = 0; - r.right = options.win_width - 2 * options.padding - options.text_indent; - if (pwd->have_av && options.time_layout == PT_WITHAV) - r.right -= (max(options.av_size, pwd->time_width) + options.padding); - else if (pwd->have_av) - r.right -= (options.av_size + options.padding); - else if (options.av_layout != PAV_NONE && options.time_layout == PT_WITHAV && pwd->time_height >= pwd->tb_height) - r.right -= pwd->time_width + options.padding; - - if (hFontSecondLine) SelectObject(hdc, (HGDIOBJ)hFontSecondLine); - TCHAR *text = mir_u2t(pd->pwzText); - DrawText(hdc, text, (int)_tcslen(text), &r, DT_CALCRECT | DT_NOPREFIX | DT_WORDBREAK | DT_EXTERNALLEADING | DT_TOP | DT_LEFT | DT_WORD_ELLIPSIS); - pwd->text_height = r.bottom; - mir_free(text); - } + if (options.time_layout == PT_WITHAV && options.av_layout != PAV_NONE) + *pHeight = max(pwd->tb_height + pwd->text_height + 3 * options.padding, pwd->av_height + pwd->time_height + options.padding + 2 * options.av_padding); + else + *pHeight = max(pwd->tb_height + pwd->text_height + 3 * options.padding, pwd->av_height + 2 * options.av_padding); - ReleaseDC(hwnd, hdc); + if (*pHeight > options.win_max_height) *pHeight = options.win_max_height; - if (options.time_layout == PT_WITHAV && options.av_layout != PAV_NONE) - *pHeight = max(pwd->tb_height + pwd->text_height + 3 * options.padding, pwd->av_height + pwd->time_height + options.padding + 2 * options.av_padding); - else - *pHeight = max(pwd->tb_height + pwd->text_height + 3 * options.padding, pwd->av_height + 2 * options.av_padding); + RECT r; + GetWindowRect(hwnd, &r); + if (r.right - r.left != options.win_width || r.bottom - r.top != *pHeight) { + SetWindowPos(hwnd, 0, 0, 0, options.win_width, *pHeight, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); + SendMessage(hwnd, PUM_UPDATERGN, 0, 0); + InvalidateRect(hwnd, 0, TRUE); + } + } + return TRUE; - if (*pHeight > options.win_max_height) *pHeight = options.win_max_height; + case PUM_GETOPAQUE: + { + void **pData = (void **)wParam; + if (pd) *pData = pd->opaque; + if (lParam) SetEvent((HANDLE)lParam); + } + return TRUE; - RECT r; - GetWindowRect(hwnd, &r); - if (r.right - r.left != options.win_width || r.bottom - r.top != *pHeight) { - SetWindowPos(hwnd, 0, 0, 0, options.win_width, *pHeight, SWP_NOMOVE | SWP_NOZORDER | SWP_NOACTIVATE); - SendMessage(hwnd, PUM_UPDATERGN, 0, 0); - InvalidateRect(hwnd, 0, TRUE); - } - } - return TRUE; - case PUM_GETOPAQUE: - { - void **pData = (void **)wParam; - if (pd) *pData = pd->opaque; - if (lParam) SetEvent((HANDLE)lParam); + case PUM_CHANGE: + { + KillTimer(hwnd, ID_CLOSETIMER); + if (pd) { + mir_free(pd->pwzTitle); + mir_free(pd->pwzText); + mir_free(pd); } - return TRUE; - case PUM_CHANGE: - { - KillTimer(hwnd, ID_CLOSETIMER); - if (pd) { - mir_free(pd->pwzTitle); - mir_free(pd->pwzText); - mir_free(pd); - } - pwd->pd = pd = (PopupData *)lParam; + pwd->pd = pd = (PopupData *)lParam; - if (pd->timeout != -1) { - if (pd->timeout == 0) { - SetTimer(hwnd, ID_CLOSETIMER, 7 * 1000, 0); - } else { - SetTimer(hwnd, ID_CLOSETIMER, pd->timeout * 1000, 0); - } + if (pd->timeout != -1) { + if (pd->timeout == 0) { + SetTimer(hwnd, ID_CLOSETIMER, 7 * 1000, 0); } else { - // make a really long timeout - say 7 days? ;) - SetTimer(hwnd, ID_CLOSETIMER, 7 * 24 * 60 * 60 * 1000, 0); + SetTimer(hwnd, ID_CLOSETIMER, pd->timeout * 1000, 0); } - - InvalidateRect(hwnd, 0, TRUE); - RepositionWindows(); + } else { + // make a really long timeout - say 7 days? ;) + SetTimer(hwnd, ID_CLOSETIMER, 7 * 24 * 60 * 60 * 1000, 0); } - return TRUE; - case PUM_SETNOTIFYH: - pwd->hNotify = (HANDLE)wParam; - return TRUE; + InvalidateRect(hwnd, 0, TRUE); + RepositionWindows(); + } + return TRUE; - case PUM_UPDATENOTIFY: - if (pwd->hNotify == (HANDLE)wParam) { - pd->colorBack = MNotifyGetDWord(pwd->hNotify, NFOPT_BACKCOLOR, colBg); - pd->colorText = MNotifyGetDWord(pwd->hNotify, NFOPT_TEXTCOLOR, colSecondLine); - pd->timeout = MNotifyGetDWord(pwd->hNotify, NFOPT_TIMEOUT, options.default_timeout); - pd->hContact = (HANDLE)MNotifyGetDWord(pwd->hNotify, NFOPT_CONTACT, 0); - pd->hIcon = (HICON)MNotifyGetDWord(pwd->hNotify, NFOPT_ICON, 0); - - const wchar_t *swzName = MNotifyGetWString(pwd->hNotify, NFOPT_TITLEW, 0); - mir_free(pd->pwzTitle); - pd->pwzTitle = mir_wstrdup(swzName); + case PUM_SETNOTIFYH: + pwd->hNotify = (HANDLE)wParam; + return TRUE; - const wchar_t *swzText = MNotifyGetWString(pwd->hNotify, NFOPT_TEXTW, 0); - mir_free(pd->pwzText); - pd->pwzText = mir_wstrdup(swzText); + case PUM_UPDATENOTIFY: + if (pwd->hNotify == (HANDLE)wParam) { + pd->colorBack = MNotifyGetDWord(pwd->hNotify, NFOPT_BACKCOLOR, colBg); + pd->colorText = MNotifyGetDWord(pwd->hNotify, NFOPT_TEXTCOLOR, colSecondLine); + pd->timeout = MNotifyGetDWord(pwd->hNotify, NFOPT_TIMEOUT, options.default_timeout); + pd->hContact = (HANDLE)MNotifyGetDWord(pwd->hNotify, NFOPT_CONTACT, 0); + pd->hIcon = (HICON)MNotifyGetDWord(pwd->hNotify, NFOPT_ICON, 0); - InvalidateRect(hwnd, 0, TRUE); - RepositionWindows(); - } + const wchar_t *swzName = MNotifyGetWString(pwd->hNotify, NFOPT_TITLEW, 0); + mir_free(pd->pwzTitle); + pd->pwzTitle = mir_wstrdup(swzName); - return TRUE; - case PUM_KILLNOTIFY: - if (pwd->hNotify != (HANDLE)wParam) - return TRUE; - // drop through + const wchar_t *swzText = MNotifyGetWString(pwd->hNotify, NFOPT_TEXTW, 0); + mir_free(pd->pwzText); + pd->pwzText = mir_wstrdup(swzText); - case PM_DESTROY: - PostMPMessage(MUM_DELETEPOPUP, 0, (LPARAM)hwnd); + InvalidateRect(hwnd, 0, TRUE); + RepositionWindows(); + } + + return TRUE; + case PUM_KILLNOTIFY: + if (pwd->hNotify != (HANDLE)wParam) return TRUE; - } + // drop through + case PM_DESTROY: + PostMPMessage(MUM_DELETEPOPUP, 0, (LPARAM)hwnd); + return TRUE; + } if (pd && pd->windowProc) return CallWindowProc(pd->windowProc, hwnd, uMsg, wParam, lParam); @@ -754,7 +707,8 @@ LRESULT CALLBACK PopupWindowProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lPa } } -void InitWindowStack() { +void InitWindowStack() +{ hUserDll = GetModuleHandle(_T("user32.dll")); if (hUserDll) { MySetLayeredWindowAttributes = (BOOL (WINAPI *)(HWND,COLORREF,BYTE,DWORD))GetProcAddress(hUserDll, "SetLayeredWindowAttributes"); @@ -766,7 +720,24 @@ void InitWindowStack() { } } -void DeinitWindowStack() { +void DeinitWindowStack() +{ ClearStack(); } +/////////////////////////////////////////////////////////////////////////////// + +void PopupData::SetIcon(HICON hNewIcon) +{ + if (flags & PDF_ICOLIB) { + Skin_ReleaseIcon(hIcon); + flags &= ~PDF_ICOLIB; + } + + hIcon = hNewIcon; + + if ( CallService(MS_SKIN2_ISMANAGEDICON, (WPARAM)hIcon, 0)) { + CallService(MS_SKIN2_ADDREFICON, (WPARAM)hIcon, 0); + flags |= PDF_ICOLIB; + } +} diff --git a/plugins/YAPP/src/services.cpp b/plugins/YAPP/src/services.cpp index 05c5beab8a..6abbd4bc47 100644 --- a/plugins/YAPP/src/services.cpp +++ b/plugins/YAPP/src/services.cpp @@ -5,11 +5,10 @@ #include "resource.h" #include "yapp_history.h" -#define NUM_SERVICES 20 -HANDLE hService[NUM_SERVICES]; HANDLE hMenuShowHistory, hMenuToggleOnOff; -void StripBBCodesInPlace(wchar_t *text) { +void StripBBCodesInPlace(wchar_t *text) +{ if (text == 0 || db_get_b(0, MODULE, "StripBBCodes", 1) == 0) return; @@ -44,7 +43,8 @@ void StripBBCodesInPlace(wchar_t *text) { } } -INT_PTR OldCreatePopupA(WPARAM wParam, LPARAM lParam) { +INT_PTR CreatePopupA(WPARAM wParam, LPARAM lParam) +{ POPUPDATA *pd_in = (POPUPDATA *)wParam; PopupData *pd_out = (PopupData *)mir_calloc(sizeof(PopupData)); @@ -56,7 +56,7 @@ INT_PTR OldCreatePopupA(WPARAM wParam, LPARAM lParam) { StripBBCodesInPlace(pd_out->pwzText); pd_out->hContact = pd_in->lchContact; - pd_out->hIcon = pd_in->lchIcon; + pd_out->SetIcon(pd_in->lchIcon); if (pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' pd_out->colorBack = pd_out->colorText = 0; else { @@ -81,7 +81,7 @@ INT_PTR OldCreatePopupA(WPARAM wParam, LPARAM lParam) { return 0; } -INT_PTR OldCreatePopupExA(WPARAM wParam, LPARAM lParam) { +INT_PTR CreatePopupExA(WPARAM wParam, LPARAM lParam) { POPUPDATAEX *pd_in = (POPUPDATAEX *)wParam; PopupData *pd_out = (PopupData *)mir_calloc(sizeof(PopupData)); @@ -94,7 +94,7 @@ INT_PTR OldCreatePopupExA(WPARAM wParam, LPARAM lParam) { StripBBCodesInPlace(pd_out->pwzText); pd_out->hContact = pd_in->lchContact; - pd_out->hIcon = pd_in->lchIcon; + pd_out->SetIcon(pd_in->lchIcon); if (pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' pd_out->colorBack = pd_out->colorText = 0; else { @@ -118,8 +118,8 @@ INT_PTR OldCreatePopupExA(WPARAM wParam, LPARAM lParam) { return 0; } -INT_PTR OldCreatePopupW(WPARAM wParam, LPARAM lParam) { - +INT_PTR CreatePopupW(WPARAM wParam, LPARAM lParam) +{ POPUPDATAW *pd_in = (POPUPDATAW *)wParam; PopupData *pd_out = (PopupData *)mir_calloc(sizeof(PopupData)); @@ -131,7 +131,7 @@ INT_PTR OldCreatePopupW(WPARAM wParam, LPARAM lParam) { StripBBCodesInPlace(pd_out->pwzText); pd_out->hContact = pd_in->lchContact; - pd_out->hIcon = pd_in->lchIcon; + pd_out->SetIcon(pd_in->lchIcon); if (pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' pd_out->colorBack = pd_out->colorText = 0; else { @@ -294,7 +294,7 @@ INT_PTR PopupChangeA(WPARAM wParam, LPARAM lParam) { StripBBCodesInPlace(pd_out.pwzText); pd_out.hContact = pd_in->lchContact; - pd_out.hIcon = pd_in->lchIcon; + pd_out.SetIcon(pd_in->lchIcon); if (pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' pd_out.colorBack = pd_out.colorText = 0; else { @@ -329,7 +329,7 @@ INT_PTR PopupChangeW(WPARAM wParam, LPARAM lParam) { StripBBCodesInPlace(pd_out.pwzText); pd_out.hContact = pd_in->lchContact; - pd_out.hIcon = pd_in->lchIcon; + pd_out.SetIcon(pd_in->lchIcon); if (pd_in->colorBack == 0xffffffff) // that's the old #define for 'skinned bg' pd_out.colorBack = pd_out.colorText = 0; else { @@ -350,35 +350,30 @@ INT_PTR PopupChangeW(WPARAM wParam, LPARAM lParam) { } INT_PTR ShowMessage(WPARAM wParam, LPARAM lParam) { - if (!db_get_b(0, MODULE, "Enabled", 1)) return 0; + if ( !db_get_b(0, MODULE, "Enabled", 1)) return 0; POPUPDATAT pd = {0}; _tcscpy(pd.lptzContactName, lParam == SM_WARNING ? _T("Warning") : _T("Notification")); pd.lchIcon = LoadIcon(0, lParam == SM_WARNING ? IDI_WARNING : IDI_INFORMATION); - TCHAR *buff = mir_a2t((char *)wParam); - _tcscpy(pd.lptzText, buff); pd.lptzText[MAX_SECONDLINE-1] = 0; - mir_free(buff); - + _tcsncpy(pd.lptzText, _A2T((char *)wParam), MAX_SECONDLINE); pd.lptzText[MAX_SECONDLINE-1] = 0; CallService(MS_POPUP_ADDPOPUPT, (WPARAM)&pd, 0); - return 0; } -INT_PTR ShowMessageW(WPARAM wParam, LPARAM lParam) { - if (!db_get_b(0, MODULE, "Enabled", 1)) return 0; +INT_PTR ShowMessageW(WPARAM wParam, LPARAM lParam) +{ + if ( !db_get_b(0, MODULE, "Enabled", 1)) return 0; POPUPDATAW pd = {0}; wcscpy(pd.lpwzContactName, lParam == SM_WARNING ? L"Warning" : L"Notification"); pd.lchIcon = LoadIcon(0, lParam == SM_WARNING ? IDI_WARNING : IDI_INFORMATION); wcsncpy(pd.lpwzText, (wchar_t *)wParam, MAX_SECONDLINE); - CallService(MS_POPUP_ADDPOPUPW, (WPARAM)&pd, 0); - return 0; } //=====PopUp/ShowHistory -//extern BOOL CALLBACK DlgProcHistLstOpts(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam); + INT_PTR PopUp_ShowHistory(WPARAM wParam, LPARAM lParam) { if (!hHistoryWindow) { @@ -437,7 +432,7 @@ INT_PTR CreateClassPopup(WPARAM wParam, LPARAM lParam) if (pc->flags & PCF_UNICODE) pd.flags |= PDF_UNICODE; pd.colorBack = pc->colorBack; pd.colorText = pc->colorText; - pd.hIcon = pc->hIcon; + pd.SetIcon(pc->hIcon); pd.timeout = pc->iSeconds; pd.windowProc = pc->PluginWindowProc; @@ -451,43 +446,38 @@ INT_PTR CreateClassPopup(WPARAM wParam, LPARAM lParam) return 0; } -int PrebuildMenu(WPARAM wParam, LPARAM lParam) { - return 0; -} - -HANDLE hEventBuildMenu; +////////////////////////////////////////////////////////////////////////////// void InitServices() { - int i = 0; - hService[i++] = CreateServiceFunction(MS_POPUP_REGISTERCLASS, RegisterPopupClass); - hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPCLASS, CreateClassPopup); - hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUP, OldCreatePopupA); - hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPEX, OldCreatePopupExA); - hService[i++] = CreateServiceFunction(MS_POPUP_ADDPOPUPW, OldCreatePopupW); - hService[i++] = CreateServiceFunction(MS_POPUP_CHANGETEXTW, ChangeTextW); - hService[i++] = CreateServiceFunction(MS_POPUP_CHANGETEXT, ChangeTextA); - hService[i++] = CreateServiceFunction(MS_POPUP_CHANGE, PopupChangeA); - hService[i++] = CreateServiceFunction(MS_POPUP_CHANGEW, PopupChangeW); - hService[i++] = CreateServiceFunction(MS_POPUP_GETCONTACT, GetContact); - hService[i++] = CreateServiceFunction(MS_POPUP_GETPLUGINDATA, GetOpaque); - hService[i++] = CreateServiceFunction(MS_POPUP_ISSECONDLINESHOWN, IsSecondLineShown); - hService[i++] = CreateServiceFunction(MS_POPUP_QUERY, PopupQuery); - - hService[i++] = CreateServiceFunction(MS_POPUP_SHOWMESSAGE, ShowMessage); - hService[i++] = CreateServiceFunction(MS_POPUP_SHOWMESSAGE"W", ShowMessageW); - - hService[i++] = CreateServiceFunction(MS_POPUP_SHOWHISTORY, PopUp_ShowHistory); - hService[i++] = CreateServiceFunction("PopUp/ToggleEnabled", TogglePopups); - - hService[i++] = CreateServiceFunction("YAPP/RegisterClass", RegisterPopupClass); - hService[i++] = CreateServiceFunction("YAPP/ClassInstance", CreateClassPopup); - - CLISTMENUITEM mi = {0}; - - mi.cbSize = sizeof(mi); + CreateServiceFunction(MS_POPUP_REGISTERCLASS, RegisterPopupClass); + CreateServiceFunction(MS_POPUP_ADDPOPUPCLASS, CreateClassPopup); + CreateServiceFunction(MS_POPUP_ADDPOPUP, CreatePopupA); + CreateServiceFunction(MS_POPUP_ADDPOPUPEX, CreatePopupExA); + CreateServiceFunction(MS_POPUP_ADDPOPUPW, CreatePopupW); + CreateServiceFunction(MS_POPUP_CHANGETEXTW, ChangeTextW); + CreateServiceFunction(MS_POPUP_CHANGETEXT, ChangeTextA); + CreateServiceFunction(MS_POPUP_CHANGE, PopupChangeA); + CreateServiceFunction(MS_POPUP_CHANGEW, PopupChangeW); + CreateServiceFunction(MS_POPUP_GETCONTACT, GetContact); + CreateServiceFunction(MS_POPUP_GETPLUGINDATA, GetOpaque); + CreateServiceFunction(MS_POPUP_ISSECONDLINESHOWN, IsSecondLineShown); + CreateServiceFunction(MS_POPUP_QUERY, PopupQuery); + + CreateServiceFunction(MS_POPUP_SHOWMESSAGE, ShowMessage); + CreateServiceFunction(MS_POPUP_SHOWMESSAGE"W", ShowMessageW); + + CreateServiceFunction(MS_POPUP_SHOWHISTORY, PopUp_ShowHistory); + CreateServiceFunction("PopUp/ToggleEnabled", TogglePopups); + + CreateServiceFunction("YAPP/RegisterClass", RegisterPopupClass); + CreateServiceFunction("YAPP/ClassInstance", CreateClassPopup); + + //////////////////////////////////////////////////////////////////////////// + // Menus + + CLISTMENUITEM mi = { sizeof(mi) }; mi.flags = CMIM_ALL; - mi.position = 500010000; mi.pszPopupName = LPGEN("PopUps"); @@ -502,20 +492,13 @@ void InitServices() mi.pszName = (char*)(db_get_b(0, MODULE, "Enabled", 1) ? LPGEN("Disable Popups") : LPGEN("Enable Popups")); hMenuToggleOnOff = Menu_AddMainMenuItem(&mi); - - hEventBuildMenu = HookEvent(ME_CLIST_PREBUILDCONTACTMENU, PrebuildMenu); } -void DeinitServices() { - int i; - for (i = 0; i < num_classes; i++) { +void DeinitServices() +{ + for (int i = 0; i < num_classes; i++) { mir_free(classes[i].pszName); mir_free(classes[i].pszDescription); } mir_free(classes); num_classes = 0; - - UnhookEvent(hEventBuildMenu); - - for (i = 0; i < NUM_SERVICES; i++) - if (hService[i]) DestroyServiceFunction(hService[i]); } diff --git a/plugins/YAPP/src/yapp.cpp b/plugins/YAPP/src/yapp.cpp index 340d223313..985d2b6287 100644 --- a/plugins/YAPP/src/yapp.cpp +++ b/plugins/YAPP/src/yapp.cpp @@ -148,8 +148,6 @@ static void InitFonts() ReloadFont(0, 0); } -HANDLE hEventReloadFont = 0; - int ModulesLoaded(WPARAM wParam, LPARAM lParam) { MNotifyGetLink(); @@ -157,7 +155,7 @@ int ModulesLoaded(WPARAM wParam, LPARAM lParam) if (ServiceExists(MS_HPP_EG_WINDOW)) lstPopupHistory.SetRenderer(RENDER_HISTORYPP); - hEventReloadFont = HookEvent(ME_FONT_RELOAD, ReloadFont); + HookEvent(ME_FONT_RELOAD, ReloadFont); LoadModuleDependentOptions(); @@ -167,14 +165,13 @@ int ModulesLoaded(WPARAM wParam, LPARAM lParam) return 0; } -int PreShutdown(WPARAM wParam, LPARAM lParam) { +int PreShutdown(WPARAM wParam, LPARAM lParam) +{ DeinitMessagePump(); DeinitNotify(); return 0; } -HANDLE hEventPreShutdown, hEventModulesLoaded; - extern "C" int YAPP_API Load(void) { mir_getLP(&pluginInfo); @@ -184,32 +181,13 @@ extern "C" int YAPP_API Load(void) { InitNotify(); InitFonts(); - hEventPreShutdown = HookEvent(ME_SYSTEM_PRESHUTDOWN, PreShutdown); - hEventModulesLoaded = HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded); - - /* - // test popup classes - PopupClass test = {0}; - test.cbSize = sizeof(test); - test.flags = PCF_TCHAR; - test.hIcon = LoadIcon(0, IDI_WARNING); - test.colorBack = RGB(0, 0, 0); - test.colorText = RGB(255, 255, 255); - test.iSeconds = 10; - test.ptszDescription = TranslateT("Test popup class"); - test.pszName = "popup/testclass"; - CallService(MS_POPUP_REGISTERCLASS, 0, (WPARAM)&test); - */ - + HookEvent(ME_SYSTEM_PRESHUTDOWN, PreShutdown); + HookEvent(ME_SYSTEM_MODULESLOADED, ModulesLoaded); return 0; } extern "C" int YAPP_API Unload() { - if (hEventReloadFont) - UnhookEvent(hEventReloadFont); - UnhookEvent(hEventPreShutdown); - UnhookEvent(hEventModulesLoaded); DeinitNotify(); DeleteObject(hFontFirstLine); DeleteObject(hFontSecondLine); -- cgit v1.2.3