1 /*****************************************************************************
2 * main_interface.cpp : Main interface
3 ****************************************************************************
4 * Copyright (C) 2006-2010 VideoLAN and AUTHORS
7 * Authors: Jean-Baptiste Kempf <jb@videolan.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
22 *****************************************************************************/
25 #include "main_interface.hpp"
27 #include "input_manager.hpp"
28 #include "actions_manager.hpp"
32 #include <vlc_windows_interfaces.h>
34 #define WM_APPCOMMAND 0x0319
36 #define APPCOMMAND_VOLUME_MUTE 8
37 #define APPCOMMAND_VOLUME_DOWN 9
38 #define APPCOMMAND_VOLUME_UP 10
39 #define APPCOMMAND_MEDIA_NEXTTRACK 11
40 #define APPCOMMAND_MEDIA_PREVIOUSTRACK 12
41 #define APPCOMMAND_MEDIA_STOP 13
42 #define APPCOMMAND_MEDIA_PLAY_PAUSE 14
43 #define APPCOMMAND_LAUNCH_MEDIA_SELECT 16
44 #define APPCOMMAND_BASS_DOWN 19
45 #define APPCOMMAND_BASS_BOOST 20
46 #define APPCOMMAND_BASS_UP 21
47 #define APPCOMMAND_TREBLE_DOWN 22
48 #define APPCOMMAND_TREBLE_UP 23
49 #define APPCOMMAND_MICROPHONE_VOLUME_MUTE 24
50 #define APPCOMMAND_MICROPHONE_VOLUME_DOWN 25
51 #define APPCOMMAND_MICROPHONE_VOLUME_UP 26
52 #define APPCOMMAND_DICTATE_OR_COMMAND_CONTROL_TOGGLE 43
53 #define APPCOMMAND_MIC_ON_OFF_TOGGLE 44
54 #define APPCOMMAND_MEDIA_PLAY 46
55 #define APPCOMMAND_MEDIA_PAUSE 47
56 #define APPCOMMAND_MEDIA_RECORD 48
57 #define APPCOMMAND_MEDIA_FAST_FORWARD 49
58 #define APPCOMMAND_MEDIA_REWIND 50
59 #define APPCOMMAND_MEDIA_CHANNEL_UP 51
60 #define APPCOMMAND_MEDIA_CHANNEL_DOWN 52
62 #define FAPPCOMMAND_MOUSE 0x8000
63 #define FAPPCOMMAND_KEY 0
64 #define FAPPCOMMAND_OEM 0x1000
65 #define FAPPCOMMAND_MASK 0xF000
67 #define GET_APPCOMMAND_LPARAM(lParam) ((short)(HIWORD(lParam) & ~FAPPCOMMAND_MASK))
68 #define GET_DEVICE_LPARAM(lParam) ((WORD)(HIWORD(lParam) & FAPPCOMMAND_MASK))
69 #define GET_MOUSEORKEY_LPARAM GET_DEVICE_LPARAM
70 #define GET_FLAGS_LPARAM(lParam) (LOWORD(lParam))
71 #define GET_KEYSTATE_LPARAM(lParam) GET_FLAGS_LPARAM(lParam)
73 void MainInterface::createTaskBarButtons()
75 taskbar_wmsg
= WM_NULL
;
76 /*Here is the code for the taskbar thumb buttons
77 FIXME:We need pretty buttons in 16x16 px that are handled correctly by masks in Qt
78 FIXME:the play button's picture doesn't changed to pause when clicked
83 if( S_OK
== CoCreateInstance( &clsid_ITaskbarList
,
84 NULL
, CLSCTX_INPROC_SERVER
,
88 p_taskbl
->vt
->HrInit(p_taskbl
);
90 if(himl
= ImageList_Create( 20, //cx
93 4,//initial nb of images
94 0//nb of images that can be added
97 QPixmap img
= QPixmap(":/win7/prev");
98 QPixmap img2
= QPixmap(":/win7/pause");
99 QPixmap img3
= QPixmap(":/win7/play");
100 QPixmap img4
= QPixmap(":/win7/next");
101 QBitmap mask
= img
.createMaskFromColor(Qt::transparent
);
102 QBitmap mask2
= img2
.createMaskFromColor(Qt::transparent
);
103 QBitmap mask3
= img3
.createMaskFromColor(Qt::transparent
);
104 QBitmap mask4
= img4
.createMaskFromColor(Qt::transparent
);
106 if(-1 == ImageList_Add(himl
, img
.toWinHBITMAP(QPixmap::PremultipliedAlpha
),mask
.toWinHBITMAP()))
107 msg_Err( p_intf
, "ImageList_Add failed" );
108 if(-1 == ImageList_Add(himl
, img2
.toWinHBITMAP(QPixmap::PremultipliedAlpha
),mask2
.toWinHBITMAP()))
109 msg_Err( p_intf
, "ImageList_Add failed" );
110 if(-1 == ImageList_Add(himl
, img3
.toWinHBITMAP(QPixmap::PremultipliedAlpha
),mask3
.toWinHBITMAP()))
111 msg_Err( p_intf
, "ImageList_Add failed" );
112 if(-1 == ImageList_Add(himl
, img4
.toWinHBITMAP(QPixmap::PremultipliedAlpha
),mask4
.toWinHBITMAP()))
113 msg_Err( p_intf
, "ImageList_Add failed" );
116 // Define an array of two buttons. These buttons provide images through an
117 // image list and also provide tooltips.
118 DWORD dwMask
= THB_BITMAP
| THB_FLAGS
;
120 THUMBBUTTON thbButtons
[3];
121 thbButtons
[0].dwMask
= dwMask
;
122 thbButtons
[0].iId
= 0;
123 thbButtons
[0].iBitmap
= 0;
124 thbButtons
[0].dwFlags
= THBF_HIDDEN
;
126 thbButtons
[1].dwMask
= dwMask
;
127 thbButtons
[1].iId
= 1;
128 thbButtons
[1].iBitmap
= 2;
129 thbButtons
[1].dwFlags
= THBF_HIDDEN
;
131 thbButtons
[2].dwMask
= dwMask
;
132 thbButtons
[2].iId
= 2;
133 thbButtons
[2].iBitmap
= 3;
134 thbButtons
[2].dwFlags
= THBF_HIDDEN
;
136 HRESULT hr
= p_taskbl
->vt
->ThumbBarSetImageList(p_taskbl
, winId(), himl
);
138 msg_Err( p_intf
, "ThumbBarSetImageList failed with error %08x", hr
);
141 hr
= p_taskbl
->vt
->ThumbBarAddButtons(p_taskbl
, winId(), 3, thbButtons
);
143 msg_Err( p_intf
, "ThumbBarAddButtons failed with error %08x", hr
);
145 CONNECT( THEMIM
->getIM(), statusChanged( int ), this, changeThumbbarButtons( int ) );
155 bool MainInterface::winEvent ( MSG
* msg
, long * result
)
157 if (msg
->message
== taskbar_wmsg
)
159 //We received the "taskbarbuttoncreated" message, now we can really create the buttons
160 createTaskBarButtons();
164 switch( msg
->message
)
167 if (HIWORD(msg
->wParam
) == THBN_CLICKED
)
169 switch(LOWORD(msg
->wParam
))
175 THEMIM
->togglePlayPause();
184 cmd
= GET_APPCOMMAND_LPARAM(msg
->lParam
);
187 case APPCOMMAND_MEDIA_PLAY_PAUSE
:
188 THEMIM
->togglePlayPause();
190 case APPCOMMAND_MEDIA_PLAY
:
193 case APPCOMMAND_MEDIA_PAUSE
:
196 case APPCOMMAND_MEDIA_PREVIOUSTRACK
:
199 case APPCOMMAND_MEDIA_NEXTTRACK
:
202 case APPCOMMAND_MEDIA_STOP
:
205 case APPCOMMAND_VOLUME_DOWN
:
208 case APPCOMMAND_VOLUME_UP
:
211 case APPCOMMAND_VOLUME_MUTE
:
212 THEAM
->toggleMuteAudio();
215 msg_Dbg( p_intf
, "unknown APPCOMMAND = %d", cmd
);
224 //moc doesn't know about #ifdef, so we have to build this method for every platform
225 void MainInterface::changeThumbbarButtons( int i_status
)
228 // Define an array of three buttons. These buttons provide images through an
229 // image list and also provide tooltips.
230 DWORD dwMask
= THB_BITMAP
| THB_FLAGS
;
232 THUMBBUTTON thbButtons
[3];
234 thbButtons
[0].dwMask
= dwMask
;
235 thbButtons
[0].iId
= 0;
236 thbButtons
[0].iBitmap
= 0;
239 thbButtons
[1].dwMask
= dwMask
;
240 thbButtons
[1].iId
= 1;
243 thbButtons
[2].dwMask
= dwMask
;
244 thbButtons
[2].iId
= 2;
245 thbButtons
[2].iBitmap
= 3;
251 thbButtons
[0].dwFlags
= THBF_ENABLED
;
252 thbButtons
[1].dwFlags
= THBF_ENABLED
;
253 thbButtons
[2].dwFlags
= THBF_ENABLED
;
254 thbButtons
[1].iBitmap
= 1;
259 thbButtons
[0].dwFlags
= THBF_ENABLED
;
260 thbButtons
[1].dwFlags
= THBF_ENABLED
;
261 thbButtons
[2].dwFlags
= THBF_ENABLED
;
262 thbButtons
[1].iBitmap
= 2;
268 HRESULT hr
= p_taskbl
->vt
->ThumbBarUpdateButtons(p_taskbl
, this->winId(), 3, thbButtons
);
270 msg_Err( p_intf
, "ThumbBarUpdateButtons failed with error %08x", hr
);