namespace gui::drivers;
import "instance"
-#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D)
+#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D) && !defined(ECERE_NOGL)
import "OpenGLDisplayDriver"
#endif
#if (defined(__unix__) || defined(__APPLE__)) && !defined(ECERE_MINIGLX)
+#undef __BLOCKS__
default:
#define uint _uint
#define property _property
#include <linux/joystick.h>
#endif
#include <sys/param.h>
-#ifdef BSD
#include <stdlib.h>
-#else
-#include <malloc.h>
-#endif
#include <unistd.h>
+#include <sys/select.h>
//#include <stdio.h>
//#include <stdlib.h>
#include <X11/Xutil.h>
#include <X11/XKBlib.h>
#include <X11/keysym.h>
-#include <sys/fcntl.h>
+#include <fcntl.h>
+#if !defined(ECERE_NO3D) && !defined(ECERE_NOGL)
#include <GL/glx.h>
+#endif
#include <X11/extensions/Xrender.h>
#include <X11/extensions/XShm.h>
// These are the events we care about
#define EVENT_MASK StructureNotifyMask | \
ButtonPressMask | ButtonReleaseMask | PointerMotionMask | \
- KeyPressMask | KeyReleaseMask | ExposureMask | FocusChangeMask
+ KeyPressMask | KeyReleaseMask | ExposureMask | FocusChangeMask | \
+ PropertyChangeMask
void * xGlobalDisplay;
static XIM im;
static Mutex xMutex { };
static bool fullScreenMode;
static int desktopX = 0, desktopY = 0, desktopW = 0, desktopH = 0;
-int confineWindow;
-static int nullCursor;
+X11Window confineWindow;
+static X11Cursor nullCursor;
static X11Window capturedWindow = None;
static Window restrictedWindow = null;
static bool gotAnXEvent = false;
static int joystickFD[4];
static X11Window activeWindow;
-static enum AtomIdents {clipboard, multiple, targets, utf8_string, wm_delete_window, wm_hints, wm_name, wm_protocols, wm_state, wm_take_focus, wm_transient_for, _motif_wm_hints, _net_active_window, _net_current_desktop, _net_number_of_desktops, _net_wm_icon, _net_wm_name, _net_wm_pid, _net_wm_state, _net_wm_state_demands_attention, _net_wm_state_hidden, _net_wm_user_time, _net_wm_window_type, _net_wm_window_type_desktop, _net_wm_window_type_dialog, _net_wm_window_type_dock, _net_wm_window_type_dropdown_menu, _net_wm_window_type_menu, _net_wm_window_type_normal, _net_wm_window_type_popup_menu, _net_wm_window_type_splash, _net_wm_window_type_toolbar, _net_wm_window_type_utility, _net_workarea, app_selection };
+static enum AtomIdents
+{
+ clipboard, multiple, targets, utf8_string, wm_delete_window, wm_hints, wm_name, wm_protocols, wm_state, wm_take_focus, wm_transient_for,
+ _motif_wm_hints,
+ _net_active_window, _net_current_desktop, _net_number_of_desktops, _net_wm_icon, _net_wm_name, _net_wm_pid,
+ _net_wm_state, _net_wm_state_demands_attention, _net_wm_state_hidden, _net_wm_user_time, _net_wm_window_type,
+ _net_wm_window_type_desktop, _net_wm_window_type_dialog, _net_wm_window_type_dock, _net_wm_window_type_dropdown_menu,
+ _net_wm_window_type_menu, _net_wm_window_type_normal, _net_wm_window_type_popup_menu, _net_wm_window_type_splash,
+ _net_wm_window_type_toolbar, _net_wm_window_type_utility, _net_workarea, _net_frame_extents, _net_request_frame_extents,
+ _net_wm_state_maximized_vert, _net_wm_state_maximized_horz, app_selection
+};
static Atom atoms[AtomIdents];
"_NET_WM_WINDOW_TYPE_TOOLBAR", //_net_wm_window_type_toolbar
"_NET_WM_WINDOW_TYPE_UTILITY", //_net_wm_window_type_utility
"_NET_WORKAREA", //_net_workarea
+ "_NET_FRAME_EXTENTS", // _net_frame_extents
+ "_NET_REQUEST_FRAME_EXTENTS", // _net_request_frame_extents
+ "_NET_WM_STATE_MAXIMIZED_VERT", // _net_wm_state_maximized_vert
+ "_NET_WM_STATE_MAXIMIZED_HORZ", // _net_wm_state_maximized_horz
"APP_SELECTION"
};
XVisualInfo * visual;
XIC ic;
bool laterFocus;
+ // Decorations Size
+ Box decor;
+ bool gotFrameExtents;
};
+bool XGetBorderWidths(Window window, Box box)
+{
+ XWindowData windowData = window.windowData;
+ if(windowData)
+ {
+ box = windowData.decor;
+ return true;
+ }
+ return false;
+}
+
static Visual * FindFullColorVisual(X11Display *dpy, int * depth)
{
XVisualInfo vinfo;
X11Window x_root;
int current = 0;
char *data = null;
- int format, len, fill;
+ int format;
+ unsigned long len, fill;
Atom type;
w = XDisplayWidth(xGlobalDisplay, DefaultScreen(xGlobalDisplay));
if(data)
{
int desktops = 0;
- desktops = *(int *)data;
+ desktops = (int)*(long *)data;
//printf("_NET_NUMBER_OF_DESKTOPS is %d\n", desktops);
if(data)
{
- current = *(int *)data;
+ current = (int)*(long *)data;
XFree(data);
data = null;
}
if(atoms[_net_workarea] != None)
{
- int *workareas;
+ long *workareas;
if(XGetWindowProperty(xGlobalDisplay, x_root, atoms[_net_workarea], 0, (4 * 32),
False, AnyPropertyType, &type, &format, &len,
if(data)
{
- workareas = (int *)data;
+ workareas = (long *)data;
- x = workareas[current * 4];
- y = workareas[current * 4 + 1];
- w = workareas[current * 4 + 2];
- h = workareas[current * 4 + 3];
+ x = (int)workareas[current * 4];
+ y = (int)workareas[current * 4 + 1];
+ w = (int)workareas[current * 4 + 2];
+ h = (int)workareas[current * 4 + 3];
//printf("_NET_WORKAREA is x = %d, y = %d, w = %d, h = %d\n", x, y, w, h);
+ XFree(data);
+ data = null;
}
// printf("Work Area width: %d, height %d\n", w, h);
}
-
+
if(desktopX != x || desktopY != y || desktopW != w || desktopH != h)
{
guiApp.SetDesktopPosition(x, y, w, h, updateChildren);
KeySym keysym = NoSymbol;
Status status;
int buflength = 0;
- static int bufsize = 16;
+ static long bufsize = 16;
static char *buf = NULL;
XWindowData windowData = window.windowData;
Key key = 0;
- if(window.destroyed) return;
+ if(window.destroyed) return result;
// Logf("Got 0x%x (%d)\n", keyCode, key);
*/
if(!buf)
- buf = malloc(bufsize);
+ buf = malloc((uint)bufsize);
if(windowData && windowData.ic)
{
- buflength = XmbLookupString(windowData.ic, event, buf, bufsize, &keysym, &status);
+ buflength = XmbLookupString(windowData.ic, event, buf, (int)bufsize, &keysym, &status);
if (status == XBufferOverflow)
{
- buf = realloc(buf, (bufsize = buflength));
- buflength = XmbLookupString(windowData.ic, event, buf, bufsize, &keysym, &status);
+ buf = realloc(buf, (uint)(bufsize = buflength));
+ buflength = XmbLookupString(windowData.ic, event, buf, (int)bufsize, &keysym, &status);
}
if(status != XLookupKeySym && status != XLookupBoth && release == 1)
keysym = XLookupKeysym(event, 0);
#ifdef __APPLE__
case XK_Help: key = insert; break;
#endif
- // case XK_Break:
+ case XK_Break: key = Key { pauseBreak, ctrl = true }; break;
#ifdef __APPLE__
case XK_Mode_switch: key = leftAlt; break;
#endif
if(!windowData.ic)
{
ch = (byte)Interface::TranslateKey(key, event->state & ShiftMask);
- if(ch == 128) ch = 0;
+ // 127 is delete, we don't treat that as a character (Use (SmartKey)key == del)
+ if(ch == 128 || ch == 127) ch = 0;
}
code = key;
if(keysym == XK_ISO_Left_Tab)
{
int numBytes;
if(windowData && windowData.ic) ch = buflength ? UTF8GetChar(buf, &numBytes) : 0;
+ if(ch == 127) ch = 0;
// printf("Release! %d %d %d\n", keysym, code, ch);
result = window.KeyMessage(__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnKeyUp, code, ch);
}
{
int numBytes;
ch = UTF8GetChar(buf + c, &numBytes);
+ if(ch == 127) ch = 0;
if(!numBytes) c = buflength;
result = window.KeyMessage((c == 0) ?
__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnKeyDown : __ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnKeyHit,
{
int numBytes;
ch = UTF8GetChar(buf + c, &numBytes);
+ if(ch == 127) ch = 0;
if(!numBytes) c = buflength;
result = window.KeyMessage(__ecereVMethodID___ecereNameSpace__ecere__gui__Window_OnKeyHit, code, ch);
c += numBytes;
static Bool ConfigureNotifyChecker(void *display, XConfigureEvent *event, char * data)
{
- return (!data || ((event->window == (int) data)) && event->type == ConfigureNotify;
+ return ((!data || (event->window == (int) data)) && event->type == ConfigureNotify;
}
static uint timerDelay = MAXINT;
*/
for(;;)
{
- int result;
- bool waitSemaphore = false;
+ //int result;
+ //bool waitSemaphore = false;
fd_set readSet, writeSet, exceptSet;
struct timeval tv = { (timerDelay == MAXINT) ? 0 : (timerDelay / 1000000), (timerDelay == MAXINT) ? (int)(1000000 / 18.2) : (timerDelay % 1000000) };
struct MWM_Hints
{
- uint flags;
- uint functions;
- uint decorations;
- int inputMode;
- uint status;
+ unsigned long flags;
+ unsigned long functions;
+ unsigned long decorations;
+ long inputMode;
+ unsigned long status;
};
static void WaitForViewableWindow(Window window)
{
XWindowAttributes attributes = { 0 };
int result;
- if(!XGetWindowAttributes(xGlobalDisplay, (int)window.windowHandle, &attributes))
+ if(!XGetWindowAttributes(xGlobalDisplay, (X11Window)window.windowHandle, &attributes))
break;
if(attributes.map_state == IsViewable)
break;
#include <sys/ipc.h>
#include <sys/shm.h>
-#include <sys/signal.h>
+#include <signal.h>
#include <locale.h>
int pid = getpgrp();
int thisPid = getpid();
//if(thisPid == pid)
- /*
+ /-*
{
if(maxid >= 0)
{
{
XVisualInfo vinfo;
XVisualInfo *vinfo_ret;
- int numitems;
+ int numitems = 0;
vinfo.visualid = XVisualIDFromVisual(xSystemVisual);
vinfo_ret = XGetVisualInfo(xGlobalDisplay, VisualIDMask, &vinfo, &numitems);
XCloseDisplay(xGlobalDisplay);
xGlobalDisplay = null;
- if(joystickFD[0]) close(joystickFD[0]);
- if(joystickFD[1]) close(joystickFD[1]);
- if(joystickFD[2]) close(joystickFD[2]);
- if(joystickFD[3]) close(joystickFD[3]);
+ if(joystickFD[0] != -1) close(joystickFD[0]);
+ if(joystickFD[1] != -1) close(joystickFD[1]);
+ if(joystickFD[2] != -1) close(joystickFD[2]);
+ if(joystickFD[3] != -1) close(joystickFD[3]);
}
#define DBLCLICK_DELAY 300 // 0.3 second
XFindContext(xGlobalDisplay, thisEvent->window, windowContext, (XPointer *) &window);
if(window)
{
+ XWindowData windowData = window.windowData;
static uint lastKeyCode = 0;
switch(thisEvent->type)
{
bool doubleClick;
uint button, buttonDouble, whichButton;
uint buttonMask;
+ int x = event->x_root, y = event->y_root;
if(event->button == Button1)
{
{
if(doubleClick)
{
- if(!window.MouseMessage(buttonDouble, event->x_root, event->y_root, &keyFlags, false, true))
+ if(!window.MouseMessage(buttonDouble, x, y, &keyFlags, false, true))
{
//*if(xGlobalDisplay) XLockDisplay(xGlobalDisplay);
delete window;
break;
}
}
- window.MouseMessage(button, event->x_root, event->y_root, &keyFlags, false, /*doubleClick? false : */true);
+ window.MouseMessage(button, x, y, &keyFlags, false, /*doubleClick? false : */true);
}
//*if(xGlobalDisplay) XLockDisplay(xGlobalDisplay);
delete window;
{
// X hasn't noticed the capture yet, so fix it!
x += window.absPosition.x;
- y += window.absPosition.x;
- window = guiApp.windowCaptured;
+ y += window.absPosition.y;
+ window = guiApp.windowCaptured.rootWindow;
x -= window.absPosition.x;
y -= window.absPosition.y;
}
// if(event->time - lastTime > 15)
{
Modifiers keyFlags = 0;
-
+ // int x = event->x_root, y = event->y_root;
+
if(event->state & ShiftMask) keyFlags.shift = true;
if(event->state & ControlMask) keyFlags.ctrl = true;
if(event->state & Mod1Mask) keyFlags.alt = true;
event->x_root, event->y_root, &keyFlags, false, false);
delete window;
//*if(xGlobalDisplay) XLockDisplay(xGlobalDisplay);
- lastTime = event->time;
+ lastTime = (uint)event->time;
}
break;
}
XFocusChangeEvent *event = (XFocusChangeEvent *) thisEvent;
Window modalRoot = window.FindModal();
XWindowData windowData;
- activeWindow = (uint)window.windowHandle;
+ activeWindow = (X11Window)window.windowHandle;
if(window.parent && window == window.parent.activeChild) break;
incref window;
break;
}
if(thisEvent->window == activeWindow)
- activeWindow = (uint)null;
+ activeWindow = (X11Window)null;
#if 0
if(XCheckTypedEvent(xGlobalDisplay, FocusIn, (XEvent *)thisEvent))
{
//if(event->x - desktopX != window.position.x || event->y - desktopY != window.position.y || event->width != window.size.w || event->height != window.size.h)
// TODO: Support _NET_REQUEST_FRAME_EXTENTS message / _NET_FRAME_EXTENTS property for decoration size awareness
+ if(window.nativeDecorations)
+ {
+ int format;
+ unsigned long len, fill;
+ Atom type;
+ char * data = null;
+ if(XGetWindowProperty(xGlobalDisplay, (X11Window)window.systemHandle, atoms[_net_wm_state], 0, 32, False,
+ XA_ATOM, &type, &format, &len, &fill, &data) == Success)
+ {
+ bool maxVert = false, maxHorz = false, isMinimized = false;
+ Atom * hints = (Atom *)data;
+ int c;
+ for(c = 0; c < len && hints[c]; c++)
+ {
+ if(hints[c] == atoms[_net_wm_state_maximized_vert])
+ maxVert = true;
+ else if(hints[c] == atoms[_net_wm_state_maximized_horz])
+ maxHorz = true;
+ else if(hints[c] == atoms[_net_wm_state_hidden])
+ isMinimized = true;
+ }
+ XFree(data);
+
+ if(maxVert && maxHorz)
+ {
+ if(window.state != maximized)
+ *&window.state = maximized;
+ }
+ else if(isMinimized)
+ {
+ if(window.state != minimized)
+ *&window.state = minimized;
+ }
+ else if(window.state != normal)
+ *&window.state = normal;
+ }
+ }
+ {
+ int x = event->x;
+ int y = event->y;
+ int w = event->width, h = event->height;
- window.ExternalPosition(event->x - desktopX, event->y - desktopY, event->width, event->height);
+ //if(event->send_event)
+ {
+ X11Window rootChild;
+ int rootX, rootY;
+ XTranslateCoordinates(xGlobalDisplay, event->window,
+ RootWindow(xGlobalDisplay, DefaultScreen(xGlobalDisplay)), 0, 0,
+ &rootX, &rootY, &rootChild);
+ x = rootX;
+ y = rootY;
+ }
+
+ x -= desktopX;
+ y -= desktopY;
+
+ if(window.nativeDecorations)
+ {
+ x -= windowData.decor.left;
+ y -= windowData.decor.top;
+ w += windowData.decor.left + windowData.decor.right;
+ h += windowData.decor.top + windowData.decor.bottom;
+ /*
+ x -= window.clientStart.x;
+ y -= window.clientStart.y - (window.hasMenuBar ? skinMenuHeight : 0);
+ w += window.size.w - window.clientSize.w;
+ h += window.size.h - window.clientSize.h;
+ */
+ }
+ window.ExternalPosition(x, y, w, h);
+ }
break;
}
case ClientMessage:
Window modalRoot;
XWindowData windowData;
bool laterFocus;
- activeWindow = (uint)window.windowHandle;
+ activeWindow = (X11Window)window.windowHandle;
- timeStamp = event->data.l[1];
+ timeStamp = (int)event->data.l[1];
windowData = window.windowData;
laterFocus = windowData.laterFocus;
{
if(modalRoot)
{
- XRaiseWindow(xGlobalDisplay, (int)modalRoot.windowHandle);
+ XRaiseWindow(xGlobalDisplay, (X11Window)modalRoot.windowHandle);
WaitForViewableWindow(modalRoot);
if(atoms[_net_active_window])
{
event.message_type = atoms[_net_active_window];
event.display = xGlobalDisplay;
event.serial = 0;
- event.window = (uint)modalRoot.windowHandle;
+ event.window = (X11Window)modalRoot.windowHandle;
event.send_event = 1;
event.format = 32;
event.data.l[0] = 0;
#endif
XSendEvent(xGlobalDisplay, DefaultRootWindow(xGlobalDisplay), bool::false, SubstructureRedirectMask | SubstructureNotifyMask, (union _XEvent *)&event);
- XSetInputFocus(xGlobalDisplay, (int)modalRoot.windowHandle, RevertToPointerRoot, (uint)timeStamp);
+ XSetInputFocus(xGlobalDisplay, (X11Window)modalRoot.windowHandle, RevertToPointerRoot, (uint)timeStamp);
//XFlush(xGlobalDisplay);
//printf("Done.\n");
}
else
{
- XSetInputFocus(xGlobalDisplay, (int)window.windowHandle, RevertToPointerRoot, (uint)timeStamp);
+ XSetInputFocus(xGlobalDisplay, (X11Window)window.windowHandle, RevertToPointerRoot, (uint)timeStamp);
window.ExternalActivate(true, true, window, null); // lastActive);
if(windowData && windowData.ic)
{
}
break;
}
+ case PropertyNotify:
+ {
+ XWindowData windowData = window.windowData;
+ XPropertyEvent * event = (XPropertyEvent *) thisEvent;
+ if(event->atom == atoms[_net_frame_extents] &&
+ event->state == PropertyNewValue && windowData)
+ {
+ int format;
+ unsigned long len, fill;
+ Atom type;
+ char * data = null;
+
+ if(XGetWindowProperty(xGlobalDisplay, (X11Window)window.windowHandle,
+ atoms[_net_frame_extents], 0, 4,
+ False, XA_CARDINAL, &type, &format, &len,
+ &fill, &data) == Success && data)
+ {
+ long *extents = (long *)data;
+ bool hadFrameExtents = windowData.gotFrameExtents;
+ windowData.decor =
+ {
+ left = (int)extents[0], right = (int)extents[1],
+ top = (int)extents[2], bottom = (int)extents[3]
+ };
+ windowData.gotFrameExtents = true;
+ {
+ int x, y, w, h;
+ window.ComputeAnchors(
+ window.normalAnchor,
+ window.normalSizeAnchor,
+ &x, &y, &w, &h);
+ if(!hadFrameExtents) // || window.state == normal)
+ {
+ bool isMaximized = window.state == maximized;
+ window.Position(x, y, w, h, true, true, true, true, false, true);
+ UpdateRootWindow(window);
+ }
+ }
+
+ XFree(data);
+ }
+ else
+ windowData.gotFrameExtents = true; // Unsupported?
+ }
+ break;
+ }
}
if(!processAll) break;
}
int depth;
Visual * visual;
XIC ic = null;
- unsigned int mask = EVENT_MASK;
+ unsigned long mask = EVENT_MASK;
attributes.override_redirect = window.interim ? True : False;
attributes.event_mask = EVENT_MASK;
//printf("%s\n", guiApp.defaultDisplayDriver);
-#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D)
+#if !defined(ECERE_VANILLA) && !defined(ECERE_NO3D) && !defined(ECERE_NOGL)
if(window.dispDriver == class(OpenGLDisplayDriver) || !strcmp(guiApp.defaultDisplayDriver, "OpenGL"))
{
int samples;
if(samples == 1) samples = 0;
else if(!samples) alpha = false;
}
- }
+ }
+ if(!visualInfo)
+ {
+ int attrList[] =
+ {
+ GLX_USE_GL, GLX_DEPTH_SIZE, 1,
+ GLX_RGBA,
+ GLX_RED_SIZE, 1, GLX_GREEN_SIZE, 1, GLX_BLUE_SIZE, 1,
+ GLX_DOUBLEBUFFER,
+ None
+ };
+ visualInfo = glXChooseVisual(xGlobalDisplay, DefaultScreen(xGlobalDisplay), attrList);
+ }
#endif
depth = visualInfo ? visualInfo->depth : (window.alphaBlend ? 32 : xSystemDepth);
visual = visualInfo ? visualInfo->visual : (window.alphaBlend ? FindFullColorVisual (xGlobalDisplay, &depth) : xSystemVisual);
else
{
if(window.windowHandle)
- windowHandle = (int)window.windowHandle;
+ windowHandle = (X11Window)window.windowHandle;
else
{
- X11Window parentWindow = (uint)null;
+ X11Window parentWindow = (X11Window)null;
if(window.master.rootWindow && window.master.rootWindow != guiApp.desktop && (window._isModal || window.style.interim))
{
Window master = window.master;
Window rootWindow = master.rootWindow;
- parentWindow = rootWindow.is3D ? (uint)rootWindow.parent.windowHandle : (uint)rootWindow.windowHandle;
+ parentWindow = rootWindow.is3D ? (X11Window)rootWindow.parent.windowHandle : (X11Window)rootWindow.windowHandle;
// parentWindow = window.master.rootWindow.is3D ? window.master.rootWindow.parent.windowHandle : window.master.rootWindow.windowHandle;
}
if(window.style.showInTaskBar)
- parentWindow = (uint)null;
+ parentWindow = (X11Window)null;
windowHandle = XCreateWindow(xGlobalDisplay, DefaultRootWindow(xGlobalDisplay),
0,0,1,1,0, depth, InputOutput, visual ? visual : CopyFromParent,
}
{
-#if defined(__APPLE__)
- Atom hints[2] =
- {
- parentWindow ? atoms[_net_wm_window_type_popup_menu] : atoms[_net_wm_window_type_normal]
- };
-
- XChangeProperty(xGlobalDisplay, windowHandle, atoms[_net_wm_window_type], XA_ATOM, 32,
- PropModeReplace, (unsigned char*)&hints, 1);
-#else
Atom hints[2] =
{
parentWindow ? atoms[_net_wm_window_type_menu] : atoms[_net_wm_window_type_normal],
parentWindow ? atoms[_net_wm_window_type_popup_menu] : 0
};
- XChangeProperty(xGlobalDisplay, windowHandle, atoms[_net_wm_window_type], XA_ATOM, 32,
- PropModeReplace, (unsigned char*)&hints, parentWindow ? 2 : 1);
+#if defined(__APPLE__) || defined(__FreeBSD__)
+ // Don't set this on non-interim windows for OS X...
+ if(parentWindow && window.interim)
#endif
+
+ XChangeProperty(xGlobalDisplay, windowHandle, atoms[_net_wm_window_type], XA_ATOM, 32,
+ PropModeReplace, (unsigned char*)&hints, parentWindow ? 2 : 1);
{
XWMHints xwmHints;
xwmHints.flags = InputHint;
ic = XCreateIC(im, XNInputStyle,
XIMStatusNothing | XIMPreeditPosition,
XNPreeditAttributes, argList,
- XNClientWindow, windowHandle, XNFocusWindow, windowHandle, 0);
+ XNClientWindow, windowHandle, XNFocusWindow, windowHandle, NULL);
XFree(argList);
// Should we free the fontset or not?
// XFreeFontSet(xGlobalDisplay, fontset);
if(ic)
setICPosition = true;
else
- ic = XCreateIC(im, XNInputStyle, XIMStatusNothing | XIMPreeditNothing, XNClientWindow, windowHandle, XNFocusWindow, windowHandle, 0);
+ ic = XCreateIC(im, XNInputStyle, XIMStatusNothing | XIMPreeditNothing, XNClientWindow, windowHandle, XNFocusWindow, windowHandle, null);
}
if(ic)
{
if(capturedWindow == None && !restrictedWindow)
{
- XGrabPointer(xGlobalDisplay, (int)windowHandle, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
+ XGrabPointer(xGlobalDisplay, (X11Window)windowHandle, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
GrabModeAsync, restrictedWindow ? confineWindow : None, fullScreenMode ? nullCursor : None, CurrentTime);
XUngrabPointer(xGlobalDisplay, CurrentTime);
}
0, 0, 0
};
XChangeProperty(xGlobalDisplay, windowHandle, atoms[_motif_wm_hints], atoms[_motif_wm_hints], 32,
- PropModeReplace, (unsigned char*)&hints, sizeof(hints)/4);
+ PropModeReplace, (unsigned char*)&hints, 5);
}
if(atoms[_net_wm_pid] != None)
{
if(capturedWindow == None && !restrictedWindow)
{
- XGrabPointer(xGlobalDisplay, (int)windowHandle, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
+ XGrabPointer(xGlobalDisplay, (X11Window)windowHandle, False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
GrabModeAsync, restrictedWindow ? confineWindow : None, fullScreenMode ? nullCursor : None, CurrentTime);
XUngrabPointer(xGlobalDisplay, CurrentTime);
}
+
+ if(window.nativeDecorations)
+ {
+ // Maximize / Restore the window
+ XClientMessageEvent event = { 0 };
+ event.type = ClientMessage;
+ event.message_type = atoms[_net_request_frame_extents];
+ event.display = xGlobalDisplay;
+ event.serial = 0;
+ event.window = (X11Window)windowHandle;
+ event.send_event = 1;
+ window.windowHandle = (void *)windowHandle;
+ event.format = 32;
+ XSendEvent(xGlobalDisplay, DefaultRootWindow(xGlobalDisplay), bool::false,
+ SubstructureRedirectMask | SubstructureNotifyMask, (union _XEvent *)&event);
+ }
return (void *)windowHandle;
}
XEvent event;
XDeleteContext(xGlobalDisplay, (XID)window, windowContext);
- XSaveContext(xGlobalDisplay, (int)window.windowHandle, windowContext, null);
- XDestroyWindow(xGlobalDisplay, (int)window.windowHandle);
+ XSaveContext(xGlobalDisplay, (X11Window)window.windowHandle, windowContext, null);
+ XDestroyWindow(xGlobalDisplay, (X11Window)window.windowHandle);
XSync(xGlobalDisplay, 0);
- while(XCheckWindowEvent(xGlobalDisplay, (int)window.windowHandle, 0xFFFFFFFF, &event));
+ while(XCheckWindowEvent(xGlobalDisplay, (X11Window)window.windowHandle, 0xFFFFFFFF, &event));
window.windowHandle = null;
if(window.windowData)
{
{
if(window.windowHandle)
{
- XChangeProperty(xGlobalDisplay, (int)window.windowHandle, atoms[_net_wm_name],
+ XChangeProperty(xGlobalDisplay, (X11Window)window.windowHandle, atoms[_net_wm_name],
atoms[utf8_string], 8, PropModeReplace, (byte *)name, name ? strlen(name) : 0);
- XChangeProperty(xGlobalDisplay, (int)window.windowHandle, atoms[wm_name],
+ XChangeProperty(xGlobalDisplay, (X11Window)window.windowHandle, atoms[wm_name],
atoms[utf8_string], 8, PropModeReplace, (byte *)name, name ? strlen(name) : 0);
}
}
void PositionRootWindow(Window window, int x, int y, int w, int h, bool move, bool resize)
{
//Logf("Position root window %s\n", window.name);
- if(!window.parent || !window.parent.display)
+ if(window.windowHandle && (!window.parent || !window.parent.display))
{
-#if defined(__APPLE__)
+#if defined(__APPLE__) || defined(__FreeBSD__)
bool visible = window.visible;
if(window.visible)
{
- XMapWindow(xGlobalDisplay, (int)window.windowHandle);
+ XMapWindow(xGlobalDisplay, (X11Window)window.windowHandle);
WaitForViewableWindow(window);
}
#endif
if(window.state == minimized) return;
+ if(window.nativeDecorations)
+ {
+ XWindowData windowData = window.windowData;
+#if !defined(__APPLE__) && !defined(__FreeBSD__)
+ // TODO: How to handle frame extents not supported?
+ if(!windowData.gotFrameExtents || window.state == maximized) return;
+#endif
+ w -= window.size.w - window.clientSize.w;
+ h -= window.size.h - window.clientSize.h;
+ }
if(move && resize)
- XMoveResizeWindow(xGlobalDisplay, (int)window.windowHandle, x + desktopX, y + desktopY, w, h);
+ XMoveResizeWindow(xGlobalDisplay, (X11Window)window.windowHandle, x + desktopX, y + desktopY, w, h);
else if(move)
- XMoveWindow(xGlobalDisplay, (int)window.windowHandle, x + desktopX, y + desktopY);
+ XMoveWindow(xGlobalDisplay, (X11Window)window.windowHandle, x + desktopX, y + desktopY);
else if(resize)
- XResizeWindow(xGlobalDisplay, (int)window.windowHandle, w, h);
+ XResizeWindow(xGlobalDisplay, (X11Window)window.windowHandle, w, h);
#if defined(__APPLE__)
// if(window.created && !visible)
- // XUnmapWindow(xGlobalDisplay, (int)window.windowHandle);
+ // XUnmapWindow(xGlobalDisplay, (X11Window)window.windowHandle);
#endif
}
}
//Logf("Set root window state %d %s\n", state, window.name);
if(visible)
{
- XMapWindow(xGlobalDisplay, (int)window.windowHandle);
-#if defined(__APPLE__)
+ XMapWindow(xGlobalDisplay, (X11Window)window.windowHandle);
+#if defined(__APPLE__) || defined(__FreeBSD__)
WaitForViewableWindow(window);
#endif
if(window.creationActivation == activate && state != minimized)
*/
// printf("Attempting to minimize %s\n", window._class.name);
- XIconifyWindow(xGlobalDisplay, (uint)window.windowHandle, DefaultScreen(xGlobalDisplay));
+ XIconifyWindow(xGlobalDisplay, (X11Window)window.windowHandle, DefaultScreen(xGlobalDisplay));
}
else
{
- XMoveResizeWindow(xGlobalDisplay,
- (int)window.windowHandle, window.position.x + desktopX, window.position.y + desktopY, window.size.w, window.size.h);
+ if(!window.nativeDecorations || (!((XWindowData)window.windowData).gotFrameExtents && window.state == maximized)) //((XWindowData)window.windowData).gotFrameExtents && (!window.nativeDecorations || window.state == state))
+ {
+ // With native decorations, we do it the first time
+ // or the WM (Gnome) is sticking it to the top/right!
+ XMoveResizeWindow(xGlobalDisplay,
+ (X11Window)window.windowHandle,
+ window.position.x + desktopX,
+ window.position.y + desktopY,
+ window.nativeDecorations ? window.clientSize.w : window.size.w,
+ window.nativeDecorations ? window.clientSize.h : window.size.h);
+ UpdateRootWindow(window);
+ }
+ if(window.nativeDecorations)
+ {
+ // Maximize / Restore the window
+ XClientMessageEvent event = { 0 };
+ event.type = ClientMessage;
+ event.message_type = atoms[_net_wm_state];
+ event.display = xGlobalDisplay;
+ event.serial = 0;
+ event.window = (X11Window)window.windowHandle;
+ event.send_event = 1;
+ event.format = 32;
+ event.data.l[0] = (state == maximized) ? 1 : 0;
+ event.data.l[1] = atoms[_net_wm_state_maximized_vert];
+ event.data.l[2] = atoms[_net_wm_state_maximized_horz];
+ XSendEvent(xGlobalDisplay, DefaultRootWindow(xGlobalDisplay), bool::false,
+ SubstructureRedirectMask | SubstructureNotifyMask, (union _XEvent *)&event);
+ }
}
}
else
- XUnmapWindow(xGlobalDisplay, (int)window.windowHandle);
+ XUnmapWindow(xGlobalDisplay, (X11Window)window.windowHandle);
//XFlush(xGlobalDisplay);
}
}
event.message_type = atoms[_net_wm_state];
event.display = xGlobalDisplay;
event.serial = 0;
- event.window = (uint)window.windowHandle;
+ event.window = (X11Window)window.windowHandle;
event.send_event = 1;
event.format = 32;
event.data.l[0] = 1;
if(!window.style.hidden && window.created)
{
//printf("Activate root window %s\n", window._class.name);
- XRaiseWindow(xGlobalDisplay, (int)window.windowHandle);
- XMapWindow(xGlobalDisplay, (int)window.windowHandle);
+ XRaiseWindow(xGlobalDisplay, (X11Window)window.windowHandle);
+ XMapWindow(xGlobalDisplay, (X11Window)window.windowHandle);
WaitForViewableWindow(window);
if(atoms[_net_active_window])
{
event.message_type = atoms[_net_active_window];
event.display = xGlobalDisplay;
event.serial = 0;
- event.window = (uint)window.windowHandle;
+ event.window = (X11Window)window.windowHandle;
event.send_event = 1;
event.format = 32;
event.data.l[0] = 0;
XSendEvent(xGlobalDisplay, DefaultRootWindow(xGlobalDisplay), bool::false, SubstructureRedirectMask | SubstructureNotifyMask, (union _XEvent *)&event);
//#if defined(__APPLE__)
- XSetInputFocus(xGlobalDisplay, (int)window.windowHandle, RevertToPointerRoot, CurrentTime);
+ XSetInputFocus(xGlobalDisplay, (X11Window)window.windowHandle, RevertToPointerRoot, CurrentTime);
//#endif
}
else
- XSetInputFocus(xGlobalDisplay, (int)window.windowHandle, RevertToPointerRoot, CurrentTime);
+ XSetInputFocus(xGlobalDisplay, (X11Window)window.windowHandle, RevertToPointerRoot, CurrentTime);
}
}
}
void GetMousePosition(int *x, int *y)
{
- int rootWindow, childWindow;
+ X11Window rootWindow, childWindow;
int mx, my;
unsigned int state;
((GuiApplication)__thisModule.application).Lock();
if(!restrictedWindow)
XMapWindow(xGlobalDisplay, confineWindow);
- XGrabPointer(xGlobalDisplay, (int) window.rootWindow.windowHandle, False,
+ XGrabPointer(xGlobalDisplay, (X11Window) window.rootWindow.windowHandle, False,
ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
GrabModeAsync, confineWindow, fullScreenMode ? nullCursor : None, CurrentTime);
{
if(capturedWindow != None)
{
- XGrabPointer(xGlobalDisplay, (int)capturedWindow,
+ XGrabPointer(xGlobalDisplay, (X11Window)capturedWindow,
False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
GrabModeAsync, None, fullScreenMode ? nullCursor : None, CurrentTime);
}
{
if(!window.parent || !window.parent.display)
{
- XGrabPointer(xGlobalDisplay, (int)window.windowHandle,
+ XGrabPointer(xGlobalDisplay, (X11Window)window.windowHandle,
False, ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
GrabModeAsync, restrictedWindow ? confineWindow : None, fullScreenMode ? nullCursor : None, CurrentTime);
else if(capturedWindow != None)
{
if(restrictedWindow)
- XGrabPointer(xGlobalDisplay, (int) restrictedWindow.rootWindow.windowHandle, False,
+ XGrabPointer(xGlobalDisplay, (X11Window) restrictedWindow.rootWindow.windowHandle, False,
ButtonPressMask | ButtonReleaseMask | PointerMotionMask, GrabModeAsync,
GrabModeAsync, confineWindow, fullScreenMode ? nullCursor : None, CurrentTime);
else
//*XLockDisplay(xGlobalDisplay);
if(cursor == -1)
{
- XDefineCursor(xGlobalDisplay, (int) guiApp.desktop.windowHandle, nullCursor);
+ XDefineCursor(xGlobalDisplay, (X11Window) guiApp.desktop.windowHandle, nullCursor);
}
//*XUnlockDisplay(xGlobalDisplay);
}
delete clipBoardData;
else if(rootWindow)
XSetSelectionOwner(xGlobalDisplay, atoms[clipboard],
- (int) rootWindow.windowHandle, CurrentTime);
+ (X11Window) rootWindow.windowHandle, CurrentTime);
clipBoardData = clipBoard.text;
clipBoard.text = null;
result = true;
}
if(rootWindow)
{
- int selAtom = atoms[clipboard];
- int owner = XGetSelectionOwner(xGlobalDisplay, selAtom);
+ Atom selAtom = atoms[clipboard];
+ X11Window owner = XGetSelectionOwner(xGlobalDisplay, selAtom);
if(owner != None)
{
- int atom;
+ Atom atom;
for(atom = atoms[utf8_string]; atom; atom = ((atom == atoms[utf8_string]) ? XA_STRING : 0))
{
XEvent e;
- XConvertSelection(xGlobalDisplay, selAtom, atom, atoms[app_selection] /*None*/, (int) rootWindow.windowHandle, CurrentTime);
+ XConvertSelection(xGlobalDisplay, selAtom, atom, atoms[app_selection] /*None*/, (X11Window) rootWindow.windowHandle, CurrentTime);
XIfEvent(xGlobalDisplay, (XEvent *) &e, EventChecker, (void *)SelectionNotify);
if(e.type == SelectionNotify)
{
XSelectionEvent * selection = (XSelectionEvent *) &e;
//printf("Got a SelectionNotify with %d (%s)\n", selection->_property, XGetAtomName(xGlobalDisplay, selection->_property));
- byte *data;
- uint len, size = 0, dummy;
+ byte *data = null;
+ unsigned long len, size = 0, dummy;
Atom type;
- int format;
- XGetWindowProperty(xGlobalDisplay, (int) rootWindow.windowHandle, selection->_property ? selection->_property : atom, 0, 0, 0, AnyPropertyType, &type, &format, &len, &size, &data);
+ int format;
+ XGetWindowProperty(xGlobalDisplay, (X11Window) rootWindow.windowHandle, selection->_property ? selection->_property : atom, 0, 0, False, AnyPropertyType, &type, &format, &len, &size, &data);
+ if(data)
+ {
+ XFree(data);
+ data = null;
+ }
if(size > 0)
{
- if(XGetWindowProperty(xGlobalDisplay, (int) rootWindow.windowHandle, selection->_property ? selection->_property : atom, 0,size,0,
+ if(XGetWindowProperty(xGlobalDisplay, (X11Window) rootWindow.windowHandle, selection->_property ? selection->_property : atom, 0, size, False,
AnyPropertyType, &type,&format,&len, &dummy, &data) == Success)
{
clipBoard.text = new char[size+1];
Bitmap bitmap { };
if(bitmap.Load(resource.fileName, null, null))
{
- uint * icon = new uint[2 + bitmap.width * bitmap.height];
+ unsigned long * icon = new unsigned long[2 + bitmap.width * bitmap.height];
bitmap.Convert(null, pixelFormat888, null);
icon[0] = bitmap.width;
icon[1] = bitmap.height;
- memcpy(icon + 2, bitmap.picture, bitmap.width * bitmap.height * 4);
+ if(sizeof(long) != sizeof(uint32))
+ {
+ int c;
+ for(c = 0; c < bitmap.width * bitmap.height; c++)
+ icon[c+2] = ((uint32 *)bitmap.picture)[c];
+ }
+ else
+ memcpy(icon + 2, bitmap.picture, bitmap.width * bitmap.height * sizeof(uint32));
XChangeProperty(xGlobalDisplay, (X11Window)window.windowHandle, atoms[_net_wm_icon],
XA_CARDINAL,32,PropModeReplace, (byte *)icon, 2+bitmap.width*bitmap.height);
delete icon;