cf48feaca37752352c021e22e801282afa7ae5ca
[vlc.git] / modules / gui / skins / gtk2 / gtk2_theme.cpp
1 /*****************************************************************************
2  * gtk2_theme.cpp: GTK2 implementation of the Theme class
3  *****************************************************************************
4  * Copyright (C) 2003 VideoLAN
5  * $Id: gtk2_theme.cpp,v 1.8 2003/04/14 20:07:49 asmax Exp $
6  *
7  * Authors: Cyril Deguet     <asmax@videolan.org>
8  *
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.
13  *
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.
18  *
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
21  * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111,
22  * USA.
23  *****************************************************************************/
24
25 #if !defined WIN32
26
27 //--- GTK2 -----------------------------------------------------------------
28 #include <gdk/gdk.h>
29 #include <gdk-pixbuf/gdk-pixbuf.h>
30
31 //--- VLC -------------------------------------------------------------------
32 #include <vlc/intf.h>
33
34 //--- SKIN ------------------------------------------------------------------
35 #include "os_api.h"
36 #include "banks.h"
37 #include "window.h"
38 #include "os_window.h"
39 #include "event.h"
40 #include "os_event.h"
41 #include "theme.h"
42 #include "os_theme.h"
43 #include "dialog.h"
44 #include "os_dialog.h"
45 #include "vlcproc.h"
46 #include "skin_common.h"
47
48
49 //---------------------------------------------------------------------------
50 void SkinManage( intf_thread_t *p_intf );
51
52 /*
53
54 //---------------------------------------------------------------------------
55 // GTK2 interface
56 //---------------------------------------------------------------------------
57 LRESULT CALLBACK GTK2Proc( HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
58 {
59     // Get pointer to thread info
60     intf_thread_t *p_intf = (intf_thread_t *)GetWindowLongPtr( hwnd,
61         GWLP_USERDATA );
62
63     // If doesn't exist, treat windows message normally
64     if( p_intf == NULL )
65         return DefWindowProc( hwnd, uMsg, wParam, lParam );
66
67     // Create event to dispatch in windows
68     Event *evt = (Event *)new OSEvent( p_intf, hwnd, uMsg, wParam, lParam );
69
70
71     // Find window matching with hwnd
72     list<Window *>::const_iterator win;
73     for( win = p_intf->p_sys->p_theme->WindowList.begin();
74          win != p_intf->p_sys->p_theme->WindowList.end(); win++ )
75     {
76         // If it is the correct window
77         if( hwnd == ( (GTK2Window *)(*win) )->GetHandle() )
78         {
79             // Send event and check if processed
80             if( (*win)->ProcessEvent( evt ) )
81             {
82                 delete (OSEvent *)evt;
83                 return 0;
84             }
85             else
86             {
87                 break;
88             }
89         }
90     }
91     delete (OSEvent *)evt;
92
93
94     // If Window is parent window
95     if( hwnd == ( (GTK2Theme *)p_intf->p_sys->p_theme )->GetParentWindow() )
96     {
97         if( uMsg == WM_SYSCOMMAND )
98         {
99             if( (Event *)wParam != NULL )
100                 ( (Event *)wParam )->SendEvent();
101             return 0;
102         }
103         else if( uMsg == WM_RBUTTONDOWN && wParam == 42 &&
104                  lParam == WM_RBUTTONDOWN )
105         {
106             int x, y;
107             OSAPI_GetMousePos( x, y );
108             TrackPopupMenu(
109                 ( (GTK2Theme *)p_intf->p_sys->p_theme )->GetSysMenu(),
110                 0, x, y, 0, hwnd, NULL );
111         }
112     }
113
114
115     // If closing parent window
116     if( uMsg == WM_CLOSE )
117     {
118         OSAPI_PostMessage( NULL, VLC_HIDE, VLC_QUIT, 0 );
119         return 0;
120     }
121
122     // If hwnd does not match any window or message not processed
123     return DefWindowProc( hwnd, uMsg, wParam, lParam );
124 }
125 //---------------------------------------------------------------------------
126
127
128 */
129
130 //---------------------------------------------------------------------------
131 // THEME
132 //---------------------------------------------------------------------------
133 GTK2Theme::GTK2Theme( intf_thread_t *_p_intf ) : Theme( _p_intf )
134 {
135 /*
136     // Get instance handle
137     hinst = GetModuleHandle( NULL );
138
139     // Create window class
140     WNDCLASS SkinWindow;
141
142     SkinWindow.style = CS_VREDRAW | CS_HREDRAW | CS_DBLCLKS;
143     SkinWindow.lpfnWndProc = (WNDPROC) GTK2Proc;
144     SkinWindow.lpszClassName = "SkinWindow";
145     SkinWindow.lpszMenuName = NULL;
146     SkinWindow.cbClsExtra = 0;
147     SkinWindow.cbWndExtra = 0;
148     SkinWindow.hbrBackground = HBRUSH (COLOR_WINDOW);
149     SkinWindow.hCursor = LoadCursor( NULL , IDC_ARROW );
150     SkinWindow.hIcon = LoadIcon( hinst, "VLC_ICON" );
151     SkinWindow.hInstance = hinst;
152
153     if( !RegisterClass( &SkinWindow ) )
154     {
155         WNDCLASS wndclass;
156
157         // Check why it failed. If it's because the class already exists
158         // then fine, otherwise return with an error.
159         if( !GetClassInfo( hinst, "SkinWindow", &wndclass ) )
160         {
161             msg_Err( p_intf, "Cannot register window class" );
162             return;
163         }
164     }
165 */
166     //Initialize value
167     ParentWindow = NULL;
168
169 }
170
171 //---------------------------------------------------------------------------
172 GTK2Theme::~GTK2Theme()
173 {/*
174     // Unregister the window class if needed
175     WNDCLASS wndclass;
176     if( GetClassInfo( hinst, "SkinWindow", &wndclass ) )
177     {
178         UnregisterClass( "SkinWindow", hinst );
179     }
180     if( GetClassInfo( hinst, "LogWindow", &wndclass ) )
181     {
182         UnregisterClass( "LogWindow", hinst );
183     }
184     if( GetClassInfo( hinst, "ParentWindow", &wndclass ) )
185     {
186         UnregisterClass( "ParentWindow", hinst );
187     }
188
189     // Delete tray icon if exists
190     if( ShowInTray )
191     {
192         Shell_NotifyIcon( NIM_DELETE, &TrayIcon );
193     }
194
195     // Destroy parent window
196     if( ParentWindow )
197     {
198         DestroyWindow( ParentWindow );
199     }*/
200 }
201 //---------------------------------------------------------------------------
202 void GTK2Theme::OnLoadTheme()
203 {/*
204     // Create window class
205     WNDCLASS ParentClass;
206     ParentClass.style = CS_VREDRAW|CS_HREDRAW|CS_DBLCLKS;
207     ParentClass.lpfnWndProc = (WNDPROC) GTK2Proc;
208     ParentClass.lpszClassName = "ParentWindow";
209     ParentClass.lpszMenuName = NULL;
210     ParentClass.cbClsExtra = 0;
211     ParentClass.cbWndExtra = 0;
212     ParentClass.hbrBackground = HBRUSH (COLOR_WINDOW);
213     ParentClass.hCursor = LoadCursor( NULL , IDC_ARROW );
214     ParentClass.hIcon = LoadIcon( hinst, "VLC_ICON" );
215     ParentClass.hInstance = hinst;
216
217     // register class and check it
218     if( !RegisterClass( &ParentClass ) )
219     {
220         WNDCLASS wndclass;
221
222         // Check why it failed. If it's because the class already exists
223         // then fine, otherwise return with an error.
224         if( !GetClassInfo( hinst, "ParentWindow", &wndclass ) )
225         {
226             msg_Err( p_intf, "Cannot register window class" );
227             return;
228         }
229     }
230
231     // Create Window
232     ParentWindow = CreateWindowEx( WS_EX_LAYERED|WS_EX_TOOLWINDOW,
233         "ParentWindow", "VLC Media Player",
234         WS_SYSMENU,
235         0, 0, 0, 0, 0, 0, hinst, NULL );
236
237     // Store with it a pointer to the interface thread
238     SetWindowLongPtr( ParentWindow, GWLP_USERDATA, (LONG_PTR)p_intf );
239     ShowWindow( ParentWindow, SW_SHOW );
240
241     // System tray icon
242     TrayIcon.cbSize = sizeof( PNOTIFYICONDATA );\r
243     TrayIcon.hWnd = ParentWindow;\r
244     TrayIcon.uID = 42;\r
245     TrayIcon.uFlags = NIF_ICON|NIF_TIP|NIF_MESSAGE;\r
246     TrayIcon.uCallbackMessage = WM_RBUTTONDOWN;\r
247     TrayIcon.hIcon = LoadIcon( hinst, "VLC_ICON" );
248     strcpy( TrayIcon.szTip, "VLC Media Player" );
249
250     // Remove default entries from system menu popup
251     SysMenu = GetSystemMenu( ParentWindow, false );
252     RemoveMenu( SysMenu, SC_RESTORE,  MF_BYCOMMAND );
253     RemoveMenu( SysMenu, SC_MOVE,     MF_BYCOMMAND );
254     RemoveMenu( SysMenu, SC_SIZE,     MF_BYCOMMAND );
255     RemoveMenu( SysMenu, SC_MINIMIZE, MF_BYCOMMAND );
256     RemoveMenu( SysMenu, SC_MAXIMIZE, MF_BYCOMMAND );
257     RemoveMenu( SysMenu, SC_CLOSE,    MF_BYCOMMAND );
258     RemoveMenu( SysMenu, 0,           MF_BYPOSITION );
259
260     // The create menu
261     CreateSystemMenu();
262 */
263     // Set the parent window attributes
264     GdkWindowAttr attr;
265     attr.title = "VLC Media Player";
266     attr.event_mask = GDK_ALL_EVENTS_MASK;
267     attr.x = 0;
268     attr.y = 0;
269     attr.width = 0;
270     attr.height = 0;
271     attr.window_type = GDK_WINDOW_TOPLEVEL;
272     attr.wclass = GDK_INPUT_ONLY;
273     attr.override_redirect = FALSE;
274     
275     gint mask = GDK_WA_TITLE|GDK_WA_X|GDK_WA_Y|GDK_WA_NOREDIR;
276     
277     // Create the parent window
278     ParentWindow = gdk_window_new( NULL, &attr, mask);
279
280 //    gdk_window_show( ParentWindow );
281 }
282 //---------------------------------------------------------------------------
283 void GTK2Theme::AddSystemMenu( string name, Event *event )
284 {/*
285     if( name == "SEPARATOR" )
286     {
287         AppendMenu( SysMenu, MF_SEPARATOR, 0, NULL );
288     }
289     else
290     {
291         AppendMenu( SysMenu, MF_STRING, (unsigned int)event,
292                     (char *)name.c_str() );
293     }*/
294 }
295 //---------------------------------------------------------------------------
296 void GTK2Theme::ChangeClientWindowName( string name )
297 {/*
298     SetWindowText( ParentWindow, name.c_str() );*/
299 }
300 //---------------------------------------------------------------------------
301 void GTK2Theme::AddWindow( string name, int x, int y, bool visible,
302     int fadetime, int alpha, int movealpha, bool dragdrop )
303 {/*
304     HWND hwnd;
305
306     hwnd = CreateWindowEx( WS_EX_LAYERED|WS_EX_TOOLWINDOW,
307         "SkinWindow", name.c_str(), WS_POPUP, CW_USEDEFAULT, CW_USEDEFAULT,
308         0, 0, ParentWindow, 0, hinst, NULL );
309
310     if( !hwnd )
311     {
312         msg_Err( p_intf, "CreateWindow failed" );
313         return;
314     }
315
316     SetWindowLongPtr( hwnd, GWLP_USERDATA, (LONG_PTR)p_intf );
317
318     WindowList.push_back( (Window *)new OSWindow( p_intf, hwnd, x, y, visible,
319         fadetime, alpha, movealpha, dragdrop ) ) ;*/
320         
321     GdkWindowAttr attr;
322     attr.event_mask = GDK_ALL_EVENTS_MASK;
323     attr.width = 0;
324     attr.height = 0;
325     attr.window_type = GDK_WINDOW_TOPLEVEL;
326     attr.wclass = GDK_INPUT_OUTPUT;
327     
328     gint mask =0;
329     
330     // Create the window
331     GdkWindow *gwnd = gdk_window_new( NULL, &attr, mask );
332     if( !gwnd )
333     {
334         msg_Err( p_intf, "CreateWindow failed" );
335         return;
336     }
337     
338     gdk_window_show( gwnd );
339     
340     WindowList.push_back( (Window *)new OSWindow( p_intf, gwnd, x, y, visible,
341         fadetime, alpha, movealpha, dragdrop ) ) ;
342
343 }
344 //---------------------------------------------------------------------------
345 /*HWND GTK2Theme::GetLogHandle()
346 {
347     if( Log != NULL )
348         return ( (GTK2LogWindow *)Log )->GetWindow();
349     else
350         return NULL;
351 }*/
352 //---------------------------------------------------------------------------
353 void GTK2Theme::ChangeTray()
354 {/*
355     if( ShowInTray )
356     {
357         Shell_NotifyIcon( NIM_DELETE, &TrayIcon );
358         ShowInTray = false;
359     }
360     else
361     {
362         Shell_NotifyIcon( NIM_ADD, &TrayIcon );
363         ShowInTray = true;
364     }*/
365 }
366 //---------------------------------------------------------------------------
367 void GTK2Theme::ChangeTaskbar()
368 {/*
369     if( ShowInTaskbar )
370     {
371         ShowWindow( ParentWindow, SW_HIDE );
372         SetWindowLongPtr( ParentWindow, GWL_EXSTYLE,
373                           WS_EX_LAYERED|WS_EX_TOOLWINDOW );
374         ShowWindow( ParentWindow, SW_SHOW );
375         ShowInTaskbar = false;
376     }
377     else
378     {
379         ShowWindow( ParentWindow, SW_HIDE );
380         SetWindowLongPtr( ParentWindow, GWL_EXSTYLE,
381                           WS_EX_LAYERED|WS_EX_APPWINDOW );
382         ShowWindow( ParentWindow, SW_SHOW );
383         ShowInTaskbar = true;
384     }*/
385 }
386 //---------------------------------------------------------------------------
387
388 #endif