rtoss - Blame information for rev 359

Subversion Repositories:
Rev:
Rev Author Line No. Line
181 roytam 1 /* ----------------------------------------------------------------------------
2  
3     gen_tbar
4     ========
5     Winamp plugin to display customizable data on window captions
6  
7     Copyright (c) 1999-2000 Jos van den Oever (http://www.vandenoever.info/)
8     Copyright (c) 2005 Martin Zuther (http://www.mzuther.de/)
9  
10     This program is free software; you can redistribute it and/or modify
11     it under the terms of the GNU General Public License as published by
12     the Free Software Foundation; either version 2 of the License, or
13     (at your option) any later version.
14  
15     This program is distributed in the hope that it will be useful,
16     but WITHOUT ANY WARRANTY; without even the implied warranty of
17     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18     GNU General Public License for more details.
19  
20     You should have received a copy of the GNU General Public License
21     along with this program; if not, write to the Free Software
22     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
23  
24 -------------------------------------------------------------------------------
25  
26     Notify CD Player
27     ================
28     Copyright (c) 1996-1997 Mats Ljungqvist (mlt@cyberdude.com)
29  
30     StdString
31     =========
32     Copyright (c) 2002 Joseph M. O'Leary.  This code is 100% free.  Use it
33     anywhere you want. Rewrite it, restructure it, whatever.  If you can write
34     software that makes money off of it, good for you.  I kinda like capitalism.
35     Please don't blame me if it causes your $30 billion dollar satellite explode
36     in orbit. If you redistribute it in any form, I'd appreciate it if you would
37     leave this notice here.
38  
39 ---------------------------------------------------------------------------- */
40  
41 #include "titleinfo.h"
42  
43 TitleInfo::TitleInfo()
44 {
45         strTitleText.Empty();
46  
47         bShowPlayStatus = false;
359 roytam 48         bODInited = false;
181 roytam 49  
50         pSearchCaption = new CStdString[10];
51  
52         for (int i=0; i < 10; i++)
53                 pSearchCaption[i].Empty();
54 }
55  
56 TitleInfo::~TitleInfo()
57 {
58         delete[] pSearchCaption;
59         pSearchCaption = NULL;
60 }
61  
62 void TitleInfo::updateCaption(HWND hWnd)
63 {
64         CStdString strWindowText;
65         GetWindowText(hWnd, strWindowText.GetBuffer(512), 512);
66         strWindowText.ReleaseBuffer();
67  
68         if (!isStringInCaption(strWindowText))
69         {
70                 #define PREVENT_XP_DISPLAY_BUG true
71  
72                 if (PREVENT_XP_DISPLAY_BUG)
73                 {
74                         // Prevents "XP display bug", but behaves strange with browsers based on newer versions of Mozilla (don't ask me why...)
75                         SetWindowPos(hWnd, NULL, NULL, NULL, NULL, NULL, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
76                 }
77                 else
78                 {
79                         DefWindowProc(hWnd, WM_NCACTIVATE, (WPARAM) true, 0);
80                 }
81  
82         }
83 }
84  
85 void TitleInfo::drawOnCaption()
86 {
87         HWND hForegroundWnd = GetForegroundWindow();
88         CStdString strName;
89         unsigned int nStyle;
90         unsigned int nExStyle;
91  
92         if (!hForegroundWnd || strTitleText.IsEmpty())
93                 return;
94  
95         // Find out the actual parent of this foreground window
96         // in case it is a popup window with a caption
97         if (GetParent(hForegroundWnd))
98         {
99                 HWND hWnd;
100  
101                 hWnd = GetParent(hForegroundWnd);
102                 while(hWnd)
103                 {
104                         hForegroundWnd = hWnd;
105                         hWnd = GetParent(hForegroundWnd);
106                 }
107         }
108  
109         // Check if we are supposed to draw this info
110         // the window must have a titlebar and must not be a toolwindow
111         // it must not be setup.exe or winver.exe (#32770) and not
112         // the Windows Taskbar (Shell_TrayWnd)
113         // it also mustn't be a Winamp window (Winamp v1.x).
114         GetClassName(hForegroundWnd, strName.GetBuffer(80), 80);
115         strName.ReleaseBuffer();
116  
117         // patch from Darren Owen (problems with command line option "/class")
182 roytam 118         if((strName != _T("Winamp PE")) && (strName != _T("Winamp v1.x")))
119                 if(FindWindowEx(hForegroundWnd,0,_T("WinampVis"),0))
181 roytam 120                         return;
121         // patch end
122  
123         nStyle = GetWindowLong(hForegroundWnd, GWL_STYLE);
124         nExStyle = GetWindowLong(hForegroundWnd, GWL_EXSTYLE);
125  
182 roytam 126         if ((nStyle & WS_CAPTION) == WS_CAPTION && !(nExStyle & WS_EX_TOOLWINDOW) && (strName != _T("#32770")) &&
127                 (strName != _T("Shell_TrayWnd")) && (strName != _T("Winamp v1.x")) && (strName != _T("Winamp EQ")) &&
128                 (strName != _T("Winamp PE")) && (strName != _T("Winamp MB"))
183 roytam 129                  /*&& (strName != _T("Chrome_WidgetWin_0"))*/ ) // chrome hack
181 roytam 130         {
131                 drawCaption(hForegroundWnd, nStyle);
132         }
133 }
134  
135 void TitleInfo::drawCaption(HWND hForegroundWnd, unsigned int nStyle)
136 {
137         CStdString strWindowText;
138         GetWindowText(hForegroundWnd, strWindowText.GetBuffer(512), 512);
139         strWindowText.ReleaseBuffer();
140  
141         if (!isStringInCaption(strWindowText))
142         {
143                 CStdString strTrackNumber;
144  
145                 int nLeft;
146                 int nLeftSpace = 0;
147                 int nRightSpace = 10;
148                 int nDrawCaptionPos = 0;
149  
150                 RECT sDrawRectTitle;
151                 RECT sRect;
152  
153                 SIZE sTempSize;
154                 SIZE sTitleSize;
155  
156                 NONCLIENTMETRICS sMetrics;
157                 HFONT hDrawFont;
158  
159                 sMetrics.cbSize = sizeof(sMetrics);
160                 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &sMetrics, FALSE);
161  
162                 // First we need to calculate the actual length of the active window text
163                 HDC hDC   = GetWindowDC(hForegroundWnd);
164                 hDrawFont = CreateFontIndirect(&sMetrics.lfCaptionFont);
165                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
166                 GetTextExtentPoint32(hDC, strWindowText, strWindowText.GetLength(), &sTempSize);
167                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
168                 DeleteObject(hDrawFont);
169  
170                 // Now use the user defined font
171                 hDrawFont = CreateFontIndirect(&sCaptionFont);
172                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
173                 GetWindowRect(hForegroundWnd, &sRect);
174                 GetTextExtentPoint32(hDC, strTitleText, strTitleText.GetLength(), &sTitleSize);
175  
176                 // Close button
177                 if ((nStyle & WS_SYSMENU) == WS_SYSMENU)
178                 {
179                         int nTemp        = GetSystemMetrics(SM_CXSIZE);
180                         nRightSpace     += nTemp;
181                         nLeftSpace      += nTemp;
182                 }
183  
184                 if ((nStyle & WS_MINIMIZEBOX) == WS_MINIMIZEBOX || (nStyle & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX)
185                 {
186                         int nTemp        = GetSystemMetrics(SM_CXSIZE);
187                         nRightSpace     += 2 * nTemp;
188                 }
189  
190                 if ((nStyle & WS_BORDER) == WS_BORDER && !((nStyle & WS_MAXIMIZE) == WS_MAXIMIZE))
191                 {
192                         int nTemp        = GetSystemMetrics(SM_CXBORDER);
193                         nRightSpace     += nTemp;
194                         nLeftSpace      += nTemp;
195                         nDrawCaptionPos += nTemp;
196                 }
197  
198                 if ((nStyle & WS_THICKFRAME) == WS_THICKFRAME && !((nStyle & WS_MAXIMIZE) == WS_MAXIMIZE))
199                 {
200                         int nTemp        = GetSystemMetrics(SM_CXFRAME);
201                         nRightSpace     += nTemp;
202                         nLeftSpace      += nTemp;
203                         nDrawCaptionPos += nTemp;
204                 }
205  
206                 if ((nStyle & WS_DLGFRAME) == WS_DLGFRAME && !((nStyle & WS_MAXIMIZE) == WS_MAXIMIZE))
207                 {
208                         int nTemp        = GetSystemMetrics(SM_CXDLGFRAME);
209                         nRightSpace     += nTemp;
210                         nLeftSpace      += nTemp;
211                         nDrawCaptionPos += nTemp;
212                 }
213  
214                 nLeft = sRect.right - sRect.left - nRightSpace - sTitleSize.cx + nHorizontalShift;
215                 nLeftSpace -= nHorizontalShift;
216  
217                 SetBkMode(hDC, TRANSPARENT);
218                 SetTextColor(hDC, nCaptionFontColor);
219                 sDrawRectTitle.top = GetSystemMetrics(SM_CYFRAME) + (GetSystemMetrics(SM_CYCAPTION) - sTitleSize.cy) / 2 - 1;
220                 sDrawRectTitle.bottom = sDrawRectTitle.top + sTitleSize.cy;
221  
222                 // Designates space between window title and winamp data written on caption
223                 int spacer = 25;
224  
225                 if (nLeft > (sTempSize.cx + nLeftSpace + spacer))
226                 {
227                         sDrawRectTitle.left  = nLeft;
228                         sDrawRectTitle.right = sDrawRectTitle.left + sTitleSize.cx;
229                 }
230                 else
231                 {
232                         sDrawRectTitle.left  = sTempSize.cx + spacer + nLeftSpace;
233                         sDrawRectTitle.right = nLeft + sTitleSize.cx;
234                 }
235  
236                 sDrawRectTitle.left   += nHorizontalShift;
237                 sDrawRectTitle.right  += nHorizontalShift;
238                 sDrawRectTitle.top    += nVerticalShift;
239                 sDrawRectTitle.bottom += nVerticalShift;
240  
241                 int nTitleWidth = (sDrawRectTitle.right - sDrawRectTitle.left);
242  
243                 if (nTitleWidth < sTitleSize.cx)
244                 {
245                         SIZE sTextSize;
246                         strTitleText += "...";
247                         int nStringLength = strTitleText.GetLength();
248                         GetTextExtentPoint32(hDC, strTitleText, nStringLength, &sTextSize);
249  
250                         while (nTitleWidth < sTextSize.cx)
251                         {
252                                 if (nStringLength > 8)
253                                 {
254                                         strTitleText.Delete(nStringLength - 4, 1);
255                                         nStringLength--;
256                                         GetTextExtentPoint32(hDC, strTitleText, nStringLength, &sTextSize);
257                                 }
258                                 else
259                                 {
260                                         strTitleText.Empty();
261                                         break;
262                                 }
263                         }
264                 }
265  
266                 hLastForegroundWindow = hForegroundWnd;
267                 updateCaption(hForegroundWnd);
183 roytam 268  
269                 /* titlebar area cleanup hack */
359 roytam 270 #if 0
183 roytam 271                 sDrawRectTitle.top    -= 5;
272                 sDrawRectTitle.left   -= 10;
273                 sDrawRectTitle.right  += 10;
274                 sDrawRectTitle.bottom += 5;
275                 RedrawWindow(hForegroundWnd, &sDrawRectTitle, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME);
276                 sDrawRectTitle.top    += 5;
277                 sDrawRectTitle.left   += 10;
278                 sDrawRectTitle.right  -= 10;
279                 sDrawRectTitle.bottom -= 5;
359 roytam 280 #endif
281                 if(bODInited) {
282                         rectOldDimension.top    -= 5;
283                         rectOldDimension.left   -= 10;
284                         rectOldDimension.right  += 10;
285                         rectOldDimension.bottom += 5;
286                         RedrawWindow(hForegroundWnd, &rectOldDimension, NULL, RDW_INVALIDATE | RDW_UPDATENOW | RDW_FRAME);
287                 } else {
288                         bODInited = true;
289                 }
290                 CopyRect(&rectOldDimension,&sDrawRectTitle);
183 roytam 291                 /* titlebar area cleanup hack end */
292  
181 roytam 293                 DrawText(hDC, strTitleText, strTitleText.GetLength(), &sDrawRectTitle, DT_LEFT | DT_VCENTER | DT_NOPREFIX);
294  
295                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
296                 DeleteObject(hDrawFont);
297                 ReleaseDC(hForegroundWnd, hDC);
298         }
299 }
300  
301 void TitleInfo::setText(CStdString newTitleText)
302 {
303         strTitleText = newTitleText;
304 }
305  
306 void TitleInfo::setSearchCaption(CStdString newSearchCaption)
307 {
308         CStdString strSearchCaption;
309         strSearchCaption = newSearchCaption;
310  
182 roytam 311         TCHAR* token = _tcstok(strSearchCaption.GetBuffer(512), _T(";"));
181 roytam 312         strSearchCaption.ReleaseBuffer();
313  
314         for (int i=0; i < 10; i++)
315         {
316                 if (token != NULL)
317                         pSearchCaption[i] = token;
318                 else
319                         pSearchCaption[i].Empty();
320  
182 roytam 321                 token = _tcstok(NULL, _T(";"));
181 roytam 322         }
323 }
324  
325 bool TitleInfo::isStringInCaption(CStdString WindowText)
326 {
327         for (int i=0; i < 10; i++)
328         {
329                 if (!pSearchCaption[i].IsEmpty())                                       // pSearchCaption[i] is not empty
330                         if (WindowText.Find(pSearchCaption[i]) != -1)   // pSearchCaption[i] appears in pWindowText
331                                 return true;                                                            // the search is over
332         }
333  
334         return false;                                                                                   // nothing found
335 }