summaryrefslogtreecommitdiff
path: root/plugingui
diff options
context:
space:
mode:
authorBent Bisballe Nyeng <deva@aasimon.org>2012-12-28 19:55:42 +0100
committerBent Bisballe Nyeng <deva@aasimon.org>2012-12-28 19:55:42 +0100
commitee8c2cf0dc3885751eb3e4b2c11da2576cac1371 (patch)
treee46700a612f74201e74ec925d6627f8c691a5944 /plugingui
parentd88abf274ddff2de9250dbf960cb8e1b25f07cfa (diff)
Move native code to seperate 'NativeWindow' classes.
Diffstat (limited to 'plugingui')
-rw-r--r--plugingui/Makefile.am.plugingui2
-rw-r--r--plugingui/guievent.h3
-rw-r--r--plugingui/nativewindow.h55
-rw-r--r--plugingui/nativewindow_win32.cc134
-rw-r--r--plugingui/nativewindow_win32.h58
-rw-r--r--plugingui/nativewindow_x11.cc233
-rw-r--r--plugingui/nativewindow_x11.h62
-rw-r--r--plugingui/window.cc290
-rw-r--r--plugingui/window.h12
9 files changed, 570 insertions, 279 deletions
diff --git a/plugingui/Makefile.am.plugingui b/plugingui/Makefile.am.plugingui
index 634c641..0e96dd2 100644
--- a/plugingui/Makefile.am.plugingui
+++ b/plugingui/Makefile.am.plugingui
@@ -1,4 +1,6 @@
PLUGIN_GUI_SOURCES = \
+ $(top_srcdir)/plugingui/nativewindow_x11.cc \
+ $(top_srcdir)/plugingui/nativewindow_win32.cc \
$(top_srcdir)/plugingui/plugingui.cc \
$(top_srcdir)/plugingui/globalcontext.cc \
$(top_srcdir)/plugingui/label.cc \
diff --git a/plugingui/guievent.h b/plugingui/guievent.h
index 3550003..0fb3ef2 100644
--- a/plugingui/guievent.h
+++ b/plugingui/guievent.h
@@ -33,6 +33,7 @@
#ifdef X11
#include <X11/Xlib.h>
+#include <X11/Xutil.h>
#endif/*X11*/
namespace GUI {
@@ -52,7 +53,7 @@ public:
virtual Type type() = 0;
#ifdef X11
- Window window_id;
+ ::Window window_id;
#endif/*X11*/
};
diff --git a/plugingui/nativewindow.h b/plugingui/nativewindow.h
new file mode 100644
index 0000000..9225f28
--- /dev/null
+++ b/plugingui/nativewindow.h
@@ -0,0 +1,55 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * nativewindow.h
+ *
+ * Fri Dec 28 18:46:01 CET 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo 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.
+ *
+ * DrumGizmo 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 DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __DRUMGIZMO_NATIVEWINDOW_H__
+#define __DRUMGIZMO_NATIVEWINDOW_H__
+
+#include <string>
+
+#include "globalcontext.h"
+
+namespace GUI {
+
+class NativeWindow {
+public:
+ NativeWindow(GlobalContext *c) : gctx(c) {}
+ virtual ~NativeWindow() {}
+
+ virtual void resize(int width, int height) = 0;
+ virtual void move(int x, int y) = 0;
+ virtual void show() = 0;
+ virtual void setCaption(const std::string &caption) = 0;
+ virtual void hide() = 0;
+ virtual void handleBuffer() = 0;
+ virtual void redraw() = 0;
+
+protected:
+ GlobalContext *gctx;
+};
+
+};
+
+#endif/*__DRUMGIZMO_NATIVEWINDOW_H__*/
diff --git a/plugingui/nativewindow_win32.cc b/plugingui/nativewindow_win32.cc
new file mode 100644
index 0000000..a98ef4c
--- /dev/null
+++ b/plugingui/nativewindow_win32.cc
@@ -0,0 +1,134 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * nativewindow_win32.cc
+ *
+ * Fri Dec 28 18:45:52 CET 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo 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.
+ *
+ * DrumGizmo 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 DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "nativewindow_win32.h"
+
+#ifdef WIN32
+
+#include "window.h"
+
+// Delared in eventhandler.cc
+LRESULT CALLBACK dialogProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
+
+GUI::NativeWindowWin32::NativeWindowWin32(GlobalContext *gctx,
+ GUI::Window *window)
+ : GUI::NativeWindow(gctx)
+{
+ this->window = window;
+
+ WNDCLASSEX wcex;
+ WNDID wndId;
+
+ gctx->m_hwnd = 0;
+ gctx->m_className = NULL;
+
+ memset(&wcex, 0, sizeof(wcex));
+
+ //Time to register a window class.
+ //Generic flags and everything. cbWndExtra is the size of a pointer to an
+ // object - we need this in the wndproc handler.
+
+ wcex.cbSize = sizeof(WNDCLASSEX);
+ wcex.style = 0;//class_style;
+ wcex.lpfnWndProc = (WNDPROC)dialogProc;
+ wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
+ // Set data:
+ wcex.cbWndExtra = sizeof(EventHandler*); // Size of data.
+ wcex.hInstance = GetModuleHandle(NULL);
+
+ // if(ex_style && WS_EX_TRANSPARENT == WS_EX_TRANSPARENT) {
+ // wcex.hbrBackground = NULL;
+ // } else {
+ wcex.hbrBackground = NULL;//(HBRUSH) COLOR_BACKGROUND + 1;
+ // }
+
+ wcex.lpszClassName = gctx->m_className = strdup("DrumGizmoClass");
+
+ RegisterClassEx(&wcex);
+
+ /*
+ if(parent) {
+ style = style | WS_CHILD;
+ wndId = parent->getWndId();
+ } else {
+ */
+ //style = style | WS_OVERLAPPEDWINDOW;
+ wndId = 0;
+ // }
+
+ gctx->m_hwnd = CreateWindowEx(NULL/*ex_style*/, gctx->m_className,
+ "DGBasisWidget",
+ (WS_OVERLAPPEDWINDOW | WS_VISIBLE),
+ window->x(), window->y(),
+ window->width(), window->height(),
+ wndId, NULL,
+ GetModuleHandle(NULL), NULL);
+
+ SetWindowLong(gctx->m_hwnd, GWL_USERDATA, (LONG)gctx->eventhandler);
+}
+
+GUI::NativeWindowWin32::~NativeWindowWin32()
+{
+ UnregisterClass(gctx->m_className, GetModuleHandle(NULL));
+ free(gctx->m_className);
+}
+
+void GUI::NativeWindowWin32::resize(int width, int height)
+{
+ SetWindowPos(gctx->m_hwnd, NULL, -1, -1, (int)width, (int)height + 27,
+ SWP_NOMOVE);
+}
+
+void GUI::NativeWindowWin32::move(int x, int y)
+{
+ SetWindowPos(gctx->m_hwnd, NULL, (int)x, (int)y, -1, -1, SWP_NOSIZE);
+}
+
+void GUI::NativeWindowWin32::show()
+{
+ ShowWindow(gctx->m_hwnd, SW_SHOW);
+}
+
+void GUI::NativeWindowWin32::handleBuffer()
+{
+}
+
+void GUI::NativeWindowWin32::hide()
+{
+ ShowWindow(gctx->m_hwnd, SW_HIDE);
+}
+
+void GUI::NativeWindowWin32::redraw()
+{
+ RedrawWindow(gctx->m_hwnd, NULL, NULL, RDW_ERASE|RDW_INVALIDATE);
+ UpdateWindow(gctx->m_hwnd);
+}
+
+void GUI::NativeWindowWin32::setCaption(const std::string &caption)
+{
+}
+
+#endif/*WIN32*/
diff --git a/plugingui/nativewindow_win32.h b/plugingui/nativewindow_win32.h
new file mode 100644
index 0000000..6039439
--- /dev/null
+++ b/plugingui/nativewindow_win32.h
@@ -0,0 +1,58 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * nativewindow_win32.h
+ *
+ * Fri Dec 28 18:45:51 CET 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo 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.
+ *
+ * DrumGizmo 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 DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __DRUMGIZMO_NATIVEWINDOW_WIN32_H__
+#define __DRUMGIZMO_NATIVEWINDOW_WIN32_H__
+
+#ifdef WIN32
+
+#include "nativewindow.h"
+
+namespace GUI {
+
+class Window;
+class NativeWindowWin32 : public NativeWindow {
+public:
+ NativeWindowWin32(GlobalContext *gctx, GUI::Window *window);
+ ~NativeWindowWin32();
+
+ void resize(int width, int height);
+ void move(int x, int y);
+ void show();
+ void setCaption(const std::string &caption);
+ void hide();
+ void handleBuffer();
+ void redraw();
+
+private:
+ GUI::Window *window;
+};
+
+};
+
+#endif/*WIN32*/
+
+#endif/*__DRUMGIZMO_NATIVEWINDOW_WIN32_H__*/
diff --git a/plugingui/nativewindow_x11.cc b/plugingui/nativewindow_x11.cc
new file mode 100644
index 0000000..91d7ed6
--- /dev/null
+++ b/plugingui/nativewindow_x11.cc
@@ -0,0 +1,233 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * nativewindow_x11.cc
+ *
+ * Fri Dec 28 18:45:57 CET 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo 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.
+ *
+ * DrumGizmo 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 DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#include "nativewindow_x11.h"
+
+#ifdef X11
+#include <X11/Xutil.h>
+#include <stdlib.h>
+
+#include "window.h"
+
+GUI::NativeWindowX11::NativeWindowX11(GlobalContext *gctx, GUI::Window *window)
+ : GUI::NativeWindow(gctx)
+{
+ this->window = window;
+ buffer = NULL;
+
+ // Get some colors
+ int blackColor = BlackPixel(gctx->display, DefaultScreen(gctx->display));
+
+ ::Window w = DefaultRootWindow(gctx->display);
+
+ // Create the window
+ xwindow = XCreateSimpleWindow(gctx->display,
+ w,
+ window->x(), window->y(),
+ window->width(), window->height(),
+ 0,
+ blackColor, blackColor);
+
+ XSelectInput(gctx->display, xwindow,
+ StructureNotifyMask |
+ PointerMotionMask |
+ ButtonPressMask |
+ ButtonReleaseMask |
+ KeyPressMask |
+ KeyReleaseMask|
+ ExposureMask |
+ StructureNotifyMask |
+ SubstructureNotifyMask);
+
+ // register interest in the delete window message
+ gctx->wmDeleteMessage = XInternAtom(gctx->display, "WM_DELETE_WINDOW", false);
+ XSetWMProtocols(gctx->display, xwindow, &gctx->wmDeleteMessage, 1);
+
+ // "Map" the window (that is, make it appear on the screen)
+ XMapWindow(gctx->display, xwindow);
+
+ // Create a "Graphics Context"
+ gc = XCreateGC(gctx->display, xwindow, 0, NULL);
+}
+
+GUI::NativeWindowX11::~NativeWindowX11()
+{
+ XDestroyWindow(gctx->display, xwindow);
+ //gctx->widgets.erase(window);
+}
+
+void GUI::NativeWindowX11::resize(int width, int height)
+{
+ XResizeWindow(gctx->display, xwindow, width, height);
+}
+
+void GUI::NativeWindowX11::move(int x, int y)
+{
+ XMoveWindow(gctx->display, xwindow, x, y);
+}
+
+void GUI::NativeWindowX11::show()
+{
+ XMapWindow(gctx->display, xwindow);
+}
+
+void GUI::NativeWindowX11::hide()
+{
+ XUnmapWindow(gctx->display, xwindow);
+}
+
+static int get_byte_order (void)
+{
+ union {
+ char c[sizeof(short)];
+ short s;
+ } order;
+
+ order.s = 1;
+ if ((1 == order.c[0])) {
+ return LSBFirst;
+ } else {
+ return MSBFirst;
+ }
+}
+
+static XImage *create_image_from_buffer(Display *dis, int screen,
+ unsigned char *buf,
+ int width, int height)
+{
+ int depth;
+ XImage *img = NULL;
+ Visual *vis;
+ double rRatio;
+ double gRatio;
+ double bRatio;
+ int outIndex = 0;
+ int i;
+ int numBufBytes = (3 * (width * height));
+
+ depth = DefaultDepth(dis, screen);
+ vis = DefaultVisual(dis, screen);
+
+ rRatio = vis->red_mask / 255.0;
+ gRatio = vis->green_mask / 255.0;
+ bRatio = vis->blue_mask / 255.0;
+
+ if (depth >= 24) {
+ size_t numNewBufBytes = (4 * (width * height));
+ u_int32_t *newBuf = (u_int32_t *)malloc (numNewBufBytes);
+
+ for (i = 0; i < numBufBytes; ++i) {
+ unsigned int r, g, b;
+ r = (buf[i] * rRatio);
+ ++i;
+ g = (buf[i] * gRatio);
+ ++i;
+ b = (buf[i] * bRatio);
+
+ r &= vis->red_mask;
+ g &= vis->green_mask;
+ b &= vis->blue_mask;
+
+ newBuf[outIndex] = r | g | b;
+ ++outIndex;
+ }
+
+ img = XCreateImage (dis,
+ CopyFromParent, depth,
+ ZPixmap, 0,
+ (char *) newBuf,
+ width, height,
+ 32, 0
+ );
+
+ } else if (depth >= 15) {
+ size_t numNewBufBytes = (2 * (width * height));
+ u_int16_t *newBuf = (u_int16_t *)malloc (numNewBufBytes);
+
+ for (i = 0; i < numBufBytes; ++i) {
+ unsigned int r, g, b;
+
+ r = (buf[i] * rRatio);
+ ++i;
+ g = (buf[i] * gRatio);
+ ++i;
+ b = (buf[i] * bRatio);
+
+ r &= vis->red_mask;
+ g &= vis->green_mask;
+ b &= vis->blue_mask;
+
+ newBuf[outIndex] = r | g | b;
+ ++outIndex;
+ }
+
+ img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0, (char *) newBuf,
+ width, height, 16, 0);
+ } else {
+ //fprintf (stderr, "This program does not support displays with a depth less than 15.");
+ return NULL;
+ }
+
+ XInitImage (img);
+ /*Set the client's byte order, so that XPutImage knows what to do with the data.*/
+ /*The default in a new X image is the server's format, which may not be what we want.*/
+ if ((LSBFirst == get_byte_order ())) {
+ img->byte_order = LSBFirst;
+ } else {
+ img->byte_order = MSBFirst;
+ }
+
+ /*The bitmap_bit_order doesn't matter with ZPixmap images.*/
+ img->bitmap_bit_order = MSBFirst;
+
+ return img;
+}
+
+void GUI::NativeWindowX11::handleBuffer()
+{
+ if(buffer) XDestroyImage(buffer);
+ buffer =
+ create_image_from_buffer(gctx->display, DefaultScreen(gctx->display),
+ window->wpixbuf.buf,
+ window->wpixbuf.width,
+ window->wpixbuf.height);
+}
+
+void GUI::NativeWindowX11::redraw()
+{
+ // http://stackoverflow.com/questions/6384987/load-image-onto-a-window-using-xlib
+ if(buffer == NULL) window->updateBuffer();
+ XPutImage(gctx->display, xwindow, gc, buffer, 0, 0, 0, 0,
+ window->width(), window->height());
+ XFlush(gctx->display);
+}
+
+void GUI::NativeWindowX11::setCaption(const std::string &caption)
+{
+}
+
+#endif/*X11*/
+
diff --git a/plugingui/nativewindow_x11.h b/plugingui/nativewindow_x11.h
new file mode 100644
index 0000000..2e51861
--- /dev/null
+++ b/plugingui/nativewindow_x11.h
@@ -0,0 +1,62 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
+/***************************************************************************
+ * nativewindow_x11.h
+ *
+ * Fri Dec 28 18:45:56 CET 2012
+ * Copyright 2012 Bent Bisballe Nyeng
+ * deva@aasimon.org
+ ****************************************************************************/
+
+/*
+ * This file is part of DrumGizmo.
+ *
+ * DrumGizmo 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.
+ *
+ * DrumGizmo 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 DrumGizmo; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.
+ */
+#ifndef __DRUMGIZMO_NATIVEWINDOW_X11_H__
+#define __DRUMGIZMO_NATIVEWINDOW_X11_H__
+#endif/*__DRUMGIZMO_NATIVEWINDOW_X11_H__*/
+
+#ifdef X11
+#include <X11/Xlib.h>
+
+#include "nativewindow.h"
+
+namespace GUI {
+
+class Window;
+class NativeWindowX11 : public NativeWindow {
+public:
+ NativeWindowX11(GlobalContext *gctx, GUI::Window *window);
+ ~NativeWindowX11();
+
+ void resize(int width, int height);
+ void move(int x, int y);
+ void show();
+ void setCaption(const std::string &caption);
+ void hide();
+ void handleBuffer();
+ void redraw();
+
+private:
+ ::Window xwindow;
+ GC gc;
+ XImage *buffer;
+
+ GUI::Window *window;
+};
+
+};
+
+#endif/*X11*/
diff --git a/plugingui/window.cc b/plugingui/window.cc
index 3c6a816..bbeffa1 100644
--- a/plugingui/window.cc
+++ b/plugingui/window.cc
@@ -30,23 +30,21 @@
#include "img_back.h"
-#ifdef X11
-#include <X11/Xlib.h>
-#include <X11/Xutil.h>
-#endif/*X11*/
-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
-GUI::Window *gwindow = NULL;
+#ifdef X11
+#include "nativewindow_x11.h"
+#endif/*X11*/
#ifdef WIN32
-// Delared in eventhandler.cc
-LRESULT CALLBACK dialogProc(HWND hwnd, UINT msg, WPARAM wp, LPARAM lp);
+#include "nativewindow_win32.h"
#endif/*WIN32*/
+GUI::Window *gwindow = NULL;
+
GUI::Window::Window(GlobalContext *gctx)
: Widget(NULL), wpixbuf(640, 200)
{
@@ -63,102 +61,22 @@ GUI::Window::Window(GlobalContext *gctx)
_buttonDownFocus = NULL;
#ifdef X11
- buffer = NULL;
-
- // Get some colors
- int blackColor = BlackPixel(gctx->display, DefaultScreen(gctx->display));
-
- ::Window w = DefaultRootWindow(gctx->display);
-
- // Create the window
- xwindow = XCreateSimpleWindow(gctx->display,
- w, _x, _y, _width, _height, 0,
- blackColor, blackColor);
-
- XSelectInput(gctx->display, xwindow,
- StructureNotifyMask |
- PointerMotionMask |
- ButtonPressMask |
- ButtonReleaseMask |
- KeyPressMask |
- KeyReleaseMask|
- ExposureMask |
- StructureNotifyMask |
- SubstructureNotifyMask);
-
- // register interest in the delete window message
- gctx->wmDeleteMessage = XInternAtom(gctx->display, "WM_DELETE_WINDOW", false);
- XSetWMProtocols(gctx->display, xwindow, &gctx->wmDeleteMessage, 1);
-
- // "Map" the window (that is, make it appear on the screen)
- XMapWindow(gctx->display, xwindow);
-
- // Create a "Graphics Context"
- gc = XCreateGC(gctx->display, xwindow, 0, NULL);
+ native = new NativeWindowX11(gctx, this);
#endif/*X11*/
#ifdef WIN32
- WNDCLASSEX wcex;
- WNDID wndId;
-
- gctx->m_hwnd = 0;
- gctx->m_className = NULL;
-
- memset(&wcex, 0, sizeof(wcex));
-
- //Time to register a window class.
- //Generic flags and everything. cbWndExtra is the size of a pointer to an
- // object - we need this in the wndproc handler.
-
- wcex.cbSize = sizeof(WNDCLASSEX);
- wcex.style = 0;//class_style;
- wcex.lpfnWndProc = (WNDPROC)dialogProc;
- wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
- // Set data:
- wcex.cbWndExtra = sizeof(EventHandler*); // Size of data.
- wcex.hInstance = GetModuleHandle(NULL);
-
- // if(ex_style && WS_EX_TRANSPARENT == WS_EX_TRANSPARENT) {
- // wcex.hbrBackground = NULL;
- // } else {
- wcex.hbrBackground = NULL;//(HBRUSH) COLOR_BACKGROUND + 1;
- // }
-
- wcex.lpszClassName = gctx->m_className = strdup("DrumGizmoClass");
-
- RegisterClassEx(&wcex);
-
- /*
- if(parent) {
- style = style | WS_CHILD;
- wndId = parent->getWndId();
- } else {
- */
- //style = style | WS_OVERLAPPEDWINDOW;
- wndId = 0;
- // }
-
- gctx->m_hwnd = CreateWindowEx(NULL/*ex_style*/, gctx->m_className,
- "DGBasisWidget",
- (WS_OVERLAPPEDWINDOW | WS_VISIBLE),
- _x, _y, _width, _height, wndId, NULL,
- GetModuleHandle(NULL), NULL);
-
- SetWindowLong(gctx->m_hwnd, GWL_USERDATA, (LONG)gctx->eventhandler);
+ native = new NativeWindowWin32(gctx, this);
#endif/*WIN32*/
}
GUI::Window::~Window()
{
-#ifdef X11
- XDestroyWindow(gctx->display, xwindow);
- //gctx->widgets.erase(window);
-#endif/*X11*/
+ delete native;
+}
-#ifdef WIN32
- UnregisterClass(gctx->m_className, GetModuleHandle(NULL));
- free(gctx->m_className);
-#endif/*WIN32*/
+void GUI::Window::setCaption(std::string caption)
+{
+ native->setCaption(caption);
}
void GUI::Window::repaintEvent(GUI::RepaintEvent *e)
@@ -170,28 +88,13 @@ void GUI::Window::repaintEvent(GUI::RepaintEvent *e)
void GUI::Window::resize(size_t width, size_t height)
{
// printf("Window::resize(%d, %d)\n", width, height);
-
-#ifdef X11
- XResizeWindow(gctx->display, xwindow, width, height);
-#endif/*X11*/
-
-#ifdef WIN32
- SetWindowPos(gctx->m_hwnd, NULL, -1, -1, (int)width, (int)height + 27,
- SWP_NOMOVE);
-#endif/*WIN32*/
-
+ native->resize(width, height);
Widget::resize(width, height);
}
void GUI::Window::move(size_t x, size_t y)
{
-#ifdef X11
- XMoveWindow(gctx->display, xwindow, x, y);
-#endif/*X11*/
-
-#ifdef WIN32
- SetWindowPos(gctx->m_hwnd, NULL, (int)x, (int)y, -1, -1, SWP_NOSIZE);
-#endif/*WIN32*/
+ native->move(x, y);
// Make sure widget corrds are updated.
Widget::move(x, y);
@@ -205,24 +108,12 @@ size_t GUI::Window::height() { return _height; }
void GUI::Window::show()
{
repaint_r(NULL);
-#ifdef X11
- XMapWindow(gctx->display, xwindow);
-#endif/*X11*/
-
-#ifdef WIN32
- ShowWindow(gctx->m_hwnd, SW_SHOW);
-#endif/*WIN32*/
+ native->show();
}
void GUI::Window::hide()
{
-#ifdef X11
- XUnmapWindow(gctx->display, xwindow);
-#endif/*X11*/
-
-#ifdef WIN32
- ShowWindow(gctx->m_hwnd, SW_HIDE);
-#endif/*WIN32*/
+ native->hide();
}
GUI::Window *GUI::Window::window()
@@ -250,115 +141,6 @@ void GUI::Window::endPaint()
}
}
-#ifdef X11
-static int get_byte_order (void)
-{
- union {
- char c[sizeof(short)];
- short s;
- } order;
-
- order.s = 1;
- if ((1 == order.c[0])) {
- return LSBFirst;
- } else {
- return MSBFirst;
- }
-}
-
-static XImage *create_image_from_buffer(Display *dis, int screen,
- unsigned char *buf,
- int width, int height)
-{
- int depth;
- XImage *img = NULL;
- Visual *vis;
- double rRatio;
- double gRatio;
- double bRatio;
- int outIndex = 0;
- int i;
- int numBufBytes = (3 * (width * height));
-
- depth = DefaultDepth(dis, screen);
- vis = DefaultVisual(dis, screen);
-
- rRatio = vis->red_mask / 255.0;
- gRatio = vis->green_mask / 255.0;
- bRatio = vis->blue_mask / 255.0;
-
- if (depth >= 24) {
- size_t numNewBufBytes = (4 * (width * height));
- u_int32_t *newBuf = (u_int32_t *)malloc (numNewBufBytes);
-
- for (i = 0; i < numBufBytes; ++i) {
- unsigned int r, g, b;
- r = (buf[i] * rRatio);
- ++i;
- g = (buf[i] * gRatio);
- ++i;
- b = (buf[i] * bRatio);
-
- r &= vis->red_mask;
- g &= vis->green_mask;
- b &= vis->blue_mask;
-
- newBuf[outIndex] = r | g | b;
- ++outIndex;
- }
-
- img = XCreateImage (dis,
- CopyFromParent, depth,
- ZPixmap, 0,
- (char *) newBuf,
- width, height,
- 32, 0
- );
-
- } else if (depth >= 15) {
- size_t numNewBufBytes = (2 * (width * height));
- u_int16_t *newBuf = (u_int16_t *)malloc (numNewBufBytes);
-
- for (i = 0; i < numBufBytes; ++i) {
- unsigned int r, g, b;
-
- r = (buf[i] * rRatio);
- ++i;
- g = (buf[i] * gRatio);
- ++i;
- b = (buf[i] * bRatio);
-
- r &= vis->red_mask;
- g &= vis->green_mask;
- b &= vis->blue_mask;
-
- newBuf[outIndex] = r | g | b;
- ++outIndex;
- }
-
- img = XCreateImage(dis, CopyFromParent, depth, ZPixmap, 0, (char *) newBuf,
- width, height, 16, 0);
- } else {
- //fprintf (stderr, "This program does not support displays with a depth less than 15.");
- return NULL;
- }
-
- XInitImage (img);
- /*Set the client's byte order, so that XPutImage knows what to do with the data.*/
- /*The default in a new X image is the server's format, which may not be what we want.*/
- if ((LSBFirst == get_byte_order ())) {
- img->byte_order = LSBFirst;
- } else {
- img->byte_order = MSBFirst;
- }
-
- /*The bitmap_bit_order doesn't matter with ZPixmap images.*/
- img->bitmap_bit_order = MSBFirst;
-
- return img;
-}
-#endif/*X11*/
-
void GUI::Window::updateBuffer()
{
// printf("updateBuffer w:%d h:%d\n", width(), height());
@@ -380,13 +162,7 @@ void GUI::Window::updateBuffer()
}
pli++;
}
-
-#ifdef X11
- if(buffer) XDestroyImage(buffer);
- buffer =
- create_image_from_buffer(gctx->display, DefaultScreen(gctx->display),
- wpixbuf.buf, wpixbuf.width, wpixbuf.height);
-#endif/*X11*/
+ native->handleBuffer();
}
void GUI::Window::resized(size_t w, size_t h)
@@ -402,17 +178,7 @@ void GUI::Window::resized(size_t w, size_t h)
void GUI::Window::redraw()
{
-#ifdef X11
- // http://stackoverflow.com/questions/6384987/load-image-onto-a-window-using-xlib
- if(buffer == NULL) updateBuffer();
- XPutImage(gctx->display, xwindow, gc, buffer, 0, 0, 0, 0, width(), height());
- XFlush(gctx->display);
-#endif/*X11*/
-
-#ifdef WIN32
- RedrawWindow(gctx->m_hwnd, NULL, NULL, RDW_ERASE|RDW_INVALIDATE);
- UpdateWindow(gctx->m_hwnd);
-#endif/*WIN32*/
+ native->redraw();
}
GUI::Widget *GUI::Window::keyboardFocus()
@@ -436,21 +202,3 @@ void GUI::Window::setButtonDownFocus(GUI::Widget *widget)
_buttonDownFocus = widget;
// repaint_r(NULL);
}
-
-
-#ifdef TEST_WINDOW
-//Additional dependency files
-//deps:
-//Required cflags (autoconf vars may be used)
-//cflags:
-//Required link options (autoconf vars may be used)
-//libs:
-#include "test.h"
-
-TEST_BEGIN;
-
-// TODO: Put some testcode here (see test.h for usable macros).
-
-TEST_END;
-
-#endif/*TEST_WINDOW*/
diff --git a/plugingui/window.h b/plugingui/window.h
index e1e49c7..8e61603 100644
--- a/plugingui/window.h
+++ b/plugingui/window.h
@@ -32,6 +32,7 @@
#include "globalcontext.h"
#include "pixelbuffer.h"
+#include "nativewindow.h"
namespace GUI {
@@ -51,6 +52,8 @@ public:
size_t width();
size_t height();
+ void setCaption(std::string caption);
+
void addChild(Widget *widget);
void repaintEvent(GUI::RepaintEvent *e);
@@ -73,20 +76,15 @@ public:
GlobalContext *gctx;
PixelBuffer wpixbuf;
-
-protected:
void updateBuffer();
+protected:
size_t refcount;
Widget *_keyboardFocus;
Widget *_buttonDownFocus;
-#ifdef X11
- ::Window xwindow;
- GC gc;
- XImage *buffer;
-#endif/*X11*/
+ NativeWindow *native;
};