unixsite.cpp
来自「symbian 下的helix player源代码」· C++ 代码 · 共 2,150 行 · 第 1/5 页
CPP
2,150 行
XLockDisplay(dis);
tmpGC = XCreateGC( dis, m_ScrollVertButtonB, 0, &values );
XUnlockDisplay(dis);
}
else if( m_ScrollHorizButtonL )
{
XLockDisplay(dis);
tmpGC = XCreateGC( dis, m_ScrollHorizButtonL, 0, &values );
XUnlockDisplay(dis);
}
else
{
//We don't have any scroll bars to draw....
return;
}
XLockDisplay(dis);
XSetForeground( dis, tmpGC, WhitePixel(dis, 0 ));
XSetBackground( dis, tmpGC, BlackPixel(dis, 0 ));
XUnlockDisplay(dis);
Colormap cmap = HXGetXColormap((Display*)GetWindow()->display,
(Window)GetWindow()->window);
XColor color;
memset(&color, 0, sizeof(XColor));
XLockDisplay(dis);
XParseColor(dis, cmap, "blue", &color);
XUnlockDisplay(dis);
HXFindBestXColor(dis, cmap, &color);
XLockDisplay(dis);
XSetForeground( dis, tmpGC, color.pixel);
XSetLineAttributes(dis, tmpGC, 1, LineSolid, CapRound, JoinRound );
XUnlockDisplay(dis);
//Draw up Vertical arrow.
if( m_ScrollVertButtonT )
{
points[0].x = offset;
points[0].y = SCROLL_BAR_WIDTH-offset;
points[1].x = SCROLL_BAR_WIDTH/2;
points[1].y = offset;
points[2].x = SCROLL_BAR_WIDTH-offset;
points[2].y = SCROLL_BAR_WIDTH-offset;
points[3].x = points[0].x;
points[3].y = points[0].y;
XLockDisplay(dis);
XFillPolygon( dis, m_ScrollVertButtonT, tmpGC, points, 4, Convex, CoordModeOrigin);
XUnlockDisplay(dis);
}
//Draw down Vertical arrow.
if( m_ScrollVertButtonB )
{
points[0].x = offset;
points[0].y = offset;
points[1].x = SCROLL_BAR_WIDTH-offset;
points[1].y = offset;
points[2].x = SCROLL_BAR_WIDTH/2;
points[2].y = SCROLL_BAR_WIDTH-offset;
points[3].x = points[0].x;
points[3].y = points[0].y;
XLockDisplay(dis);
XFillPolygon( dis, m_ScrollVertButtonB, tmpGC, points, 4, Convex, CoordModeOrigin);
XUnlockDisplay(dis);
}
//Draw Left Horizontal arrow.
if( m_ScrollHorizButtonL )
{
points[0].x = SCROLL_BAR_WIDTH-offset;
points[0].y = offset;
points[1].x = SCROLL_BAR_WIDTH-offset;
points[1].y = SCROLL_BAR_WIDTH-offset;
points[2].x = offset;
points[2].y = SCROLL_BAR_WIDTH/2;
points[3].x = points[0].x;
points[3].y = points[0].y;
XLockDisplay(dis);
XFillPolygon( dis, m_ScrollHorizButtonL, tmpGC, points, 4, Convex, CoordModeOrigin);
XUnlockDisplay(dis);
}
//Draw Right Horizontal arrow.
if( m_ScrollHorizButtonR )
{
points[0].x = offset;
points[0].y = SCROLL_BAR_WIDTH-offset;
points[1].x = offset;
points[1].y = offset;
points[2].x = SCROLL_BAR_WIDTH-offset;
points[2].y = SCROLL_BAR_WIDTH/2;
points[3].x = points[0].x;
points[3].y = points[0].y;
XLockDisplay(dis);
XFillPolygon( dis, m_ScrollHorizButtonR, tmpGC, points, 4, Convex, CoordModeOrigin);
XUnlockDisplay(dis);
}
//Free the GC and go.
XLockDisplay(dis);
XFreeGC( dis, tmpGC );
XUnlockDisplay(dis);
}
BOOL CHXUnixSite::_InButton( HXxPoint& pt, int x, int y )
{
BOOL retVal =FALSE;
if( x>= pt.x && x< pt.x+SCROLL_BAR_WIDTH && y>=pt.y && y<pt.y+SCROLL_BAR_WIDTH )
retVal=TRUE;
else
retVal=FALSE;
return retVal;
}
void CHXUnixSite::_CreateHorizScrollBar()
{
HX_ASSERT( m_ScrollHorizButtonL == 0 );
HX_ASSERT( m_ScrollHorizButtonR == 0 );
HXxSize mySize;
HXxWindow* pParentWindow = NULL;
if(GetParentSite())
{
pParentWindow = GetParentSite()->GetWindow();
}
if(pParentWindow)
{
GetParentSite()->GetSize(mySize);
}
HX_ASSERT( pParentWindow );
HX_ASSERT( pParentWindow->window != 0 );
if( m_ScrollVertButtonB )
{
// if the other bar already exists, don't overlap it!
mySize.cx -= SCROLL_BAR_WIDTH;
}
m_ptScrollHorizPosL.x = m_topleft.x;
m_ptScrollHorizPosL.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
#ifndef _ARROWS_SIDE_BY_SIDE
m_ptScrollHorizPosR.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
#else
m_ptScrollHorizPosR.x = m_topleft.x+SCROLL_BAR_WIDTH;
#endif
m_ptScrollHorizPosR.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
Display* dis = (Display*)GetWindow()->display;
XLockDisplay(dis);
Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) );
XUnlockDisplay(dis);
Pixel greyPixel = blackPixel;
Colormap cmap = HXGetXColormap(dis, (Window)GetWindow()->window);
XColor color;
XLockDisplay(dis);
XParseColor(dis, cmap, "gray", &color);
XUnlockDisplay(dis);
HXFindBestXColor(dis, cmap, &color);
greyPixel = color.pixel;
XLockDisplay(dis);
m_ScrollHorizButtonL = XCreateSimpleWindow( dis,
(Window)pParentWindow->window,
m_ptScrollHorizPosL.x, m_ptScrollHorizPosL.y,
SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
1,
blackPixel,
greyPixel
);
m_ScrollHorizButtonR = XCreateSimpleWindow( dis,
(Window)pParentWindow->window,
m_ptScrollHorizPosR.x, m_ptScrollHorizPosR.y,
SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
1,
blackPixel,
greyPixel
);
XUnlockDisplay(dis);
HX_ASSERT( m_ScrollHorizButtonR && m_ScrollHorizButtonL );
}
void CHXUnixSite::_CreateVertScrollBar()
{
HX_ASSERT( m_ScrollVertButtonB == 0 );
HX_ASSERT( m_ScrollVertButtonT == 0 );
HXxSize mySize;
HXxWindow* pParentWindow = NULL;
if(GetParentSite())
{
pParentWindow = GetParentSite()->GetWindow();
}
if(pParentWindow)
{
GetParentSite()->GetSize(mySize);
}
HX_ASSERT( pParentWindow );
HX_ASSERT( pParentWindow->window != 0 );
if( m_ScrollHorizButtonR )
{
// if the other bar already exists, don't overlap it!
mySize.cy -= SCROLL_BAR_WIDTH;
}
m_ptScrollVertPosT.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
m_ptScrollVertPosT.y = m_topleft.y;
m_ptScrollVertPosB.x = m_topleft.x+mySize.cx-SCROLL_BAR_WIDTH;
#ifndef _ARROWS_SIDE_BY_SIDE
m_ptScrollVertPosB.y = m_topleft.y+mySize.cy-SCROLL_BAR_WIDTH;
#else
m_ptScrollVertPosB.y = m_topleft.y+SCROLL_BAR_WIDTH;
#endif
Display* dis = (Display*)GetWindow()->display;
XLockDisplay(dis);
Pixel blackPixel = BlackPixel( dis, DefaultScreen(dis) );
XUnlockDisplay(dis);
Pixel greyPixel = blackPixel;
Colormap cmap = HXGetXColormap((Display*)GetWindow()->display,
(Window)GetWindow()->window);
XColor color;
XLockDisplay(dis);
XParseColor(dis, cmap, "gray", &color);
XUnlockDisplay(dis);
HXFindBestXColor(dis, cmap, &color);
greyPixel = color.pixel;
HX_ASSERT( GetWindow() );
XLockDisplay(dis);
m_ScrollVertButtonT = XCreateSimpleWindow( dis,
(Window)pParentWindow->window,
m_ptScrollVertPosT.x, m_ptScrollVertPosT.y,
SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
1,
blackPixel,
greyPixel
);
m_ScrollVertButtonB = XCreateSimpleWindow( dis,
(Window)pParentWindow->window,
m_ptScrollVertPosB.x, m_ptScrollVertPosB.y,
SCROLL_BAR_WIDTH, SCROLL_BAR_WIDTH,
1,
blackPixel,
greyPixel
);
XUnlockDisplay(dis);
HX_ASSERT( m_ScrollVertButtonB && m_ScrollVertButtonT );
}
//
// Inherited CHXBaseSite methods.
//
void CHXUnixSite::_NeedWindowedSite()
{
#ifdef _DEBUG
fprintf( stderr, "CHXUnixSite::_NeedWindowedSite do something here....\n" );
#endif
//Nothing to do on unix....
}
void CHXUnixSite::_AttachWindow()
{
void* pDummy=NULL;
if(!z_mapSiteToWindow.Lookup((void*)this, pDummy))
{
z_mapSiteToWindow.SetAt((void*)this, (void*)m_pWindow);
}
//Set the display variable.
if( m_pWindow->display == NULL )
{
HX_ASSERT(zm_display);
m_pWindow->display = zm_display;
}
//Now that we have a window be sure to init the CUnixRootSurf.
//this lets it set up the display, colormap, etc.
((CUnixRootSurf*)m_pRootSurface)->Init();
}
void CHXUnixSite::_DetachWindow()
{
void* pDummy;
if (z_mapSiteToWindow.Lookup((void*)this, pDummy))
{
z_mapSiteToWindow.RemoveKey((void*)this);
}
}
void* CHXUnixSite::_Create(void* pParentWindow, UINT32 style)
{
HRESULT result = HXR_OK;
if( m_pWindow && m_pWindow->window )
{
HX_ASSERT( "We already have created a window"==NULL);
return NULL;
}
if (pParentWindow==NULL || style)
{
m_bIsChildWindow = FALSE;
}
else
{
m_bIsChildWindow = TRUE;
}
if( _OpenXDisplay(NULL) != HXR_OK )
{
return NULL;
}
return (void*)CreateXWindow((Window)pParentWindow);
}
void CHXUnixSite::_Destroy(HXxWindow* pWindow)
{
_DestroySliders();
if (GetWindow())
{
Display* pDis = (Display*)GetWindow()->display;
XLockDisplay(pDis);
XDestroyWindow( pDis, (Window)pWindow->window );
XUnlockDisplay(pDis);
}
}
void CHXUnixSite::_SetSize(HXxSize size)
{
HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
//The scroll bars get resized also...
_DestroySliders();
Display* pDis = (Display*)GetWindow()->display;
XLockDisplay(pDis);
XResizeWindow(pDis,
(Window) m_pWindow->window,
size.cx,
size.cy);
XUnlockDisplay(pDis);
}
void CHXUnixSite::_SetPosition(HXxPoint position)
{
HX_ASSERT( m_pWindow && m_pWindow->display && m_pWindow->window);
_DestroyScrollButtons();
XLockDisplay((Display*) m_pWindow->display);
XMoveWindow((Display*)m_pWindow->display,
(Window)m_pWindow->window,
position.x,
position.y);
XUnlockDisplay((Display*) m_pWindow->display);
}
void CHXUnixSite::_DamageRect(HXxRect rect)
{
if(GetWindow())
{
m_bDamaged = TRUE;
}
return;
}
void CHXUnixSite::_DamageRegion(HXxRegion rect)
{
if(GetWindow())
{
m_bDamaged = TRUE;
}
return;
}
void CHXUnixSite::_SendOSUpdateMessage()
{
//We need to redraw our window here, m_pWindow.
}
void CHXUnixSite::_ShowSite(BOOL bShow)
{
if( bShow )
{
_MapScrollButtons();
}
else
{
_UnmapScrollButtons();
}
//do nothing....
}
BOOL CHXUnixSite::_AtSystemTime()
{
return TRUE;
}
void CHXUnixSite::_GetDeviceCaps( void* hdc,
UINT16& uBitsPerPixel,
UINT16& uHorzRes,
UINT16& uVertRes )
{
Screen* pScreen = NULL;
HXxWindow* pWin = GetWindow();
HX_ASSERT( pWin );
if( pWin )
{
Display* dis = (Display*)pWin->display;
HX_ASSERT( dis );
if( dis )
{
Display* pDisp = (Display*)GetWindow()->display;
XLockDisplay(pDisp);
pScreen = DefaultScreenOfDisplay(pDisp);
XUnlockDisplay(pDisp);
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?