static int OnContactDeleted(WPARAM wParam, LPARAM lParam) { HANDLE hContact = (HANDLE)wParam; ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (pThumb) { pThumb->DeleteContactPos(); thumbList.RemoveThumb(pThumb); } return 0; }
static INT_PTR OnContactMenu_Remove(WPARAM hContact, LPARAM) { ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (pThumb) { pThumb->DeleteContactPos(); thumbList.RemoveThumb(pThumb); } DestroyMenu(hContactMenu); return 0; }
static int OnContactIconChanged(WPARAM hContact, LPARAM lParam) { ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (pThumb) { pThumb->RefreshContactIcon((int)lParam); //pThumb->ThumbSelect( FALSE ); //SetTimer( pThumb->hwnd, TIMERID_SELECT_T, 1000, NULL ); } return 0; }
static INT_PTR OnContactMenu_Remove(WPARAM wParam, LPARAM lParam) { HANDLE hContact = (HANDLE)wParam; ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (pThumb) { pThumb->DeleteContactPos(); thumbList.RemoveThumb(pThumb); } DestroyMenu(hContactMenu); return 0; }
HRESULT STDMETHODCALLTYPE CDropTarget::DragLeave( ) { ThumbInfo *pThumb = thumbList.FindThumb( hwndCurDrag ); if ( NULL != pThumb ) { pThumb->ThumbDeselect( TRUE ); } hwndCurDrag = NULL; return S_OK; }
static int OnContactDrop(WPARAM hContact, LPARAM) { RECT rcMiranda; RECT rcThumb; ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (hNewContact == hContact && pThumb != NULL) { hNewContact = NULL; GetWindowRect(hwndMiranda, &rcMiranda); pThumb->GetThumbRect(&rcThumb); } SaveContactsPos(); return 1; }
static void LoadContact(MCONTACT hContact) { ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (hContact == NULL) return; DWORD dwPos = db_get_dw(hContact, MODULE, "ThumbsPos", (DWORD)-1); if (dwPos != -1) { TCHAR *ptName = pcli->pfnGetContactDisplayName(hContact, 0); if (ptName != NULL) { int nX = DB_POS_GETX(dwPos); int nY = DB_POS_GETY(dwPos); CreateThumbWnd(ptName, hContact, nX, nY); pThumb->PositionThumb(nX, nY); } } }
static void LoadContact( HANDLE hContact ) { ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (hContact == NULL) return; DWORD dwPos = db_get_dw( hContact, MODULE, "ThumbsPos", (DWORD)-1); if ( dwPos != -1) { TCHAR *ptName = (TCHAR*)CallService(MS_CLIST_GETCONTACTDISPLAYNAME, (WPARAM)hContact, (LPARAM)GCDNF_TCHAR); if ( ptName != NULL ) { int nX = DB_POS_GETX( dwPos ); int nY = DB_POS_GETY( dwPos ); CreateThumbWnd(ptName, hContact, nX, nY); pThumb->PositionThumb(nX, nY); } } }
void ThumbInfo::PositionThumb(int nX, int nY) { POINT pos = { nX, nY }; HDWP hdwp = BeginDeferWindowPos(1); ThumbInfo *pThumb = this; while (pThumb) { pThumb->PositionThumbWorker(pos.x, pos.y, &pos); if (nullptr != pThumb->hwnd) /* Wine fix. */ hdwp = DeferWindowPos(hdwp, pThumb->hwnd, HWND_TOPMOST, pos.x, pos.y, 0, 0, SWP_NOSIZE | SWP_NOZORDER | SWP_NOACTIVATE); pThumb->ptPos = pos; pos.x += pThumb->szSize.cx; pThumb = fcOpt.bMoveTogether ? thumbList.FindThumb(pThumb->dockOpt.hwndRight) : nullptr; } EndDeferWindowPos(hdwp); }
static void CreateThumbWnd(TCHAR *ptszName, MCONTACT hContact, int nX, int nY) { ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (pThumb != NULL) return; // Prepare for window creation HWND hwnd = CreateWindowEx(WS_EX_TOOLWINDOW | WS_EX_TOPMOST, WND_CLASS, ptszName, WS_POPUP, nX, nY, 50, 20, NULL, NULL, hInst, NULL); if (hwnd == NULL) return; pThumb = thumbList.AddThumb(hwnd, ptszName, hContact); SetWindowLongPtr(hwnd, GWLP_USERDATA, (LONG_PTR)pThumb); pThumb->ResizeThumb(); pThumb->SetThumbOpacity(fcOpt.thumbAlpha); ShowWindow(hwnd, (fcOpt.bHideAll || HideOnFullScreen() || fcOpt.bHideOffline || (fcOpt.bHideWhenCListShow && bIsCListShow)) ? SW_HIDE : SW_SHOWNA); pThumb->PositionThumb(nX, nY); // force repaint pThumb->UpdateContent(); }
static int OnContactDrag(WPARAM hContact, LPARAM) { POINT pt; GetCursorPos(&pt); ThumbInfo *pThumb = thumbList.FindThumbByContact(hContact); if (pThumb == NULL) { int idStatus = GetContactStatus(hContact); if (!fcOpt.bHideAll && !HideOnFullScreen() && (!fcOpt.bHideOffline || IsStatusVisible(idStatus)) && (!fcOpt.bHideWhenCListShow || !bIsCListShow)) { CreateThumbWnd(pcli->pfnGetContactDisplayName(hContact, 0), hContact, pt.x, pt.y); ThumbInfo *pNewThumb = thumbList.FindThumbByContact(hContact); ShowWindow(pNewThumb->hwnd, SW_SHOWNA); hNewContact = hContact; OnStatusChanged(); } } else if (hContact == hNewContact) pThumb->PositionThumb(pt.x - 5, pt.y - 5); return hNewContact != NULL; }
HRESULT STDMETHODCALLTYPE CDropTarget::DragEnter( IDataObject *pData, DWORD fKeyState, POINTL pt, DWORD *pdwEffect) { FORMATETC feFile = { CF_HDROP, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; FORMATETC feText = { CF_TEXT, NULL, DVASPECT_CONTENT, -1, TYMED_HGLOBAL }; if ( S_OK == pData->QueryGetData( &feFile ) || S_OK == pData->QueryGetData( &feText )) { POINT shortPt; shortPt.x = pt.x; shortPt.y = pt.y; HWND hwnd = WindowFromPoint( shortPt ); ThumbInfo *pThumb = thumbList.FindThumb(hwnd); if (pThumb) { hwndCurDrag = hwnd; pThumb->ThumbSelect( TRUE ); } } return DragOver( fKeyState, pt, pdwEffect); }
static LRESULT __stdcall CommWndProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { ThumbInfo *pThumb = thumbList.FindThumb(hwnd); switch (uMsg) { case WM_RBUTTONUP: { POINT pt; pt.x = LOWORD(lParam); pt.y = HIWORD(lParam); if (pThumb) pThumb->ThumbDeselect(TRUE); ClientToScreen(hwnd, &pt); ShowContactMenu(hwnd, pt); } break; case WM_CLOSE: DestroyWindow(hwnd); break; case WM_NCPAINT: if (pThumb) { HDC hdc = GetWindowDC(hwnd); BitBlt(hdc, 0, 0, pThumb->bmpContent.getWidth(), pThumb->bmpContent.getHeight(), pThumb->bmpContent.getDC(), 0, 0, SRCCOPY); //RepaintWindow( hwnd, hdc ); ReleaseDC(hwnd, hdc); ValidateRect(hwnd, NULL); return 0; } case WM_PAINT: if (pThumb) { PAINTSTRUCT ps; HDC hdc = BeginPaint(hwnd, &ps); BitBlt(hdc, 0, 0, pThumb->bmpContent.getWidth(), pThumb->bmpContent.getHeight(), pThumb->bmpContent.getDC(), 0, 0, SRCCOPY); //RepaintWindow( hwnd, hdc ); EndPaint(hwnd, &ps); break; } case WM_PRINT: case WM_PRINTCLIENT: if (pThumb) { BitBlt((HDC)wParam, 0, 0, pThumb->bmpContent.getWidth(), pThumb->bmpContent.getHeight(), pThumb->bmpContent.getDC(), 0, 0, SRCCOPY); //RepaintWindow(hwnd, (HDC)wParam); break; } case WM_MEASUREITEM: Menu_MeasureItem((LPMEASUREITEMSTRUCT)lParam); break; case WM_DRAWITEM: Menu_DrawItem((LPDRAWITEMSTRUCT)lParam); break; case WM_LBUTTONDOWN: if (pThumb) pThumb->OnLButtonDown(); break; case WM_MOUSEMOVE: if (pThumb) pThumb->OnMouseMove(LOWORD(lParam), HIWORD(lParam)); break; case WM_LBUTTONUP: if (pThumb) pThumb->OnLButtonUp(); break; case WM_LBUTTONDBLCLK: // Popup message dialog if (!fcOpt.bUseSingleClick && pThumb) pThumb->PopupMessageDialog(); break; case WM_RBUTTONDOWN: if (bEnableTip && fcOpt.bShowTip && pThumb) pThumb->KillTip(); break; case WM_REFRESH_CONTACT: if (pThumb) { _tcsncpy(pThumb->ptszName, pcli->pfnGetContactDisplayName(pThumb->hContact, 0), USERNAME_LEN - 1); pThumb->RefreshContactStatus((int)lParam); pThumb->ResizeThumb(); } break; case WM_TIMER: if (pThumb) pThumb->OnTimer(wParam); break; case WM_HOTKEY: pThumb = thumbList.FindThumb((HWND)wParam); if (pThumb) pThumb->PopupMessageDialog(); } return DefWindowProc(hwnd, uMsg, wParam, lParam); }
void ThumbInfo::ResizeThumb() { int index = FLT_FONTID_NOTONLIST; himlMiranda = Clist_GetImageList(); if (himlMiranda == nullptr) return; SIZEL sizeIcon; ImageList_GetIconSize_my(himlMiranda, sizeIcon); HDC hdc = GetWindowDC(hwnd); if (!db_get_b(hContact, "CList", "NotOnList", 0)) { char *szProto = GetContactProto(hContact); if (nullptr != szProto) { int nStatus = Proto_GetStatus(szProto); int nContactStatus = db_get_w(hContact, szProto, "Status", ID_STATUS_OFFLINE); int nApparentMode = db_get_w(hContact, szProto, "ApparentMode", 0); if ((nStatus == ID_STATUS_INVISIBLE && nApparentMode == ID_STATUS_ONLINE) || (nStatus != ID_STATUS_INVISIBLE && nApparentMode == ID_STATUS_OFFLINE)) { if (ID_STATUS_OFFLINE == nContactStatus) index = FLT_FONTID_OFFINVIS; else index = FLT_FONTID_INVIS; } else if (ID_STATUS_OFFLINE == nContactStatus) index = FLT_FONTID_OFFLINE; else index = FLT_FONTID_CONTACTS; } } else index = FLT_FONTID_NOTONLIST; HFONT hOldFont = (HFONT)SelectObject(hdc, hFont[index]); // Get text and icon sizes SIZEL sizeText; GetTextExtentPoint32(hdc, ptszName, (int)mir_wstrlen(ptszName), &sizeText); SelectObject(hdc, hOldFont); // Transform text size POINT ptText; ptText.x = sizeText.cx; ptText.y = sizeText.cy; LPtoDP(hdc, &ptText, 1); szSize.cx = fcOpt.bFixedWidth ? fcOpt.nThumbWidth : sizeIcon.cx + ptText.x + 10; szSize.cy = ((sizeIcon.cy > ptText.y) ? sizeIcon.cy : ptText.y) + 4; SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, szSize.cx, szSize.cy, SWP_NOMOVE | SWP_NOACTIVATE); RefreshContactIcon(0xFFFFFFFF); ReleaseDC(hwnd, hdc); // Move the docked widnow if needed ThumbInfo *pNextThumb = thumbList.FindThumb(dockOpt.hwndRight); if (pNextThumb) { RECT rcThumb; GetThumbRect(&rcThumb); pNextThumb->PositionThumb(rcThumb.right, rcThumb.top); } }