rtoss - Blame information for rev 182

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;
48  
49         pSearchCaption = new CStdString[10];
50  
51         for (int i=0; i < 10; i++)
52                 pSearchCaption[i].Empty();
53 }
54  
55 TitleInfo::~TitleInfo()
56 {
57         delete[] pSearchCaption;
58         pSearchCaption = NULL;
59 }
60  
61 void TitleInfo::updateCaption(HWND hWnd)
62 {
63         CStdString strWindowText;
64         GetWindowText(hWnd, strWindowText.GetBuffer(512), 512);
65         strWindowText.ReleaseBuffer();
66  
67         if (!isStringInCaption(strWindowText))
68         {
69                 #define PREVENT_XP_DISPLAY_BUG true
70  
71                 if (PREVENT_XP_DISPLAY_BUG)
72                 {
73                         // Prevents "XP display bug", but behaves strange with browsers based on newer versions of Mozilla (don't ask me why...)
74                         SetWindowPos(hWnd, NULL, NULL, NULL, NULL, NULL, SWP_FRAMECHANGED | SWP_NOACTIVATE | SWP_NOMOVE | SWP_NOOWNERZORDER | SWP_NOSIZE | SWP_NOZORDER);
75                 }
76                 else
77                 {
78                         DefWindowProc(hWnd, WM_NCACTIVATE, (WPARAM) true, 0);
79                 }
80  
81         }
82 }
83  
84 void TitleInfo::drawOnCaption()
85 {
86         HWND hForegroundWnd = GetForegroundWindow();
87         CStdString strName;
88         unsigned int nStyle;
89         unsigned int nExStyle;
90  
91         if (!hForegroundWnd || strTitleText.IsEmpty())
92                 return;
93  
94         // Find out the actual parent of this foreground window
95         // in case it is a popup window with a caption
96         if (GetParent(hForegroundWnd))
97         {
98                 HWND hWnd;
99  
100                 hWnd = GetParent(hForegroundWnd);
101                 while(hWnd)
102                 {
103                         hForegroundWnd = hWnd;
104                         hWnd = GetParent(hForegroundWnd);
105                 }
106         }
107  
108         // Check if we are supposed to draw this info
109         // the window must have a titlebar and must not be a toolwindow
110         // it must not be setup.exe or winver.exe (#32770) and not
111         // the Windows Taskbar (Shell_TrayWnd)
112         // it also mustn't be a Winamp window (Winamp v1.x).
113         GetClassName(hForegroundWnd, strName.GetBuffer(80), 80);
114         strName.ReleaseBuffer();
115  
116         // patch from Darren Owen (problems with command line option "/class")
182 roytam 117         if((strName != _T("Winamp PE")) && (strName != _T("Winamp v1.x")))
118                 if(FindWindowEx(hForegroundWnd,0,_T("WinampVis"),0))
181 roytam 119                         return;
120         // patch end
121  
122         nStyle = GetWindowLong(hForegroundWnd, GWL_STYLE);
123         nExStyle = GetWindowLong(hForegroundWnd, GWL_EXSTYLE);
124  
182 roytam 125         if ((nStyle & WS_CAPTION) == WS_CAPTION && !(nExStyle & WS_EX_TOOLWINDOW) && (strName != _T("#32770")) &&
126                 (strName != _T("Shell_TrayWnd")) && (strName != _T("Winamp v1.x")) && (strName != _T("Winamp EQ")) &&
127                 (strName != _T("Winamp PE")) && (strName != _T("Winamp MB"))
128                  && (strName != _T("Chrome_WidgetWin_0"))) // chrome hack
181 roytam 129         {
130                 drawCaption(hForegroundWnd, nStyle);
131         }
132 }
133  
134 void TitleInfo::drawCaption(HWND hForegroundWnd, unsigned int nStyle)
135 {
136         CStdString strWindowText;
137         GetWindowText(hForegroundWnd, strWindowText.GetBuffer(512), 512);
138         strWindowText.ReleaseBuffer();
139  
140         if (!isStringInCaption(strWindowText))
141         {
142                 CStdString strTrackNumber;
143  
144                 int nLeft;
145                 int nLeftSpace = 0;
146                 int nRightSpace = 10;
147                 int nDrawCaptionPos = 0;
148  
149                 RECT sDrawRectTitle;
150                 RECT sRect;
151  
152                 SIZE sTempSize;
153                 SIZE sTitleSize;
154  
155                 NONCLIENTMETRICS sMetrics;
156                 HFONT hDrawFont;
157  
158                 sMetrics.cbSize = sizeof(sMetrics);
159                 SystemParametersInfo(SPI_GETNONCLIENTMETRICS, 0, &sMetrics, FALSE);
160  
161                 // First we need to calculate the actual length of the active window text
162                 HDC hDC   = GetWindowDC(hForegroundWnd);
163                 hDrawFont = CreateFontIndirect(&sMetrics.lfCaptionFont);
164                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
165                 GetTextExtentPoint32(hDC, strWindowText, strWindowText.GetLength(), &sTempSize);
166                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
167                 DeleteObject(hDrawFont);
168  
169                 // Now use the user defined font
170                 hDrawFont = CreateFontIndirect(&sCaptionFont);
171                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
172                 GetWindowRect(hForegroundWnd, &sRect);
173                 GetTextExtentPoint32(hDC, strTitleText, strTitleText.GetLength(), &sTitleSize);
174  
175                 // Close button
176                 if ((nStyle & WS_SYSMENU) == WS_SYSMENU)
177                 {
178                         int nTemp        = GetSystemMetrics(SM_CXSIZE);
179                         nRightSpace     += nTemp;
180                         nLeftSpace      += nTemp;
181                 }
182  
183                 if ((nStyle & WS_MINIMIZEBOX) == WS_MINIMIZEBOX || (nStyle & WS_MAXIMIZEBOX) == WS_MAXIMIZEBOX)
184                 {
185                         int nTemp        = GetSystemMetrics(SM_CXSIZE);
186                         nRightSpace     += 2 * nTemp;
187                 }
188  
189                 if ((nStyle & WS_BORDER) == WS_BORDER && !((nStyle & WS_MAXIMIZE) == WS_MAXIMIZE))
190                 {
191                         int nTemp        = GetSystemMetrics(SM_CXBORDER);
192                         nRightSpace     += nTemp;
193                         nLeftSpace      += nTemp;
194                         nDrawCaptionPos += nTemp;
195                 }
196  
197                 if ((nStyle & WS_THICKFRAME) == WS_THICKFRAME && !((nStyle & WS_MAXIMIZE) == WS_MAXIMIZE))
198                 {
199                         int nTemp        = GetSystemMetrics(SM_CXFRAME);
200                         nRightSpace     += nTemp;
201                         nLeftSpace      += nTemp;
202                         nDrawCaptionPos += nTemp;
203                 }
204  
205                 if ((nStyle & WS_DLGFRAME) == WS_DLGFRAME && !((nStyle & WS_MAXIMIZE) == WS_MAXIMIZE))
206                 {
207                         int nTemp        = GetSystemMetrics(SM_CXDLGFRAME);
208                         nRightSpace     += nTemp;
209                         nLeftSpace      += nTemp;
210                         nDrawCaptionPos += nTemp;
211                 }
212  
213                 nLeft = sRect.right - sRect.left - nRightSpace - sTitleSize.cx + nHorizontalShift;
214                 nLeftSpace -= nHorizontalShift;
215  
216                 SetBkMode(hDC, TRANSPARENT);
217                 SetTextColor(hDC, nCaptionFontColor);
218                 sDrawRectTitle.top = GetSystemMetrics(SM_CYFRAME) + (GetSystemMetrics(SM_CYCAPTION) - sTitleSize.cy) / 2 - 1;
219                 sDrawRectTitle.bottom = sDrawRectTitle.top + sTitleSize.cy;
220  
221                 // Designates space between window title and winamp data written on caption
222                 int spacer = 25;
223  
224                 if (nLeft > (sTempSize.cx + nLeftSpace + spacer))
225                 {
226                         sDrawRectTitle.left  = nLeft;
227                         sDrawRectTitle.right = sDrawRectTitle.left + sTitleSize.cx;
228                 }
229                 else
230                 {
231                         sDrawRectTitle.left  = sTempSize.cx + spacer + nLeftSpace;
232                         sDrawRectTitle.right = nLeft + sTitleSize.cx;
233                 }
234  
235                 sDrawRectTitle.left   += nHorizontalShift;
236                 sDrawRectTitle.right  += nHorizontalShift;
237                 sDrawRectTitle.top    += nVerticalShift;
238                 sDrawRectTitle.bottom += nVerticalShift;
239  
240                 int nTitleWidth = (sDrawRectTitle.right - sDrawRectTitle.left);
241  
242                 if (nTitleWidth < sTitleSize.cx)
243                 {
244                         SIZE sTextSize;
245                         strTitleText += "...";
246                         int nStringLength = strTitleText.GetLength();
247                         GetTextExtentPoint32(hDC, strTitleText, nStringLength, &sTextSize);
248  
249                         while (nTitleWidth < sTextSize.cx)
250                         {
251                                 if (nStringLength > 8)
252                                 {
253                                         strTitleText.Delete(nStringLength - 4, 1);
254                                         nStringLength--;
255                                         GetTextExtentPoint32(hDC, strTitleText, nStringLength, &sTextSize);
256                                 }
257                                 else
258                                 {
259                                         strTitleText.Empty();
260                                         break;
261                                 }
262                         }
263                 }
264  
265                 hLastForegroundWindow = hForegroundWnd;
266                 updateCaption(hForegroundWnd);
267                 DrawText(hDC, strTitleText, strTitleText.GetLength(), &sDrawRectTitle, DT_LEFT | DT_VCENTER | DT_NOPREFIX);
268  
269                 hDrawFont = (HFONT)SelectObject(hDC, hDrawFont);
270                 DeleteObject(hDrawFont);
271                 ReleaseDC(hForegroundWnd, hDC);
272         }
273 }
274  
275 void TitleInfo::setText(CStdString newTitleText)
276 {
277         strTitleText = newTitleText;
278 }
279  
280 void TitleInfo::setSearchCaption(CStdString newSearchCaption)
281 {
282         CStdString strSearchCaption;
283         strSearchCaption = newSearchCaption;
284  
182 roytam 285         TCHAR* token = _tcstok(strSearchCaption.GetBuffer(512), _T(";"));
181 roytam 286         strSearchCaption.ReleaseBuffer();
287  
288         for (int i=0; i < 10; i++)
289         {
290                 if (token != NULL)
291                         pSearchCaption[i] = token;
292                 else
293                         pSearchCaption[i].Empty();
294  
182 roytam 295                 token = _tcstok(NULL, _T(";"));
181 roytam 296         }
297 }
298  
299 bool TitleInfo::isStringInCaption(CStdString WindowText)
300 {
301         for (int i=0; i < 10; i++)
302         {
303                 if (!pSearchCaption[i].IsEmpty())                                       // pSearchCaption[i] is not empty
304                         if (WindowText.Find(pSearchCaption[i]) != -1)   // pSearchCaption[i] appears in pWindowText
305                                 return true;                                                            // the search is over
306         }
307  
308         return false;                                                                                   // nothing found
309 }