More X11 code

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@14097 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Julian Smart
2002-02-10 01:03:45 +00:00
parent 6cecceddd8
commit b513212d2e
9 changed files with 657 additions and 619 deletions

View File

@@ -38,6 +38,14 @@
#endif //WX_PRECOMP
#include "wx/x11/private.h"
#include "X11/Xatom.h"
#include "X11/Xutil.h"
// Set the window manager decorations according to the
// given wxWindows style
static bool SetWMDecorations(Widget w, long style);
static bool MWMIsRunning(Window w);
// ----------------------------------------------------------------------------
// globals
@@ -98,9 +106,13 @@ bool wxTopLevelWindowX11::Create(wxWindow *parent,
m_windowId = id == -1 ? NewControlId() : id;
wxTopLevelWindows.Append(this);
Atom wm_delete_window = XInternAtom(wxGlobalDisplay(), "WM_DELETE_WINDOW", False);
if ( parent )
parent->AddChild(this);
XSetWMProtocols(wxGlobalDisplay(), (Window) GetMainWindow(), &wm_delete_window, 1);
SetWMDecorations((Window) GetMainWindow(), style);
SetTitle(title);
if ( GetExtraStyle() & wxTOPLEVEL_EX_DIALOG )
{
@@ -141,9 +153,7 @@ bool wxTopLevelWindowX11::Show(bool show)
if ( !wxWindowBase::Show(show) )
return FALSE;
// TODO
return TRUE;
return wxWindowX11::Show(show);
}
// ----------------------------------------------------------------------------
@@ -163,18 +173,27 @@ bool wxTopLevelWindowX11::IsMaximized() const
void wxTopLevelWindowX11::Iconize(bool iconize)
{
// TODO
if (!m_iconized && GetMainWindow())
{
if (XIconifyWindow(wxGlobalDisplay(),
(Window) GetMainWindow(), DefaultScreen(wxGlobalDisplay())) != 0)
m_iconized = TRUE;
}
}
bool wxTopLevelWindowX11::IsIconized() const
{
// TODO
return m_iconized;
}
void wxTopLevelWindowX11::Restore()
{
// TODO
// This is the way to deiconify the window, according to the X FAQ
if (m_iconized && GetMainWindow())
{
XMapWindow(wxGlobalDisplay(), (Window) GetMainWindow());
m_iconized = FALSE;
}
}
// ----------------------------------------------------------------------------
@@ -216,5 +235,157 @@ void wxTopLevelWindowX11::SetIcon(const wxIcon& icon)
// this sets m_icon
wxTopLevelWindowBase::SetIcon(icon);
// TODO
if (icon.Ok() && GetMainWindow())
{
XWMHints *wmHints = XAllocWMHints();
wmHints.icon_pixmap = (Pixmap) icon.GetPixmap();
wmHints.flags = IconPixmapHint;
if (icon.GetMask())
{
wmHints.flags |= IconMaskHint;
wmHints.icon_mask = (Pixmap) icon.GetMask()->GetPixmap();
}
XSetWMHints(wxGlobalDisplay(), (Window) GetMainWindow(),
wmHints);
XFree(wmHints);
}
}
void wxTopLevelWindowX11::SetTitle(const wxString& title)
{
m_title = title;
if (GetMainWindow())
{
XStoreName(wxGlobalDisplay(), (Window) GetMainWindow(),
(const char*) title);
XSetIconName(wxGlobalDisplay(), (Window) GetMainWindow(),
(const char*) title);
#if 0
XTextProperty textProperty;
textProperty.value = (unsigned char*) title;
textProperty.encoding = XA_STRING;
textProperty.format = 8;
textProperty.nitems = 1;
XSetTextProperty(wxGlobalDisplay(), (Window) GetMainWindow(),
& textProperty, WM_NAME);
#endif
}
}
wxString wxTopLevelWindowX11::GetTitle() const
{
return m_title;
}
#ifndef MWM_DECOR_BORDER
/* bit definitions for MwmHints.flags */
#define MWM_HINTS_FUNCTIONS (1L << 0)
#define MWM_HINTS_DECORATIONS (1L << 1)
#define MWM_HINTS_INPUT_MODE (1L << 2)
#define MWM_HINTS_STATUS (1L << 3)
#define MWM_DECOR_ALL (1L << 0)
#define MWM_DECOR_BORDER (1L << 1)
#define MWM_DECOR_RESIZEH (1L << 2)
#define MWM_DECOR_TITLE (1L << 3)
#define MWM_DECOR_MENU (1L << 4)
#define MWM_DECOR_MINIMIZE (1L << 5)
#define MWM_DECOR_MAXIMIZE (1L << 6)
#endif
struct MwmHints {
long flags;
long functions;
long decorations;
long input_mode;
};
#define PROP_MOTIF_WM_HINTS_ELEMENTS 5
// Set the window manager decorations according to the
// given wxWindows style
static bool SetWMDecorations(Widget w, long style)
{
if (!MWMIsRunning(w))
return FALSE;
Atom mwm_wm_hints = XInternAtom(wxGlobalDisplay(),"_MOTIF_WM_HINTS", False);
MwmHints hints;
hints.flags = 0;
hints.decorations = 0;
if (style & wxRESIZE_BORDER)
{
hints.flags |= MWM_HINTS_DECORATIONS;
hints.decorations |= MWM_DECOR_RESIZEH;
}
if (style & wxSYSTEM_MENU)
{
hints.flags |= MWM_HINTS_DECORATIONS;
hints.decorations |= MWM_DECOR_MENU;
}
if ((style & wxCAPTION) ||
(style & wxTINY_CAPTION_HORIZ) ||
(style & wxTINY_CAPTION_VERT))
{
hints.flags |= MWM_HINTS_DECORATIONS;
hints.decorations |= MWM_DECOR_TITLE;
}
if (style & wxTHICK_FRAME)
{
hints.flags |= MWM_HINTS_DECORATIONS;
hints.decorations |= MWM_DECOR_BORDER;
}
if (style & wxTHICK_FRAME)
{
hints.flags |= MWM_HINTS_DECORATIONS;
hints.decorations |= MWM_DECOR_BORDER;
}
if (style & wxMINIMIZE_BOX)
{
hints.flags |= MWM_HINTS_DECORATIONS;
hints.decorations |= MWM_DECOR_MINIMIZE;
}
if (style & wxMAXIMIZE_BOX)
{
hints.flags |= MWM_HINTS_DECORATIONS;
hints.decorations |= MWM_DECOR_MAXIMIZE;
}
XChangeProperty(wxGlobalDisplay(),
w,
mwm_wm_hints, mem_wm_hints,
32, PropModeReplace,
(unsigned char *) &hints, PROP_MOTIF_WM_HINTS_ELEMENTS);
return TRUE;
}
static bool MWMIsRunning(Window w)
{
Atom motifWmInfo = XInternAtom(dpy, "_MOTIF_WM_INFO", False);
unsigned long length, bytesafter;
unsigned char value[20];
int ret, type, format;
type = format = length = 0;
value = 0;
ret = XGetWindowProperty(wxGlobalDisplay(), w, motifWmInfo,
0L, 2, False, motifWmInfo,
&type, &format, &length, &bytesafter, &value);
return (ret == Success);
}