2. use HandleWindowEvent() everywhere as more obvious and convenient shortcut for GetEventHandler()->ProcessEvent(); also for consistency with wxGTK where it's required git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@50329 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
208 lines
5.7 KiB
C++
208 lines
5.7 KiB
C++
/////////////////////////////////////////////////////////////////////////////
|
|
// Name: src/dfb/toplevel.cpp
|
|
// Purpose: Top level window, abstraction of wxFrame and wxDialog
|
|
// Author: Vaclav Slavik
|
|
// Created: 2006-08-10
|
|
// RCS-ID: $Id$
|
|
// Copyright: (c) 2006 REA Elektronik GmbH
|
|
// Licence: wxWindows licence
|
|
/////////////////////////////////////////////////////////////////////////////
|
|
|
|
// For compilers that support precompilation, includes "wx.h".
|
|
#include "wx/wxprec.h"
|
|
|
|
#include "wx/toplevel.h"
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/app.h"
|
|
#endif // WX_PRECOMP
|
|
|
|
#include "wx/dfb/private.h"
|
|
|
|
#define TRACE_EVENTS "events"
|
|
|
|
// ============================================================================
|
|
// wxTopLevelWindowDFB
|
|
// ============================================================================
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// creation & destruction
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxTopLevelWindowDFB::Init()
|
|
{
|
|
m_isMaximized = false;
|
|
m_fsIsShowing = false;
|
|
}
|
|
|
|
bool wxTopLevelWindowDFB::Create(wxWindow *parent,
|
|
wxWindowID id,
|
|
const wxString& title,
|
|
const wxPoint& posOrig,
|
|
const wxSize& sizeOrig,
|
|
long style,
|
|
const wxString &name)
|
|
{
|
|
// always create a frame of some reasonable, even if arbitrary, size (at
|
|
// least for MSW compatibility)
|
|
wxSize size(sizeOrig);
|
|
if ( size.x == wxDefaultCoord || size.y == wxDefaultCoord )
|
|
{
|
|
wxSize sizeDefault = GetDefaultSize();
|
|
if ( size.x == wxDefaultCoord )
|
|
size.x = sizeDefault.x;
|
|
if ( size.y == wxDefaultCoord )
|
|
size.y = sizeDefault.y;
|
|
}
|
|
|
|
wxPoint pos(posOrig);
|
|
if ( pos.x == wxDefaultCoord )
|
|
pos.x = 0;
|
|
if ( pos.y == wxDefaultCoord )
|
|
pos.y = 0;
|
|
|
|
if ( !wxNonOwnedWindow::Create(parent, id, pos, size, style, name) )
|
|
return false;
|
|
|
|
wxTopLevelWindows.Append(this);
|
|
m_title = title;
|
|
|
|
return true;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// showing and hiding
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#warning "FIXME: the rest of this file is almost same as for MGL, merge it"
|
|
bool wxTopLevelWindowDFB::ShowFullScreen(bool show, long style)
|
|
{
|
|
if ( show == m_fsIsShowing )
|
|
return true;
|
|
|
|
m_fsIsShowing = show;
|
|
|
|
if (show)
|
|
{
|
|
m_fsSaveStyle = m_windowStyle;
|
|
m_fsSaveFlag = style;
|
|
GetPosition(&m_fsSaveFrame.x, &m_fsSaveFrame.y);
|
|
GetSize(&m_fsSaveFrame.width, &m_fsSaveFrame.height);
|
|
|
|
if ( style & wxFULLSCREEN_NOCAPTION )
|
|
m_windowStyle &= ~wxCAPTION;
|
|
if ( style & wxFULLSCREEN_NOBORDER )
|
|
m_windowStyle = wxSIMPLE_BORDER;
|
|
|
|
int x, y;
|
|
wxDisplaySize(&x, &y);
|
|
SetSize(0, 0, x, y);
|
|
}
|
|
else
|
|
{
|
|
m_windowStyle = m_fsSaveStyle;
|
|
SetSize(m_fsSaveFrame.x, m_fsSaveFrame.y,
|
|
m_fsSaveFrame.width, m_fsSaveFrame.height);
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool wxTopLevelWindowDFB::SetTransparent(wxByte alpha)
|
|
{
|
|
if ( IsShown() )
|
|
{
|
|
if ( !m_dfbwin->SetOpacity(alpha) )
|
|
return false;
|
|
}
|
|
|
|
m_opacity = alpha;
|
|
return true;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// maximize, minimize etc.
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxTopLevelWindowDFB::Maximize(bool maximize)
|
|
{
|
|
int x, y, w, h;
|
|
wxClientDisplayRect(&x, &y, &w, &h);
|
|
|
|
if ( maximize && !m_isMaximized )
|
|
{
|
|
m_isMaximized = true;
|
|
|
|
GetPosition(&m_savedFrame.x, &m_savedFrame.y);
|
|
GetSize(&m_savedFrame.width, &m_savedFrame.height);
|
|
|
|
SetSize(x, y, w, h);
|
|
}
|
|
else if ( !maximize && m_isMaximized )
|
|
{
|
|
m_isMaximized = false;
|
|
SetSize(m_savedFrame.x, m_savedFrame.y,
|
|
m_savedFrame.width, m_savedFrame.height);
|
|
}
|
|
}
|
|
|
|
bool wxTopLevelWindowDFB::IsMaximized() const
|
|
{
|
|
return m_isMaximized;
|
|
}
|
|
|
|
void wxTopLevelWindowDFB::Restore()
|
|
{
|
|
if ( IsMaximized() )
|
|
{
|
|
Maximize(false);
|
|
}
|
|
}
|
|
|
|
void wxTopLevelWindowDFB::Iconize(bool WXUNUSED(iconize))
|
|
{
|
|
wxFAIL_MSG(wxT("Iconize not supported under wxDFB"));
|
|
}
|
|
|
|
bool wxTopLevelWindowDFB::IsIconized() const
|
|
{
|
|
return false;
|
|
}
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// focus handling
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void wxTopLevelWindowDFB::HandleFocusEvent(const wxDFBWindowEvent& event_)
|
|
{
|
|
const DFBWindowEvent& dfbevent = event_;
|
|
const bool activate = (dfbevent.type == DWET_GOTFOCUS);
|
|
|
|
wxLogTrace(TRACE_EVENTS,
|
|
"toplevel window %p ('%s') %s focus",
|
|
this, GetName(),
|
|
activate ? "got" : "lost");
|
|
|
|
wxActivateEvent event(wxEVT_ACTIVATE, activate, GetId());
|
|
event.SetEventObject(this);
|
|
HandleWindowEvent(event);
|
|
|
|
// if a frame that doesn't have wx focus inside it just got focus, we
|
|
// need to set focus to it (or its child):
|
|
if ( activate )
|
|
{
|
|
wxWindow *focused = wxWindow::FindFocus();
|
|
if ( !focused || focused->GetTLW() != this )
|
|
{
|
|
wxLogTrace(TRACE_EVENTS,
|
|
"setting wx focus to toplevel window %p ('%s')",
|
|
this, GetName());
|
|
|
|
if ( CanAcceptFocus() )
|
|
SetFocus();
|
|
else
|
|
wxLogTrace(TRACE_EVENTS, "...which doesn't accept it");
|
|
}
|
|
}
|
|
}
|