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 "gen_tbar.h"
42  
43 gen_tbar* pGenTbar = NULL;
44  
45 VOID CALLBACK TimerProc(HWND hwnd, UINT uMsg, UINT idEvent, DWORD dwTime)
46 {
47         pGenTbar->draw_titlebar();
48 }
49  
50 BOOL CALLBACK ConfigProc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
51 {
52         return pGenTbar->config_proc(hwndDlg, uMsg, wParam, lParam);
53 }
54  
55 gen_tbar::gen_tbar(HINSTANCE h_dll_instance, HWND hwnd_parent, CStdString help_file, CStdString plugin_version)
56 {
57         hDllInstance = h_dll_instance;
58         hWndParent   = hwnd_parent;
59  
60         strHelpFile = help_file;
61         strVersion  = plugin_version;
62  
63         winamp_version = SendMessage(hWndParent, WM_WA_IPC, 0, IPC_GETVERSION);
64  
65         // Get data from registry
182 roytam 66         data = new TCHAR[200];
181 roytam 67  
182 roytam 68         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("title_mask_2"), &data))
181 roytam 69                 strTitleMask = data;
70         else
71         {
72 //              if ((winamp_version >= 0x2090) || (winamp_version >= 0x2900))
73 //                      strTitleMask = "%number%. %artist% - %title% - %time%"; // does not work with tagless files
74 //              else
182 roytam 75                         strTitleMask = _T("%number%. %track% - %time%"); // works with and without tags
181 roytam 76         }
77  
182 roytam 78         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("search_caption"), &data))
181 roytam 79                 strSearchCaption = data;
80         else
81                 strSearchCaption.Empty();
82  
182 roytam 83         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("remaining_time"), &data))
84                 show_remaining_time = (_tcstol(data, NULL, 10) != 0);
181 roytam 85         else
86                 show_remaining_time = true;
87  
182 roytam 88         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("song_length"), &data))
89                 show_song_length = (_tcstol(data, NULL, 10) != 0);
181 roytam 90         else
91                 show_song_length = false;
92  
182 roytam 93         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_name"), &data))
181 roytam 94         {
182 roytam 95                 _tcsncpy(lfont.lfFaceName, data, LF_FACESIZE);
181 roytam 96                 lfont.lfFaceName[LF_FACESIZE - 1] = '\0';
97         }
98         else
182 roytam 99                 _tcsncpy(lfont.lfFaceName, _T("Arial"), LF_FACESIZE);
181 roytam 100  
182 roytam 101         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_height"), &data))
102                 lfont.lfHeight = _tcstol(data, NULL, 10);
181 roytam 103         else
104                 lfont.lfHeight = -11;
105  
182 roytam 106         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_weight"), &data))
107                 lfont.lfWeight = _tcstol(data, NULL, 10);
181 roytam 108         else
109                 lfont.lfWeight = FW_BOLD;
110  
182 roytam 111         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_italic"), &data))
112                 lfont.lfItalic = (unsigned char)_tcstoul(data, NULL, 10);
181 roytam 113         else
114                 lfont.lfItalic = false;
115  
182 roytam 116         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_underline"), &data))
117                 lfont.lfUnderline = (unsigned char)_tcstoul(data, NULL, 10);
181 roytam 118         else
119                 lfont.lfUnderline = false;
120  
182 roytam 121         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_strikeout"), &data))
122                 lfont.lfStrikeOut = (unsigned char)_tcstoul(data, NULL, 10);
181 roytam 123         else
124                 lfont.lfStrikeOut = false;
125  
182 roytam 126         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_color"), &data))
127                 color = _tcstoul(data, NULL, 10);
181 roytam 128         else
129                 color = GetSysColor(COLOR_CAPTIONTEXT);
130  
182 roytam 131         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("show_playstatus"), &data))
132                 show_playstatus = (_tcstol(data, NULL, 10) != 0);
181 roytam 133         else
134                 show_playstatus = true;
135  
182 roytam 136         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("plugin_enabled"), &data))
137                 plugin_enabled = (_tcstol(data, NULL, 10) != 0);
181 roytam 138         else
139                 plugin_enabled = true;
140  
182 roytam 141         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("shift_horizontal"), &data))
142                 horizontalshift = _tcstol(data, NULL, 10);
181 roytam 143         else
144                 horizontalshift = 0;
145  
182 roytam 146         if (get_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("shift_vertical"), &data))
147                 verticalshift = _tcstol(data, NULL, 10);
181 roytam 148         else
149                 verticalshift = 0;
150  
151         // Set font attributes that cannot be changed
152         lfont.lfWidth                   = 0;
153         lfont.lfEscapement              = 0;
154         lfont.lfOrientation             = 0;
155         lfont.lfCharSet                 = DEFAULT_CHARSET;
156         lfont.lfOutPrecision    = OUT_STRING_PRECIS;
157         lfont.lfClipPrecision   = CLIP_STROKE_PRECIS;
158         lfont.lfQuality                 = DRAFT_QUALITY;
159         lfont.lfPitchAndFamily  = VARIABLE_PITCH | FF_DONTCARE;
160  
161         pInfo = new TitleInfo;
162         pInfo->setSearchCaption(strSearchCaption);
163  
164         pGenTbar = this;
165  
166         uTimerID = SetTimer(NULL, 0, 1000, TimerProc);
167 }
168  
169 gen_tbar::~gen_tbar()
170 {
171         KillTimer(NULL, uTimerID);
172  
173         pGenTbar = NULL;
174  
175         delete pInfo;
176         pInfo = NULL;
177  
178         // Save data in registry
182 roytam 179         _stprintf(data, _T("%s"), strTitleMask.GetBuffer(512));         // "%s" must be a pointer to char!
180         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("title_mask_2"), data);
181 roytam 181  
182 roytam 182         _stprintf(data, _T("%s"), strSearchCaption.GetBuffer(512));     // "%s" must be a pointer to char!
183         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("search_caption"), data);
181 roytam 184  
182 roytam 185         _stprintf(data, _T("%d"), show_remaining_time);
186         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("remaining_time"), data);
181 roytam 187  
182 roytam 188         _stprintf(data, _T("%d"), show_song_length);
189         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("song_length"), data);
181 roytam 190  
182 roytam 191         _stprintf(data, _T("%s"), lfont.lfFaceName);
192         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_name"), data);
181 roytam 193  
182 roytam 194         _stprintf(data, _T("%d"), lfont.lfHeight);
195         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_height"), data);
181 roytam 196  
182 roytam 197         _stprintf(data, _T("%d"), lfont.lfWeight);
198         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_weight"), data);
181 roytam 199  
182 roytam 200         _stprintf(data, _T("%d"), lfont.lfItalic);
201         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_italic"), data);
181 roytam 202  
182 roytam 203         _stprintf(data, _T("%d"), lfont.lfUnderline);
204         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_underline"), data);
181 roytam 205  
182 roytam 206         _stprintf(data, _T("%d"), lfont.lfStrikeOut);
207         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_strikeout"), data);
181 roytam 208  
182 roytam 209         _stprintf(data, _T("%d"), color);
210         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("font_color"), data);
181 roytam 211  
182 roytam 212         _stprintf(data, _T("%d"), show_playstatus);
213         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("show_playstatus"), data);
181 roytam 214  
182 roytam 215         _stprintf(data, _T("%d"), plugin_enabled);
216         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("plugin_enabled"), data);
181 roytam 217  
182 roytam 218         _stprintf(data, _T("%d"), horizontalshift);
219         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("shift_horizontal"), data);
181 roytam 220  
182 roytam 221         _stprintf(data, _T("%d"), verticalshift);
222         set_registry_string(HKEY_CURRENT_USER, _T("Software\\radix\\gen_tbar"), _T("shift_vertical"), data);
181 roytam 223  
224         delete[] data;
225         data = NULL;
226 }
227  
228 void gen_tbar::config()
229 {
230         // Open dialog box for configuration
231         DialogBox(hDllInstance, MAKEINTRESOURCE(IDD_DIALOG), hWndParent, ConfigProc);
232 }
233  
234 bool gen_tbar::config_proc(HWND hwndDlg, UINT uMsg, WPARAM wParam, LPARAM lParam)
235 {
236         if (uMsg == WM_INITDIALOG)                                                      // Initialisation of dialog box
237         {
238                 SetWindowText(hwndDlg, strVersion);
239  
240                 if ((winamp_version >= 0x2090) || (winamp_version >= 0x2900))
241                 {
242                         EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC_WINAMP_5_1), true);
243                         EnableWindow(GetDlgItem(hwndDlg, IDC_STATIC_WINAMP_5_2), true);
244                 }
245  
246                 show_remaining_time_old = show_remaining_time;
247                 show_song_length_old    = show_song_length;
248                 show_playstatus_old             = show_playstatus;
249                 plugin_enabled_old              = plugin_enabled;
250  
251                 color_old = color;
252                 lfont_old = lfont;
253  
254                 horizontalshift_old     = horizontalshift;
255                 verticalshift_old       = verticalshift;
256  
257                 CheckDlgButton(hwndDlg, IDC_SHOW_REMAINING_TIME, show_remaining_time_old);
258                 CheckDlgButton(hwndDlg, IDC_SHOW_SONG_LENGTH, show_song_length_old);
259                 CheckDlgButton(hwndDlg, IDC_SHOW_PLAYSTATUS, show_playstatus_old);
260  
261                 CheckDlgButton(hwndDlg, IDC_PLUGIN_ENABLED, plugin_enabled_old);
182 roytam 262                 SetWindowText(GetDlgItem(hwndDlg, IDC_PLUGIN_ENABLED), plugin_enabled?_T("Plugin en&abled"):_T("Plugin dis&abled"));
181 roytam 263  
182 roytam 264                 _stprintf(data, _T("%s"), lfont.lfFaceName);
181 roytam 265                 HWND hStaticDialog = GetDlgItem(hwndDlg, IDC_CHOOSE_FONT);
266                 SetWindowText(hStaticDialog, data);
267  
268                 HWND hHorSpin = GetDlgItem(hwndDlg, IDC_HSPIN);
269                 SendMessage(hHorSpin, UDM_SETRANGE, 0L, MAKELONG(250, -250));
270                 SendMessage(hHorSpin, UDM_SETPOS,   0L, MAKELONG(horizontalshift_old, 0));
271  
272                 HWND hVerSpin = GetDlgItem(hwndDlg, IDC_VSPIN);
273                 SendMessage(hVerSpin, UDM_SETRANGE, 0L, MAKELONG(20, -20));
274                 SendMessage(hVerSpin, UDM_SETPOS,   0L, MAKELONG(verticalshift_old, 0));
275  
276                 HWND hSearchCaption = GetDlgItem(hwndDlg, IDC_SEARCH_CAPTION);
277                 SendMessage(hSearchCaption, EM_SETLIMITTEXT, (WPARAM) SEARCH_CAPTION_TEXT, 0L);
278                 SetWindowText(hSearchCaption, strSearchCaption);
279  
280                 strTitleMaskOld = strTitleMask;
281  
282                 HWND hTitleMask = GetDlgItem(hwndDlg, IDC_TITLE_MASK);
283                 SendMessage(hTitleMask, EM_SETLIMITTEXT, (WPARAM) TITLE_MASK_TEXT, 0L);
284                 SetWindowText(hTitleMask, strTitleMask);
285         }
286         else if ((uMsg == WM_VSCROLL) && (LOWORD(wParam) == SB_THUMBPOSITION))
287         {
288                 HWND hwndScrollBar = (HWND) lParam; // handle to scroll bar
289  
290                 if (hwndScrollBar == GetDlgItem(hwndDlg, IDC_HSPIN))
291                         horizontalshift = (short int) HIWORD(wParam);
292                 else if (hwndScrollBar == GetDlgItem(hwndDlg, IDC_VSPIN))
293                         verticalshift = (short int) HIWORD(wParam);
294         }
295         else if (uMsg == WM_HELP)
296         {
297                 CStdString strContextHelpFile = strHelpFile + "::/popup.txt";
298  
299                 LPHELPINFO lphi = (LPHELPINFO) lParam;
300                 if (lphi->iContextType == HELPINFO_WINDOW)
301                         HtmlHelp((HWND) lphi->hItemHandle, strContextHelpFile, HH_TP_HELP_WM_HELP, (DWORD) id_array) ;
302         }
303         else if (uMsg == WM_COMMAND)
304         {
305                 switch (LOWORD(wParam))
306                 {
307                         case IDC_SHOW_REMAINING_TIME:   // Check box "Show remaining time" has been (un)checked
308                         {
309                                 show_remaining_time = (IsDlgButtonChecked(hwndDlg,IDC_SHOW_REMAINING_TIME) == BST_CHECKED?1:0);
310                                 break;
311                         }
312                         case IDC_SHOW_SONG_LENGTH:      // Check box "Show song length" has been (un)checked
313                         {
314                                 show_song_length = (IsDlgButtonChecked(hwndDlg,IDC_SHOW_SONG_LENGTH) == BST_CHECKED?1:0);
315                                 break;
316                         }
317                         case IDC_SHOW_PLAYSTATUS:               // Check box "Show playback status" has been (un)checked
318                         {
319                                 show_playstatus = (IsDlgButtonChecked(hwndDlg,IDC_SHOW_PLAYSTATUS) == BST_CHECKED?1:0);
320                                 break;
321                         }
322                         case IDC_PLUGIN_ENABLED:                // Check box "Plugin ***abled" has been (un)checked
323                         {
324                                 plugin_enabled = (IsDlgButtonChecked(hwndDlg,IDC_PLUGIN_ENABLED) == BST_CHECKED?1:0);
182 roytam 325                                 SetWindowText(GetDlgItem(hwndDlg, IDC_PLUGIN_ENABLED), plugin_enabled?_T("Plugin en&abled"):_T("Plugin dis&abled"));
181 roytam 326                                 break;
327                         }
328                         case IDC_TITLE_MASK_RESET:              // Button "Reset" has been pressed
329                         {
330                                 HWND hTitleMask = GetDlgItem(hwndDlg, IDC_TITLE_MASK);
182 roytam 331                                 strTitleMask = _T("%number%. %track% - %time%");
181 roytam 332 //                              if ((winamp_version >= 0x2090) || (winamp_version >= 0x2900))
333 //                                      SetWindowText(hTitleMask, "%number%. %artist% - %title% - %time%"); // does not work with tagless files
334 //                              else
182 roytam 335                                         SetWindowText(hTitleMask, _T("%number%. %track% - %time%")); // works with and without tags
181 roytam 336  
337                                 break;
338                         }
339                         case IDC_TITLE_MASK:                    // Content of IDC_TITLE_MASK has changed
340                         {
341                                 if (HIWORD(wParam) == EN_CHANGE)
342                                 {
343                                         HWND hTitleMask = GetDlgItem(hwndDlg, IDC_TITLE_MASK);
344                                         GetWindowText(hTitleMask, strTitleMask.GetBuffer(TITLE_MASK_TEXT + 1), TITLE_MASK_TEXT);
345                                         strTitleMask.ReleaseBuffer();
346                                 }
347                                 break;
348                         }
349                         case IDC_GET_HELP:
350                         {
351                                 HtmlHelp(NULL, strHelpFile, HH_DISPLAY_TOPIC, 0);
352                                 break;
353                         }
354                         case IDC_ABOUT:                                 // Button "About" has been pressed
355                         {
182 roytam 356                                 MessageBox(hWndParent, _T("Copyright (c) 1996-1997 Mats Ljungqvist (mlt@cyberdude.com)\n")
357                                         _T("Copyright (c) 1999-2000 Jos van den Oever (http://www.vandenoever.info/)\n")
358                                         _T("Copyright (c) 2001-2005 Martin Zuther (http://www.mzuther.de/)\n\n")
181 roytam 359  
182 roytam 360                                         _T("This program is free software; you can redistribute it and/or modify\n")
361                                         _T("it under the terms of the GNU General Public License as published by\n")
362                                         _T("the Free Software Foundation; either version 2 of the License, or\n")
363                                         _T("(at your option) any later version.\n\n")
181 roytam 364  
182 roytam 365                                         _T("This program is distributed in the hope that it will be useful,\n")
366                                         _T("but WITHOUT ANY WARRANTY; without even the implied warranty of\n")
367                                         _T("MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n")
368                                         _T("GNU General Public License for more details.\n\n")
181 roytam 369  
182 roytam 370                                         _T("You should have received a copy of the GNU General Public License\n")
371                                         _T("along with this program; if not, write to the Free Software\n")
372                                         _T("Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.\n\n")
181 roytam 373  
182 roytam 374                                         _T("Thanks to anyone who sent ideas or bug reports."),
181 roytam 375                                         strVersion, MB_OK|MB_APPLMODAL);
376                                 break;
377                         }
378                         case IDC_CHOOSE_FONT:                   // Button "Font" has been pressed
379                         {
380                                 CHOOSEFONT cf;
381  
382                                 cf.lStructSize  = sizeof(CHOOSEFONT);
383                                 cf.hwndOwner    = hwndDlg;
384                                 cf.Flags                = CF_FORCEFONTEXIST | CF_SCREENFONTS | CF_LIMITSIZE | CF_INITTOLOGFONTSTRUCT | CF_EFFECTS;
385                                 cf.lpLogFont    = &lfont;
386                                 cf.nSizeMin             = 6;
387                                 cf.nSizeMax             = 14;
388                                 cf.rgbColors    = color;
389                                 if (ChooseFont(&cf))            // "Ok" button was pressed in font dialog
390                                 {
391                                         color = cf.rgbColors;
182 roytam 392                                         _stprintf(data, _T("%s"), lfont.lfFaceName);
181 roytam 393                                         HWND hStaticDialog = GetDlgItem(hwndDlg, IDC_CHOOSE_FONT);
394                                         SetWindowText(hStaticDialog, data);
395                                 }
396                                 break;
397                         }
398                         case IDOK:                                              // "Ok" button was pressed in dialog box
399                         {
400                                 HWND hSearchCaption = GetDlgItem(hwndDlg, IDC_SEARCH_CAPTION);
401                                 GetWindowText(hSearchCaption, strSearchCaption.GetBuffer(SEARCH_CAPTION_TEXT + 1), SEARCH_CAPTION_TEXT);
402                                 strSearchCaption.ReleaseBuffer();
403  
404                                 HWND hTitleMask = GetDlgItem(hwndDlg, IDC_TITLE_MASK);
405                                 GetWindowText(hTitleMask, strTitleMask.GetBuffer(TITLE_MASK_TEXT + 1), TITLE_MASK_TEXT);
406                                 strTitleMask.ReleaseBuffer();
407  
408                                 pInfo->setSearchCaption(strSearchCaption);
409  
410                                 EndDialog(hwndDlg,0);
411                                 break;
412                         }
413                         case IDCANCEL:                                  // "Cancel" button was pressed in dialog box
414                         {
415                                 show_remaining_time     = show_remaining_time_old;
416                                 show_song_length        = show_song_length_old;
417                                 show_playstatus         = show_playstatus_old;
418                                 plugin_enabled          = plugin_enabled_old;
419  
420                                 horizontalshift = horizontalshift_old;
421                                 verticalshift   = verticalshift_old;
422  
423                                 lfont = lfont_old;
424                                 color = color_old;
425  
426                                 strTitleMask = strTitleMaskOld;
427  
428                                 EndDialog(hwndDlg,0);
429                                 break;
430                         }
431                 }
432         }
433  
434         return false;
435 }
436  
437 bool gen_tbar::get_song_data()
438 {
439         strTitle = strTitleMask;
440  
441         // IPC_GETLISTPOS returns the playlist position
442         int track_number = SendMessage(hWndParent, WM_WA_IPC, 0, IPC_GETLISTPOS);
443  
444         // IPC_GETPLAYLISTTITLE gets the title of the playlist entry [index]
182 roytam 445 #ifdef _MBCS
181 roytam 446         CStdString strTrackName = (char*) SendMessage(hWndParent, WM_WA_IPC, track_number, IPC_GETPLAYLISTTITLE);
182 roytam 447 #else
448         CStdString strTrackName = (wchar_t*) SendMessage(hWndParent, WM_WA_IPC, track_number, IPC_GETPLAYLISTTITLEW);
449 #endif
181 roytam 450  
451         if ((winamp_version >= 0x2090) || (winamp_version >= 0x2900)) // buggy because of lame unicode support !!!
452         {
182 roytam 453 #ifdef _MBCS
181 roytam 454                 extendedFileInfoStruct ExtFileInfoStruct;
455  
456                 ExtFileInfoStruct.filename = (char*) SendMessage(hWndParent, WM_WA_IPC, track_number, IPC_GETPLAYLISTFILE);
182 roytam 457 #else
458                 extendedFileInfoStructW ExtFileInfoStruct;
181 roytam 459  
182 roytam 460                 ExtFileInfoStruct.filename = (wchar_t*) SendMessage(hWndParent, WM_WA_IPC, track_number, IPC_GETPLAYLISTFILEW);
461 #endif
462  
463  
464                 if (strTitle.Find(_T("%artist%")) != -1)
181 roytam 465                 {
466                         CStdString strArtist;
467  
182 roytam 468                         ExtFileInfoStruct.metadata      = _T("artist");
181 roytam 469                         ExtFileInfoStruct.ret           = strArtist.GetBuffer(TEXTLENGTH);
470                         ExtFileInfoStruct.retlen        = TEXTLENGTH;
471  
182 roytam 472 #ifdef _MBCS
181 roytam 473                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFO);
182 roytam 474 #else
475                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFOW);
476 #endif
181 roytam 477  
478                         strArtist.ReleaseBuffer();
182 roytam 479                         strTitle.Replace(_T("%artist%"), strArtist);
181 roytam 480                 }
481  
182 roytam 482                 if (strTitle.Find(_T("%album%")) != -1)
181 roytam 483                 {
484                         CStdString strAlbum;
485  
182 roytam 486                         ExtFileInfoStruct.metadata      = _T("album");
181 roytam 487                         ExtFileInfoStruct.ret           = strAlbum.GetBuffer(TEXTLENGTH);
488                         ExtFileInfoStruct.retlen        = TEXTLENGTH;
489  
182 roytam 490 #ifdef _MBCS
181 roytam 491                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFO);
182 roytam 492 #else
493                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFOW);
494 #endif
181 roytam 495  
496                         strAlbum.ReleaseBuffer();
182 roytam 497                         strTitle.Replace(_T("%album%"), strAlbum);
181 roytam 498                 }
499  
182 roytam 500                 if (strTitle.Find(_T("%title%")) != -1)
181 roytam 501                 {
502                         CStdString strSongTitle;
503  
182 roytam 504                         ExtFileInfoStruct.metadata      = _T("title");
181 roytam 505                         ExtFileInfoStruct.ret           = strSongTitle.GetBuffer(TEXTLENGTH);
506                         ExtFileInfoStruct.retlen        = TEXTLENGTH;
507  
182 roytam 508 #ifdef _MBCS
509                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFO);
510 #else
511                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFOW);
512 #endif
181 roytam 513  
514                         strSongTitle.ReleaseBuffer();
182 roytam 515                         strTitle.Replace(_T("%title%"), strSongTitle);
181 roytam 516                 }
517  
182 roytam 518                 if (strTitle.Find(_T("%genre%")) != -1)
181 roytam 519                 {
520                         CStdString strGenre;
521  
182 roytam 522                         ExtFileInfoStruct.metadata      = _T("genre");
181 roytam 523                         ExtFileInfoStruct.ret           = strGenre.GetBuffer(TEXTLENGTH);
524                         ExtFileInfoStruct.retlen        = TEXTLENGTH;
525  
182 roytam 526 #ifdef _MBCS
181 roytam 527                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFO);
182 roytam 528 #else
529                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFOW);
530 #endif
181 roytam 531  
532                         strGenre.ReleaseBuffer();
182 roytam 533                         strTitle.Replace(_T("%genre%"), strGenre);
181 roytam 534                 }
535  
182 roytam 536                 if (strTitle.Find(_T("%year%")) != -1)
181 roytam 537                 {
538                         CStdString strYear;
539  
182 roytam 540                         ExtFileInfoStruct.metadata      = _T("year");
181 roytam 541                         ExtFileInfoStruct.ret           = strYear.GetBuffer(TEXTLENGTH);
542                         ExtFileInfoStruct.retlen        = TEXTLENGTH;
543  
182 roytam 544 #ifdef _MBCS
181 roytam 545                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFO);
182 roytam 546 #else
547                         SendMessage(hWndParent, WM_WA_IPC, (WPARAM) &ExtFileInfoStruct, IPC_GET_EXTENDED_FILE_INFOW);
548 #endif
181 roytam 549  
550                         strYear.ReleaseBuffer();
182 roytam 551                         strTitle.Replace(_T("%year%"), strYear);
181 roytam 552                 }
553         }
554  
555         // Prevent further mischief in case of error
556         if ((strTrackName == NULL) || strTrackName.IsEmpty())
557         {
558                 strTitle.Empty();
559                 strTime.Empty();
560  
561                 return false;
562         }
563         else
564         {
565                 int play_status;
566  
567                 if (show_playstatus)
568                 {
569                         // IPC_ISPLAYING returns the status of playback
570                         play_status = SendMessage(hWndParent, WM_WA_IPC, 0, IPC_ISPLAYING);     // Paused: 3
571                 }
572                 else
573                         play_status = 1; // "[Pause]" or [Stop] are not displayed
574  
575                 switch (play_status)
576                 {
577                         case 1:         // Winamp is playing: get current play time and song length from Winamp
578                         {
579                                 // IPC_GETOUTPUTTIME returns the position of the current song in milliseconds (mode 0)
580                                 int song_position = int ((SendMessage(hWndParent, WM_WA_IPC, 0, IPC_GETOUTPUTTIME) / 1000.0) + 0.5); // convert to seconds
581                                 // IPC_GETOUTPUTTIME returns the length of the current song in seconds (mode 1)
582                                 int song_length   = SendMessage(hWndParent, WM_WA_IPC, 1, IPC_GETOUTPUTTIME); // seconds
583  
584                                 if (show_remaining_time) // Show remaining time or play time
585                                         song_position = song_length - song_position;
586  
587                                 if (song_position < 0) // Track has been written (i.e. encoded) while Winamp already played it
588                                 {
589                                         song_position = abs(song_position);
182 roytam 590                                         strTime.Format(_T("[%02d:%02d]"), song_position/60, song_position%60);
181 roytam 591                                 }
592                                 else
593                                 {
594                                         if (show_song_length) // Show song length after song position
182 roytam 595                                                 strTime.Format(_T("%02d:%02d (%02d:%02d)"), song_position/60, song_position%60, song_length/60, song_length%60);
181 roytam 596                                         else
182 roytam 597                                                 strTime.Format(_T("%02d:%02d"), song_position/60, song_position%60);
181 roytam 598                                 }
599                                 break;
600                         }
601                         case 3:         // Playback is currently paused
602                         {
603                                 strTime = "Pause";
604                                 break;
605                         }
606                         default:        // Playback is currently stopped
607                         {
608                                 strTime = "Stop";
609                                 break;
610                         }
611                 }
612         }
613  
614         CStdString strTrackNumber;
182 roytam 615         strTrackNumber.Format(_T("%02d"), track_number + 1);
181 roytam 616  
182 roytam 617         strTitle.Replace(_T("%number%"), strTrackNumber);
181 roytam 618  
182 roytam 619         if (strTitle.Find(_T("%total%")) != -1)
181 roytam 620         {
621                 // IPC_GETLISTLENGTH returns the length of the current playlist in tracks
622                 int total_track_number = SendMessage(hWndParent, WM_WA_IPC, 0, IPC_GETLISTLENGTH);
623  
624                 CStdString strTotalTrackNumber;
182 roytam 625                 strTotalTrackNumber.Format(_T("%02d"), total_track_number);
181 roytam 626  
182 roytam 627                 strTitle.Replace(_T("%total%"), strTotalTrackNumber);
181 roytam 628         }
629  
182 roytam 630         strTitle.Replace(_T("%track%"), strTrackName);
631         strTitle.Replace(_T("%time%"), strTime);
181 roytam 632  
633         return true;
634 }
635  
636 void gen_tbar::draw_titlebar()
637 {
638         if (pInfo && plugin_enabled && get_song_data())
639         {
640                 pInfo->setText(strTitle);
641                 pInfo->setFont(lfont);
642                 pInfo->setFontColor(color);
643                 pInfo->setFontShift(horizontalshift, verticalshift);
644                 pInfo->setShowPlayStatus(show_playstatus);
645                 pInfo->drawOnCaption();
646         }
647 }
648  
182 roytam 649 bool gen_tbar::get_registry_string(HKEY root_key, TCHAR* sub_key, TCHAR* key_name, TCHAR** data)
181 roytam 650 {
651         HKEY hRegistry;
652         DWORD dwType = REG_SZ;
653         DWORD dwSize = 199;
654  
655         RegOpenKeyEx(root_key, sub_key, NULL, KEY_EXECUTE, &hRegistry);
656         LONG rueck = RegQueryValueEx(hRegistry, key_name, NULL, &dwType, (BYTE*)*data, &dwSize);
657         RegCloseKey(hRegistry);
658         hRegistry = NULL;
659  
660         return (rueck == ERROR_SUCCESS);
661 }
662  
182 roytam 663 bool gen_tbar::set_registry_string(HKEY root_key, TCHAR* sub_key, TCHAR* key_name, TCHAR* data)
181 roytam 664 {
182 roytam 665         TCHAR* registry_data = new TCHAR[200];
666         _tcsncpy(registry_data, data, 200);
181 roytam 667         registry_data[199] = '\0';
668  
669         HKEY hRegistry;
670         DWORD dwSize = 199;
671         DWORD dwType = REG_SZ;
672         RegCreateKeyEx(root_key, sub_key, NULL, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &hRegistry, NULL);
673  
674         dwSize = 199;
675         dwType = REG_SZ;
182 roytam 676         LONG rueck = RegSetValueEx(hRegistry, key_name, NULL, dwType, (BYTE*)registry_data, (_tcslen(registry_data) + 1)* sizeof(TCHAR));
181 roytam 677         RegCloseKey(hRegistry);
678         hRegistry = NULL;
679  
680         delete[] registry_data;
681         registry_data = NULL;
682  
683         return (rueck == ERROR_SUCCESS);
684 }