From 8514be7da4543931841293e8ce084a045b623ad7 Mon Sep 17 00:00:00 2001 From: ketmar Date: Tue, 14 Mar 2017 00:48:06 +0000 Subject: [PATCH] fixes; window dragging temporarily disabled FossilOrigin-Name: 474296bc7ebd9f10541c3c43df4b7cc66a4e55a296fdf60ea602698336fa10dd --- amper.d | 474 ++++++++++++++++++++++++++++++++++------------------------ amperskin.d | 14 +- egfx/backgl.d | 12 +- 3 files changed, 294 insertions(+), 206 deletions(-) rewrite amper.d (61%) diff --git a/amper.d b/amper.d dissimilarity index 61% index 1726717..18f08e3 100644 --- a/amper.d +++ b/amper.d @@ -1,199 +1,275 @@ -module amper is aliced; - -import arsd.bmp; -import arsd.color; -import arsd.image; -import arsd.simpledisplay; - -import iv.cmdcon; -import iv.cmdcongl; -import iv.strex; -import iv.vfs; - -import egfx; - -import amperskin; - - -// ////////////////////////////////////////////////////////////////////////// // -extern(C) nothrow @nogc { - Bool XTranslateCoordinates(Display *display, Window src_w, Window dest_w, int src_x, int src_y, int *dest_x_return, int *dest_y_return, Window *child_return); -} - - -// ////////////////////////////////////////////////////////////////////////// // -__gshared ubyte vbNewScale = 1; - - -// ////////////////////////////////////////////////////////////////////////// // -/* -public __gshared void delegate () gxRebuildScreenCB; - -public void gxRebuildScreen () { - if (gxRebuildScreenCB !is null) { - gxClipReset(); - try { - gxRebuildScreenCB(); - } catch (Exception e) { - conwriteln("SCREEN REBUILD ERROR: ", e.msg); - } - vglUpdateTexture(); - } -} -*/ - - -// ////////////////////////////////////////////////////////////////////////// // -void main (string[] args) { - sdpyWindowClass = "AMPER_PLAYER"; - glconShowKey = "M-Grave"; - - conRegVar!vbNewScale(1, 8, "v_scale", "window scale"); - - conProcessQueue(); // load config - conProcessArgs!true(args); - - loadSkin(); - - auto sdwin = new SimpleWindow(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale, "Amper", OpenGlOptions.yes, Resizablity.allowResizing, WindowTypes.undecorated); - glconMainWindow = sdwin; - sdwin.setMinSize(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale); - sdwin.setMaxSize(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale); - //sdwin.hideCursor(); - - static if (is(typeof(&sdwin.closeQuery))) { - sdwin.closeQuery = delegate () { concmd("quit"); glconPostDoConCommands(); }; - } - - sdwin.addEventListener((QuitEvent evt) { - scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); - if (sdwin.closed) return; - if (isQuitRequested) { sdwin.close(); return; } - concmd("quit"); - }); - - sdwin.addEventListener((GLConScreenRebuildEvent evt) { - scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); - if (sdwin.closed) return; - if (isQuitRequested) { sdwin.close(); return; } - //conwriteln("rebuilding screen"); - sdwin.redrawOpenGlSceneNow(); - }); - - sdwin.addEventListener((GLConScreenRepaintEvent evt) { - scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); - if (sdwin.closed) return; - if (isQuitRequested) { sdwin.close(); return; } - sdwin.redrawOpenGlSceneNow(); - }); - - sdwin.addEventListener((GLConDoConsoleCommandsEvent evt) { - scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); - bool sendAnother = false; - bool prevVisible = isConsoleVisible; - { - consoleLock(); - scope(exit) consoleUnlock(); - conProcessQueue(); - sendAnother = !conQueueEmpty(); - } - if (sdwin.closed) return; - if (isQuitRequested) { sdwin.close(); return; } - if (sendAnother) glconPostDoConCommands(); - /* - if (prevVisible || isConsoleVisible) glconPostScreenRepaintDelayed(); - if (vbNewScale != vbufEffScale) glconPostScreenRepaint(); - */ - if (vbNewScale != vglWindowScale(sdwin)) { - vbNewScale = vglScaleWindow(sdwin, vbNewScale); - } else { - glconPostScreenRebuild(); - } - }); - - - static class ScrollTitleEvent {} - ScrollTitleEvent evScrollTitle = new ScrollTitleEvent(); - - sdwin.addEventListener((ScrollTitleEvent evt) { - scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); - if (sdwin.closed) return; - if (isQuitRequested) { sdwin.close(); return; } - //conwriteln("scrolling title"); - ampMain.scrollTitle(); - if (!sdwin.eventQueued!ScrollTitleEvent) sdwin.postTimeout(evScrollTitle, 100); - glconPostScreenRebuild(); - }); - - - sdwin.redrawOpenGlScene = delegate () { - ampMain.onPaint(); - //conwriteln("PAINT!"); - }; - - sdwin.visibleForTheFirstTime = delegate () { - vglRegisterWindow(sdwin); - }; - - - if (!sdwin.eventQueued!ScrollTitleEvent) sdwin.postEvent(evScrollTitle); - - bool mainDrag = false; - int mainDrawPrevX, mainDrawPrevY; - - sdwin.eventLoop(0, - delegate () { - }, - delegate (KeyEvent event) { - if (event.pressed && event == "Escape") { concmd("quit"); return; } - if (event.pressed && event == "Plus") { concmd("v_scale 2"); return; } - if (event.pressed && event == "Minus") { concmd("v_scale 1"); return; } - //conwriteln(event.toStr); - ampMain.onKey(event); - glconPostScreenRebuild(); - //sdwin.redrawOpenGlSceneNow(); - }, - delegate (MouseEvent event) { - if (mainDrag) { - if (event.type == MouseEventType.motion /*&& event.modifierState&ModifierState.leftButtonDown*/) { - flushGui(); - Window dummyw; - - int nx = event.x*vbufEffScale; - int ny = event.y*vbufEffScale; - XTranslateCoordinates(sdwin.display, sdwin.window, RootWindow(sdwin.display, DefaultScreen(sdwin.display)), nx, ny, &nx, &ny, &dummyw); - int dx = nx-mainDrawPrevX; - int dy = ny-mainDrawPrevY; - mainDrawPrevX = nx; - mainDrawPrevY = ny; - - XWindowAttributes xwa; - XGetWindowAttributes(sdwin.display, sdwin.window, &xwa); - XTranslateCoordinates(sdwin.display, sdwin.window, RootWindow(sdwin.display, DefaultScreen(sdwin.display)), xwa.x, xwa.y, &xwa.x, &xwa.y, &dummyw); - sdwin.move(xwa.x+dx, xwa.y+dy); - flushGui(); - } - if (event.type == MouseEventType.buttonReleased && event.button == MouseButton.left) mainDrag = false; - return; - } - if (!ampMain.onMouse(event)) { - if (event.type == MouseEventType.buttonPressed && event.button == MouseButton.left) { - if (ampMain.widgetAt(event.x, event.y) is null) { - flushGui(); - Window dummyw; - mainDrag = true; - mainDrawPrevX = event.x*vbufEffScale; - mainDrawPrevY = event.y*vbufEffScale; - XTranslateCoordinates(sdwin.display, sdwin.window, RootWindow(sdwin.display, DefaultScreen(sdwin.display)), mainDrawPrevX, mainDrawPrevY, &mainDrawPrevX, &mainDrawPrevY, &dummyw); - } - } - } - glconPostScreenRebuild(); - //sdwin.redrawOpenGlSceneNow(); - }, - delegate (dchar ch) { - }, - ); - flushGui(); - conProcessQueue(int.max/4); -} +module amper is aliced; + +import arsd.bmp; +import arsd.color; +import arsd.image; +import arsd.simpledisplay; + +import iv.cmdcon; +import iv.cmdcongl; +import iv.sdpyutil; +import iv.strex; +import iv.vfs; + +import egfx; + +import amperskin; + + +// ////////////////////////////////////////////////////////////////////////// // +extern(C) nothrow @nogc { + Bool XTranslateCoordinates(Display *display, Window src_w, Window dest_w, int src_x, int src_y, int *dest_x_return, int *dest_y_return, Window *child_return); +} + + +// ////////////////////////////////////////////////////////////////////////// // +__gshared ubyte vbNewScale = 1; + + +// ////////////////////////////////////////////////////////////////////////// // +/* +public __gshared void delegate () gxRebuildScreenCB; + +public void gxRebuildScreen () { + if (gxRebuildScreenCB !is null) { + gxClipReset(); + try { + gxRebuildScreenCB(); + } catch (Exception e) { + conwriteln("SCREEN REBUILD ERROR: ", e.msg); + } + vglUpdateTexture(); + } +} +*/ + + +// ////////////////////////////////////////////////////////////////////////// // +class ScrollTitleEvent {} +__gshared ScrollTitleEvent evScrollTitle; + +shared static this () { + evScrollTitle = new ScrollTitleEvent(); +} + + +// ////////////////////////////////////////////////////////////////////////// // +__gshared SimpleWindow sdampwin; +__gshared SimpleWindow sdplwin; +__gshared bool mainDrag = false; +__gshared int mainDrawPrevX, mainDrawPrevY; + + +// ////////////////////////////////////////////////////////////////////////// // +void closeAllIfMainIsClosed () { + if (sdampwin !is null && !sdampwin.closed) return; + if (sdplwin !is null && !sdplwin.closed) sdplwin.close(); +} + + +// ////////////////////////////////////////////////////////////////////////// // +void createAmpWindow () { + sdpyWindowClass = "AMPER_PLAYER"; + + sdampwin = new SimpleWindow(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale, "Amper", OpenGlOptions.yes, Resizablity.fixedSize, WindowTypes.undecorated); + glconMainWindow = sdampwin; + sdampwin.setMinSize(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale); + sdampwin.setMaxSize(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale); + //sdwin.hideCursor(); + + static if (is(typeof(&sdampwin.closeQuery))) { + sdampwin.closeQuery = delegate () { concmd("quit"); glconPostDoConCommands(); }; + } + + sdampwin.addEventListener((QuitEvent evt) { + scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); + if (sdampwin.closed) { closeAllIfMainIsClosed(); return; } + if (isQuitRequested) { sdampwin.close(); closeAllIfMainIsClosed(); return; } + concmd("quit"); + }); + + sdampwin.addEventListener((GLConScreenRebuildEvent evt) { + scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); + if (sdampwin.closed) { closeAllIfMainIsClosed(); return; } + if (isQuitRequested) { sdampwin.close(); closeAllIfMainIsClosed(); return; } + //conwriteln("rebuilding screen"); + sdampwin.redrawOpenGlSceneNow(); + }); + + sdampwin.addEventListener((GLConScreenRepaintEvent evt) { + scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); + if (sdampwin.closed) { closeAllIfMainIsClosed(); return; } + if (isQuitRequested) { sdampwin.close(); closeAllIfMainIsClosed(); return; } + sdampwin.redrawOpenGlSceneNow(); + }); + + sdampwin.addEventListener((GLConDoConsoleCommandsEvent evt) { + scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); + bool sendAnother = false; + bool prevVisible = isConsoleVisible; + { + consoleLock(); + scope(exit) consoleUnlock(); + conProcessQueue(); + sendAnother = !conQueueEmpty(); + } + if (sdampwin.closed) { closeAllIfMainIsClosed(); return; } + if (isQuitRequested) { sdampwin.close(); closeAllIfMainIsClosed(); return; } + if (sendAnother) glconPostDoConCommands(); + /* + if (prevVisible || isConsoleVisible) glconPostScreenRepaintDelayed(); + if (vbNewScale != vbufEffScale) glconPostScreenRepaint(); + */ + if (vbNewScale != vglWindowScale(sdampwin)) { + vbNewScale = vglScaleWindow(sdampwin, vbNewScale); + } else { + glconPostScreenRebuild(); + } + }); + + sdampwin.addEventListener((ScrollTitleEvent evt) { + scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); + if (sdampwin.closed) { closeAllIfMainIsClosed(); return; } + if (isQuitRequested) { sdampwin.close(); closeAllIfMainIsClosed(); return; } + //conwriteln("scrolling title"); + ampMain.scrollTitle(); + if (!sdampwin.eventQueued!ScrollTitleEvent) sdampwin.postTimeout(evScrollTitle, 100); + glconPostScreenRebuild(); + }); + + + sdampwin.redrawOpenGlScene = delegate () { + ampMain.onPaint(); + //conwriteln("PAINT!"); + if (sdplwin !is null && !sdplwin.closed) sdplwin.redrawOpenGlSceneNow(); + }; + + sdampwin.visibleForTheFirstTime = delegate () { + vglRegisterWindow(sdampwin); + }; + + /* + sdampwin.handlePulse = delegate () { + }; + */ + + sdampwin.handleKeyEvent = delegate (KeyEvent event) { + if (event.pressed && event == "Escape") { concmd("quit"); return; } + if (event.pressed && event == "Plus") { concmd("v_scale 2"); return; } + if (event.pressed && event == "Minus") { concmd("v_scale 1"); return; } + //conwriteln(event.toStr); + ampMain.onKey(event); + glconPostScreenRebuild(); + //sdwin.redrawOpenGlSceneNow(); + }; + + sdampwin.handleMouseEvent = delegate (MouseEvent event) { + if (mainDrag) { + if (event.type == MouseEventType.motion /*&& event.modifierState&ModifierState.leftButtonDown*/) { + flushGui(); + Window dummyw; + + int nx = event.x*vbufEffScale; + int ny = event.y*vbufEffScale; + XTranslateCoordinates(sdampwin.display, sdampwin.window, RootWindow(sdampwin.display, DefaultScreen(sdampwin.display)), nx, ny, &nx, &ny, &dummyw); + int dx = nx-mainDrawPrevX; + int dy = ny-mainDrawPrevY; + mainDrawPrevX = nx; + mainDrawPrevY = ny; + + XWindowAttributes xwa; + XGetWindowAttributes(sdampwin.display, sdampwin.window, &xwa); + XTranslateCoordinates(sdampwin.display, sdampwin.window, RootWindow(sdampwin.display, DefaultScreen(sdampwin.display)), xwa.x, xwa.y, &xwa.x, &xwa.y, &dummyw); + sdampwin.move(xwa.x+dx, xwa.y+dy); + + if (sdplwin !is null && !sdplwin.closed) { + XGetWindowAttributes(sdplwin.display, sdplwin.window, &xwa); + XTranslateCoordinates(sdplwin.display, sdplwin.window, RootWindow(sdplwin.display, DefaultScreen(sdplwin.display)), xwa.x, xwa.y, &xwa.x, &xwa.y, &dummyw); + sdplwin.move(xwa.x+dx, xwa.y+dy); + } + + flushGui(); + } + if (event.type == MouseEventType.buttonReleased && event.button == MouseButton.left) mainDrag = false; + return; + } + if (!ampMain.onMouse(event)) { + /* + if (event.type == MouseEventType.buttonPressed && event.button == MouseButton.left) { + if (ampMain.widgetAt(event.x, event.y) is null) { + flushGui(); + Window dummyw; + mainDrag = true; + mainDrawPrevX = event.x*vbufEffScale; + mainDrawPrevY = event.y*vbufEffScale; + XTranslateCoordinates(sdampwin.display, sdampwin.window, RootWindow(sdampwin.display, DefaultScreen(sdampwin.display)), mainDrawPrevX, mainDrawPrevY, &mainDrawPrevX, &mainDrawPrevY, &dummyw); + } + } + */ + } + glconPostScreenRebuild(); + //sdwin.redrawOpenGlSceneNow(); + }; + + /* + sdampwin.handleCharEvent = delegate (dchar ch) { + }; + */ + + if (!sdampwin.eventQueued!ScrollTitleEvent) sdampwin.postEvent(evScrollTitle); +} + + +// ////////////////////////////////////////////////////////////////////////// // +void createPListWindow () { + sdpyWindowClass = "AMPER_PLAYLIST"; + + sdplwin = new SimpleWindow(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale, "Amper Playlist", OpenGlOptions.yes, Resizablity.allowResizing, WindowTypes.undecorated); + sdplwin.setMinSize(skinImgMain.width*vbufEffScale, skinImgMain.height*vbufEffScale); + sdplwin.setMaxSize(4096, 4096); + sdplwin.setResizeGranularity(5, 4); + + static if (is(typeof(&sdplwin.closeQuery))) { + sdplwin.closeQuery = delegate () { /*concmd("quit"); glconPostDoConCommands();*/ }; + } + + sdplwin.redrawOpenGlScene = delegate () { + ampPList.onPaint(); + }; + + sdplwin.visibleForTheFirstTime = delegate () { + vglRegisterWindow(sdplwin); + + if (sdampwin !is null && !sdampwin.closed) { + switchToWindow(sdampwin); + flushGui(); + Window dummyw; + XWindowAttributes xwa; + XGetWindowAttributes(sdampwin.display, sdampwin.window, &xwa); + XTranslateCoordinates(sdampwin.display, sdampwin.window, RootWindow(sdampwin.display, DefaultScreen(sdampwin.display)), xwa.x, xwa.y, &xwa.x, &xwa.y, &dummyw); + sdplwin.move(xwa.x, xwa.y+sdampwin.height); + flushGui(); + } + }; +} + + +// ////////////////////////////////////////////////////////////////////////// // +void main (string[] args) { + glconShowKey = "M-Grave"; + + conRegVar!vbNewScale(1, 8, "v_scale", "window scale"); + + conProcessQueue(); // load config + conProcessArgs!true(args); + + loadSkin(); + + createAmpWindow(); + createPListWindow(); + flushGui(); + + sdampwin.eventLoop(0); + flushGui(); + conProcessQueue(int.max/4); +} diff --git a/amperskin.d b/amperskin.d index e8ca0f1..c7a6a5d 100644 --- a/amperskin.d +++ b/amperskin.d @@ -46,6 +46,7 @@ __gshared EImage skinImgPlaylist; // ////////////////////////////////////////////////////////////////////////// // __gshared AmpMainWindow ampMain; +__gshared AmpPListWindow ampPList; // ////////////////////////////////////////////////////////////////////////// // @@ -88,6 +89,8 @@ void loadSkin () { } ampMain = null; + ampPList = null; + EImage numsex; static struct ImageInfo { @@ -121,7 +124,7 @@ void loadSkin () { foreach (ref ii; imglist) { if (*(ii.img) is null && iname.strEquCI(ii.name)) { - conwriteln(de.name); + //conwriteln(de.name); loadImage(ii.img, de.name); break; } @@ -139,6 +142,7 @@ void loadSkin () { } ampMain = new AmpMainWindow(); + ampPList = new AmpPListWindow(); } @@ -455,3 +459,11 @@ class AmpMainWindow : AmpWindow { if (wtitle !is null) wtitle.scrollTitle(); } } + + +// ////////////////////////////////////////////////////////////////////////// // +class AmpPListWindow : AmpWindow { + this () { + super(skinImgMain); + } +} diff --git a/egfx/backgl.d b/egfx/backgl.d index baed005..d70763d 100644 --- a/egfx/backgl.d +++ b/egfx/backgl.d @@ -416,13 +416,13 @@ public void vglRegisterWindow (SimpleWindow w) { } } } - glconDraw(); + if (glconMainWindow is w) glconDraw(); }; svd.handleKeyEventSave = w.handleKeyEvent; w.handleKeyEvent = delegate (KeyEvent event) { scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); - if (glconKeyEvent(event)) { glconPostScreenRepaint(); return; } + if (glconMainWindow is w && glconKeyEvent(event)) { glconPostScreenRepaint(); return; } if (isQuitRequested) w.close(); { auto save = EGfxWindowData.setup(w); @@ -449,7 +449,7 @@ public void vglRegisterWindow (SimpleWindow w) { svd.handleCharEventSave = w.handleCharEvent; w.handleCharEvent = delegate (dchar ch) { scope(exit) if (!conQueueEmpty()) glconPostDoConCommands(); - if (glconCharEvent(ch)) { glconPostScreenRepaint(); return; } + if (glconMainWindow is w && glconCharEvent(ch)) { glconPostScreenRepaint(); return; } if (isQuitRequested) w.close(); { auto save = EGfxWindowData.setup(w); @@ -478,9 +478,9 @@ public void vglRegisterWindow (SimpleWindow w) { auto save = EGfxWindowData.setup(w); if (auto sw = save.wd) { if (!w.closed) { - w.setMinSize(wdt, hgt); - w.setMaxSize(wdt, hgt); - glconResize(wdt, hgt); + //w.setMinSize(wdt, hgt); + //w.setMaxSize(wdt, hgt); + if (glconMainWindow is w) glconResize(wdt, hgt); vglResizeBuffer(wdt/vbufEffScale, hgt/vbufEffScale, vbufEffScale); if (sw.windowResizedSave !is null) sw.windowResizedSave(wdt, hgt); } -- 2.11.4.GIT