public struct TouchPointerInfo
{
int id;
- int x, y;
+ Point point;
float size, pressure;
};
OldLink slave;
ResPtr ptr;
+#if !defined(__EMSCRIPTEN__)
if(fileMonitor)
{
int i, lockCount = guiApp.lockMutex.lockCount;
for(i = 0; i < lockCount; i++)
guiApp.lockMutex.Wait();
}
+#endif
if(parent)
{
delete statusBar;
OnDestroyed();
+#if !defined(__EMSCRIPTEN__)
delete mutex;
+#endif
delete icon;
if(((subclass(Window))_class).pureVTbl)
x -= rootWindow.clientStart.x;
y -= rootWindow.clientStart.y - (rootWindow.hasMenuBar ? skinMenuHeight : 0);
}
+#if !defined(__EMSCRIPTEN__)
if(!guiApp.fullScreenMode || is3D)
+#endif
{
x -= rootWindow.absPosition.x;
y -= rootWindow.absPosition.y;
if(parent.numIcons) ph -= guiApp.textMode ? 16 : 24;
if(anchor.left.type == vTiled)
{
- tilingH = (int)sqrt(numTiling);
- tilingW = numTiling / tilingH;
+ if(numTiling)
+ {
+ tilingH = (int)sqrt(numTiling);
+ tilingW = numTiling / tilingH;
+ }
+ else
+ tilingH = tilingW = 0;
}
else
{
- tilingW = (int)sqrt(numTiling);
- tilingH = numTiling / tilingW;
+ if(numTiling)
+ {
+ tilingW = (int)sqrt(numTiling);
+ tilingH = numTiling / tilingW;
+ }
+ else
+ tilingH = tilingW = 0;
}
leftOver = numTiling - tilingH * tilingW;
else
tilingSplit = numTiling;
- if(positionID >= tilingSplit)
+ if(tilingW && tilingH)
{
- x = xOffset + pw * (tilingSplit / tilingH + (positionID - tilingSplit) / tilingLastH)/tilingW;
- y = yOffset + ph * ((positionID - tilingSplit) % tilingLastH) / tilingLastH;
- x2 = xOffset + pw * (tilingSplit/tilingH + (positionID - tilingSplit) / tilingLastH + 1)/tilingW;
- y2 = yOffset + ph * (((positionID - tilingSplit) % tilingLastH) + 1) / tilingLastH;
+ if(positionID >= tilingSplit)
+ {
+ x = xOffset + pw * (tilingSplit / tilingH + (positionID - tilingSplit) / tilingLastH)/tilingW;
+ y = yOffset + ph * ((positionID - tilingSplit) % tilingLastH) / tilingLastH;
+ x2 = xOffset + pw * (tilingSplit/tilingH + (positionID - tilingSplit) / tilingLastH + 1)/tilingW;
+ y2 = yOffset + ph * (((positionID - tilingSplit) % tilingLastH) + 1) / tilingLastH;
+ }
+ else
+ {
+ x = xOffset + pw * (positionID / tilingH) / tilingW;
+ y = yOffset + ph * (positionID % tilingH) / tilingH;
+ x2 = xOffset + pw * (positionID / tilingH + 1) / tilingW;
+ y2 = yOffset + ph * ((positionID % tilingH) + 1) / tilingH;
+ }
}
else
{
- x = xOffset + pw * (positionID / tilingH) / tilingW;
- y = yOffset + ph * (positionID % tilingH) / tilingH;
- x2 = xOffset + pw * (positionID / tilingH + 1) / tilingW;
- y2 = yOffset + ph * ((positionID % tilingH) + 1) / tilingH;
+ // How can this happen? From ec2 parsing test
+ x = 0;
+ y = 0;
+ x2 = 0;
+ y2 = 0;
}
if(guiApp.textMode)
{
if(display && !display.flags.memBackBuffer && changeRootWindow)
guiApp.interfaceDriver.PositionRootWindow(this, x, y, w, h, windowMoved, windowResized); //realResized);
- if(!guiApp.fullScreenMode && this != guiApp.desktop && (windowResized || windowMoved))
+ if(
+#if !defined(__EMSCRIPTEN__)
+ !guiApp.fullScreenMode &&
+#endif
+ this != guiApp.desktop && (windowResized || windowMoved))
for(child = parent.children.first; child && child != this; child = child.next)
if(child.rootWindow)
guiApp.interfaceDriver.UpdateRootWindow(child.rootWindow);
child.display.width = display.width;
child.display.height = display.height;
child.display.driverData = display.driverData;
+#if !defined(__EMSCRIPTEN__)
child.display.mutex = null;
+#endif
}
}
}
// Default Settings
surface.TextFont(usedFont.font);
surface.TextOpacity(false);
+ surface.outlineColor = black;
OnRedraw(surface);
surface.TextFont(usedFont.font);
surface.TextOpacity(false);
+ surface.outlineColor = black;
OnDrawOverChildren(surface);
clipExtent.AddBox(box);
+ display.Lock(true);
display.StartUpdate();
if(!rootWindow.fullRender)
}
display.EndUpdate();
+ display.Unlock();
dirtyBack.Empty();
dirty = false;
if(activateParent && parent && !parent.active /*parent != parent.parent.activeChild*/)
parent.ActivateEx(true, true, moveInactive, activateRoot, external, externalSwap);
}
- else if(!guiApp.fullScreenMode)
+ else
+#if !defined(__EMSCRIPTEN__)
+ if(!guiApp.fullScreenMode)
+#endif
{
Window modalRoot = FindModal();
if(!modalRoot) modalRoot = this;
public bool MultiTouchMessage(TouchPointerEvent event, Array<TouchPointerInfo> infos, Modifiers * mods, bool consequential, bool activate)
{
bool result = true;
- if(infos.count)
+ if((infos && infos.count) || (event == up || event == pointerUp))
{
Window w = null;
while(result && w != this)
{
// TODO: How to handle this?
- int x = infos[0].x;
- int y = infos[0].y;
+ int x = (infos && infos.count) ? infos[0].point.x : 0;
+ int y = (infos && infos.count) ? infos[0].point.y : 0;
Window msgWindow = GetAtPosition(x,y, false, true, w);
Window window;
delete w;
if(w) incref w;
window = (w && !w.disabled) ? w : null;
+ if(guiApp.windowCaptured && (guiApp.windowCaptured.rootWindow == this))
+ {
+ if(!guiApp.windowCaptured.isEnabled)
+ guiApp.windowCaptured.ReleaseCapture();
+ else
+ window = guiApp.windowCaptured;
+ }
+
if(consequential) mods->isSideEffect = true;
if(!result || (window && window.destroyed)) window = null;
{
if(window.OnMultiTouch && !window.disabled)
{
- Array<TouchPointerInfo> in { size = infos.size };
- memcpy(in.array, infos.array, sizeof(TouchPointerInfo) * infos.size);
-
- for(i : in)
+ Array<TouchPointerInfo> in = null;
+ if(infos && infos.count)
{
- i.x -= (window.absPosition.x + window.clientStart.x);
- i.y -= (window.absPosition.y + window.clientStart.y);
+ in = { size = infos.size };
+ memcpy(in.array, infos.array, sizeof(TouchPointerInfo) * infos.size);
- i.x = Max(Min(i.x, 32767),-32768);
- i.y = Max(Min(i.y, 32767),-32768);
+ for(i : in)
+ {
+ i.point.x -= (window.absPosition.x + window.clientStart.x);
+ i.point.y -= (window.absPosition.y + window.clientStart.y);
+
+ i.point.x = Max(Min(i.point.x, 32767),-32768);
+ i.point.y = Max(Min(i.point.y, 32767),-32768);
+ }
}
incref window;
while(it.Next())
{
- Window w = it.data;
- if(trueWindow != w && !trueWindow.IsDescendantOf(w))
+ Window ww = it.data;
+ if(trueWindow != ww && !trueWindow.IsDescendantOf(ww))
{
it.pointer = null;
- result = w.OnMouseLeave(*mods);
+ result = ww.OnMouseLeave(*mods);
if(!result) break;
- overWindows.TakeOut(w);
+ overWindows.TakeOut(ww);
}
}
}
if(trueWindow && trueWindow._refCount > 1 && !trueWindow.destroyed)
{
- for(w : guiApp.overWindows; w == trueWindow)
+ for(wi : guiApp.overWindows; wi == trueWindow)
{
OnMouseLeave(0);
- guiApp.overWindows.TakeOut(w);
+ guiApp.overWindows.TakeOut(wi);
break;
}
guiApp.prevWindow = trueWindow;
Window child;
// Setup relationship with outside world (bb root || !bb)
+#if defined(__EMSCRIPTEN__)
+ if(this == guiApp.desktop)
+#else
if((!guiApp.fullScreenMode && parent == guiApp.desktop) || this == guiApp.desktop ||
(_displayDriver && parent.dispDriver && dispDriver != parent.dispDriver))
+#endif
{
rootWindow = this;
if(!tempExtents)
bool result = false;
Window child;
+#if defined(__EMSCRIPTEN__)
+ if(this == guiApp.desktop)
+#else
if((!guiApp.fullScreenMode && parent == guiApp.desktop) || (guiApp.fullScreenMode && (this == guiApp.desktop || (_displayDriver && parent.dispDriver && dispDriver != parent.dispDriver))))
+#endif
{
subclass(DisplayDriver) dDriver = (dispDriver && !formDesigner) ? dispDriver : GetDisplayDriver(guiApp.defaultDisplayDriver);
DisplaySystem displaySystem = dDriver ? dDriver.displaySystem : null;
if(!displaySystem)
{
- displaySystem = DisplaySystem {};
+ displaySystem = DisplaySystem { glCapabilities = glCapabilities };
if(!displaySystem.Create(dDriver.name, guiApp.fullScreenMode ? windowHandle : windowHandle /*null*/, guiApp.fullScreenMode))
{
delete displaySystem;
}
if(displaySystem)
{
- display = Display { alphaBlend = alphaBlend, useSharedMemory = useSharedMemory, windowDriverData = windowData };
+ display = Display { alphaBlend = alphaBlend, useSharedMemory = useSharedMemory, glCapabilities = glCapabilities, windowDriverData = windowData };
if(display.Create(displaySystem, windowHandle))
result = true;
else
}
}
- if(guiApp.fullScreenMode || this != guiApp.desktop)
+ if(
+#if !defined(__EMSCRIPTEN__)
+ guiApp.fullScreenMode ||
+#endif
+ this != guiApp.desktop)
{
SetWindowMinimum(&skinMinSize.w, &skinMinSize.h);
if(display)
public bool AcquireInput(bool acquired)
{
bool result = true;
- if(acquiredInput != acquired)
+ if((guiApp.acquiredWindow && acquiredInput) != acquired)
{
if(active || (!visible && creationActivation == activate))
result = AcquireInputEx(acquired);
{
if(guiApp.driver != null)
{
+#if !defined(__EMSCRIPTEN__)
if(guiApp.fullScreenMode && guiApp.desktop.display)
+#else
+ if(true)
+#endif
{
+#if !defined(__EMSCRIPTEN__)
guiApp.desktop.mutex.Wait();
+#endif
guiApp.desktop.display.Lock(true);
Update(extent);
}
guiApp.desktop.display.Unlock();
+#if !defined(__EMSCRIPTEN__)
guiApp.desktop.mutex.Release();
+#endif
}
else
{
Window rootWindow = this.rootWindow;
+#if !defined(__EMSCRIPTEN__)
rootWindow.mutex.Wait();
+#endif
display.Lock(true);
Update(extent);
guiApp.SignalEvent();
else
{
+#if !defined(__EMSCRIPTEN__)
guiApp.waitMutex.Wait();
+#endif
guiApp.interfaceDriver.Lock(rootWindow);
if(!rootWindow.style.hidden && rootWindow.dirty)
{
rootWindow.dirty = false;
}
guiApp.interfaceDriver.Unlock(rootWindow);
+#if !defined(__EMSCRIPTEN__)
guiApp.waitMutex.Release();
+#endif
}
display.Unlock();
+#if !defined(__EMSCRIPTEN__)
rootWindow.mutex.Release();
+#endif
}
}
}
guiApp.interfaceDriver.SetMousePosition(guiApp.windowMovingStart.x, guiApp.windowMovingStart.y);
else
{
- int x, y;
+ int x = 0, y = 0;
guiApp.interfaceDriver.GetMousePosition(&x, &y);
guiApp.windowMovingStart.x += x - absPosition.x;
guiApp.windowMovingStart.y += y - absPosition.y;
void SetupFileMonitor()
{
+#if !defined(__EMSCRIPTEN__)
if(!fileMonitor)
{
fileMonitor = FileMonitor
};
incref fileMonitor;
}
+#endif
}
public:
}
}
+#if !defined(__EMSCRIPTEN__)
if(parent == guiApp.desktop && !mutex)
mutex = Mutex {};
+#endif
if(style.isDocument)
{
SetupFileMonitor();
if(fileName)
{
+#if !defined(__EMSCRIPTEN__)
fileMonitor.fileName = null;
+#endif
saving = true;
if(OnSaveFile(fileName))
//if(OnFileModified != Window::OnFileModified)
{
saving = false;
+#if !defined(__EMSCRIPTEN__)
fileMonitor.fileName = fileName;
+#endif
}
return true;
}
sprintf(filePath, "Untitled %d", documentID);
fileDialog.filePath = filePath;
}
+#if !defined(__EMSCRIPTEN__)
fileMonitor.fileName = null;
+#endif
fileDialog.type = save;
fileDialog.text = $"Save As";
break;
}
}
+#if !defined(__EMSCRIPTEN__)
//if(OnFileModified != Window::OnFileModified && fileName)
{
if(fileName)
fileMonitor.fileName = fileName;
}
+#endif
delete fileDialog;
}
return (bool)result; // Actually returning result from Yes/NoCancel message box
bool MenuWindowWindows(MenuItem selection, Modifiers mods)
{
- WindowList dialog { master = this };
- Window document = (Window)(intptr)dialog.Modal();
- if(document)
+ WindowList
{
- if(activeChild.state == maximized)
- document.SetState(maximized, false, mods);
- else if(document.state == minimized)
- document.SetState(normal, false, mods);
- document.Activate();
- }
+ master = this; isModal = true;
+
+ void NotifyDestroyed(Window window, DialogResult result)
+ {
+ Window document = (Window)(intptr)result;
+ if(document)
+ {
+ if(activeChild.state == maximized)
+ document.SetState(maximized, false, 0);
+ else if(document.state == minimized)
+ document.SetState(normal, false, 0);
+ document.Activate();
+ }
+ }
+ }.Create();
return true;
}
UpdateCaption();
// if(style.isDocument)
+#if !defined(__EMSCRIPTEN__)
if(!saving)
fileMonitor.fileName = value;
+#endif
}
get { return fileName; }
};
property bool moveable { get { return (bool)moveable; } set { moveable = value; } };
property bool alphaBlend { get { return (bool)alphaBlend; } set { alphaBlend = value; if(value) nativeDecorations = false; /* Native Decorations are not supported with alphaBlend */ } };
property bool useSharedMemory { get { return (bool)useSharedMemory; } set { useSharedMemory = value; } };
+ property GLCapabilities glCapabilities
+ {
+ get { return glCapabilities; }
+ set
+ {
+ bool reload = display != null &&
+ (glCapabilities.nonPow2Textures != value.nonPow2Textures ||
+ glCapabilities.intAndDouble != value.intAndDouble ||
+ glCapabilities.vertexBuffer != value.vertexBuffer ||
+ glCapabilities.compatible != value.compatible ||
+ glCapabilities.legacyFormats != value.legacyFormats ||
+ glCapabilities.debug != value.debug ||
+ glCapabilities.vertexPointer != value.vertexPointer ||
+ glCapabilities.quads != value.quads);
+ if(reload)
+ UnloadGraphics(false);
+
+ glCapabilities = value;
+
+ if(reload)
+ {
+ if(SetupDisplay())
+ LoadGraphics(false, false);
+ }
+ else if(display)
+ display.glCapabilities = value;
+ }
+ };
property CreationActivationOption creationActivation { get { return creationActivation; } set { creationActivation = value; } };
property bool nativeDecorations
{
int numIcons;
int positionID;
+#if !defined(__EMSCRIPTEN__)
Mutex mutex;
+#endif
WindowState lastState;
+#if !defined(__EMSCRIPTEN__)
FileMonitor fileMonitor;
+#endif
FontResource setFont, systemFont;
FontResource usedFont;
BitmapResource icon;
void * windowData;
CreationActivationOption creationActivation;
+ GLCapabilities glCapabilities;
+ glCapabilities = { true, true, true, true, true, true, true, true, false, true, true, true, true, true, true, true };
struct
{
bool active:1; // true if window and ancestors are active