From 20d28e80a5c861a9d5f449ea911ab75b4f37ad0d Mon Sep 17 00:00:00 2001 From: Jef Date: Tue, 24 Sep 2024 14:54:57 +0200 Subject: Initial community commit --- Src/Winamp/Set.cpp | 1287 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 1287 insertions(+) create mode 100644 Src/Winamp/Set.cpp (limited to 'Src/Winamp/Set.cpp') diff --git a/Src/Winamp/Set.cpp b/Src/Winamp/Set.cpp new file mode 100644 index 00000000..fc0bdad8 --- /dev/null +++ b/Src/Winamp/Set.cpp @@ -0,0 +1,1287 @@ +/** (c) Nullsoft, Inc. C O N F I D E N T I A L + ** Filename: + ** Project: + ** Description: + ** Author: + ** Created: + **/ + +#include "Main.h" +#include "WinampAttributes.h" +#include "ExternalCOM.h" +#include "../nu/AutoWide.h" + +static int dc_pos=0; +extern int is_fullscreen_video; +extern int g_fsapp; + +static BOOL HasParent(HWND hwnd) +{ + return ((0 != (WS_CHILD & GetWindowLongPtrW(hwnd, GWL_STYLE))) && NULL != GetParent(hwnd)); +} + +void do_caption_autoscroll(void) +{ + wchar_t buf[4096]=L""; + if (dc_pos < (int)lstrlenW(caption)) + { + StringCchCopyW(buf,4096, caption+dc_pos); + StringCchCatW(buf,4096,L" *** "); + StringCchCopyW(buf+lstrlenW(buf),4096-lstrlenW(buf),caption); + dc_pos++; + } + else + { + StringCchCopyW(buf,4096,L" *** "+dc_pos-lstrlenW(caption)); + StringCchCatW(buf,4096, caption); + StringCchCopyW(buf+lstrlenW(buf),4096-lstrlenW(buf), L" *** "); + if (++dc_pos >= (int)lstrlenW(caption)+3) dc_pos=0; + } + SetWindowLong(hMainWindow,GWL_STYLE,GetWindowLongW(hMainWindow,GWL_STYLE)&~(WS_CAPTION)); + SetWindowTextW(hMainWindow,buf); + SetWindowLong(hMainWindow,GWL_STYLE,GetWindowLongW(hMainWindow,GWL_STYLE)|(WS_CAPTION)); +} + +void set_caption(int alt_cb, wchar_t *format, ...) +{ + va_list v; + if (format) + { + va_start(v,format); + StringCchVPrintfW(caption, CAPTION_SIZE, format, v); + va_end(v); + } + + SetWindowLong(hMainWindow,GWL_STYLE,GetWindowLongW(hMainWindow,GWL_STYLE)&~(WS_CAPTION)); + SetWindowTextW(hMainWindow,caption); + SetWindowLong(hMainWindow,GWL_STYLE,GetWindowLongW(hMainWindow,GWL_STYLE)|(WS_CAPTION)); + dc_pos=0; + if (systray_intray) systray_minimize(caption); + + // TODO in some cases this is crashing based on crash reports (issue with 'now playling' ??) + JSAPI1_CurrentTitleChanged(); + PostMessageW(hMainWindow,WM_WA_IPC,(!alt_cb?IPC_CB_MISC_TITLE:IPC_CB_MISC_TITLE_RATING),IPC_CB_MISC); + SendNotifyMessage(HWND_BROADCAST, songChangeBroadcastMessage, 0, 0); +} + +void set_taskbar(void) +{ + static int a; + if (config_taskbar == 1 || config_taskbar == 2) + { + systray_minimize(caption); + } + else + { + if (systray_intray) systray_restore(); + } + + ShowWindow(hMainWindow,SW_HIDE); + + if (config_taskbar == 1 || config_taskbar == 3) + SetWindowLong(hMainWindow,GWL_EXSTYLE,GetWindowLongW(hMainWindow,GWL_EXSTYLE)|WS_EX_TOOLWINDOW); + else + SetWindowLong(hMainWindow,GWL_EXSTYLE,GetWindowLongW(hMainWindow,GWL_EXSTYLE)&~WS_EX_TOOLWINDOW); + if (a) + { + extern int deferring_show; + if (!deferring_show) ShowWindow(hMainWindow,SW_SHOWNA); + } + a=1; +} + +// better enter embedcs before calling this func +static void doMyDirtyShitholeDockingShit(HWND myWnd, RECT newr, int sedge) // -1 to do all +{ + RECT oldr = {0}; + GetWindowRect(myWnd, &oldr); + if (myWnd == hMainWindow) + FixMainWindowRect(&oldr); + + for (int whichedge = 0; whichedge < 2; whichedge++) // not always used + { + int diff; + embedWindowState *p=embedwndlist; + + if (sedge >= 0) + whichedge=sedge; + + if (whichedge == 0) + diff=newr.bottom - oldr.bottom; + else + diff = newr.right - oldr.right; + + // move any windows docked to the bottom, bottom. recursively. + if (diff) for (int x = 0; ; x ++) + { + HWND dockwnd=NULL; + RECT oldrect; + int vis=0; + + if ( x == 0 ) + { + dockwnd = hMainWindow; + vis = config_mw_open; + } + else if ( x == 1 ) + { + dockwnd = hEQWindow; + vis = config_eq_open; + } + else if ( x == 2 ) + { + dockwnd = hPLWindow; + vis = config_pe_open; + } +//else if (x == 3) { dockwnd=hMBWindow; vis=0; } //config_mb_open; } + else if ( x == 4 ) + { + dockwnd = hVideoWindow; + vis = config_video_open; + } + else + { + if ( !p ) + break; + + dockwnd = p->me; + vis = IsWindowVisible( p->me ); + } + GetWindowRect(dockwnd,&oldrect); + if (!x) + FixMainWindowRect(&oldrect); + + if (dockwnd != myWnd) + { + int isdocked; + if (!whichedge) + isdocked=oldrect.top == oldr.bottom && ( + (oldrect.left >= oldr.left && oldrect.left < oldr.right) || + (oldrect.right > oldr.left && oldrect.right <= oldr.right) || + (oldr.left >= oldrect.left && oldr.left < oldrect.right) || + (oldr.right > oldrect.left && oldr.right <= oldrect.right) + ); + else + isdocked=oldrect.left == oldr.right && ( + (oldrect.top >= oldr.top && oldrect.top < oldr.bottom) || + (oldrect.bottom > oldr.top && oldrect.bottom <= oldr.bottom) || + (oldr.top >= oldrect.top && oldr.top < oldrect.bottom) || + (oldr.bottom > oldrect.top && oldr.bottom <= oldrect.bottom) + ); + + if (isdocked) + { + if ( x == 0 ) + { + if ( !whichedge ) + config_wy = newr.bottom; + else + config_wx = newr.right; + + EstMainWindowRect( &oldrect ); + } + else if ( x == 1 ) + { + if ( !whichedge ) + config_eq_wy = newr.bottom; + else + config_eq_wx = newr.right; + + EstEQWindowRect( &oldrect ); + } + else if ( x == 2 ) + { + if ( !whichedge ) + config_pe_wy = newr.bottom; + else + config_pe_wx = newr.right; + + EstPLWindowRect( &oldrect ); + } + else if ( x == 4 && !is_fullscreen_video ) + { + if ( !whichedge ) + config_video_wy = newr.bottom; + else + config_video_wx = newr.right; + + EstVidWindowRect( &oldrect ); + } + else + { + int w = p->r.right - p->r.left; + int h = p->r.bottom - p->r.top; + + if ( !whichedge ) + p->r.top = newr.bottom; + else + p->r.left = newr.right; + + p->r.right = p->r.left + w; + p->r.bottom = p->r.top + h; + oldrect = p->r; + } + + if ( vis ) + doMyDirtyShitholeDockingShit( dockwnd, oldrect, whichedge ); + } + } + + if (x>4) p=p->link; + } + + if (sedge >= 0) break; + } +} + +static void doScreenDockMoveSubWindows(HWND myWnd, RECT newr, int whichedge) +{ + RECT oldr = {0}; + embedWindowState *p=embedwndlist; + + GetWindowRect(myWnd,&oldr); + if (myWnd == hMainWindow) + FixMainWindowRect(&oldr); + + // move any windows docked to the bottom, bottom. recursively. + for (int x = 0; ; x ++) + { + HWND dockwnd=NULL; + RECT oldrect; + int vis=0; + RECT newrect; + if ( x == 0 ) + { + dockwnd = hMainWindow; + vis = config_mw_open; + EstMainWindowRect( &newrect ); + } + else if ( x == 1 ) + { + dockwnd = hEQWindow; + vis = config_eq_open; + EstEQWindowRect( &newrect ); + } + else if ( x == 2 ) + { + dockwnd = hPLWindow; + vis = config_pe_open; + EstPLWindowRect( &newrect ); + } +//else if (x == 3) { dockwnd=hMBWindow; vis=0;/*config_mb_open; */ EstMBWindowRect(&newrect); } + else if ( x == 4 ) + { + dockwnd = hVideoWindow; + vis = config_video_open; + EstVidWindowRect( &newrect ); + } + else + { + if ( !p ) + break; + + newrect = p->r; + dockwnd = p->me; + vis = IsWindowVisible( p->me ); + } + GetWindowRect(dockwnd,&oldrect); + if (!x) FixMainWindowRect(&oldrect); + + if (dockwnd != myWnd) + { + int isdocked; + if (!whichedge) + isdocked=oldrect.bottom == oldr.top && ( + (oldrect.left >= oldr.left && oldrect.left <= oldr.right) || + (oldrect.right >= oldr.left && oldrect.right <= oldr.right) || + (oldr.left >= oldrect.left && oldr.left <= oldrect.right) || + (oldr.right >= oldrect.left && oldr.right <= oldrect.right) + ); + else + isdocked=oldrect.right == oldr.left && ( + (oldrect.top >= oldr.top && oldrect.top <= oldr.bottom) || + (oldrect.bottom >= oldr.top && oldrect.bottom <= oldr.bottom) || + (oldr.top >= oldrect.top && oldr.top <= oldrect.bottom) || + (oldr.bottom >= oldrect.top && oldr.bottom <= oldrect.bottom) + ); + + if (isdocked) + { + int h=newrect.bottom-newrect.top; + int w=newrect.right-newrect.left; + if ( x == 0 ) + { + if ( !whichedge ) + config_wy = newr.top - h; + else + config_wx = newr.left - w; + + EstMainWindowRect( &oldrect ); + } + else if ( x == 1 ) + { + if ( !whichedge ) + config_eq_wy = newr.top - h; + else + config_eq_wx = newr.left - w; + + EstEQWindowRect( &oldrect ); + } + else if ( x == 2 ) + { + if ( !whichedge ) + config_pe_wy = newr.top - h; + else + config_pe_wx = newr.left - w; + + EstPLWindowRect( &oldrect ); + } + else if ( x == 4 && !is_fullscreen_video ) + { + if ( !whichedge ) + config_video_wy = newr.top - h; + else + config_video_wx = newr.left - w; + + EstVidWindowRect( &oldrect ); + } + else + { + int w = p->r.right - p->r.left; + int h = p->r.bottom - p->r.top; + + if ( !whichedge ) + p->r.top = newr.top - h; + else + p->r.left = newr.left - w; + + p->r.right = p->r.left + w; + p->r.bottom = p->r.top + h; + oldrect = p->r; + } + + if (vis) + doScreenDockMoveSubWindows(dockwnd,oldrect,whichedge); + } + } + + if (x>4) p=p->link; + } +} + +static void doScreenDock() +{ + //RECT vp; + //SystemParametersInfo(SPI_GETWORKAREA, 0, &vp, 0); //fixme: make sure we keep things in vp :) + for (int whichedge = 0; whichedge < 2; whichedge++) + { + embedWindowState *p=embedwndlist; + + // move any windows docked to the bottom, bottom. recursively. + for (int x = 0; ; x ++) + { + RECT vp; + HWND dockwnd=NULL; + RECT oldrect; + RECT newrect; + int at2side=0; + int vis=0; + if ( x == 0 ) + { + dockwnd = hMainWindow; + vis = config_mw_open; + EstMainWindowRect( &newrect ); + } + else if ( x == 1 ) + { + dockwnd = hEQWindow; + vis = config_eq_open; + EstEQWindowRect( &newrect ); + } + else if ( x == 2 ) + { + dockwnd = hPLWindow; + vis = config_pe_open; + EstPLWindowRect( &newrect ); + } +//else if (x == 3) { dockwnd=hMBWindow; vis=0; /*config_mb_open; */ EstMBWindowRect(&newrect); } + else if ( x == 4 ) + { + dockwnd = hVideoWindow; + vis = config_video_open; + EstVidWindowRect( &newrect ); + } + else + { + if ( !p ) + break; + + newrect = p->r; + dockwnd = p->me; + vis = IsWindowVisible( p->me ); + } + + GetWindowRect(dockwnd,&oldrect); + + if (!x) + FixMainWindowRect(&oldrect); + + getViewport(&vp,NULL,0,&oldrect); + + if (config_keeponscreen&1) + { + if (!whichedge) + at2side=oldrect.bottom == vp.bottom; + else + at2side=oldrect.right == vp.right; + } + + if (at2side) + { + if (!whichedge) + { + int diff=vp.bottom-newrect.bottom; + newrect.bottom += diff; + newrect.top += diff; + } + else + { + int diff=vp.right-newrect.right; + newrect.right += diff; + newrect.left += diff; + } + + if ( x == 0 ) + { + if ( !whichedge ) + config_wy = newrect.top; + else + config_wx = newrect.left; + + EstMainWindowRect( &oldrect ); + } + else if ( x == 1 ) + { + if ( !whichedge ) + config_eq_wy = newrect.top; + else + config_eq_wx = newrect.left; + + EstEQWindowRect( &oldrect ); + } + else if ( x == 2 ) + { + if ( !whichedge ) + config_pe_wy = newrect.top; + else + config_pe_wx = newrect.left; + + EstPLWindowRect( &oldrect ); + } +// else if (x == 3) { if (!whichedge) config_mb_wy = newrect.top; else config_mb_wx = newrect.left; EstMBWindowRect(&oldrect); } + else if ( x == 4 && !is_fullscreen_video ) + { + if ( !whichedge ) + config_video_wy = newrect.top; + else + config_video_wx = newrect.left; + + EstVidWindowRect( &oldrect ); + } + else + { + int w = p->r.right - p->r.left; + int h = p->r.bottom - p->r.top; + + if ( !whichedge ) + p->r.top = newrect.top; + else + p->r.left = newrect.left; + + p->r.right = p->r.left + w; + p->r.bottom = p->r.top + h; + oldrect = p->r; + } + + if (vis) + { + doScreenDockMoveSubWindows(dockwnd,oldrect,whichedge); + } + } + + if (x>4) p=p->link; + } + } +} + +void set_eq_wnd_tooltip() +{ + if (hEQTooltipWindow) + { + static int b=0; + TOOLINFOW ti = {0}; + RECT r_main; + EstEQWindowRect(&r_main); + ti.cbSize = sizeof(ti); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hEQWindow; + ti.rect = r_main; + + ti.uId = (UINT_PTR)hEQTooltipWindow; + ti.lpszText = (wchar_t*)LPSTR_TEXTCALLBACK; + if (b) SendMessageW(hEQTooltipWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hEQTooltipWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + + { + RECT rs[18]={{0},{0},{0},{0},{0},{0},{0},{0},{0},{0},{0}, + // toggle winshade / close button + {254,3,262,12},{264,3,272,12}, + // toggle eq, toggle auto, presets + {14,18,39,30},{39,18,72,30},{217,18,261,30}, + // windowshade volume and pan + {61,3,162,11},{163,3,206,11}}; + wchar_t buf[2048] = {0}; + getStringW(IDS_TOOLTIPS,buf,2048); + wchar_t *bands[11] = + { + L"", + L"70",L"180",L"320",L"600", // Hz + L"1",L"3",L"6",L"12",L"14",L"16" // KHz + }; + wchar_t *bandsISO[11] = + { + L"", + L"31.5",L"63",L"125",L"250", // Hz + L"500",L"1",L"2",L"4",L"8",L"16" // KHz + }; + + for (int x=0; x < sizeof(rs)/sizeof(rs[0]); x++) + { + if(x < 11){ + int xoffs; + if (!x) xoffs=21; + else xoffs=78+(x-1)*(96-78); + rs[x].left = xoffs; + rs[x].top = 39; + rs[x].right = xoffs+(33-21); + rs[x].bottom = 98; + } + + ti.uId = x; + if(!x) ti.lpszText = getStringW(IDS_PREAMP,NULL,0); + + else if(x > 15){ + if(config_eq_ws) + { + // re-use the main tooltip text and handle the 'toggle windowshade' and 'close' buttons as applicable + wchar_t buf[2048], *p=buf; + getStringW(IDS_TOOLTIPS,buf,2048); + ti.lpszText=(wchar_t*)SendMessageW(hMainWindow,WM_WA_IPC,(x - 4),IPC_CB_GETTOOLTIPW); + if (!ti.lpszText) ti.lpszText=AutoWide((char*)SendMessageW(hMainWindow,WM_WA_IPC,(x - 4),IPC_CB_GETTOOLTIP)); + if (!ti.lpszText){ + for(int i = 0; i < (x - 4); i++){ + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + } + } + } + else + ti.lpszText = 0; + } + else if(x > 12){ + wchar_t buf[2048], *p=buf; + getStringW(IDS_EQ_TOOLTIPS,buf,2048); + for(int i = 0; i < x - 12; i++){ + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + } + } + else if(x > 10){ + // re-use the main tooltip text and handle the 'toggle windowshade' and 'close' buttons as applicable + wchar_t buf[2048], *p=buf; + getStringW(IDS_TOOLTIPS,buf,2048); + ti.lpszText=(wchar_t*)SendMessageW(hMainWindow,WM_WA_IPC,x-11,IPC_CB_GETTOOLTIPW); + if (!ti.lpszText) ti.lpszText=AutoWide((char*)SendMessageW(hMainWindow,WM_WA_IPC,x-11,IPC_CB_GETTOOLTIP)); + if (!ti.lpszText){ + for(int i = 0; i < (x == 11 ? 1 : 3); i++){ + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + } + } + } + else{ + wchar_t HZStr[16] = {0}; + getStringW((x<5+!(config_eq_frequencies==EQ_FREQUENCIES_WINAMP)?IDS_EQ_HZ:IDS_EQ_KHZ),HZStr,16); + StringCchPrintfW(buf,80,L"%s%s", + ((config_eq_frequencies==EQ_FREQUENCIES_WINAMP)?bands[x]:bandsISO[x]), + (!x?L"":HZStr)); + ti.lpszText = buf; + } + + ti.rect = rs[x]; + if (config_dsize) + { + ti.rect.left *= 2; + ti.rect.right *= 2; + ti.rect.top *= 2; + ti.rect.bottom *= 2; + } + SendMessageW(hEQTooltipWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hEQTooltipWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + } + } + + b=config_ttips; + } +} + +void set_vid_wnd_tooltip() +{ + if (hVideoTooltipWindow) + { + static int d=0; + TOOLINFOW ti = {0}; + RECT r_main; + EstVidWindowRect(&r_main); + ti.cbSize = sizeof(ti); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hVideoWindow; + ti.rect = r_main; + + ti.uId = (UINT_PTR)hVideoTooltipWindow; + ti.lpszText = (wchar_t*)LPSTR_TEXTCALLBACK; + if (d) SendMessageW(hVideoTooltipWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hVideoTooltipWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + + { + RECT rs[]={{0,3,0,12},{9,0,24,0},{25,0,40,0},{41,0,56,0},{57,0,72,0},{73,0,89,0}}; + + rs[0].left = config_video_width-11; + rs[0].right = config_video_width-2; + + rs[1].top = rs[2].top = rs[3].top = rs[4].top = rs[5].top = config_video_height-29; + rs[1].bottom = rs[2].bottom = rs[3].bottom = rs[4].bottom = rs[5].bottom = config_video_height-11; + + wchar_t buf[2048], *p=buf; + getStringW(IDS_VID_TOOLTIPS,buf,2048); + for (int x=0; x < sizeof(rs)/sizeof(rs[0]); x++) + { + if(!x) + { + // re-use the main tooltip text and handle the 'toggle windowshade' and 'close' buttons as applicable + wchar_t buf2[2048], *p2=buf2; + getStringW(IDS_TOOLTIPS,buf2,2048); + for(int i = 0; i < 3; i++){ + ti.lpszText=p2; + while (p2 && *p2 && *p2 != L'|') p2++; + if (p2) *p2++=0; + } + } + else + { + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + } + ti.uId = x; + + ti.rect = rs[x]; + if (d) SendMessageW(hVideoTooltipWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hVideoTooltipWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + } + } + + d=config_ttips; + } +} + +void set_pl_wnd_tooltip() +{ + if (hPLTooltipWindow) + { + static int c=0; + TOOLINFOW ti = {0}; + RECT r_main; + EstPLWindowRect(&r_main); + ti.cbSize = sizeof(ti); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hPLWindow; + ti.rect = r_main; + + ti.uId = (UINT_PTR)hPLTooltipWindow; + ti.lpszText = (wchar_t*)LPSTR_TEXTCALLBACK; + if (c) SendMessageW(hPLWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hPLWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + + { + // toggle winshade / close button + RECT rs[]={{0,3,0,12},{0,3,0,12}, + // add, rem, sel, misc, list buttons + {14,0,36,0},{43,0,65,0},{72,0,94,0},{101,0,123,0},{0}, + // windowshade mappings - order is out of kilt so it maps more easily to the string + // (open, previuos, play, pause, stop, next, time) + {0},{0},{0},{0},{0},{0},{0}, + // up/down scroll buttons + {0},{0}, + // resize horizontally (winshade) + /*{0}, + // playlist item truncated text*/ + {0}}; + + rs[0].left = config_pe_width - 11; + rs[0].right = config_pe_width - 2; + + rs[1].left = config_pe_width - 21; + rs[1].right = config_pe_width - 12; + + rs[2].top = rs[3].top = rs[4].top = rs[5].top = rs[6].top = (config_pe_height - 30); + rs[2].bottom = rs[3].bottom = rs[4].bottom = rs[5].bottom = rs[6].bottom = (config_pe_height - 12); + + rs[6].left = config_pe_width - 44; + rs[6].right = config_pe_width - 22; + + rs[7].top = rs[8].top = rs[9].top = rs[10].top = rs[11].top = rs[12].top = rs[13].top = (config_pe_height - 16); + rs[7].bottom = rs[8].bottom = rs[9].bottom = rs[10].bottom = rs[11].bottom = rs[12].bottom = rs[13].bottom = (config_pe_height - 8); + + rs[7].left = config_pe_width - 98; + rs[7].right = config_pe_width - 90; + + rs[8].left = config_pe_width - 144; + rs[8].right = config_pe_width - 137; + rs[9].left = config_pe_width - 136; + rs[9].right = config_pe_width - 127; + rs[10].left = config_pe_width - 126; + rs[10].right = config_pe_width - 117; + rs[11].left = config_pe_width - 116; + rs[11].right = config_pe_width - 109; + rs[12].left = config_pe_width - 108; + rs[12].right = config_pe_width - 100; + rs[13].left = config_pe_width - 87; + rs[13].right = config_pe_width - 54; + + wchar_t buf[2048], *p=buf; + getStringW(IDS_PL_TOOLTIPS,buf,2048); + for (int x=0; x < sizeof(rs)/sizeof(rs[0]); x++) + { + if(x < 2) + { + // re-use the main tooltip text and handle the 'toggle windowshade' and 'close' buttons as applicable + wchar_t buf2[2048], *p2=buf2; + getStringW(IDS_TOOLTIPS,buf2,2048); + for(int i = 0; i < (x == 1 ? 1 : 3); i++){ + ti.lpszText=p2; + while (p2 && *p2 && *p2 != L'|') p2++; + if (p2) *p2++=0; + } + } + else if(x == 16){ + if(config_pe_height == 14) + { + rs[x].left = config_pe_width - 29; + rs[x].right = config_pe_width - 22; + rs[x].top = 3; + rs[x].bottom = 13; + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + } + else + ti.lpszText = 0; + } + else if(x >= 14) + { + rs[x].left = config_pe_width - 16; + rs[x].right = config_pe_width - 6; + rs[x].top = config_pe_height - (x == 14 ? 37 : 31); + rs[x].bottom = config_pe_height - (x == 14 ? 32 : 25); + + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + *p++=0; + } + else if(x > 6) + { + if (config_pe_height != 14) + { + wchar_t buf2[2048], *p2=buf2; + getStringW(IDS_TOOLTIPS,buf2,2048); + for(int i = 0; i < 17 + (x - 6); i++){ + ti.lpszText=p2; + while (p2 && *p2 && *p2 != L'|') p2++; + *p2++=0; + } + } + else + ti.lpszText = 0; + } + else + { + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + if (config_pe_height == 14 && x > 1) + ti.lpszText = 0; + } + ti.uId = x; + + ti.rect = rs[x]; + if (c) SendMessageW(hPLTooltipWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hPLTooltipWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + } + } + + c=config_ttips; + } +} + +void set_main_wnd_tooltip() +{ + if (hTooltipWindow) + { + static int a=0; + TOOLINFOW ti = {0}; + RECT r_main; + EstMainWindowRect(&r_main); + ti.cbSize = sizeof(ti); + ti.uFlags = TTF_SUBCLASS; + ti.hwnd = hMainWindow; + ti.rect = r_main; + + ti.uId = (UINT_PTR)hTooltipWindow; + ti.lpszText = (wchar_t*)LPSTR_TEXTCALLBACK; + if (a) SendMessageW(hTooltipWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hTooltipWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + + { + RECT rs[]={{254,3,262,12},{244,3,253,12},{264,3,272,12},{5,3,17,13}, + {219,58,219+23,58+12},{219+23,58,219+23+23,58+12}, + {11,24,19,31},{11,32,19,39},{11,40,19,47},{11,48,19,55},{11,56,19,62}, + {107,43+15,107+68,51+15},{177,43+15,177+38,51+15},{11+7,58+15,256+7,66+15},{133+7-4+29,75+15,181+7-4-4+29,87+15},{182+7-4-4+29,75+15,182+29+7-4-4+29,87+15}, + {246+7,76+15,258+7,90+15},{132+7-4+1,60+14+15,132+7-4+22+1,60+14+15+16}, + {7+8,15+72,7+31,15+91},{7+32,15+72,7+53,15+91},{7+54,15+72,7+77,15+91},{7+78,15+72,7+100,15+91},{7+101,15+72,7+123,15+91}, + {36,26,96,39},{105,24,266,35}, + // windowshade mappings - order is out of kilt so it maps more easily to the string + // (seeker, open, previuos, play, pause, stop, next, time) + {226,4,243,11},{216,2,224,11},{168,2,176,11},{177,2,186,11},{187,2,195,11},{196,2,204,11},{205,2,215,11},{125,4,157,10}}; + + wchar_t buf[2048], *p=buf; + getStringW(IDS_TOOLTIPS,buf,2048); + for (int x=0; x < sizeof(rs)/sizeof(rs[0]); x++) + { + ti.uId = x; + ti.lpszText=(wchar_t*)SendMessageW(hMainWindow,WM_WA_IPC,x,IPC_CB_GETTOOLTIPW); + if (!ti.lpszText) ti.lpszText=AutoWide((char*)SendMessageW(hMainWindow,WM_WA_IPC,x,IPC_CB_GETTOOLTIP)); + if (!ti.lpszText) ti.lpszText=p; + + int ws_parts = sizeof(rs)/sizeof(rs[0]) - 8; + if(x < ws_parts) + { + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + } + else + { + if(config_windowshade) + { + getStringW(IDS_TOOLTIPS,buf,2048); + p=buf; + for(int i = 0; i < (x - ws_parts == 0 ? 14 : x - 8); i++){ + ti.lpszText=p; + while (p && *p && *p != L'|') p++; + if (p) *p++=0; + } + } + else + ti.lpszText = 0; + } + ti.rect = rs[x]; + if (config_dsize) + { + ti.rect.left *= 2; + ti.rect.right *= 2; + ti.rect.top *= 2; + ti.rect.bottom *= 2; + } + if (a) SendMessageW(hTooltipWindow,TTM_DELTOOLW,0,(LPARAM) &ti); + if (config_ttips) SendMessageW(hTooltipWindow,TTM_ADDTOOLW,0,(LPARAM) &ti); + } + } + + a=config_ttips; + } +} + +void set_aot(int dodockingstuff) +{ + // do size handling stuff here + if (dodockingstuff>0) + { + //new mode is inspired by christophe's sexiness + RECT newr; + EnterCriticalSection(&embedcs); + EstMainWindowRect(&newr); + doMyDirtyShitholeDockingShit(hMainWindow,newr,-1); + EstEQWindowRect(&newr); + doMyDirtyShitholeDockingShit(hEQWindow,newr,-1); + EstPLWindowRect(&newr); + doMyDirtyShitholeDockingShit(hPLWindow,newr,-1); + + // check to see if any windows used to be docked to the right/bottom, and + // if they did, move them to the bottom and any attached windows + + // this actually works OK! + if ((config_keeponscreen&1) && !g_fsapp) doScreenDock(); + + LeaveCriticalSection(&embedcs); + } + + set_eq_wnd_tooltip(); + set_vid_wnd_tooltip(); + set_pl_wnd_tooltip(); + set_main_wnd_tooltip(); + + CheckMenuItem(main_menu,WINAMP_OPTIONS_AOT,config_aot?MF_CHECKED:MF_UNCHECKED); + CheckMenuItem(main_menu,WINAMP_OPTIONS_DSIZE,config_dsize?MF_CHECKED:MF_UNCHECKED); + + if ((config_keeponscreen&1) && !g_fsapp) + { + RECT r; + if (config_mw_open) + { + RECT thisr; + EstMainWindowRect( &thisr ); + getViewport( &r, NULL, 0, &thisr ); + + if ( config_wx + ( thisr.right - thisr.left - 10 ) < r.left ) + config_wx = r.left - ( thisr.right - thisr.left - 10 ); + + if ( config_wy + ( thisr.bottom - thisr.top - 10 ) < r.top ) + config_wy = r.top - ( thisr.bottom - thisr.top - 10 ); + + if (config_wx > r.right - 10) + config_wx = r.left + 10; //config_wx = r.right - 10; + + if (config_wy > r.bottom - 10) + config_wy = r.top + 10; //config_wy = r.bottom - 10; + } + + if (config_eq_open) + { + RECT thisr; + EstEQWindowRect( &thisr ); + getViewport( &r, NULL, 0, &thisr ); + + if ( config_eq_wx + ( thisr.right - thisr.left - 10 ) < r.left ) + config_eq_wx = r.left - ( thisr.right - thisr.left - 10 ); + + if ( config_eq_wy + ( thisr.bottom - thisr.top - 10 ) < r.top ) + config_eq_wy = r.top - ( thisr.bottom - thisr.top - 10 ); + + if (config_eq_wx > r.right - 10) + config_eq_wx = r.left + 10; //r.right - 10; + + if (config_eq_wy > r.bottom - 10) + config_eq_wy = r.top + 10; //r.bottom - 10; + } + + if (config_pe_open) + { + RECT thisr; + EstPLWindowRect( &thisr ); + getViewport( &r, NULL, 0, &thisr ); + + if ( config_pe_wx + ( thisr.right - thisr.left - 10 ) < r.left ) + config_pe_wx = r.left - ( thisr.right - thisr.left - 10 ); + + if ( config_pe_wy + ( thisr.bottom - thisr.top - 10 ) < r.top ) + config_pe_wy = r.top - ( thisr.bottom - thisr.top - 10 ); + + if (config_pe_wx > r.right - 10) + config_pe_wx = r.left + 10; //r.right - 10; + + if (config_pe_wy > r.bottom - 10) + config_pe_wy = r.top + 10; //r.bottom - 10; + } + + if (config_video_open && !is_fullscreen_video) + { + RECT thisr; + EstVidWindowRect( &thisr ); + getViewport( &r, NULL, 0, &thisr ); + + if ( config_video_wx + ( thisr.right - thisr.left - 10 ) < r.left ) + config_video_wx = r.left - ( thisr.right - thisr.left - 10 ); + + if ( config_video_wy + ( thisr.bottom - thisr.top - 10 ) < r.top ) + config_video_wy = r.top - ( thisr.bottom - thisr.top - 10 ); + + if (config_video_wx > r.right - 10) + config_video_wx = r.left + 10; //r.right - 10; + + if (config_video_wy > r.bottom - 10) + config_video_wy = r.top + 10; // r.bottom - 10; + } + EnterCriticalSection(&embedcs); + { + embedWindowState *p=embedwndlist; + while (p) + { + if (IsWindowVisible(p->me)) + { + RECT thisr = p->r; + getViewport( &r, NULL, 0, &thisr ); + if ( thisr.right < r.left - 10 ) + p->r.left = r.left - ( thisr.right - thisr.left - 10 ); + + if ( thisr.bottom < r.top - 10 ) + p->r.top = r.top - ( thisr.bottom - thisr.top - 10 ); + + if (thisr.left > r.right - 10) + p->r.left = r.left + 10; // r.right - 10; + + if (thisr.top > r.bottom - 10) + p->r.top = r.top + 10; // r.bottom - 10; + + p->r.right = p->r.left + (thisr.right - thisr.left); + p->r.bottom = p->r.top + (thisr.bottom - thisr.top); + } + p=p->link; + } + } + LeaveCriticalSection(&embedcs); + } + + { + HDWP hwdp=BeginDeferWindowPos(10); + RECT r; + int do_pl_inv=0; + extern int g_fsapp; + + EstMainWindowRect(&r); + if (config_aot) + { + if (g_fsapp) + { + if (config_dropaotfs) + { + hwdp=DeferWindowPos(hwdp,hMainWindow, HWND_NOTOPMOST, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE|(config_mw_open?0:SWP_NOMOVE|SWP_NOSIZE)); + } + else + { + hwdp=DeferWindowPos(hwdp,hMainWindow, HWND_TOPMOST, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE|(config_mw_open?0:SWP_NOMOVE|SWP_NOSIZE)); + } + } + else + { + hwdp=DeferWindowPos(hwdp,hMainWindow, HWND_TOPMOST, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE|(config_mw_open?0:SWP_NOMOVE|SWP_NOSIZE)); + } + } + else + { + hwdp=DeferWindowPos(hwdp,hMainWindow, HWND_NOTOPMOST, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE|(config_mw_open?0:SWP_NOMOVE|SWP_NOSIZE)); + } + + if (hEQWindow && !GetParent(hEQWindow)) // we check to see if the windows have no parent, for the gen_ff + { + EstEQWindowRect(&r); + hwdp=DeferWindowPos(hwdp,hEQWindow, 0, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE|SWP_NOZORDER); + } + + if (hPLWindow && !GetParent(hPLWindow)) + { + EstPLWindowRect(&r); + hwdp=DeferWindowPos(hwdp,hPLWindow, 0, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOACTIVATE|SWP_NOZORDER); + do_pl_inv=1; + } + +/* if (hMBWindow && !GetParent(hMBWindow)) + { + EstMBWindowRect(&r); + hwdp=DeferWindowPos(hwdp,hMBWindow, 0, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_DRAWFRAME|SWP_NOACTIVATE|SWP_NOZORDER); + }*/ + + if (hVideoWindow && !GetParent(hVideoWindow) && !is_fullscreen_video) + { + EstVidWindowRect(&r); + hwdp=DeferWindowPos(hwdp,hVideoWindow, 0, r.left, r.top, r.right-r.left, r.bottom-r.top, SWP_NOCOPYBITS|SWP_NOACTIVATE|SWP_NOZORDER); + } + + // traverse the embed windows + EnterCriticalSection(&embedcs); + { + embedWindowState *p=embedwndlist; + while (p) + { + if (!HasParent(p->me)) + hwdp=DeferWindowPos(hwdp,p->me, 0, p->r.left, p->r.top, p->r.right-p->r.left, p->r.bottom-p->r.top, SWP_DRAWFRAME|SWP_NOACTIVATE|SWP_NOZORDER); + + p=p->link; + } + } + LeaveCriticalSection(&embedcs); + + EndDeferWindowPos(hwdp); + + if(do_pl_inv) + InvalidateRect(hPLWindow,NULL,FALSE); // fix pl bug? + } + + // region + if (!config_minimized && config_mw_open) + { + HRGN lasthrgn=NULL; + int *plist=0, *nlist=0, len=0; + + if (skin_directory[0]) + len = Skin_GetRegionPointList(0,&plist,&nlist); + else + len=0; + + if (len) + { + POINT *points; + int x; + int a=config_dsize?1:0; + int ma=0; + for (x=0; x < len; x ++) + ma+=nlist[x]; + points= (POINT *) GlobalAlloc(GPTR,sizeof(POINT) * ma); + for (x = 0; x < ma; x ++) + { + points[x].x = *plist++<= 350 && config_pe_height != 14 ? 72 : 0); + h=16; + SetWindowPos(hPLVisWindow,0,x,y,w,h,SWP_NOZORDER|SWP_NOACTIVATE); + } + + draw_clutterbar(0); + SendMessageW(hMainWindow, WM_WA_IPC, config_aot, IPC_CB_ONTOGGLEAOT); +} + +void set_visopts(void) +{ + if (prefs_last_page == 22 && IsWindow(prefs_hwnd)) + { + prefs_last_page=0; + prefs_dialog(1); + prefs_last_page=22; + prefs_dialog(1); + } +} + +void set_priority(void) +{ + int tab[5]={IDLE_PRIORITY_CLASS,NORMAL_PRIORITY_CLASS,ABOVE_NORMAL_PRIORITY_CLASS,HIGH_PRIORITY_CLASS,REALTIME_PRIORITY_CLASS}; + if (config_priority > 4) config_priority=1; + SetPriorityClass(GetCurrentProcess(),tab[config_priority]); +} \ No newline at end of file -- cgit