WinCE: update the use of messages subscription
[vlc.git] / modules / gui / wince / wince.h
1 /*****************************************************************************
2  * wince.h: private WinCE interface descriptor
3  *****************************************************************************
4  * Copyright (C) 1999-2004 the VideoLAN team
5  * $Id$
6  *
7  * Authors: Gildas Bazin <gbazin@videolan.org>
8  *          Marodon Cedric <cedric_marodon@yahoo.fr>
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., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23  *****************************************************************************/
24
25 #ifndef WINCE_RESOURCE
26
27 #define SLIDER_HEIGHT 50
28 #define SLIDER_MAX_POS 10000
29 #define MENU_HEIGHT 26
30
31 #define FILE_ACCESS 1
32 #define NET_ACCESS 2
33
34 #define OPEN_NORMAL 0
35 #define OPEN_STREAM 1
36
37 #if defined( UNDER_CE ) && defined(__MINGW32__)
38     /* This is a gross hack for the wince gcc cross-compiler */
39 #   define _off_t long
40 #endif
41
42 #include "vlc_keys.h"
43 #include <vlc_messages.h>
44
45 #include <stdio.h>
46 #include <string>
47 #include <vector>
48 using namespace std;
49
50 class CBaseWindow;
51 class MenuItemExt;
52 class VideoWindow;
53
54 /*****************************************************************************
55  * intf_sys_t: description and status of wxwindows interface
56  *****************************************************************************/
57 struct intf_sys_t
58 {
59     /* the parent window */
60     CBaseWindow         *p_window;
61
62     /* special actions */
63     bool          b_playing;
64
65     /* The input thread */
66     input_thread_t *    p_input;
67
68     /* The slider */
69     int                 i_slider_pos;                     /* slider position */
70     int                 i_slider_oldpos;                /* previous position */
71     bool          b_slider_free;                      /* slider status */
72
73
74
75     /* Playlist management */
76     int                 i_playing;                 /* playlist selected item */
77
78     /* Send an event to show a dialog */
79     void (*pf_show_dialog) ( intf_thread_t *p_intf, int i_dialog, int i_arg,
80                              intf_dialog_args_t *p_arg );
81
82     /* Dynamic Menu management */
83     vector<MenuItemExt*> *p_audio_menu;
84     vector<MenuItemExt*> *p_video_menu;
85     vector<MenuItemExt*> *p_navig_menu;
86     vector<MenuItemExt*> *p_settings_menu;
87
88     VideoWindow          *p_video_window;
89 };
90
91 /*****************************************************************************
92  * Prototypes
93  *****************************************************************************/
94
95 class CBaseWindow
96 {
97 public:
98     CBaseWindow( intf_thread_t *_p_intf = 0, CBaseWindow *_p_parent = 0,
99                  HINSTANCE _hInst = 0 )
100       : hWnd(0), hInst(_hInst), p_parent(_p_parent), p_intf(_p_intf) {};
101     virtual ~CBaseWindow() {};
102
103     HWND hWnd;                // The main window handle
104
105     static LRESULT CALLBACK BaseWndProc( HWND, UINT, WPARAM, LPARAM );
106     static int CreateDialogBox( HWND, CBaseWindow * );
107
108     HWND GetHandle() { return hWnd; }
109     BOOL Show( BOOL b_show ) { return (hWnd && ShowWindow(hWnd, b_show)); }
110     BOOL IsShown( void ) { return (hWnd && IsWindowVisible(hWnd)); }
111
112 protected:
113
114     HINSTANCE       hInst;               // The current instance
115     HWND            hwndCB;              // The command bar handle
116
117     HINSTANCE       GetInstance () const { return hInst; }
118     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM ) { return 0; };
119
120     CBaseWindow     *p_parent;
121     intf_thread_t   *p_intf;
122 };
123
124 class FileInfo;
125 class Messages;
126 class Playlist;
127 class Timer;
128 class OpenDialog;
129 class PrefsDialog;
130
131 CBaseWindow *CreateDialogsProvider( intf_thread_t *, CBaseWindow *, HINSTANCE);
132 CBaseWindow *CreateVideoWindow( intf_thread_t *, HWND );
133 void PopupMenu( intf_thread_t *, HWND, POINT );
134
135 /* Main Interface */
136 class Interface : public CBaseWindow
137 {
138 public:
139     /* Constructor */
140     Interface( intf_thread_t *, CBaseWindow *, HINSTANCE );
141     ~Interface();
142
143     BOOL InitInstance();
144
145     HWND CreateMenuBar( HWND, HINSTANCE );
146     void TogglePlayButton( int i_playing_status );
147     void Update();
148
149     HWND hwndMain;      // Handle to the main window.
150
151     HWND hwndCB;        // Handle to the command bar (contains menu)
152     HWND hwndTB;        // Handle to the toolbar.
153     HWND hwndSlider;       // Handle to the Sliderbar.
154     HWND hwndLabel;
155     HWND hwndVol;          // Handle to the volume trackbar.
156     HWND hwndSB;        // Handle to the status bar.
157     HMENU hPopUpMenu;
158     HMENU hMenu;
159
160     Timer *timer;
161     CBaseWindow *video;
162
163 protected:
164
165     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
166
167     void OnShowDialog( int );
168
169     void OnPlayStream( void );
170     void OnStopStream( void );
171     void OnPrevStream( void );
172     void OnNextStream( void );
173     void OnSlowStream( void );
174     void OnFastStream( void );
175
176     void OnVideoOnTop( void );
177     void OnSliderUpdate( int wp );
178     void OnChange( int wp );
179     void VolumeChange( int i_volume );
180     void VolumeUpdate( void );
181
182     int i_old_playing_status;
183
184 private:
185     HMENU menu_settings;
186     HMENU menu_video;
187     HMENU menu_audio;
188     HMENU menu_navigation;
189
190     bool b_volume_hold;
191 };
192
193 /* File Info */
194 class FileInfo : public CBaseWindow
195 {
196 public:
197     /* Constructor */
198     FileInfo( intf_thread_t *, CBaseWindow *, HINSTANCE );
199     virtual ~FileInfo(){};
200
201     void UpdateFileInfo(void);
202
203 protected:
204
205     HWND hwnd_fileinfo;                 // handle to fileinfo window
206     HWND hwndTV;                                // handle to tree-view control
207
208     TCHAR szFileInfoClassName[100];     // Main window class name
209     TCHAR szFileInfoTitle[100];         // Main window name
210
211     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
212     BOOL CreateTreeView( HWND );
213 };
214
215 struct msg_cb_data_t
216 {
217     Messages *self;
218 };
219
220 /* Messages */
221 class Messages : public CBaseWindow
222 {
223 public:
224     /* Constructor */
225     Messages( intf_thread_t *, CBaseWindow *, HINSTANCE );
226      ~Messages();
227
228     static void sinkMessage (msg_cb_data_t *, msg_item_t *, unsigned);
229     void sinkMessage (msg_item_t *item, unsigned);
230
231 protected:
232
233     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
234
235     /* The messages window */
236     msg_subscription_t* sub;                  /* message bank subscription */
237     msg_cb_data_t *cb_data;
238     HWND hListView;
239     bool b_verbose;
240 };
241
242 /* ItemInfo Dialog */
243 class ItemInfoDialog : public CBaseWindow
244 {
245 public:
246     /* Constructor */
247     ItemInfoDialog( intf_thread_t *, CBaseWindow *,
248                     HINSTANCE, playlist_item_t * );
249     virtual ~ItemInfoDialog(){};
250
251 protected:
252
253     intf_thread_t *p_intf;
254     HWND hwndCB;        // Handle to the command bar (but no menu)
255
256     playlist_item_t *p_item;
257
258     /* Event handlers (these functions should _not_ be virtual) */
259     void OnOk();
260     void UpdateInfo();
261
262     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
263
264     /* Controls for the iteminfo dialog box */
265     HWND uri_label;
266     HWND uri_text;
267
268     HWND name_label;
269     HWND name_text;
270
271     HWND checkbox_label;
272     HWND enabled_checkbox;
273
274     HWND info_tree;
275 };
276
277 /* Open Dialog */
278 class SubsFileDialog;
279 class OpenDialog : public CBaseWindow
280 {
281 public:
282     /* Constructor */
283     OpenDialog( intf_thread_t *, CBaseWindow *, HINSTANCE, int, int );
284     virtual ~OpenDialog(){};
285
286     void UpdateMRL();
287     void UpdateMRL( int i_access_method );
288
289     HWND file_combo;
290
291 protected:
292
293     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
294
295     HWND mrl_box;
296     HWND mrl_label;
297     HWND mrl_combo;
298     HWND label;
299
300     HWND notebook;
301
302     HWND browse_button;
303     HWND subsfile_checkbox;
304     HWND subsfile_label;
305     HWND subsfile_button;
306     SubsFileDialog *subsfile_dialog;
307
308     HWND net_radios[4];
309     HWND net_label[4];
310
311     HWND net_port_label[4];
312     HWND net_ports[4];
313     HWND hUpdown[4];
314     int i_net_ports[4];
315
316     HWND net_addrs_label[4];
317     HWND net_addrs[4];
318
319     int i_open_arg;
320     int i_access;
321     int i_net_type;
322
323     void FilePanel( HWND hwnd );
324     void NetPanel( HWND hwnd );
325
326     void OnSubsFileEnable();
327     void OnSubsFileSettings( HWND hwnd );
328
329     void OnPageChange();
330
331     void OnFilePanelChange();
332     void OnFileBrowse();
333     void OnNetPanelChange( int event );
334     void OnNetTypeChange( int event );
335     void DisableNETCtrl();
336
337     void OnOk();
338
339     vector<string> mrl;
340     vector<string> subsfile_mrl;
341 };
342
343 /* Subtitles File Dialog */
344 class SubsFileDialog: public CBaseWindow
345 {
346 public:
347     /* Constructor */
348     SubsFileDialog( intf_thread_t *, CBaseWindow *, HINSTANCE );
349     virtual ~SubsFileDialog(){};
350
351     vector<string> subsfile_mrl;
352     HWND file_combo;
353
354 protected:
355     friend class OpenDialog;
356
357     HWND file_box;
358     HWND browse_button;
359
360     HWND enc_box;
361     HWND enc_label;
362     HWND encoding_combo;
363
364     HWND misc_box;
365     HWND delay_label;
366     HWND delay_edit;
367     HWND delay_spinctrl;
368     HWND fps_label;
369     HWND fps_edit;
370     HWND fps_spinctrl;
371
372     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
373
374     /* Event handlers (these functions should _not_ be virtual) */
375     void OnFileBrowse();
376 };
377
378 /* Playlist */
379 class Playlist : public CBaseWindow
380 {
381 public:
382     /* Constructor */
383     Playlist( intf_thread_t *, CBaseWindow *, HINSTANCE );
384     virtual ~Playlist(){};
385
386     void UpdatePlaylist();
387     void ShowPlaylist( bool );
388
389 protected:
390
391     bool b_need_update;
392     vlc_mutex_t lock;
393
394     int i_title_sorted;
395     int i_author_sorted;
396
397     HWND hwndCB;        // Handle to the command bar (contains menu)
398     HWND hwndTB;        // Handle to the toolbar.
399     HWND hListView;
400
401     void Rebuild();
402     void UpdateItem( int );
403     LRESULT ProcessCustomDraw( LPARAM lParam );
404     void HandlePopupMenu( HWND hwnd, POINT point);
405
406     void DeleteItem( int item );
407
408     void OnOpen();
409     void OnSave();
410
411     void OnDeleteSelection();
412     void OnInvertSelection();
413     void OnEnableSelection();
414     void OnDisableSelection();
415     void OnSelectAll();
416     void OnActivateItem( int i_item );
417     void ShowInfos( HWND hwnd, int i_item );
418
419     void OnUp();
420     void OnDown();
421
422     void OnRandom();
423     void OnLoop();
424     void OnRepeat();
425
426     void OnSort( UINT event );
427     void OnColSelect( int iSubItem );
428
429     void OnPopupPlay();
430     void OnPopupDel();
431     void OnPopupEna();
432     void OnPopupInfo( HWND hwnd );
433
434     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
435 };
436
437 /* Timer */
438 class Timer
439 {
440 public:
441     /* Constructor */
442     Timer( intf_thread_t *p_intf, HWND hwnd, Interface *_p_main_interface );
443     virtual ~Timer();
444     void Notify( void );
445
446 private:
447     intf_thread_t *p_intf;
448     Interface *p_main_interface;
449     //Interface *p_main_interface;
450     int i_old_playing_status;
451     int i_old_rate;
452 };
453
454 /* Menus */
455 void RefreshSettingsMenu( intf_thread_t *_p_intf, HMENU hMenu );
456 void RefreshAudioMenu( intf_thread_t *_p_intf, HMENU hMenu );
457 void RefreshVideoMenu( intf_thread_t *_p_intf, HMENU hMenu );
458 void RefreshNavigMenu( intf_thread_t *_p_intf, HMENU hMenu );
459 void RefreshMenu( intf_thread_t *, vector<MenuItemExt*> *, HMENU, int,
460                   char **, vlc_object_t **, int );
461 int wce_GetMenuItemCount( HMENU );
462 void CreateMenuItem( intf_thread_t *, vector<MenuItemExt*> *, HMENU, char *,
463                      vlc_object_t *, int * );
464 HMENU CreateChoicesMenu( intf_thread_t *, vector<MenuItemExt*> *, char *,
465                          vlc_object_t *, int * );
466 void OnMenuEvent( intf_thread_t *, int );
467
468 /*****************************************************************************
469  * A small helper class which encapsulate wxMenuitem with some other useful
470  * things.
471  *****************************************************************************/
472 class MenuItemExt
473 {
474 public:
475     /* Constructor */
476     MenuItemExt( intf_thread_t *_p_intf, int _id, char *_psz_var,
477                  vlc_object_t * p_object, vlc_value_t _val, int _i_val_type );
478
479     virtual ~MenuItemExt();
480
481     static void ClearList( vector<MenuItemExt*> * );
482
483     int id;
484     intf_thread_t *p_intf;
485     char *psz_var;
486     int  i_val_type;
487     vlc_object_t * p_object;
488     vlc_value_t val;
489
490 private:
491
492 };
493
494
495 /* Preferences Dialog */
496 /* Preferences Dialog */
497 class PrefsTreeCtrl;
498 class PrefsDialog: public CBaseWindow
499 {
500 public:
501     /* Constructor */
502     PrefsDialog( intf_thread_t *, CBaseWindow *, HINSTANCE );
503     virtual ~PrefsDialog(){};
504
505 protected:
506
507     /* Event handlers (these functions should _not_ be virtual) */
508     void OnOk( void );
509     /*void OnCancel( UINT event );
510     void OnSave( UINT event );
511     void OnResetAll( UINT event );
512     void OnAdvanced( UINT event );*/
513
514     HWND save_button;
515     HWND reset_button;
516     HWND advanced_checkbox;
517     HWND advanced_label;
518
519     PrefsTreeCtrl *prefs_tree;
520
521     virtual LRESULT WndProc( HWND, UINT, WPARAM, LPARAM );
522 };
523
524 /*****************************************************************************
525  * A small helper function for utf8 <-> unicode conversions
526  *****************************************************************************/
527 #ifdef UNICODE
528     extern wchar_t pwsz_mbtow_wince[2048];
529     extern char psz_wtomb_wince[2048];
530     static inline wchar_t *_FROMMB( const char *psz_in )
531     {
532         mbstowcs( pwsz_mbtow_wince, psz_in, 2048 );
533         pwsz_mbtow_wince[2048-1] = 0;
534         return pwsz_mbtow_wince;
535     }
536     static inline char *_TOMB( const wchar_t *pwsz_in )
537     {
538         wcstombs( psz_wtomb_wince, pwsz_in, 2048 );
539         psz_wtomb_wince[2048-1] = 0;
540         return psz_wtomb_wince;
541     }
542 #else
543 #   define _FROMMB(a) a
544 #   define _TOMB(a) a
545 #endif
546
547 /*****************************************************************************
548  * Misc definitions (mainly from aygshell.h)
549  *****************************************************************************/
550 #define _WIN32_IE 0x0500
551
552 #define SHFS_SHOWSIPBUTTON          0x0004
553 #define SHFS_HIDESIPBUTTON          0x0008
554 #define SHIDIM_FLAGS                0x0001
555 #define SHIDIF_DONEBUTTON           0x0001
556 #define SHIDIF_SIPDOWN              0x0008
557 #define SHIDIF_FULLSCREENNOMENUBAR  0x0010
558 #define SHCMBF_HMENU                0x0010
559 #define SHCMBF_EMPTYBAR             0x0001
560 #define GN_CONTEXTMENU              1000
561 #define SHRG_RETURNCMD              0x0001
562 #define SHRG_NOTIFYPARENT           0x0002
563 #define SHCMBM_GETSUBMENU           (WM_USER + 401)
564 #define SHCMBM_GETMENU              (WM_USER + 402)
565 #ifndef TBSTYLE_NO_DROPDOWN_ARROW
566 #define TBSTYLE_NO_DROPDOWN_ARROW   0x0080
567 #endif
568 #define lstrlenW wcslen
569 #define SHGetMenu(hwnd) \
570     (HMENU)SendMessage((hwnd), SHCMBM_GETMENU, (WPARAM)0, (LPARAM)0)
571 #define TrackPopupMenu(hm,u,x,y,r,hw,p) \
572     TrackPopupMenuEx((hm),(u),(x),(y),(hw),0)
573
574 extern "C" {
575     typedef struct tagSHMENUBARINFO
576     {
577         DWORD cbSize;
578         HWND hwndParent;
579         DWORD dwFlags;
580         UINT nToolBarId;
581         HINSTANCE hInstRes;
582         int nBmpId;
583         int cBmpImages;
584         HWND hwndMB;
585         COLORREF clrBk;
586     } SHMENUBARINFO, *PSHMENUBARINFO;
587
588     BOOL SHCreateMenuBar( SHMENUBARINFO *pmbi );
589     BOOL SHFullScreen(HWND hwndRequester, DWORD dwState);
590
591     typedef struct tagSHINITDLGINFO
592     {
593         DWORD dwMask;
594         HWND  hDlg;
595         DWORD dwFlags;
596     } SHINITDLGINFO, *PSHINITDLGINFO;
597
598     BOOL SHInitDialog(PSHINITDLGINFO pshidi);
599
600     typedef struct tagNMRGINFO
601     {
602         NMHDR hdr;
603         POINT ptAction;
604         DWORD dwItemSpec;
605     } NMRGINFO, *PNMRGINFO;
606
607     BOOL WINAPI CommandBar_InsertMenubarEx(HWND, HINSTANCE, LPTSTR, WORD);
608
609     typedef struct tagSHRGI
610     {
611         DWORD cbSize;
612         HWND hwndClient;
613         POINT ptDown;
614         DWORD dwFlags;
615     } SHRGINFO, *PSHRGINFO;
616
617     DWORD SHRecognizeGesture(SHRGINFO *shrg);
618
619     typedef enum tagSIPSTATE
620     {
621         SIP_UP = 0,
622         SIP_DOWN,
623         SIP_FORCEDOWN,
624         SIP_UNCHANGED,
625         SIP_INPUTDIALOG,
626     } SIPSTATE;
627
628     BOOL SHSipPreference(HWND, SIPSTATE);
629
630     BOOL SHSipInfo(UINT, UINT, PVOID, UINT);
631
632     typedef struct
633     {
634         DWORD cbSize;
635         DWORD fdwFlags;
636         RECT rcVisibleDesktop;
637         RECT rcSipRect;
638         DWORD dwImDataSize;
639         VOID *pvImData;
640     } SIPINFO;
641 }
642
643 #if defined( WIN32 ) && !defined( UNDER_CE )
644 #   define SHFullScreen(a,b)
645 #   define SHInitDialog(a)
646 #   define SHCreateMenuBar(a) 1
647 #   define SHRecognizeGesture(a) 0
648 #   define SHSipPreference(a,b)
649
650 #   define SHSipInfo(a,b,c,d) 0
651 #endif
652
653 #endif //WINCE_RESOURCE
654
655 #define IDD_ABOUT                       101
656 #define IDI_ICON1                       102
657 #define IDB_BITMAP1                     103
658 #define IDB_BITMAP2                     111
659 #define IDR_MENUBAR1                    113
660 #define IDD_FILEINFO                    118
661 #define IDD_DUMMY                       118
662 #define IDD_MESSAGES                    119
663 #define IDR_MENUBAR                     120
664 #define IDR_MENUBAR2                    121
665 #define IDD_PLAYLIST                    122
666 #define IDB_BITMAP3                     123
667 #define IDD_ITEMINFO                    124
668 #define IDCLEAR                         1001
669 #define IDSAVEAS                        1002
670 #define ID_FILE                         40028
671 #define ID_VIEW                         40030
672 #define ID_SETTINGS                     40032
673 #define ID_AUDIO                        40034
674 #define ID_EMPTY                        40034
675 #define ID_VIDEO                        40036
676 #define ID_NAVIGATION                   40038
677 #define IDM_FILE                        40042
678 #define IDM_VIEW                        40044
679 #define IDM_SETTINGS                    40046
680 #define IDM_AUDIO                       40048
681 #define IDM_VIDEO                       40050
682 #define IDM_NAVIGATION                  40053
683 #define ID_FILE_QUICKOPEN               40057
684 #define ID_FILE_OPENFILE                40058
685 #define ID_FILE_OPENDIR                 40059
686 #define ID_FILE_OPENNET                 40060
687 #define ID_FILE_EXIT                    40061
688 #define ID_VIEW_PLAYLIST                40063
689 #define ID_VIEW_MESSAGES                40064
690 #define ID_VIEW_MEDIAINFO               40065
691 #define ID_VIEW_STREAMINFO              40066
692 #define ID_PREFERENCES                  40071
693 #define ID_FILE_ABOUT                   40069
694 #define IDM_MANAGE                      40087
695 #define IDM_SORT                        40088
696 #define IDM_SEL                         40089
697 #define ID_SORT_AUTHOR                  40091
698 #define ID_SORT_RAUTHOR                 40092
699 #define ID_SORT_SHUFFLE                 40095
700 #define ID_SEL_INVERT                   40096
701 #define ID_SEL_DELETE                   40097
702 #define ID_SEL_SELECTALL                40098
703 #define ID_SEL_ENABLE                   40100
704 #define ID_SEL_DISABLE                  40101
705 #define ID_SORT_TITLE                   40102
706 #define ID_SORT_RTITLE                  40103
707 #define ID_MANAGE_ADDFILE               40104
708 #define ID_MANAGE_ADDDIRECTORY          40105
709 #define ID_MANAGE_ADDMRL                40106
710 #define ID_MANAGE_OPENPL                40107
711 #define ID_MANAGE_SAVEPL                40108
712 #define StopStream_Event                57601
713 #define PlayStream_Event                57602
714 #define PrevStream_Event                57603
715 #define NextStream_Event                57604
716 #define SlowStream_Event                57605
717 #define FastStream_Event                57606