committed by
Rafaël Carré
24 changed files with 2526 additions and 7 deletions
@ -0,0 +1,40 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_dragdrop.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#include "os2/os2_dragdrop.hpp" |
||||
|
#include "../commands/cmd_add_item.hpp" |
||||
|
#include "../events/evt_dragndrop.hpp" |
||||
|
#include <list> |
||||
|
|
||||
|
|
||||
|
OS2DragDrop::OS2DragDrop( intf_thread_t *pIntf, |
||||
|
bool playOnDrop, GenericWindow* pWin ) |
||||
|
: SkinObject( pIntf ), m_playOnDrop( playOnDrop ), m_pWin( pWin) |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,50 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_dragdrop.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_DRAGDROP_HPP |
||||
|
#define OS2_DRAGDROP_HPP |
||||
|
|
||||
|
#ifdef HAVE_CONFIG_H |
||||
|
# include "config.h" |
||||
|
#endif |
||||
|
|
||||
|
#include "../src/skin_common.hpp" |
||||
|
#include "../src/generic_window.hpp" |
||||
|
|
||||
|
|
||||
|
class OS2DragDrop: public SkinObject |
||||
|
{ |
||||
|
public: |
||||
|
OS2DragDrop( intf_thread_t *pIntf, bool playOnDrop, GenericWindow* pWin ); |
||||
|
virtual ~OS2DragDrop() { } |
||||
|
|
||||
|
private: |
||||
|
/// Indicates whether the file(s) must be played immediately
|
||||
|
bool m_playOnDrop; |
||||
|
///
|
||||
|
GenericWindow* m_pWin; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,452 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_factory.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#ifdef HAVE_CONFIG_H |
||||
|
# include "config.h" |
||||
|
#endif |
||||
|
|
||||
|
#include <io.h> |
||||
|
#include <sys/types.h> |
||||
|
#include <sys/stat.h> |
||||
|
|
||||
|
#include "os2_factory.hpp" |
||||
|
#include "os2_graphics.hpp" |
||||
|
#include "os2_timer.hpp" |
||||
|
#include "os2_window.hpp" |
||||
|
#include "os2_tooltip.hpp" |
||||
|
#include "os2_popup.hpp" |
||||
|
#include "os2_loop.hpp" |
||||
|
#include "../src/theme.hpp" |
||||
|
#include "../src/window_manager.hpp" |
||||
|
#include "../src/generic_window.hpp" |
||||
|
#include "../commands/cmd_dialogs.hpp" |
||||
|
#include "../commands/cmd_minimize.hpp" |
||||
|
|
||||
|
|
||||
|
static void MorphToPM( void ) |
||||
|
{ |
||||
|
PPIB pib; |
||||
|
PTIB tib; |
||||
|
|
||||
|
DosGetInfoBlocks(&tib, &pib); |
||||
|
|
||||
|
// Change flag from VIO to PM
|
||||
|
if (pib->pib_ultype==2) pib->pib_ultype = 3; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
MRESULT EXPENTRY OS2Factory::OS2FrameProc( HWND hwnd, ULONG msg, |
||||
|
MPARAM mp1, MPARAM mp2 ) |
||||
|
{ |
||||
|
// Get pointer to thread info: should only work with the parent window
|
||||
|
intf_thread_t *p_intf = (intf_thread_t *)WinQueryWindowPtr( hwnd, 0 ); |
||||
|
|
||||
|
OS2Factory *pFactory = (OS2Factory*)OS2Factory::instance( p_intf ); |
||||
|
|
||||
|
if( msg == WM_ADJUSTWINDOWPOS ) |
||||
|
{ |
||||
|
PSWP pswp = ( PSWP )PVOIDFROMMP( mp1 ); |
||||
|
if( pswp->fl & ( SWP_MINIMIZE | SWP_RESTORE )) |
||||
|
{ |
||||
|
// propagate to all the owned windows
|
||||
|
HENUM henum = WinBeginEnumWindows( HWND_DESKTOP ); |
||||
|
HWND hwndNext; |
||||
|
while(( hwndNext = WinGetNextWindow( henum )) != NULLHANDLE ) |
||||
|
{ |
||||
|
if( WinQueryWindow( hwndNext, QW_OWNER ) == |
||||
|
pFactory->m_hParentClientWindow ) |
||||
|
WinSetWindowPos( hwndNext, 0, 0, 0, 0, 0, |
||||
|
pswp->fl & |
||||
|
( SWP_MINIMIZE | SWP_RESTORE )); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
else if( msg == WM_SYSCOMMAND ) |
||||
|
{ |
||||
|
// If closing parent window
|
||||
|
if( SHORT1FROMMP(mp1) == SC_CLOSE ) |
||||
|
{ |
||||
|
libvlc_Quit( p_intf->p_libvlc ); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
else if( SHORT1FROMMP(mp1) == SC_MINIMIZE ) |
||||
|
{ |
||||
|
pFactory->minimize(); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
else if( SHORT1FROMMP(mp1) == SC_RESTORE ) |
||||
|
{ |
||||
|
pFactory->restore(); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
msg_Dbg( p_intf, "WM_SYSCOMMAND %i", (SHORT1FROMMP(mp1))); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
return pFactory->m_pfnwpOldFrameProc( hwnd, msg, mp1, mp2 ); |
||||
|
} |
||||
|
|
||||
|
MRESULT EXPENTRY OS2Factory::OS2Proc( HWND hwnd, ULONG msg, |
||||
|
MPARAM mp1, MPARAM mp2 ) |
||||
|
{ |
||||
|
// Get pointer to thread info: should only work with the parent window
|
||||
|
intf_thread_t *p_intf = (intf_thread_t *)WinQueryWindowPtr( hwnd, 0 ); |
||||
|
|
||||
|
// If doesn't exist, treat windows message normally
|
||||
|
if( p_intf == NULL || p_intf->p_sys->p_osFactory == NULL ) |
||||
|
{ |
||||
|
return WinDefWindowProc( hwnd, msg, mp1, mp2 ); |
||||
|
} |
||||
|
|
||||
|
OS2Factory *pFactory = (OS2Factory*)OS2Factory::instance( p_intf ); |
||||
|
GenericWindow *pWin = pFactory->m_windowMap[hwnd]; |
||||
|
|
||||
|
// Subclass a frame window
|
||||
|
if( !pFactory->m_pfnwpOldFrameProc ) |
||||
|
{ |
||||
|
// Store with it a pointer to the interface thread
|
||||
|
WinSetWindowPtr( pFactory->m_hParentWindow, 0, p_intf ); |
||||
|
|
||||
|
pFactory->m_pfnwpOldFrameProc = |
||||
|
WinSubclassWindow( pFactory->m_hParentWindow, OS2FrameProc ); |
||||
|
} |
||||
|
|
||||
|
if( hwnd != pFactory->getParentWindow() && pWin ) |
||||
|
{ |
||||
|
OS2Loop* pLoop = |
||||
|
(OS2Loop*) OSFactory::instance( p_intf )->getOSLoop(); |
||||
|
if( pLoop ) |
||||
|
return pLoop->processEvent( hwnd, msg, mp1, mp2 ); |
||||
|
} |
||||
|
|
||||
|
// If hwnd does not match any window or message not processed
|
||||
|
return WinDefWindowProc( hwnd, msg, mp1, mp2 ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Factory::OS2Factory( intf_thread_t *pIntf ): |
||||
|
OSFactory( pIntf ), m_hParentWindow( 0 ), |
||||
|
m_dirSep( "\\" ), m_pfnwpOldFrameProc( 0 ) |
||||
|
{ |
||||
|
// see init()
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
bool OS2Factory::init() |
||||
|
{ |
||||
|
PCSZ vlc_name = "VLC Media Player"; |
||||
|
PCSZ vlc_icon = "VLC_ICON"; |
||||
|
PCSZ vlc_class = "SkinWindowClass"; |
||||
|
|
||||
|
MorphToPM(); |
||||
|
|
||||
|
m_hab = WinInitialize( 0 ); |
||||
|
m_hmq = WinCreateMsgQueue( m_hab, 0 ); |
||||
|
|
||||
|
if( !WinRegisterClass( m_hab, vlc_class, OS2Factory::OS2Proc, |
||||
|
CS_SIZEREDRAW, sizeof( PVOID ))) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "cannot register window class" ); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
ULONG flFrame = FCF_SYSMENU | FCF_MINBUTTON | FCF_TASKLIST |
||||
|
/* | FCF_ICON */; |
||||
|
|
||||
|
m_hParentWindow = WinCreateStdWindow( HWND_DESKTOP, |
||||
|
0, |
||||
|
&flFrame, |
||||
|
vlc_class, |
||||
|
vlc_name, |
||||
|
0, |
||||
|
NULLHANDLE, |
||||
|
0/* ID_VLC_ICON */, |
||||
|
&m_hParentClientWindow ); |
||||
|
|
||||
|
if( !m_hParentWindow ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "cannot create parent window" ); |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
// Store with it a pointer to the interface thread
|
||||
|
WinSetWindowPtr( m_hParentClientWindow, 0, getIntf()); |
||||
|
|
||||
|
WinSetWindowPos( m_hParentWindow, HWND_TOP, 0, 0, 0, 0, |
||||
|
SWP_ACTIVATE | SWP_ZORDER | SWP_MOVE | SWP_SIZE | |
||||
|
SWP_SHOW ); |
||||
|
|
||||
|
// Initialize the resource path
|
||||
|
char *datadir = config_GetUserDir( VLC_DATA_DIR ); |
||||
|
m_resourcePath.push_back( (string)datadir + "\\skins" ); |
||||
|
free( datadir ); |
||||
|
datadir = config_GetDataDir(); |
||||
|
m_resourcePath.push_back( (string)datadir + "\\skins" ); |
||||
|
m_resourcePath.push_back( (string)datadir + "\\skins2" ); |
||||
|
m_resourcePath.push_back( (string)datadir + "\\share\\skins" ); |
||||
|
m_resourcePath.push_back( (string)datadir + "\\share\\skins2" ); |
||||
|
m_resourcePath.push_back( (string)datadir + "\\vlc\\skins" ); |
||||
|
m_resourcePath.push_back( (string)datadir + "\\vlc\\skins2" ); |
||||
|
free( datadir ); |
||||
|
|
||||
|
// All went well
|
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Factory::~OS2Factory() |
||||
|
{ |
||||
|
if( m_hParentWindow ) WinDestroyWindow( m_hParentWindow ); |
||||
|
|
||||
|
WinDestroyMsgQueue( m_hmq ); |
||||
|
WinTerminate( m_hab ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OSGraphics *OS2Factory::createOSGraphics( int width, int height ) |
||||
|
{ |
||||
|
return new OS2Graphics( getIntf(), width, height ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OSLoop *OS2Factory::getOSLoop() |
||||
|
{ |
||||
|
return OS2Loop::instance( getIntf() ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Factory::destroyOSLoop() |
||||
|
{ |
||||
|
OS2Loop::destroy( getIntf() ); |
||||
|
} |
||||
|
|
||||
|
void OS2Factory::minimize() |
||||
|
{ |
||||
|
/* Make sure no tooltip is visible first */ |
||||
|
getIntf()->p_sys->p_theme->getWindowManager().hideTooltip(); |
||||
|
|
||||
|
WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, SWP_MINIMIZE ); |
||||
|
} |
||||
|
|
||||
|
void OS2Factory::restore() |
||||
|
{ |
||||
|
WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, SWP_RESTORE ); |
||||
|
} |
||||
|
|
||||
|
void OS2Factory::addInTray() |
||||
|
{ |
||||
|
// TODO
|
||||
|
} |
||||
|
|
||||
|
void OS2Factory::removeFromTray() |
||||
|
{ |
||||
|
// TODO
|
||||
|
} |
||||
|
|
||||
|
void OS2Factory::addInTaskBar() |
||||
|
{ |
||||
|
WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, SWP_HIDE ); |
||||
|
|
||||
|
HSWITCH hswitch = WinQuerySwitchHandle( m_hParentWindow, 0 ); |
||||
|
|
||||
|
SWCNTRL swctl; |
||||
|
WinQuerySwitchEntry( hswitch, &swctl ); |
||||
|
swctl.uchVisibility = SWL_VISIBLE; |
||||
|
WinChangeSwitchEntry( hswitch, &swctl ); |
||||
|
|
||||
|
WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, |
||||
|
SWP_ACTIVATE | SWP_SHOW ); |
||||
|
} |
||||
|
|
||||
|
void OS2Factory::removeFromTaskBar() |
||||
|
{ |
||||
|
WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, SWP_HIDE ); |
||||
|
|
||||
|
HSWITCH hswitch = WinQuerySwitchHandle( m_hParentWindow, 0 ); |
||||
|
|
||||
|
SWCNTRL swctl; |
||||
|
WinQuerySwitchEntry( hswitch, &swctl ); |
||||
|
swctl.uchVisibility = SWL_INVISIBLE; |
||||
|
WinChangeSwitchEntry( hswitch, &swctl ); |
||||
|
|
||||
|
WinSetWindowPos( m_hParentWindow, NULLHANDLE, 0, 0, 0, 0, |
||||
|
SWP_ACTIVATE | SWP_SHOW ); |
||||
|
} |
||||
|
|
||||
|
OSTimer *OS2Factory::createOSTimer( CmdGeneric &rCmd ) |
||||
|
{ |
||||
|
return new OS2Timer( getIntf(), rCmd, m_hParentClientWindow ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OSWindow *OS2Factory::createOSWindow( GenericWindow &rWindow, bool dragDrop, |
||||
|
bool playOnDrop, OSWindow *pParent, |
||||
|
GenericWindow::WindowType_t type ) |
||||
|
{ |
||||
|
return new OS2Window( getIntf(), rWindow, m_hInst, m_hParentClientWindow, |
||||
|
dragDrop, playOnDrop, (OS2Window*)pParent, type ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OSTooltip *OS2Factory::createOSTooltip() |
||||
|
{ |
||||
|
return new OS2Tooltip( getIntf(), m_hInst, m_hParentClientWindow ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OSPopup *OS2Factory::createOSPopup() |
||||
|
{ |
||||
|
// XXX FIXME: this way of getting the handle really sucks!
|
||||
|
// In fact, the clean way would be to have in Builder::addPopup() a call
|
||||
|
// to pPopup->associateToWindow() (to be written)... but the problem is
|
||||
|
// that there is no way to access the OS-dependent window handle from a
|
||||
|
// GenericWindow (we cannot even access the OSWindow).
|
||||
|
if( m_windowMap.begin() == m_windowMap.end() ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "no window has been created before the popup!" ); |
||||
|
return NULL; |
||||
|
} |
||||
|
|
||||
|
return new OS2Popup( getIntf(), m_windowMap.begin()->first ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int OS2Factory::getScreenWidth() const |
||||
|
{ |
||||
|
return WinQuerySysValue( HWND_DESKTOP, SV_CXSCREEN ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int OS2Factory::getScreenHeight() const |
||||
|
{ |
||||
|
return WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Factory::getMonitorInfo( const GenericWindow &rWindow, |
||||
|
int* p_x, int* p_y, |
||||
|
int* p_width, int* p_height ) const |
||||
|
{ |
||||
|
*p_x = 0; |
||||
|
*p_y = 0; |
||||
|
*p_width = getScreenWidth(); |
||||
|
*p_height = getScreenHeight(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Factory::getMonitorInfo( int numScreen, int* p_x, int* p_y, |
||||
|
int* p_width, int* p_height ) const |
||||
|
{ |
||||
|
*p_x = 0; |
||||
|
*p_y = 0; |
||||
|
*p_width = getScreenWidth(); |
||||
|
*p_height = getScreenHeight(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
SkinsRect OS2Factory::getWorkArea() const |
||||
|
{ |
||||
|
// TODO : calculate Desktop Workarea excluding WarpCenter
|
||||
|
|
||||
|
// Fill a Rect object
|
||||
|
return SkinsRect( 0, 0, getScreenWidth(), getScreenHeight()); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Factory::getMousePos( int &rXPos, int &rYPos ) const |
||||
|
{ |
||||
|
POINTL ptl; |
||||
|
|
||||
|
WinQueryPointerPos( HWND_DESKTOP, &ptl ); |
||||
|
|
||||
|
rXPos = ptl.x; |
||||
|
rYPos = ( getScreenHeight() - 1 ) - ptl.y; // Invert Y
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Factory::changeCursor( CursorType_t type ) const |
||||
|
{ |
||||
|
LONG id; |
||||
|
switch( type ) |
||||
|
{ |
||||
|
default: |
||||
|
case kDefaultArrow: id = SPTR_ARROW; break; |
||||
|
case kResizeNWSE: id = SPTR_SIZENWSE; break; |
||||
|
case kResizeNS: id = SPTR_SIZENS; break; |
||||
|
case kResizeWE: id = SPTR_SIZEWE; break; |
||||
|
case kResizeNESW: id = SPTR_SIZENESW; break; |
||||
|
} |
||||
|
|
||||
|
HPOINTER hptr = WinQuerySysPointer( HWND_DESKTOP, id, FALSE ); |
||||
|
WinSetPointer( HWND_DESKTOP, hptr ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Factory::rmDir( const string &rPath ) |
||||
|
{ |
||||
|
struct dirent *file; |
||||
|
DIR *dir; |
||||
|
|
||||
|
dir = opendir( rPath.c_str() ); |
||||
|
if( !dir ) return; |
||||
|
|
||||
|
// Parse the directory and remove everything it contains
|
||||
|
while( (file = readdir( dir )) ) |
||||
|
{ |
||||
|
struct stat statbuf; |
||||
|
string filename = file->d_name; |
||||
|
|
||||
|
// Skip "." and ".."
|
||||
|
if( filename == "." || filename == ".." ) |
||||
|
{ |
||||
|
continue; |
||||
|
} |
||||
|
|
||||
|
filename = rPath + "\\" + filename; |
||||
|
|
||||
|
if( !stat( filename.c_str(), &statbuf ) && statbuf.st_mode & S_IFDIR ) |
||||
|
{ |
||||
|
rmDir( filename ); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
unlink( filename.c_str() ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Close the directory
|
||||
|
closedir( dir ); |
||||
|
|
||||
|
// And delete it
|
||||
|
rmdir( rPath.c_str() ); |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,152 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_factory.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_FACTORY_HPP |
||||
|
#define OS2_FACTORY_HPP |
||||
|
|
||||
|
#ifdef HAVE_CONFIG_H |
||||
|
# include "config.h" |
||||
|
#endif |
||||
|
|
||||
|
#include "../src/os_factory.hpp" |
||||
|
#include "../src/generic_window.hpp" |
||||
|
|
||||
|
#include <map> |
||||
|
|
||||
|
|
||||
|
/// Class used to instanciate OS2 specific objects
|
||||
|
class OS2Factory: public OSFactory |
||||
|
{ |
||||
|
public: |
||||
|
OS2Factory( intf_thread_t *pIntf ); |
||||
|
virtual ~OS2Factory(); |
||||
|
|
||||
|
/// Initialization method
|
||||
|
virtual bool init(); |
||||
|
|
||||
|
/// Instantiate an object OSGraphics
|
||||
|
virtual OSGraphics *createOSGraphics( int width, int height ); |
||||
|
|
||||
|
/// Get the instance of the singleton OSLoop
|
||||
|
virtual OSLoop *getOSLoop(); |
||||
|
|
||||
|
/// Destroy the instance of OSLoop
|
||||
|
virtual void destroyOSLoop(); |
||||
|
|
||||
|
/// Minimize all the windows
|
||||
|
virtual void minimize(); |
||||
|
|
||||
|
/// Restore the minimized windows
|
||||
|
virtual void restore(); |
||||
|
|
||||
|
/// Add an icon in the system tray
|
||||
|
virtual void addInTray(); |
||||
|
|
||||
|
/// Remove the icon from the system tray
|
||||
|
virtual void removeFromTray(); |
||||
|
|
||||
|
/// Show the task in the task bar
|
||||
|
virtual void addInTaskBar(); |
||||
|
|
||||
|
/// Remove the task from the task bar
|
||||
|
virtual void removeFromTaskBar(); |
||||
|
|
||||
|
/// Instantiate an OSTimer with the given command
|
||||
|
virtual OSTimer *createOSTimer( CmdGeneric &rCmd ); |
||||
|
|
||||
|
/// Instantiate an OSWindow object
|
||||
|
virtual OSWindow *createOSWindow( GenericWindow &rWindow, |
||||
|
bool dragDrop, bool playOnDrop, |
||||
|
OSWindow *pParent, |
||||
|
GenericWindow::WindowType_t type ); |
||||
|
|
||||
|
/// Instantiate an object OSTooltip
|
||||
|
virtual OSTooltip *createOSTooltip(); |
||||
|
|
||||
|
/// Instantiate an object OSPopup
|
||||
|
virtual OSPopup *createOSPopup(); |
||||
|
|
||||
|
/// Get the directory separator
|
||||
|
virtual const string &getDirSeparator() const { return m_dirSep; } |
||||
|
|
||||
|
/// Get the resource path
|
||||
|
virtual const list<string> &getResourcePath() const |
||||
|
{ return m_resourcePath; } |
||||
|
|
||||
|
/// Get the screen size
|
||||
|
virtual int getScreenWidth() const; |
||||
|
virtual int getScreenHeight() const; |
||||
|
|
||||
|
/// Get Monitor Information
|
||||
|
virtual void getMonitorInfo( const GenericWindow &rWindow, |
||||
|
int* x, int* y, |
||||
|
int* width, int* height ) const; |
||||
|
virtual void getMonitorInfo( int numScreen, |
||||
|
int* x, int* y, |
||||
|
int* width, int* height ) const; |
||||
|
|
||||
|
/// Get the work area (screen area without taskbars)
|
||||
|
virtual SkinsRect getWorkArea() const; |
||||
|
|
||||
|
/// Get the position of the mouse
|
||||
|
virtual void getMousePos( int &rXPos, int &rYPos ) const; |
||||
|
|
||||
|
/// Change the cursor
|
||||
|
virtual void changeCursor( CursorType_t type ) const; |
||||
|
|
||||
|
/// Delete a directory recursively
|
||||
|
virtual void rmDir( const string &rPath ); |
||||
|
|
||||
|
/// Map to find the GenericWindow associated with a OS2Window
|
||||
|
map<HWND, GenericWindow*> m_windowMap; |
||||
|
|
||||
|
HWND getParentWindow() { return m_hParentClientWindow; } |
||||
|
|
||||
|
/// Callback function (Windows Procedure)
|
||||
|
static MRESULT EXPENTRY OS2FrameProc( HWND hwnd, ULONG msg, |
||||
|
MPARAM mp1, MPARAM Mp2 ); |
||||
|
static MRESULT EXPENTRY OS2Proc( HWND hwnd, ULONG msg, |
||||
|
MPARAM mp1, MPARAM Mp2 ); |
||||
|
|
||||
|
private: |
||||
|
/// Handle of the instance
|
||||
|
HMODULE m_hInst; |
||||
|
/// Handle of anchor-block
|
||||
|
HAB m_hab; |
||||
|
/// Handle of message queue
|
||||
|
HMQ m_hmq; |
||||
|
/// Window procedure of the old frame window
|
||||
|
PFNWP m_pfnwpOldFrameProc; |
||||
|
/// Handle of the parent window
|
||||
|
HWND m_hParentWindow; |
||||
|
/// Handle of the client window of the parent window
|
||||
|
HWND m_hParentClientWindow; |
||||
|
/// Directory separator
|
||||
|
const string m_dirSep; |
||||
|
/// Resource path
|
||||
|
list<string> m_resourcePath; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,453 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_graphics.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#include "os2_factory.hpp" |
||||
|
#include "os2_graphics.hpp" |
||||
|
#include "os2_window.hpp" |
||||
|
#include "../src/generic_bitmap.hpp" |
||||
|
|
||||
|
// kLIBC does not declare this function
|
||||
|
extern "C" BOOL APIENTRY WinSetClipRegion( HWND, HRGN ); |
||||
|
|
||||
|
OS2Graphics::OS2Graphics( intf_thread_t *pIntf, int width, int height ): |
||||
|
OSGraphics( pIntf ), m_width( width ), m_height( height ) |
||||
|
{ |
||||
|
m_hdc = DevOpenDC( 0, OD_MEMORY, "*", 0L, NULL, NULLHANDLE ); |
||||
|
|
||||
|
SIZEL sizl = { 0, 0 }; |
||||
|
m_hps = GpiCreatePS( 0, m_hdc, &sizl, |
||||
|
PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC ); |
||||
|
|
||||
|
// Set the color table into RGB mode
|
||||
|
GpiCreateLogColorTable( m_hps, 0, LCOLF_RGB, 0, 0, NULL ); |
||||
|
|
||||
|
BITMAPINFOHEADER bmp; |
||||
|
bmp.cbFix = sizeof( bmp ); |
||||
|
bmp.cx = width; |
||||
|
bmp.cy = height; |
||||
|
bmp.cPlanes = 1; |
||||
|
bmp.cBitCount = 24; |
||||
|
|
||||
|
m_hbm = GpiCreateBitmap( m_hps, ( PBITMAPINFOHEADER2 )&bmp, 0L, |
||||
|
NULL, NULL); |
||||
|
|
||||
|
GpiSetBitmap( m_hps, m_hbm ); |
||||
|
|
||||
|
// Create the mask
|
||||
|
RECTL rcl = { 0, 0, 0, 0 }; |
||||
|
m_mask = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Graphics::~OS2Graphics() |
||||
|
{ |
||||
|
GpiDestroyRegion( m_hps, m_mask ); |
||||
|
|
||||
|
GpiSetBitmap( m_hps, NULLHANDLE ); |
||||
|
GpiDeleteBitmap( m_hbm ); |
||||
|
|
||||
|
GpiDestroyPS( m_hps ); |
||||
|
|
||||
|
DevCloseDC( m_hdc ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::clear( int xDest, int yDest, int width, int height ) |
||||
|
{ |
||||
|
if( width <= 0 || height <= 0 ) |
||||
|
{ |
||||
|
// Clear the transparency mask
|
||||
|
GpiDestroyRegion( m_hps, m_mask ); |
||||
|
RECTL rcl = { 0, 0, 0, 0 }; |
||||
|
m_mask = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
RECTL rcl = { xDest, invertRectY( yDest + height ), |
||||
|
xDest + width, invertRectY( yDest )}; |
||||
|
HRGN mask = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
GpiCombineRegion( m_hps, m_mask, m_mask, mask, CRGN_DIFF ); |
||||
|
GpiDestroyRegion( m_hps, mask ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::drawBitmap( const GenericBitmap &rBitmap, |
||||
|
int xSrc, int ySrc, int xDest, int yDest, |
||||
|
int width, int height, bool blend ) |
||||
|
{ |
||||
|
(void)blend; |
||||
|
|
||||
|
// check and adapt to source if needed
|
||||
|
if( !checkBoundaries( 0, 0, rBitmap.getWidth(), rBitmap.getHeight(), |
||||
|
xSrc, ySrc, width, height ) ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "empty source! pls, debug your skin" ); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// check destination
|
||||
|
if( !checkBoundaries( 0, 0, m_width, m_height, |
||||
|
xDest, yDest, width, height ) ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "out of reach destination! pls, debug your skin" ); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// Get a buffer on the image data
|
||||
|
uint8_t *pBmpData = rBitmap.getData(); |
||||
|
if( pBmpData == NULL ) |
||||
|
{ |
||||
|
// Nothing to draw
|
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
BITMAPINFOHEADER bmp; |
||||
|
bmp.cbFix = sizeof( bmp ); |
||||
|
bmp.cx = width; |
||||
|
bmp.cy = height; |
||||
|
bmp.cPlanes = 1; |
||||
|
bmp.cBitCount = 24; |
||||
|
|
||||
|
// pointer to bitmap bits
|
||||
|
uint8_t *pBits = ( uint8_t * )malloc((( bmp.cBitCount * bmp.cx + 31 ) / |
||||
|
32 ) * bmp.cPlanes * 4 ); |
||||
|
|
||||
|
HDC hdc = DevOpenDC( 0, OD_MEMORY, "*", 0L, NULL, NULLHANDLE ); |
||||
|
|
||||
|
SIZEL sizl = { 0, 0 }; |
||||
|
HPS hps = GpiCreatePS( 0, hdc, &sizl, |
||||
|
PU_PELS | GPIF_DEFAULT | GPIT_MICRO | GPIA_ASSOC ); |
||||
|
|
||||
|
HBITMAP hbm = GpiCreateBitmap( hps, ( PBITMAPINFOHEADER2 )&bmp, 0L, |
||||
|
NULL, NULL); |
||||
|
|
||||
|
GpiSetBitmap( hps, hbm ); |
||||
|
|
||||
|
// Mask for transparency
|
||||
|
RECTL rcl = { 0, 0, 0, 0 }; |
||||
|
HRGN mask = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
|
||||
|
// Skip the first lines of the image
|
||||
|
pBmpData += 4 * ySrc * rBitmap.getWidth(); |
||||
|
|
||||
|
// Copy the bitmap on the image and compute the mask
|
||||
|
for( int y = 0; y < height; y++ ) |
||||
|
{ |
||||
|
// Skip uninteresting bytes at the beginning of the line
|
||||
|
pBmpData += 4 * xSrc; |
||||
|
// Flag to say whether the previous pixel on the line was visible
|
||||
|
bool wasVisible = false; |
||||
|
// Beginning of the current visible segment on the line
|
||||
|
int visibleSegmentStart = 0; |
||||
|
for( int x = 0; x < width; x++ ) |
||||
|
{ |
||||
|
uint8_t b = *( pBmpData++ ); |
||||
|
uint8_t g = *( pBmpData++ ); |
||||
|
uint8_t r = *( pBmpData++ ); |
||||
|
uint8_t a = *( pBmpData++ ); |
||||
|
|
||||
|
// Draw the pixel
|
||||
|
pBits[ x * 3 ] = b; |
||||
|
pBits[ x * 3 + 1 ] = g; |
||||
|
pBits[ x * 3 + 2 ] = r; |
||||
|
|
||||
|
if( a > 0 ) |
||||
|
{ |
||||
|
// Pixel is visible
|
||||
|
if( ! wasVisible ) |
||||
|
{ |
||||
|
// Beginning of a visible segment
|
||||
|
visibleSegmentStart = x; |
||||
|
} |
||||
|
wasVisible = true; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// Pixel is transparent
|
||||
|
if( wasVisible ) |
||||
|
{ |
||||
|
// End of a visible segment: add it to the mask
|
||||
|
addSegmentInRegion( mask, visibleSegmentStart, x, y, |
||||
|
height ); |
||||
|
} |
||||
|
wasVisible = false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
// Transfer bitmap bits to hps
|
||||
|
GpiSetBitmapBits( hps, invertPointY( y, height ), 1, ( PBYTE )pBits, |
||||
|
( PBITMAPINFO2 )&bmp ); |
||||
|
|
||||
|
if( wasVisible ) |
||||
|
{ |
||||
|
// End of a visible segment: add it to the mask
|
||||
|
addSegmentInRegion( mask, visibleSegmentStart, width, y, height ); |
||||
|
} |
||||
|
// Skip uninteresting bytes at the end of the line
|
||||
|
pBmpData += 4 * (rBitmap.getWidth() - width - xSrc); |
||||
|
} |
||||
|
|
||||
|
// Apply the mask to the internal DC
|
||||
|
POINTL ptl = { xDest, invertRectY( yDest + height )}; |
||||
|
GpiOffsetRegion( m_hps, mask, &ptl ); |
||||
|
|
||||
|
GpiSetClipRegion( m_hps, mask, NULL ); |
||||
|
|
||||
|
POINTL aptl[] = {{ xDest, invertRectY( yDest + height )}, |
||||
|
{ xDest + width, invertRectY( yDest )}, |
||||
|
{ 0, 0 }}; |
||||
|
GpiBitBlt( m_hps, hps, 3, aptl, ROP_SRCCOPY, BBO_IGNORE ); |
||||
|
|
||||
|
// Release a clip region handle
|
||||
|
GpiSetClipRegion( m_hps, NULLHANDLE, NULL ); |
||||
|
|
||||
|
// Add the bitmap mask to the global graphics mask
|
||||
|
GpiCombineRegion( m_hps, m_mask, m_mask, mask, CRGN_OR ); |
||||
|
|
||||
|
// Do cleanup
|
||||
|
GpiDestroyRegion( m_hps, mask ); |
||||
|
GpiSetBitmap( hps, NULLHANDLE ); |
||||
|
GpiDeleteBitmap( hbm ); |
||||
|
GpiDestroyPS( hps ); |
||||
|
DevCloseDC( hdc ); |
||||
|
free( pBits ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::drawGraphics( const OSGraphics &rGraphics, int xSrc, |
||||
|
int ySrc, int xDest, int yDest, int width, |
||||
|
int height ) |
||||
|
{ |
||||
|
// check and adapt to source if needed
|
||||
|
if( !checkBoundaries( 0, 0, rGraphics.getWidth(), rGraphics.getHeight(), |
||||
|
xSrc, ySrc, width, height ) ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "nothing to draw from graphics source" ); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// check destination
|
||||
|
if( !checkBoundaries( 0, 0, m_width, m_height, |
||||
|
xDest, yDest, width, height ) ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "out of reach destination! pls, debug your skin" ); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// To invert Y
|
||||
|
int h = rGraphics.getHeight(); |
||||
|
|
||||
|
// Create the mask for transparency
|
||||
|
RECTL rcl = { xSrc, invertRectY( ySrc + height, h ), |
||||
|
xSrc + width, invertRectY( ySrc, h )}; |
||||
|
HRGN mask = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
GpiCombineRegion( m_hps, mask, ((OS2Graphics&)rGraphics).getMask(), mask, |
||||
|
CRGN_AND ); |
||||
|
|
||||
|
POINTL ptl = { xDest - xSrc, |
||||
|
invertRectY( yDest + height ) - |
||||
|
invertRectY( ySrc + height, h )}; |
||||
|
GpiOffsetRegion( m_hps, mask, &ptl ); |
||||
|
|
||||
|
// Copy the image
|
||||
|
HPS hpsSrc = ((OS2Graphics&)rGraphics).getPS(); |
||||
|
|
||||
|
GpiSetClipRegion( m_hps, mask, NULL ); |
||||
|
|
||||
|
POINTL aptl[] = {{ xDest, invertRectY( yDest + height )}, |
||||
|
{ xDest + width, invertRectY( yDest )}, |
||||
|
{ xSrc, invertRectY( ySrc + height, h )}}; |
||||
|
GpiBitBlt( m_hps, hpsSrc, 3, aptl, ROP_SRCCOPY, BBO_IGNORE ); |
||||
|
|
||||
|
// Release a clip region handle
|
||||
|
GpiSetClipRegion( m_hps, NULLHANDLE, NULL ); |
||||
|
|
||||
|
// Add the source mask to the mask of the graphics
|
||||
|
GpiCombineRegion( m_hps, m_mask, mask, m_mask, CRGN_OR ); |
||||
|
GpiDestroyRegion( m_hps, mask ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::fillRect( int left, int top, int width, int height, |
||||
|
uint32_t color ) |
||||
|
{ |
||||
|
// Update the mask with the rectangle area
|
||||
|
int bottom = invertRectY( top + height ); |
||||
|
RECTL rcl = { left, bottom, left + width, bottom + height }; |
||||
|
HRGN newMask = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
GpiCombineRegion( m_hps, m_mask, m_mask, newMask, CRGN_OR ); |
||||
|
|
||||
|
GpiSetClipRegion( m_hps, m_mask, NULL ); |
||||
|
GpiDestroyRegion( m_hps, newMask ); |
||||
|
|
||||
|
// Draw the rectangle
|
||||
|
WinSetRect( 0, &rcl, left, bottom, left + width, bottom + height ); |
||||
|
WinFillRect( m_hps, &rcl, color ); |
||||
|
|
||||
|
// Release a clip region handle
|
||||
|
GpiSetClipRegion( m_hps, NULLHANDLE, NULL ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::drawRect( int left, int top, int width, int height, |
||||
|
uint32_t color ) |
||||
|
{ |
||||
|
// Update the mask with the rectangle
|
||||
|
int bottom = invertRectY( top + height ); |
||||
|
RECTL rcl = { left, bottom, left + width, bottom + 1 }; |
||||
|
HRGN l1 = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
|
||||
|
WinSetRect( 0, &rcl, left + width - 1, bottom, left + width, |
||||
|
bottom + height ); |
||||
|
HRGN l2 = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
|
||||
|
WinSetRect( 0, &rcl, left, bottom + height - 1, left + width, |
||||
|
bottom + height ); |
||||
|
HRGN l3 = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
|
||||
|
WinSetRect( 0, &rcl, left, bottom, left + 1, bottom + height ); |
||||
|
HRGN l4 = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
|
||||
|
GpiCombineRegion( m_hps, m_mask, m_mask, l1, CRGN_OR ); |
||||
|
GpiCombineRegion( m_hps, m_mask, m_mask, l2, CRGN_OR ); |
||||
|
GpiCombineRegion( m_hps, m_mask, m_mask, l3, CRGN_OR ); |
||||
|
GpiCombineRegion( m_hps, m_mask, m_mask, l4, CRGN_OR ); |
||||
|
|
||||
|
GpiDestroyRegion( m_hps, l1 ); |
||||
|
GpiDestroyRegion( m_hps, l2 ); |
||||
|
GpiDestroyRegion( m_hps, l3 ); |
||||
|
GpiDestroyRegion( m_hps, l4 ); |
||||
|
|
||||
|
GpiSetClipRegion( m_hps, m_mask, NULL ); |
||||
|
|
||||
|
// Set color
|
||||
|
GpiSetColor( m_hps, color ); |
||||
|
|
||||
|
// Draw the rectangle
|
||||
|
POINTL ptl = { left, bottom }; |
||||
|
GpiMove( m_hps, &ptl ); |
||||
|
|
||||
|
ptl.x = left + width - 1; |
||||
|
ptl.y = bottom; |
||||
|
GpiLine( m_hps, &ptl ); |
||||
|
|
||||
|
ptl.x = left + width - 1; |
||||
|
ptl.y = bottom + height - 1; |
||||
|
GpiLine( m_hps, &ptl ); |
||||
|
|
||||
|
ptl.x = left; |
||||
|
ptl.y = bottom + height - 1; |
||||
|
GpiLine( m_hps, &ptl ); |
||||
|
|
||||
|
ptl.x = left; |
||||
|
ptl.y = bottom; |
||||
|
GpiLine( m_hps, &ptl ); |
||||
|
|
||||
|
// Release a clip region handle
|
||||
|
GpiSetClipRegion( m_hps, NULLHANDLE, NULL ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::applyMaskToWindow( OSWindow &rWindow ) |
||||
|
{ |
||||
|
// Get window handle
|
||||
|
HWND hWnd = ((OS2Window&)rWindow).getHandle(); |
||||
|
|
||||
|
// Apply the mask
|
||||
|
RECTL rcl = { 0, 0, 0, 0 }; |
||||
|
HRGN mask = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
GpiCombineRegion( m_hps, mask, m_mask, NULLHANDLE, CRGN_COPY ); |
||||
|
//WinSetClipRegion( hWnd, mask );
|
||||
|
GpiDestroyRegion( m_hps, mask ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::copyToWindow( OSWindow &rWindow, int xSrc, int ySrc, |
||||
|
int width, int height, int xDest, int yDest ) |
||||
|
{ |
||||
|
// Initialize painting
|
||||
|
HWND hWnd = ((OS2Window&)rWindow).getHandle(); |
||||
|
HPS hpsWnd = WinGetPS( hWnd ); |
||||
|
HPS hpsSrc = m_hps; |
||||
|
|
||||
|
RECTL rcl; |
||||
|
WinQueryWindowRect( hWnd, &rcl ); |
||||
|
|
||||
|
// Draw image on window
|
||||
|
POINTL aptl[] = {{ xDest, invertRectY( yDest + height, rcl.yTop )}, |
||||
|
{ xDest + width, invertRectY( yDest, rcl.yTop )}, |
||||
|
{ xSrc, invertRectY( ySrc + height )}}; |
||||
|
GpiBitBlt( hpsWnd, hpsSrc, 3, aptl, ROP_SRCCOPY, BBO_IGNORE ); |
||||
|
|
||||
|
// Release window device context
|
||||
|
WinReleasePS( hpsWnd ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
bool OS2Graphics::hit( int x, int y ) const |
||||
|
{ |
||||
|
POINTL ptl = { x, invertPointY( y )}; |
||||
|
return GpiPtInRegion( m_hps, m_mask, &ptl ) == PRGN_INSIDE; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Graphics::addSegmentInRegion( HRGN &rMask, int start, |
||||
|
int end, int line, int height ) |
||||
|
{ |
||||
|
RECTL rcl = { start, invertRectY( line + 1, height ), |
||||
|
end, invertRectY( line, height )}; |
||||
|
HRGN buffer = GpiCreateRegion( m_hps, 1, &rcl ); |
||||
|
GpiCombineRegion( m_hps, rMask, buffer, rMask, CRGN_OR ); |
||||
|
GpiDestroyRegion( m_hps, buffer ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
bool OS2Graphics::checkBoundaries( int x_src, int y_src, |
||||
|
int w_src, int h_src, |
||||
|
int& x_target, int& y_target, |
||||
|
int& w_target, int& h_target ) |
||||
|
{ |
||||
|
// set valid width and height
|
||||
|
w_target = (w_target > 0) ? w_target : w_src; |
||||
|
h_target = (h_target > 0) ? h_target : h_src; |
||||
|
|
||||
|
// clip source if needed
|
||||
|
rect srcRegion( x_src, y_src, w_src, h_src ); |
||||
|
rect targetRegion( x_target, y_target, w_target, h_target ); |
||||
|
rect inter; |
||||
|
if( rect::intersect( srcRegion, targetRegion, &inter ) ) |
||||
|
{ |
||||
|
x_target = inter.x; |
||||
|
y_target = inter.y; |
||||
|
w_target = inter.width; |
||||
|
h_target = inter.height; |
||||
|
return true; |
||||
|
} |
||||
|
return false; |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,140 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_graphics.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_GRAPHICS_HPP |
||||
|
#define OS2_GRAPHICS_HPP |
||||
|
|
||||
|
#include "../src/os_graphics.hpp" |
||||
|
|
||||
|
|
||||
|
class GenericBitmap; |
||||
|
|
||||
|
/// OS2 implementation of OSGraphics
|
||||
|
class OS2Graphics: public OSGraphics |
||||
|
{ |
||||
|
public: |
||||
|
OS2Graphics( intf_thread_t *pIntf, int width, int height ); |
||||
|
virtual ~OS2Graphics(); |
||||
|
|
||||
|
/// Clear the graphics
|
||||
|
virtual void clear( int xDest = 0, int yDest = 0, |
||||
|
int width = -1, int height = -1 ); |
||||
|
|
||||
|
/// Render a bitmap on this graphics
|
||||
|
virtual void drawBitmap( const GenericBitmap &rBitmap, int xSrc = 0, |
||||
|
int ySrc = 0, int xDest = 0, int yDest = 0, |
||||
|
int width = -1, int height = -1, |
||||
|
bool blend = false ); |
||||
|
|
||||
|
/// Draw another graphics on this one
|
||||
|
virtual void drawGraphics( const OSGraphics &rGraphics, int xSrc = 0, |
||||
|
int ySrc = 0, int xDest = 0, int yDest = 0, |
||||
|
int width = -1, int height = -1 ); |
||||
|
|
||||
|
/// Draw an empty rectangle on the grahics (color is #RRGGBB)
|
||||
|
virtual void drawRect( int left, int top, int width, int height, |
||||
|
uint32_t color ); |
||||
|
|
||||
|
|
||||
|
/// Draw a filled rectangle on the grahics (color is #RRGGBB)
|
||||
|
virtual void fillRect( int left, int top, int width, int height, |
||||
|
uint32_t color ); |
||||
|
|
||||
|
/// Set the shape of a window with the mask of this graphics.
|
||||
|
virtual void applyMaskToWindow( OSWindow &rWindow ); |
||||
|
|
||||
|
/// Copy the graphics on a window
|
||||
|
virtual void copyToWindow( OSWindow &rWindow, int xSrc, |
||||
|
int ySrc, int width, int height, |
||||
|
int xDest, int yDest ); |
||||
|
|
||||
|
/// Tell whether the pixel at the given position is visible
|
||||
|
virtual bool hit( int x, int y ) const; |
||||
|
|
||||
|
/// Getters for the size
|
||||
|
virtual int getWidth() const { return m_width; } |
||||
|
virtual int getHeight() const { return m_height; } |
||||
|
|
||||
|
/// Get the device context handler
|
||||
|
virtual HDC getPS() const { return m_hps; } |
||||
|
|
||||
|
/// Get the mask
|
||||
|
virtual HRGN getMask() const { return m_mask; } |
||||
|
|
||||
|
private: |
||||
|
/// Size of the image
|
||||
|
int m_width, m_height; |
||||
|
|
||||
|
/// Device context
|
||||
|
HDC m_hdc; |
||||
|
|
||||
|
/// Presentaiton space
|
||||
|
HPS m_hps; |
||||
|
|
||||
|
/// Bitmap handle
|
||||
|
HBITMAP m_hbm; |
||||
|
|
||||
|
/// Transparency mask
|
||||
|
HRGN m_mask; |
||||
|
|
||||
|
/// Add a segment in a region
|
||||
|
void addSegmentInRegion( HRGN &rMask, int start, int end, int line, |
||||
|
int height ); |
||||
|
|
||||
|
/// check boundaries for graphics and bitmaps
|
||||
|
bool checkBoundaries( int x_src, int y_src, int w_src, int h_src, |
||||
|
int& x_target, int& y_target, |
||||
|
int& w_target, int& h_target ); |
||||
|
|
||||
|
/// invert Y of a point against the given height
|
||||
|
int invertPointY( int y, int height ) const |
||||
|
{ |
||||
|
return ( height - 1 ) - y; |
||||
|
} |
||||
|
|
||||
|
/// invert Y of a point against the m_height
|
||||
|
int invertPointY( int y ) const |
||||
|
{ |
||||
|
return ( m_height - 1 ) - y; |
||||
|
} |
||||
|
|
||||
|
/// invert Y of a rectangular against the given height
|
||||
|
int invertRectY( int y, int height ) const |
||||
|
{ |
||||
|
// bottom is inclusive, top is exclusive
|
||||
|
// the following is the short of ( height - 1 ) - ( y - 1 )
|
||||
|
return height - y; |
||||
|
} |
||||
|
|
||||
|
/// invert Y of a rectangular against the m_height
|
||||
|
int invertRectY( int y ) const |
||||
|
{ |
||||
|
// bottom is inclusive, top is exclusive
|
||||
|
// the following is the short of ( m_height - 1 ) - ( y - 1 )
|
||||
|
return m_height - y; |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,295 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_loop.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#include "os2_factory.hpp" |
||||
|
#include "os2_loop.hpp" |
||||
|
#include "../src/generic_window.hpp" |
||||
|
#include "../events/evt_key.hpp" |
||||
|
#include "../events/evt_leave.hpp" |
||||
|
#include "../events/evt_menu.hpp" |
||||
|
#include "../events/evt_motion.hpp" |
||||
|
#include "../events/evt_mouse.hpp" |
||||
|
#include "../events/evt_refresh.hpp" |
||||
|
#include "../events/evt_scroll.hpp" |
||||
|
#include <vlc_keys.h> |
||||
|
|
||||
|
|
||||
|
#define GET_X_MP( mp ) ( SHORT1FROMMP( mp )) |
||||
|
#define GET_Y_MP( mp ) (( rcl.yTop - 1 ) - SHORT2FROMMP( mp )) /* Invert Y */ |
||||
|
|
||||
|
#ifndef WM_MOUSELEAVE |
||||
|
#define WM_MOUSELEAVE 0x41F |
||||
|
#endif |
||||
|
|
||||
|
OS2Loop::OS2Loop( intf_thread_t *pIntf ): OSLoop( pIntf ) |
||||
|
{ |
||||
|
// Initialize the map
|
||||
|
virtKeyToVlcKey[VK_F1] = KEY_F1; |
||||
|
virtKeyToVlcKey[VK_F2] = KEY_F2; |
||||
|
virtKeyToVlcKey[VK_F3] = KEY_F3; |
||||
|
virtKeyToVlcKey[VK_F4] = KEY_F4; |
||||
|
virtKeyToVlcKey[VK_F5] = KEY_F5; |
||||
|
virtKeyToVlcKey[VK_F6] = KEY_F6; |
||||
|
virtKeyToVlcKey[VK_F7] = KEY_F7; |
||||
|
virtKeyToVlcKey[VK_F8] = KEY_F8; |
||||
|
virtKeyToVlcKey[VK_F9] = KEY_F9; |
||||
|
virtKeyToVlcKey[VK_F10] = KEY_F10; |
||||
|
virtKeyToVlcKey[VK_F11] = KEY_F11; |
||||
|
virtKeyToVlcKey[VK_F12] = KEY_F12; |
||||
|
virtKeyToVlcKey[VK_ENTER] = KEY_ENTER; |
||||
|
virtKeyToVlcKey[VK_NEWLINE] = KEY_ENTER; |
||||
|
virtKeyToVlcKey[VK_SPACE] = ' '; |
||||
|
virtKeyToVlcKey[VK_ESC] = KEY_ESC; |
||||
|
virtKeyToVlcKey[VK_LEFT] = KEY_LEFT; |
||||
|
virtKeyToVlcKey[VK_RIGHT] = KEY_RIGHT; |
||||
|
virtKeyToVlcKey[VK_UP] = KEY_UP; |
||||
|
virtKeyToVlcKey[VK_DOWN] = KEY_DOWN; |
||||
|
virtKeyToVlcKey[VK_INSERT] = KEY_INSERT; |
||||
|
virtKeyToVlcKey[VK_DELETE] = KEY_DELETE; |
||||
|
virtKeyToVlcKey[VK_HOME] = KEY_HOME; |
||||
|
virtKeyToVlcKey[VK_END] = KEY_END; |
||||
|
virtKeyToVlcKey[VK_PAGEUP] = KEY_PAGEUP; |
||||
|
virtKeyToVlcKey[VK_PAGEDOWN] = KEY_PAGEDOWN; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Loop::~OS2Loop() |
||||
|
{ |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OSLoop *OS2Loop::instance( intf_thread_t *pIntf ) |
||||
|
{ |
||||
|
if( pIntf->p_sys->p_osLoop == NULL ) |
||||
|
{ |
||||
|
OSLoop *pOsLoop = new OS2Loop( pIntf ); |
||||
|
pIntf->p_sys->p_osLoop = pOsLoop; |
||||
|
} |
||||
|
return pIntf->p_sys->p_osLoop; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Loop::destroy( intf_thread_t *pIntf ) |
||||
|
{ |
||||
|
delete pIntf->p_sys->p_osLoop; |
||||
|
pIntf->p_sys->p_osLoop = NULL; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Loop::run() |
||||
|
{ |
||||
|
QMSG qm; |
||||
|
|
||||
|
// Compute windows message list
|
||||
|
while( WinGetMsg( 0, &qm, NULLHANDLE, 0, 0 )) |
||||
|
WinDispatchMsg( 0, &qm ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
MRESULT EXPENTRY OS2Loop::processEvent( HWND hwnd, ULONG msg, |
||||
|
MPARAM mp1, MPARAM mp2 ) |
||||
|
{ |
||||
|
OS2Factory *pFactory = |
||||
|
(OS2Factory*)OS2Factory::instance( getIntf() ); |
||||
|
GenericWindow *pWin = pFactory->m_windowMap[hwnd]; |
||||
|
|
||||
|
// To invert Y
|
||||
|
RECTL rcl; |
||||
|
WinQueryWindowRect( hwnd, &rcl ); |
||||
|
|
||||
|
GenericWindow &win = *pWin; |
||||
|
switch( msg ) |
||||
|
{ |
||||
|
case WM_PAINT: |
||||
|
{ |
||||
|
HPS hps; |
||||
|
RECTL rclPaint; |
||||
|
|
||||
|
hps = WinBeginPaint( hwnd, NULLHANDLE, &rclPaint ); |
||||
|
EvtRefresh evt( getIntf(), |
||||
|
rclPaint.xLeft, |
||||
|
// Find top and invert it
|
||||
|
( rcl.yTop - 1 ) - ( rclPaint.yTop - 1 ), |
||||
|
rclPaint.xRight - rclPaint.xLeft + 1, |
||||
|
rclPaint.yTop - rclPaint.yBottom + 1 ); |
||||
|
win.processEvent( evt ); |
||||
|
WinEndPaint( hps ); |
||||
|
return 0; |
||||
|
} |
||||
|
case WM_COMMAND: |
||||
|
{ |
||||
|
EvtMenu evt( getIntf(), SHORT1FROMMP( mp1 )); |
||||
|
win.processEvent( evt ); |
||||
|
return 0; |
||||
|
} |
||||
|
case WM_MOUSEMOVE: |
||||
|
{ |
||||
|
// Compute the absolute position of the mouse
|
||||
|
int x = GET_X_MP( mp1 ) + win.getLeft(); |
||||
|
int y = GET_Y_MP( mp1 ) + win.getTop(); |
||||
|
EvtMotion evt( getIntf(), x, y ); |
||||
|
win.processEvent( evt ); |
||||
|
|
||||
|
// fall though to WinDefWindowProc()
|
||||
|
break; |
||||
|
} |
||||
|
case WM_MOUSELEAVE: |
||||
|
{ |
||||
|
EvtLeave evt( getIntf() ); |
||||
|
win.processEvent( evt ); |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
case WM_BUTTON1DOWN: |
||||
|
{ |
||||
|
WinSetCapture( HWND_DESKTOP, hwnd ); |
||||
|
EvtMouse evt( getIntf(), GET_X_MP( mp1 ), |
||||
|
GET_Y_MP( mp1 ), EvtMouse::kLeft, |
||||
|
EvtMouse::kDown, getMod( mp2 ) ); |
||||
|
win.processEvent( evt ); |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
case WM_BUTTON2DOWN: |
||||
|
{ |
||||
|
WinSetCapture( HWND_DESKTOP, hwnd ); |
||||
|
EvtMouse evt( getIntf(), GET_X_MP( mp1 ), |
||||
|
GET_Y_MP( mp1 ), EvtMouse::kRight, |
||||
|
EvtMouse::kDown, getMod( mp2 ) ); |
||||
|
win.processEvent( evt ); |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
case WM_BUTTON1UP: |
||||
|
{ |
||||
|
WinSetCapture( HWND_DESKTOP, NULLHANDLE ); |
||||
|
EvtMouse evt( getIntf(), GET_X_MP( mp1 ), |
||||
|
GET_Y_MP( mp1 ), EvtMouse::kLeft, |
||||
|
EvtMouse::kUp, getMod( mp2 ) ); |
||||
|
win.processEvent( evt ); |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
case WM_BUTTON2UP: |
||||
|
{ |
||||
|
WinSetCapture( HWND_DESKTOP, NULLHANDLE ); |
||||
|
EvtMouse evt( getIntf(), GET_X_MP( mp1 ), |
||||
|
GET_Y_MP( mp1 ), EvtMouse::kRight, |
||||
|
EvtMouse::kUp, getMod( mp2 ) ); |
||||
|
win.processEvent( evt ); |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
case WM_BUTTON1DBLCLK: |
||||
|
{ |
||||
|
WinSetCapture( HWND_DESKTOP, NULLHANDLE ); |
||||
|
EvtMouse evt( getIntf(), GET_X_MP( mp1 ), |
||||
|
GET_Y_MP( mp1 ), EvtMouse::kLeft, |
||||
|
EvtMouse::kDblClick, getMod( mp2 ) ); |
||||
|
win.processEvent( evt ); |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
case WM_BUTTON2DBLCLK: |
||||
|
{ |
||||
|
WinSetCapture( HWND_DESKTOP, NULLHANDLE ); |
||||
|
EvtMouse evt( getIntf(), GET_X_MP( mp1 ), |
||||
|
GET_Y_MP( mp1 ), EvtMouse::kRight, |
||||
|
EvtMouse::kDblClick, getMod( mp2 ) ); |
||||
|
win.processEvent( evt ); |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
case WM_CHAR: |
||||
|
{ |
||||
|
// The key events are first processed here and not translated
|
||||
|
// into WM_CHAR events because we need to know the status of
|
||||
|
// the modifier keys.
|
||||
|
|
||||
|
USHORT fsFlags = SHORT1FROMMP( mp1 ); |
||||
|
USHORT usCh = SHORT1FROMMP( mp2 ); |
||||
|
USHORT usVk = SHORT2FROMMP( mp2 ); |
||||
|
|
||||
|
// Get VLC key code from the virtual key code
|
||||
|
int key = ( fsFlags & KC_VIRTUALKEY ) ? |
||||
|
virtKeyToVlcKey[ usVk ] : 0; |
||||
|
if( !key ) |
||||
|
{ |
||||
|
// This appears to be a "normal" (ascii) key
|
||||
|
key = tolower( usCh ); |
||||
|
} |
||||
|
|
||||
|
if( key ) |
||||
|
{ |
||||
|
// Get the modifier
|
||||
|
int mod = 0; |
||||
|
if( fsFlags & KC_CTRL ) |
||||
|
{ |
||||
|
mod |= EvtInput::kModCtrl; |
||||
|
} |
||||
|
if( fsFlags & KC_SHIFT ) |
||||
|
{ |
||||
|
mod |= EvtInput::kModShift; |
||||
|
} |
||||
|
if( fsFlags & KC_ALT ) |
||||
|
{ |
||||
|
mod |= EvtInput::kModAlt; |
||||
|
} |
||||
|
|
||||
|
// Get the state
|
||||
|
EvtKey::ActionType_t state; |
||||
|
if( fsFlags & KC_KEYUP ) |
||||
|
{ |
||||
|
state = EvtKey::kUp; |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
state = EvtKey::kDown; |
||||
|
} |
||||
|
|
||||
|
EvtKey evt( getIntf(), key, state, mod ); |
||||
|
win.processEvent( evt ); |
||||
|
} |
||||
|
return MRFROMLONG( TRUE ); |
||||
|
} |
||||
|
default: |
||||
|
break; |
||||
|
} |
||||
|
return WinDefWindowProc( hwnd, msg, mp1, mp2 ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int OS2Loop::getMod( MPARAM mp ) const |
||||
|
{ |
||||
|
int mod = EvtInput::kModNone; |
||||
|
if( SHORT2FROMMP( mp ) & KC_CTRL ) |
||||
|
mod |= EvtInput::kModCtrl; |
||||
|
if( SHORT2FROMMP( mp ) & KC_SHIFT ) |
||||
|
mod |= EvtInput::kModShift; |
||||
|
|
||||
|
return mod; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Loop::exit() |
||||
|
{ |
||||
|
WinPostQueueMsg( HMQ_CURRENT, WM_QUIT, 0, 0 ); |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,68 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_loop.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_LOOP_HPP |
||||
|
#define OS2_LOOP_HPP |
||||
|
|
||||
|
#include "../events/evt_mouse.hpp" |
||||
|
#include "../src/os_loop.hpp" |
||||
|
#include <map> |
||||
|
|
||||
|
|
||||
|
class GenericWindow; |
||||
|
|
||||
|
/// Main event loop for OS2
|
||||
|
class OS2Loop: public OSLoop |
||||
|
{ |
||||
|
public: |
||||
|
/// Get the instance of OS2Loop
|
||||
|
static OSLoop *instance( intf_thread_t *pIntf ); |
||||
|
|
||||
|
/// Destroy the instance of OS2Loop
|
||||
|
static void destroy( intf_thread_t *pIntf ); |
||||
|
|
||||
|
/// Enter the event loop
|
||||
|
virtual void run(); |
||||
|
|
||||
|
/// Exit the main loop
|
||||
|
virtual void exit(); |
||||
|
|
||||
|
/// called by the window procedure callback
|
||||
|
virtual MRESULT EXPENTRY processEvent( HWND hwnd, ULONG msg, |
||||
|
MPARAM mp1, MPARAM mp2 ); |
||||
|
|
||||
|
private: |
||||
|
// Private because it is a singleton
|
||||
|
OS2Loop( intf_thread_t *pIntf ); |
||||
|
virtual ~OS2Loop(); |
||||
|
|
||||
|
/// Map associating special (i.e. non ascii) virtual key codes with
|
||||
|
/// internal vlc key codes
|
||||
|
map<int, int> virtKeyToVlcKey; |
||||
|
|
||||
|
/// Helper function to find the modifier in a Windows message
|
||||
|
int getMod( MPARAM mp ) const; |
||||
|
}; |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,129 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_popup.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#include "os2_popup.hpp" |
||||
|
#include "os2_factory.hpp" |
||||
|
|
||||
|
|
||||
|
OS2Popup::OS2Popup( intf_thread_t *pIntf, HWND hAssociatedWindow ) |
||||
|
: OSPopup( pIntf ), m_hWnd( hAssociatedWindow ) |
||||
|
{ |
||||
|
// Create the popup menu
|
||||
|
m_hMenu = WinCreateWindow( m_hWnd, // parent
|
||||
|
WC_MENU, // menu
|
||||
|
"", // title
|
||||
|
0, // style
|
||||
|
0, 0, // x, y
|
||||
|
0, 0, // cx, cy
|
||||
|
m_hWnd, // owner
|
||||
|
HWND_TOP, // z-order
|
||||
|
1, // id
|
||||
|
NULL, NULL ); // ctrl data, pres params
|
||||
|
|
||||
|
if( !m_hMenu ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "CreatePopupMenu failed" ); |
||||
|
return; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Popup::~OS2Popup() |
||||
|
{ |
||||
|
if( m_hMenu ) |
||||
|
WinDestroyWindow( m_hMenu ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Popup::show( int xPos, int yPos ) |
||||
|
{ |
||||
|
POINTL ptl = { xPos, yPos }; |
||||
|
// Invert Y
|
||||
|
ptl.y = ( WinQuerySysValue( HWND_DESKTOP, SV_CYSCREEN ) - 1 ) - ptl.y; |
||||
|
WinMapWindowPoints( HWND_DESKTOP, m_hWnd, &ptl, 1 ); |
||||
|
|
||||
|
WinPopupMenu( m_hWnd, m_hWnd, m_hMenu, ptl.x, ptl.y, 0, |
||||
|
PU_HCONSTRAIN | PU_VCONSTRAIN | PU_NONE | |
||||
|
PU_KEYBOARD | PU_MOUSEBUTTON1 | PU_MOUSEBUTTON2 ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Popup::hide() |
||||
|
{ |
||||
|
WinSendMsg( m_hMenu, WM_CHAR, |
||||
|
MPFROM2SHORT( KC_VIRTUALKEY, 0 ), |
||||
|
MPFROM2SHORT( 0, VK_ESC )); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Popup::addItem( const string &rLabel, int pos ) |
||||
|
{ |
||||
|
MENUITEM mi; |
||||
|
|
||||
|
mi.iPosition = findInsertionPoint( pos ); |
||||
|
mi.afStyle = MIS_TEXT; |
||||
|
mi.afAttribute = 0; |
||||
|
mi.id = pos; |
||||
|
mi.hwndSubMenu = NULLHANDLE; |
||||
|
mi.hItem = NULLHANDLE; |
||||
|
|
||||
|
WinSendMsg( m_hMenu, MM_INSERTITEM, MPFROMP( &mi ), |
||||
|
MPFROMP( rLabel.c_str())); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Popup::addSeparator( int pos ) |
||||
|
{ |
||||
|
MENUITEM mi; |
||||
|
|
||||
|
mi.iPosition = findInsertionPoint( pos ); |
||||
|
mi.afStyle = MIS_SEPARATOR; |
||||
|
mi.afAttribute = 0; |
||||
|
mi.id = 0; |
||||
|
mi.hwndSubMenu = NULLHANDLE; |
||||
|
mi.hItem = NULLHANDLE; |
||||
|
|
||||
|
WinSendMsg( m_hMenu, MM_INSERTITEM, MPFROMP( &mi ), 0 ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
unsigned int OS2Popup::findInsertionPoint( unsigned int pos ) const |
||||
|
{ |
||||
|
int nCount = LONGFROMMR( WinSendMsg( m_hMenu, MM_QUERYITEMCOUNT, 0, 0 )); |
||||
|
|
||||
|
// For this simple algorithm, we rely on the fact that in the final state
|
||||
|
// of the menu, the ID of each item is equal to its position in the menu
|
||||
|
int i = 0; |
||||
|
while( i < nCount && |
||||
|
SHORT1FROMMR( WinSendMsg( m_hMenu, MM_ITEMIDFROMPOSITION, |
||||
|
MPFROMLONG( i ), 0 )) < pos ) |
||||
|
{ |
||||
|
i++; |
||||
|
} |
||||
|
return i; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,69 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_popup.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_POPUP_HPP |
||||
|
#define OS2_POPUP_HPP |
||||
|
|
||||
|
#include "../src/os_popup.hpp" |
||||
|
|
||||
|
|
||||
|
/// OS2 implementation of OSPopup
|
||||
|
class OS2Popup: public OSPopup |
||||
|
{ |
||||
|
public: |
||||
|
OS2Popup( intf_thread_t *pIntf, HWND hAssociatedWindow ); |
||||
|
|
||||
|
virtual ~OS2Popup(); |
||||
|
|
||||
|
/// Show the popup menu at the given (absolute) corrdinates
|
||||
|
virtual void show( int xPos, int yPos ); |
||||
|
|
||||
|
/// Hide the popup menu
|
||||
|
virtual void hide(); |
||||
|
|
||||
|
/// Append a new menu item with the given label to the popup menu
|
||||
|
virtual void addItem( const string &rLabel, int pos ); |
||||
|
|
||||
|
/// Create a dummy menu item to separate sections
|
||||
|
virtual void addSeparator( int pos ); |
||||
|
|
||||
|
/// Return the position of the item identified by the given id
|
||||
|
virtual int getPosFromId( int id ) const { return id; } |
||||
|
|
||||
|
private: |
||||
|
/// Menu handle
|
||||
|
HWND m_hMenu; |
||||
|
/// Handle of the window which will receive the menu events
|
||||
|
HWND m_hWnd; |
||||
|
|
||||
|
/**
|
||||
|
* Find the item before which to insert another item so that the |
||||
|
* newly added item is at the position pos _when the whole menu has |
||||
|
* been built_ (no assumption is made for the order of insertion of |
||||
|
* the items) |
||||
|
*/ |
||||
|
unsigned int findInsertionPoint( unsigned int pos ) const; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,102 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_timer.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#include "os2_timer.hpp" |
||||
|
#include "../commands/cmd_generic.hpp" |
||||
|
|
||||
|
#define OS2_TIMER_CLASS "OS2Timer Window Class" |
||||
|
|
||||
|
#define ID_TIMER 0x100 |
||||
|
|
||||
|
static MRESULT EXPENTRY TimerWindowProc( HWND hwnd, ULONG msg, |
||||
|
MPARAM mp1, MPARAM mp2 ) |
||||
|
{ |
||||
|
if( msg == WM_TIMER ) |
||||
|
{ |
||||
|
OS2Timer *pTimer = ( OS2Timer * )WinQueryWindowPtr( hwnd, 0 ); |
||||
|
|
||||
|
pTimer->execute(); |
||||
|
|
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
return WinDefWindowProc( hwnd, msg, mp1, mp2 ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Timer::OS2Timer( intf_thread_t *pIntf, CmdGeneric &rCmd, HWND hWnd ): |
||||
|
OSTimer( pIntf ), m_rCommand( rCmd ), m_hWnd( hWnd ), m_hwndTimer( 0 ) |
||||
|
{ |
||||
|
WinRegisterClass( 0, OS2_TIMER_CLASS, TimerWindowProc, 0, |
||||
|
sizeof( PVOID )); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Timer::~OS2Timer() |
||||
|
{ |
||||
|
stop(); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Timer::start( int delay, bool oneShot ) |
||||
|
{ |
||||
|
m_interval = delay; |
||||
|
m_oneShot = oneShot; |
||||
|
|
||||
|
m_hwndTimer = WinCreateWindow( HWND_OBJECT, OS2_TIMER_CLASS, |
||||
|
"", 0, 0, 0, 0, 0, NULLHANDLE, |
||||
|
HWND_TOP, 0, NULL, NULL ); |
||||
|
|
||||
|
WinSetWindowPtr( m_hwndTimer, 0, this ); |
||||
|
|
||||
|
WinStartTimer( 0, m_hwndTimer, ID_TIMER, m_interval ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Timer::stop() |
||||
|
{ |
||||
|
if( !m_hwndTimer ) |
||||
|
return; |
||||
|
|
||||
|
WinStopTimer( 0, m_hwndTimer, ID_TIMER ); |
||||
|
|
||||
|
WinDestroyWindow( m_hwndTimer ); |
||||
|
|
||||
|
m_hwndTimer = NULLHANDLE; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Timer::execute() |
||||
|
{ |
||||
|
// Execute the callback
|
||||
|
m_rCommand.execute(); |
||||
|
|
||||
|
// Stop the timer if requested
|
||||
|
if( m_oneShot ) |
||||
|
stop(); |
||||
|
} |
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,68 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_timer.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_TIMER_HPP |
||||
|
#define OS2_TIMER_HPP |
||||
|
|
||||
|
#include "../src/os_timer.hpp" |
||||
|
|
||||
|
class CmdGeneric; |
||||
|
|
||||
|
// OS2 specific timer
|
||||
|
class OS2Timer: public OSTimer |
||||
|
{ |
||||
|
public: |
||||
|
OS2Timer( intf_thread_t *pIntf, CmdGeneric &rCmd, HWND hWnd ); |
||||
|
virtual ~OS2Timer(); |
||||
|
|
||||
|
/// (Re)start the timer with the given delay (in ms). If oneShot is
|
||||
|
/// true, stop it after the first execution of the callback.
|
||||
|
virtual void start( int delay, bool oneShot ); |
||||
|
|
||||
|
/// Stop the timer
|
||||
|
virtual void stop(); |
||||
|
|
||||
|
/// Execute the callback
|
||||
|
void execute(); |
||||
|
|
||||
|
private: |
||||
|
/// Command to execute
|
||||
|
CmdGeneric &m_rCommand; |
||||
|
|
||||
|
/// Delay between two execute
|
||||
|
mtime_t m_interval; |
||||
|
|
||||
|
/// Flag to tell whether the timer must be stopped after the
|
||||
|
/// first execution
|
||||
|
bool m_oneShot; |
||||
|
|
||||
|
/// Handle of the window to which the timer will be attached
|
||||
|
HWND m_hWnd; |
||||
|
|
||||
|
/// Handle of the timer window
|
||||
|
HWND m_hwndTimer; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,92 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_tooltip.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#include "os2_tooltip.hpp" |
||||
|
#include "os2_graphics.hpp" |
||||
|
#include "../src/generic_window.hpp" |
||||
|
|
||||
|
OS2Tooltip::OS2Tooltip( intf_thread_t *pIntf, HMODULE hInst, |
||||
|
HWND hParentWindow ): |
||||
|
OSTooltip( pIntf ) |
||||
|
{ |
||||
|
// Create the window
|
||||
|
ULONG flFrame = FCF_SHELLPOSITION; |
||||
|
m_hWnd = WinCreateStdWindow( HWND_DESKTOP, |
||||
|
WS_DISABLED, |
||||
|
&flFrame, |
||||
|
"SkinWindowClass", |
||||
|
"tooltip", |
||||
|
0, |
||||
|
hInst, |
||||
|
0, |
||||
|
&m_hWndClient ); |
||||
|
|
||||
|
if( !m_hWnd ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "createWindow failed" ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Tooltip::~OS2Tooltip() |
||||
|
{ |
||||
|
if( m_hWnd ) |
||||
|
WinDestroyWindow( m_hWnd ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Tooltip::show( int left, int top, OSGraphics &rText ) |
||||
|
{ |
||||
|
// Source drawable
|
||||
|
HPS hpsSrc = ((OS2Graphics&)rText).getPS(); |
||||
|
int width = rText.getWidth(); |
||||
|
int height = rText.getHeight(); |
||||
|
|
||||
|
RECTL rclParent; |
||||
|
|
||||
|
WinQueryWindowRect( WinQueryWindow( m_hWnd, QW_PARENT ), &rclParent ); |
||||
|
|
||||
|
// Find bottom and invert it
|
||||
|
int bottom = ( rclParent.yTop - 1 ) - ( top + height - 1 ); |
||||
|
|
||||
|
// Set the window on top, resize it, and show it
|
||||
|
WinSetWindowPos( m_hWnd, HWND_TOP, left, bottom, width, height, |
||||
|
SWP_ZORDER | SWP_MOVE | SWP_SIZE | SWP_SHOW ); |
||||
|
|
||||
|
HPS hps = WinGetPS( m_hWnd ); |
||||
|
POINTL aptl[] = {{ 0, 0 }, { width, height }, { 0, 0 }}; |
||||
|
GpiBitBlt( hps, hpsSrc, 3, aptl, ROP_SRCCOPY, BBO_IGNORE ); |
||||
|
WinReleasePS( hps ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Tooltip::hide() |
||||
|
{ |
||||
|
WinShowWindow( m_hWnd, FALSE ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,54 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_tooltip.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_TOOLTIP_HPP |
||||
|
#define OS2_TOOLTIP_HPP |
||||
|
|
||||
|
#include "../src/os_tooltip.hpp" |
||||
|
|
||||
|
|
||||
|
/// OS2 implementation of OSTooltip
|
||||
|
class OS2Tooltip: public OSTooltip |
||||
|
{ |
||||
|
public: |
||||
|
OS2Tooltip( intf_thread_t *pIntf, HMODULE hInst, HWND hParentWindow ); |
||||
|
|
||||
|
virtual ~OS2Tooltip(); |
||||
|
|
||||
|
/// Show the tooltip
|
||||
|
virtual void show( int left, int top, OSGraphics &rText ); |
||||
|
|
||||
|
/// Hide the tooltip
|
||||
|
virtual void hide(); |
||||
|
|
||||
|
private: |
||||
|
/// Window ID
|
||||
|
HWND m_hWnd; |
||||
|
|
||||
|
/// Client window ID
|
||||
|
HWND m_hWndClient; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,237 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_window.cpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License |
||||
|
* along with this program; if not, write to the Free Software |
||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifdef OS2_SKINS |
||||
|
|
||||
|
#include "../src/generic_window.hpp" |
||||
|
#include "../src/vlcproc.hpp" |
||||
|
#include "../src/vout_manager.hpp" |
||||
|
#include "os2_window.hpp" |
||||
|
#include "os2_dragdrop.hpp" |
||||
|
#include "os2_factory.hpp" |
||||
|
|
||||
|
|
||||
|
OS2Window::OS2Window( intf_thread_t *pIntf, GenericWindow &rWindow, |
||||
|
HMODULE hInst, HWND hParentWindow, |
||||
|
bool dragDrop, bool playOnDrop, |
||||
|
OS2Window *pParentWindow, |
||||
|
GenericWindow::WindowType_t type ): |
||||
|
OSWindow( pIntf ), m_dragDrop( dragDrop ), m_isLayered( false ), |
||||
|
m_pParent( pParentWindow ), m_type ( type ) |
||||
|
{ |
||||
|
(void)hParentWindow; |
||||
|
OS2Factory *pFactory = (OS2Factory*)OS2Factory::instance( getIntf() ); |
||||
|
|
||||
|
PCSZ vlc_name = "VlC Media Player"; |
||||
|
PCSZ vlc_class = "SkinWindowClass"; |
||||
|
ULONG flFrame = 0; |
||||
|
|
||||
|
// Create the window
|
||||
|
if( type == GenericWindow::VoutWindow ) |
||||
|
{ |
||||
|
// Child window (for vout)
|
||||
|
m_hWnd_parent = pParentWindow->getHandle(); |
||||
|
m_hWnd = WinCreateStdWindow( m_hWnd_parent, |
||||
|
WS_CLIPCHILDREN | WS_CLIPSIBLINGS, |
||||
|
&flFrame, |
||||
|
vlc_class, |
||||
|
vlc_name, |
||||
|
0, |
||||
|
hInst, |
||||
|
0, |
||||
|
&m_hWndClient ); |
||||
|
} |
||||
|
else if( type == GenericWindow::FullscreenWindow ) |
||||
|
{ |
||||
|
// top-level window
|
||||
|
m_hWnd = WinCreateStdWindow( HWND_DESKTOP, |
||||
|
WS_CLIPCHILDREN, |
||||
|
&flFrame, |
||||
|
vlc_class, |
||||
|
vlc_name, |
||||
|
0, |
||||
|
hInst, |
||||
|
0, |
||||
|
&m_hWndClient ); |
||||
|
|
||||
|
WinSetOwner( m_hWnd, pFactory->getParentWindow()); |
||||
|
} |
||||
|
else if( type == GenericWindow::FscWindow ) |
||||
|
{ |
||||
|
VoutManager* pVoutManager = VoutManager::instance( getIntf() ); |
||||
|
GenericWindow* pParent = |
||||
|
(GenericWindow*)pVoutManager->getVoutMainWindow(); |
||||
|
|
||||
|
m_hWnd_parent = (HWND)pParent->getOSHandle(); |
||||
|
|
||||
|
// top-level window
|
||||
|
m_hWnd = WinCreateStdWindow( HWND_DESKTOP, |
||||
|
WS_CLIPCHILDREN | WS_CLIPSIBLINGS, |
||||
|
&flFrame, |
||||
|
vlc_class, |
||||
|
vlc_name, |
||||
|
0, |
||||
|
hInst, |
||||
|
0, |
||||
|
&m_hWndClient ); |
||||
|
|
||||
|
WinSetOwner( m_hWnd, m_hWnd_parent ); |
||||
|
} |
||||
|
else |
||||
|
{ |
||||
|
// top-level window (owned by the root window)
|
||||
|
HWND hWnd_owner = pFactory->getParentWindow(); |
||||
|
m_hWnd = WinCreateStdWindow( HWND_DESKTOP, |
||||
|
WS_CLIPCHILDREN, |
||||
|
&flFrame, |
||||
|
vlc_class, |
||||
|
vlc_name, |
||||
|
0, |
||||
|
hInst, |
||||
|
0, |
||||
|
&m_hWndClient ); |
||||
|
|
||||
|
WinSetOwner( m_hWnd, hWnd_owner ); |
||||
|
} |
||||
|
|
||||
|
if( !m_hWnd ) |
||||
|
{ |
||||
|
msg_Err( getIntf(), "CreateWindow failed" ); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
// Store with it a pointer to the interface thread
|
||||
|
WinSetWindowPtr( m_hWndClient, 0, getIntf()); |
||||
|
|
||||
|
// Store a pointer to the GenericWindow in a map
|
||||
|
pFactory->m_windowMap[m_hWndClient] = &rWindow; |
||||
|
|
||||
|
// Drag & drop
|
||||
|
if( m_dragDrop ) |
||||
|
{ |
||||
|
// TODO
|
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
OS2Window::~OS2Window() |
||||
|
{ |
||||
|
OS2Factory *pFactory = (OS2Factory*)OS2Factory::instance( getIntf() ); |
||||
|
pFactory->m_windowMap[m_hWndClient] = NULL; |
||||
|
|
||||
|
if( m_hWnd ) |
||||
|
{ |
||||
|
if( m_dragDrop ) |
||||
|
{ |
||||
|
// TODO
|
||||
|
} |
||||
|
|
||||
|
WinDestroyWindow( m_hWnd ); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Window::reparent( void* OSHandle, int x, int y, int w, int h ) |
||||
|
{ |
||||
|
HWND hwndParent = ( HWND )OSHandle; |
||||
|
|
||||
|
// Reparent the window
|
||||
|
if( !WinSetParent( m_hWnd, hwndParent, TRUE ) ) |
||||
|
msg_Err( getIntf(), "SetParent failed (%lx)", WinGetLastError( 0 )); |
||||
|
RECTL rclParent; |
||||
|
WinQueryWindowRect( hwndParent, &rclParent ); |
||||
|
// Find bottom and invert it
|
||||
|
y = ( rclParent.yTop - 1 ) - ( y + h - 1 ); |
||||
|
WinSetWindowPos( m_hWnd, NULLHANDLE, x, y, w, h, SWP_MOVE | SWP_SIZE ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
bool OS2Window::invalidateRect( int x, int y, int w, int h ) const |
||||
|
{ |
||||
|
RECTL rcl; |
||||
|
WinQueryWindowRect( m_hWnd, &rcl ); |
||||
|
|
||||
|
// Find bottom and invert it
|
||||
|
y = ( rcl.yTop - 1 ) - ( y + h - 1 ); |
||||
|
WinSetRect( 0, &rcl, x, y, x + w, y + h ); |
||||
|
WinInvalidateRect( m_hWndClient, &rcl, TRUE ); |
||||
|
WinUpdateWindow( m_hWndClient ); |
||||
|
|
||||
|
return true; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Window::show() const |
||||
|
{ |
||||
|
if( m_type == GenericWindow::VoutWindow ) |
||||
|
{ |
||||
|
WinSetWindowPos( m_hWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_ZORDER ); |
||||
|
} |
||||
|
else if( m_type == GenericWindow::FullscreenWindow ) |
||||
|
{ |
||||
|
WinSetWindowPos( m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER ); |
||||
|
} |
||||
|
|
||||
|
WinSetWindowPos( m_hWnd, NULLHANDLE, 0, 0, 0, 0, |
||||
|
SWP_SHOW | SWP_ACTIVATE ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Window::hide() const |
||||
|
{ |
||||
|
WinShowWindow( m_hWnd, FALSE ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Window::moveResize( int left, int top, int width, int height ) const |
||||
|
{ |
||||
|
RECTL rclParent; |
||||
|
WinQueryWindowRect( WinQueryWindow( m_hWnd, QW_PARENT ), &rclParent ); |
||||
|
// Find bottom and invert it
|
||||
|
int bottom = ( rclParent.yTop - 1 ) - ( top + height - 1 ); |
||||
|
WinSetWindowPos( m_hWnd, NULLHANDLE, left, bottom , width, height, |
||||
|
SWP_MOVE | SWP_SIZE ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Window::raise() const |
||||
|
{ |
||||
|
WinSetWindowPos( m_hWnd, HWND_TOP, 0, 0, 0, 0, SWP_ZORDER | SWP_SHOW ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Window::setOpacity( uint8_t value ) const |
||||
|
{ |
||||
|
// Not supported
|
||||
|
} |
||||
|
|
||||
|
|
||||
|
void OS2Window::toggleOnTop( bool onTop ) const |
||||
|
{ |
||||
|
// Just bring a window to the top
|
||||
|
WinSetWindowPos( m_hWnd, HWND_TOP, 0, 0, 0, 0, onTop ? SWP_ZORDER : 0 ); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
#endif |
||||
@ -0,0 +1,90 @@ |
|||||
|
/*****************************************************************************
|
||||
|
* os2_window.hpp |
||||
|
***************************************************************************** |
||||
|
* Copyright (C) 2003, 2013 the VideoLAN team |
||||
|
* |
||||
|
* Authors: Cyril Deguet <asmax@via.ecp.fr> |
||||
|
* Olivier Teulière <ipkiss@via.ecp.fr> |
||||
|
* KO Myung-Hun <komh@chollian.net> |
||||
|
* |
||||
|
* This program is free software; you can redistribute it and/or modify |
||||
|
* it under the terms of the GNU General Public License as published by |
||||
|
* the Free Software Foundation; either version 2 of the License, or |
||||
|
* (at your option) any later version. |
||||
|
* |
||||
|
* This program is distributed in the hope that it will be useful, |
||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
* GNU General Public License for more details. |
||||
|
* |
||||
|
* You should have received a copy of the GNU General Public License along |
||||
|
* with this program; if not, write to the Free Software Foundation, Inc., |
||||
|
* 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. |
||||
|
*****************************************************************************/ |
||||
|
|
||||
|
#ifndef OS2_WINDOW_HPP |
||||
|
#define OS2_WINDOW_HPP |
||||
|
|
||||
|
#include "../src/generic_window.hpp" |
||||
|
#include "../src/os_window.hpp" |
||||
|
|
||||
|
|
||||
|
/// OS2 implementation of OSWindow
|
||||
|
class OS2Window: public OSWindow |
||||
|
{ |
||||
|
public: |
||||
|
OS2Window( intf_thread_t *pIntf, GenericWindow &rWindow, |
||||
|
HMODULE hInst, HWND hParentWindow, |
||||
|
bool dragDrop, bool playOnDrop, |
||||
|
OS2Window *pParentWindow, GenericWindow::WindowType_t ); |
||||
|
virtual ~OS2Window(); |
||||
|
|
||||
|
// Show the window
|
||||
|
virtual void show() const; |
||||
|
|
||||
|
// Hide the window
|
||||
|
virtual void hide() const; |
||||
|
|
||||
|
/// Move and resize the window
|
||||
|
virtual void moveResize( int left, int top, int width, int height ) const; |
||||
|
|
||||
|
/// Bring the window on top
|
||||
|
virtual void raise() const; |
||||
|
|
||||
|
/// Set the opacity of the window (0 = transparent, 255 = opaque)
|
||||
|
virtual void setOpacity( uint8_t value ) const; |
||||
|
|
||||
|
/// Toggle the window on top
|
||||
|
virtual void toggleOnTop( bool onTop ) const; |
||||
|
|
||||
|
/// Getter for the window handle
|
||||
|
HWND getHandle() const { return m_hWndClient; } |
||||
|
|
||||
|
/// Getter for the window handle
|
||||
|
void* getOSHandle() const { return (void*) m_hWndClient; } |
||||
|
|
||||
|
/// reparent the window
|
||||
|
void reparent( void* OSHandle, int x, int y, int w, int h ); |
||||
|
|
||||
|
/// invalidate a window surface
|
||||
|
bool invalidateRect( int x, int y, int w, int h ) const; |
||||
|
|
||||
|
private: |
||||
|
/// Window handle
|
||||
|
HWND m_hWnd; |
||||
|
/// Client window handle
|
||||
|
HWND m_hWndClient; |
||||
|
/// Window parent's handle
|
||||
|
HWND m_hWnd_parent; |
||||
|
/// Indicates whether the window handles drag&drop events
|
||||
|
bool m_dragDrop; |
||||
|
/// Indicates whether the window is layered
|
||||
|
mutable bool m_isLayered; |
||||
|
/// Parent window
|
||||
|
OS2Window *m_pParent; |
||||
|
/// window type
|
||||
|
GenericWindow::WindowType_t m_type; |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
#endif |
||||
Loading…
Reference in new issue