123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458 |
- /*
- ** Copyright © 2003-2014 Winamp SA
- **
- ** This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held
- ** liable for any damages arising from the use of this software.
- **
- ** Permission is granted to anyone to use this software for any purpose, including commercial applications, and to
- ** alter it and redistribute it freely, subject to the following restrictions:
- **
- ** 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software.
- ** If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
- **
- ** 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
- **
- ** 3. This notice may not be removed or altered from any source distribution.
- **
- */
- #ifndef _WA_DLG_H_
- #define _WA_DLG_H_
- #include "wa_ipc.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- /*
- 1) gen.bmp has a generic window frame for plugins to use.
- its format is similar to the minibrowser's.
- In addition gen.bmp includes a font for the titlebar, in both
- highlight and no-highlight modes. The font is variable width,
- and it uses the first color before the letter A as the delimiter.
- The no-highlight form of letter must be the same width as the
- highlight form.
- 2) genex.bmp has button and scrollbar images, as well as some individual
- pixels that describe the colors for the dialog. The button and
- scrollbar images should be self explanatory (note that the buttons
- have 4 pixel sized edges that are not stretched, and the center is
- stretched), and the scrollbars do something similar.
- The colors start at (48,0) and run every other pixel. The meaning
- of each pixel is:
- x=48: item background (background to edits, listviews etc)
- x=50: item foreground (text color of edit/listview, etc)
- x=52: window background (used to set the bg color for the dialog)
- x=54: button text color
- x=56: window text color
- x=58: color of dividers and sunken borders
- x=60: selection color for playlists
- x=62: listview header background color
- x=64: listview header text color
- x=66: listview header frame top color
- x=68: listview header frame middle color
- x=70: listview header frame bottom color
- x=72: listview header empty color
- x=74: scrollbar foreground color
- x=76: scrollbar background color
- x=78: inverse scrollbar foreground color
- x=80: inverse scrollbar background color
- x=82: scrollbar dead area color
- x=84: listview/treeview selection bar text color (active)
- x=86: listview/treeview selection bar back color (active)
- x=88: listview/treeview selection bar text color (inactive)
- x=90: listview/treeview selection bar back color (inactive)
- x=92: listview header alternating background color (added with 5.55+ or will revert to x=48)
- x=94: listview header alternating text color (added with 5.55+ or will revert to x=50)
- */
- #define DCW_SUNKENBORDER 0x00010000
- #define DCW_DIVIDER 0x00020000
- enum
- {
- WADLG_ITEMBG,
- WADLG_ITEMFG,
- WADLG_WNDBG,
- WADLG_BUTTONFG,
- WADLG_WNDFG,
- WADLG_HILITE,
- WADLG_SELCOLOR,
- WADLG_LISTHEADER_BGCOLOR,
- WADLG_LISTHEADER_FONTCOLOR,
- WADLG_LISTHEADER_FRAME_TOPCOLOR,
- WADLG_LISTHEADER_FRAME_MIDDLECOLOR,
- WADLG_LISTHEADER_FRAME_BOTTOMCOLOR,
- WADLG_LISTHEADER_EMPTY_BGCOLOR,
- WADLG_SCROLLBAR_FGCOLOR,
- WADLG_SCROLLBAR_BGCOLOR,
- WADLG_SCROLLBAR_INV_FGCOLOR,
- WADLG_SCROLLBAR_INV_BGCOLOR,
- WADLG_SCROLLBAR_DEADAREA_COLOR,
- WADLG_SELBAR_FGCOLOR,
- WADLG_SELBAR_BGCOLOR,
- WADLG_INACT_SELBAR_FGCOLOR,
- WADLG_INACT_SELBAR_BGCOLOR,
- WADLG_ITEMBG2, // added with 5.55+ (otherwise will revert to WADLG_ITEMBG)
- WADLG_ITEMFG2, // added with 5.55+ (otherwise will revert to WADLG_ITEMBG)
- WADLG_NUM_COLORS
- };
- typedef enum _WACURSOR // used in IPC_GETSKINCURSORS
- {
- WACURSOR_VOLUME = 0, // volume & balane
- WACURSOR_POSITION = 1, // position
- WACURSOR_BTN_WINSHADE = 2, // winshade
- WACURSOR_BTN_MINIMIZE = 3, // minimize
- WACURSOR_BTN_CLOSE = 4, // close
- WACURSOR_MENU = 5, // main menu
- WACURSOR_TITLEBAR = 6, // title bar
- WACURSOR_SONGNAME = 7,
- WACURSOR_NORMAL = 8,
- WACURSOR_WINSHADE_BTN_WINSHADE = 9,
- WACURSOR_WINSHADE_BTN_MINIMIZE = 10,
- WACURSOR_WINSHADE_POSITION = 11,
- WACURSOR_WINSHADE_BTN_CLOSE = 12,
- WACURSOR_WINSHADE_MENU = 13,
- WACURSOR_WINSHADE_NORMAL = 14,
- WACURSOR_PL_BTN_WINSHADE = 15,
- WACURSOR_PL_BTN_CLOSE = 16,
- WACURSOR_PL_TITLEBAR = 17,
- WACURSOR_PL_VSCROLL = 18,
- WACURSOR_PL_RESIZE = 19,
- WACURSOR_PL_NORMAL = 20,
- WACURSOR_PL_WINSHADE_BTN_WINSHADE = 21,
- WACURSOR_PL_WINSHADE_BTN_CLOSE = 22,
- WACURSOR_PL_WINSHADE_HSIZE = 23,
- WACURSOR_PL_WINSHADE_NORMAL = 24,
- WACURSOR_EQ_SLIDER = 25,
- WACURSOR_EQ_BTN_CLOSE = 26,
- WACURSOR_EQ_TITLEBAR = 27,
- WACURSOR_EQ_NORMAL = 28,
- } WACURSOR;
- void WADlg_init(HWND hwndWinamp); // call this on init, or on WM_DISPLAYCHANGE
- int WADlg_initted();
- void WADlg_close();
- int WADlg_getColor(int idx);
- HBITMAP WADlg_getBitmap();
- void WADlg_setSolidBorder(int solidborder);
- LRESULT WADlg_handleDialogMsgs(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam); //
- void WADlg_DrawChildWindowBorders(HWND hwndDlg, int *tab, int tabsize); // each entry in tab would be the id | DCW_*
- #ifdef __cplusplus
- }
- #endif
- #endif//_WA_DLG_H_
- // define WA_DLG_IMPLEMENT in one of your source files before including this .h
- // if you are making a media library plugin, you dont need to do this, look at view_ex for
- // an example of how to get the function *'s via an IPC message.
- #if (defined WA_DLG_IMPLEMENT && !defined WA_DLG_IMPLEMENT_DONE)
- #define WA_DLG_IMPLEMENT_DONE
- #ifdef __cplusplus
- extern "C" {
- #endif
- static int wadlg_solidborder=0;
- static HBRUSH wadlg_lastbrush=0;
- static HBITMAP wadlg_bitmap=0; // load this manually
- static int wadlg_colors[WADLG_NUM_COLORS];
- static int wadlg_defcolors[WADLG_NUM_COLORS]=
- {
- RGB(0,0,0),
- RGB(0,255,0),
- RGB(36,36,60),
- RGB(57,56,66),
- RGB(255,255,255),
- RGB(132,148,165),
- RGB(0,0,198),
- RGB(72,72,120),
- RGB(255,255,255),
- RGB(108,108,180),
- RGB(36,36,60),
- RGB(18,18,30),
- RGB(36,36,60),
- RGB(36,36,60),
- RGB(36,36,60),
- RGB(121,130,150),
- RGB(78,88,110),
- RGB(36,36,60),
- RGB(255,255,255),
- RGB(0,0,180),
- RGB(0,255,0),
- RGB(0,0,128),
- RGB(0,0,0),
- RGB(0,255,0),
- };
- int WADlg_initted()
- {
- return !!wadlg_bitmap;
- }
- int WADlg_getColor(int idx)
- {
- if (idx < 0 || idx >= WADLG_NUM_COLORS) return 0;
- return wadlg_colors[idx];
- }
- HBITMAP WADlg_getBitmap()
- {
- return wadlg_bitmap;
- }
- // set this to draw the border all the way around the control
- void WADlg_setSolidBorder(int solidborder)
- {
- wadlg_solidborder = solidborder;
- }
- void WADlg_init(HWND hwndWinamp) // call this on init, or on WM_DISPLAYCHANGE
- {
- if (wadlg_bitmap) DeleteObject(wadlg_bitmap);
- wadlg_bitmap = (HBITMAP) SendMessage(hwndWinamp,WM_WA_IPC,0,IPC_GET_GENSKINBITMAP);
- if (wadlg_bitmap)
- {
- HDC tmpDC=CreateCompatibleDC(NULL);
- HGDIOBJ o=SelectObject(tmpDC,(HGDIOBJ)wadlg_bitmap);
- int defbgcol=GetPixel(tmpDC,111,0);
- for (int x = 0; x < WADLG_NUM_COLORS; x ++)
- {
- int a=GetPixel(tmpDC,48+x*2,0);
- if (a == CLR_INVALID || a == RGB(0,198,255) || a == defbgcol)
- {
- //defaults for old skins
- if (x == WADLG_SELBAR_FGCOLOR || x == WADLG_INACT_SELBAR_FGCOLOR) a=wadlg_colors[WADLG_WNDFG];
- else if (x == WADLG_SELBAR_BGCOLOR || x == WADLG_INACT_SELBAR_BGCOLOR)
- {
- a=wadlg_colors[WADLG_SELCOLOR];
- if (x == WADLG_INACT_SELBAR_BGCOLOR)
- a=((a/2)&0x7F7F7F)+(((wadlg_colors[WADLG_WNDBG])/2)&0x7F7F7F);
- }
- else if (x == WADLG_ITEMBG2)
- {
- a=wadlg_colors[WADLG_ITEMBG];
- }
- else if (x == WADLG_ITEMFG2)
- {
- a=wadlg_colors[WADLG_ITEMFG];
- }
- else a=wadlg_defcolors[x];
- }
- wadlg_colors[x]=a;
- }
- SelectObject(tmpDC,o);
- DeleteDC(tmpDC);
- }
- }
- void WADlg_close()
- {
- if (wadlg_bitmap) DeleteObject(wadlg_bitmap);
- wadlg_bitmap=0;
- if (wadlg_lastbrush) DeleteObject(wadlg_lastbrush);
- wadlg_lastbrush=0;
- }
- void WADlg_dotLine(HDC hdc, int left, int top, int len, int vert)
- {
- for (int i=(top&1);i<len-1;i+=2)
- {
- if (vert)
- {
- MoveToEx(hdc,left,top+i,NULL);
- LineTo(hdc,left,top+i+1);
- }
- else
- {
- MoveToEx(hdc,left+i,top,NULL);
- LineTo(hdc,left+i+1,top);
- }
- }
- }
- LRESULT WADlg_handleDialogMsgs(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
- {
- if (uMsg == WM_DRAWITEM)
- {
- DRAWITEMSTRUCT *di = (DRAWITEMSTRUCT *)lParam;
- if (di->CtlType == ODT_BUTTON)
- {
- wchar_t wt[256] = {0};
- GetDlgItemTextW(hwndDlg,(INT)wParam,wt,ARRAYSIZE(wt));
- HDC hdc = CreateCompatibleDC(di->hDC);
- HBITMAP hbmpOld = (HBITMAP)SelectObject(hdc, wadlg_bitmap);
- RECT r=di->rcItem;
- SetStretchBltMode(di->hDC,COLORONCOLOR);
- int yoffs = (di->itemState & ODS_SELECTED) ? 15 : 0;
- BitBlt(di->hDC,r.left,r.top,4,4,hdc,0,yoffs,SRCCOPY); // top left
- StretchBlt(di->hDC,r.left+4,r.top,r.right-r.left-4-4,4,hdc,4,yoffs,47-4-4,4,SRCCOPY); // top center
- BitBlt(di->hDC,r.right-4,r.top,4,4,hdc,47-4,yoffs,SRCCOPY); // top right
- StretchBlt(di->hDC,r.left,r.top+4,4,r.bottom-r.top-4-4,hdc,0,4+yoffs,4,15-4-4,SRCCOPY); // left edge
- StretchBlt(di->hDC,r.right-4,r.top+4,4,r.bottom-r.top-4-4,hdc,47-4,4+yoffs,4,15-4-4,SRCCOPY); // right edge
- // center
- StretchBlt(di->hDC,r.left+4,r.top+4,r.right-r.left-4-4,r.bottom-r.top-4-4,hdc,4,4+yoffs,47-4-4,15-4-4,SRCCOPY);
- BitBlt(di->hDC,r.left,r.bottom-4,4,4,hdc,0,15-4+yoffs,SRCCOPY); // bottom left
- StretchBlt(di->hDC,r.left+4,r.bottom-4,r.right-r.left-4-4,4,hdc,4,15-4+yoffs,47-4-4,4,SRCCOPY); // bottom center
- BitBlt(di->hDC,r.right-4,r.bottom-4,4,4,hdc,47-4,15-4+yoffs,SRCCOPY); // bottom right
- // draw text
- SetBkMode(di->hDC,TRANSPARENT);
- // this will do a different style for the button text depending on enabled state of the button
- COLORREF colour = wadlg_colors[WADLG_BUTTONFG];
- if (!IsWindowEnabled(di->hwndItem))
- {
- COLORREF fg = wadlg_colors[WADLG_WNDFG],
- bg = wadlg_colors[WADLG_WNDBG];
- colour = RGB((GetRValue(fg)+GetRValue(bg))/2,
- (GetGValue(fg)+GetGValue(bg))/2,
- (GetBValue(fg)+GetBValue(bg))/2);
- }
- SetTextColor(di->hDC,colour);
- if (di->itemState & ODS_SELECTED) {r.left+=2; r.top+=2;}
- r.right -= 4; r.left += 5;
- DrawTextW(di->hDC,wt,-1,&r,DT_VCENTER|DT_SINGLELINE|DT_CENTER|DT_END_ELLIPSIS);
- r.right += 4; r.left -= 5;
- SelectObject(hdc, hbmpOld);
- DeleteDC(hdc);
- if (GetFocus()==di->hwndItem)
- {
- HPEN hpen = CreatePen(PS_SOLID,0,RGB(0,0,0));
- HPEN hpenOld = (HPEN)SelectObject(di->hDC, hpen);
- WADlg_dotLine(di->hDC,r.left+2,r.top+2,r.right-r.left-3,0);
- WADlg_dotLine(di->hDC,r.right-3,r.top+2,r.bottom-r.top-3,1);
- WADlg_dotLine(di->hDC,r.left+2,r.top+2,r.bottom-r.top-3,1);
- WADlg_dotLine(di->hDC,r.left+2,r.bottom-3,r.right-r.left-3,0);
- SelectObject(di->hDC, hpenOld);
- DeleteObject(hpen);
- }
- }
- }
- switch (uMsg)
- {
- case WM_CTLCOLORLISTBOX:
- case WM_CTLCOLORDLG:
- case WM_CTLCOLORBTN:
- case WM_CTLCOLORSTATIC:
- case WM_CTLCOLOREDIT:
- {
- int bgcolor=(uMsg == WM_CTLCOLOREDIT || uMsg == WM_CTLCOLORLISTBOX) ? wadlg_colors[WADLG_ITEMBG] : (uMsg == WM_CTLCOLORBTN ? wadlg_colors[WADLG_ITEMBG] : wadlg_colors[WADLG_WNDBG]);
- LOGBRUSH lb={BS_SOLID,GetNearestColor((HDC)wParam,bgcolor)};
- if (wadlg_lastbrush) DeleteObject(wadlg_lastbrush);
- wadlg_lastbrush=CreateBrushIndirect(&lb);
- SetTextColor((HDC)wParam,uMsg == WM_CTLCOLORSTATIC ? wadlg_colors[WADLG_WNDFG] : wadlg_colors[WADLG_ITEMFG]);
- SetBkColor((HDC)wParam,lb.lbColor);
- return (LRESULT)wadlg_lastbrush;
- }
- }
- return 0;
- }
- static int RectInRect(RECT *rect1, RECT *rect2)
- {
- // this has a bias towards true
- // this could probably be optimized a lot
- return ((rect1->top >= rect2->top && rect1->top <= rect2->bottom) ||
- (rect1->bottom >= rect2->top && rect1->bottom <= rect2->bottom) ||
- (rect2->top >= rect1->top && rect2->top <= rect1->bottom) ||
- (rect2->bottom >= rect1->top && rect2->bottom <= rect1->bottom)) // vertical intersect
- &&
- ((rect1->left >= rect2->left && rect1->left <= rect2->right) ||
- (rect1->right >= rect2->left && rect1->right <= rect2->right) ||
- (rect2->left >= rect1->left && rect2->left <= rect1->right) ||
- (rect2->right >= rect1->left && rect2->right <= rect1->right)) // horiz intersect
- ;
- }
- static void WADlg_removeFromRgn(HRGN hrgn, int left, int top, int right, int bottom)
- {
- HRGN rgn2=CreateRectRgn(left,top,right,bottom);
- CombineRgn(hrgn,hrgn,rgn2,RGN_DIFF);
- DeleteObject(rgn2);
- }
- void WADlg_DrawChildWindowBorders(HWND hwndDlg, int *tab, int tabsize)
- {
- PAINTSTRUCT ps={0};
- BeginPaint(hwndDlg,&ps);
- HRGN hrgn = (ps.fErase) ? CreateRectRgnIndirect(&ps.rcPaint) : NULL;
- HPEN pen = CreatePen(PS_SOLID, 0, wadlg_colors[WADLG_HILITE]);
- HGDIOBJ o = SelectObject(ps.hdc, pen);
- while (tabsize--)
- {
- RECT r = {0};
- int a = *tab++;
- GetWindowRect(GetDlgItem(hwndDlg, a & 0xffff),&r);
- MapWindowPoints(HWND_DESKTOP, hwndDlg, (LPPOINT)&r, 2);
- if (RectInRect(&ps.rcPaint,&r))
- {
- if ((a & 0xffff0000) == DCW_SUNKENBORDER)
- {
- MoveToEx(ps.hdc,r.left,r.bottom,NULL);
- LineTo(ps.hdc,r.right,r.bottom);
- LineTo(ps.hdc,r.right,r.top-1);
- if (hrgn)
- {
- WADlg_removeFromRgn(hrgn,r.left,r.bottom,r.right,r.bottom+1);
- WADlg_removeFromRgn(hrgn,r.right,r.top,r.right+1,r.bottom);
- }
- }
- else if ((a & 0xffff0000) == DCW_DIVIDER)
- {
- if (r.right - r.left < r.bottom - r.top) // vertical
- {
- int left=(r.left+r.right)/2;
- MoveToEx(ps.hdc,left,r.top,NULL);
- LineTo(ps.hdc,left,r.bottom+1);
- if (hrgn) WADlg_removeFromRgn(hrgn,left,r.top,left+1,r.bottom);
- }
- else // horiz
- {
- int top=(r.top+r.bottom)/2;
- MoveToEx(ps.hdc,r.left,top,NULL);
- LineTo(ps.hdc,r.right+1,top);
- if (hrgn) WADlg_removeFromRgn(hrgn,r.left,top,r.right,top+1);
- }
- }
- }
- }
- SelectObject(ps.hdc, o);
- DeleteObject(pen);
- if(hrgn)
- {
- //erase bkgnd while clipping out our own drawn stuff (for flickerless display)
- HBRUSH b = CreateSolidBrush(wadlg_colors[WADLG_WNDBG]);
- FillRgn(ps.hdc,hrgn,b);
- DeleteObject(b);
- DeleteObject(hrgn);
- }
- EndPaint(hwndDlg,&ps);
- }
- #ifdef __cplusplus
- }
- #endif
- #endif // WA_DLG_IMPLEMENT
|