*/}}
Browse Source

Preliminary windows backport

YimingWu 1 year ago
parent
commit
6cad9811bd
16 changed files with 582 additions and 154 deletions
  1. 3 0
      CMakeLists.txt
  2. 6 3
      la_5.h
  3. 8 2
      la_controllers.c
  4. 5 1
      la_data.c
  5. 49 15
      la_interface.h
  6. 368 48
      la_kernel.c
  7. 1 3
      la_tns.h
  8. 24 15
      la_tns_kernel.c
  9. 12 5
      la_util.c
  10. 20 2
      la_util.h
  11. 38 21
      lagui-config.cmake
  12. 2 2
      resources/la_modelling.c
  13. 36 29
      resources/la_operators.c
  14. 7 5
      resources/la_properties.c
  15. 1 1
      resources/la_tns_shaders.cpp
  16. 2 2
      resources/la_translations.c

+ 3 - 0
CMakeLists.txt

@@ -16,6 +16,9 @@ find_package(X11 REQUIRED)
 find_package(Freetype REQUIRED)
 find_package(GLEW REQUIRED)
 
+add_compile_options("$<$<C_COMPILER_ID:MSVC>:/utf-8>")
+add_compile_options("$<$<CXX_COMPILER_ID:MSVC>:/utf-8>")
+
 file(GLOB_RECURSE SOURCE_FILES 
 	./*.c ./*.cpp ./resources/*.c ./resources/*.cpp)
 

+ 6 - 3
la_5.h

@@ -44,11 +44,14 @@
 //#include "LA_AV.h"
 //#include <direct.h>
 //#include <io.h>
+#include <stddef.h> //offsetof
+#include <stdio.h>
 
+#ifdef __linux__
 #include <unistd.h>
 #include <dirent.h>
 #include <locale.h>
-#include <stddef.h> //offsetof
-#include <stdio.h>
-#include <time.h>
 #include <sys/stat.h>
+#endif
+
+#include <time.h>

+ 8 - 2
la_controllers.c

@@ -18,16 +18,16 @@
 
 #include "la_5.h"
 
-#include <stdio.h>
-#include <stdlib.h>
 #include <math.h>
 
+#ifdef __linux__
 #include <fcntl.h>
 #include <sys/ioctl.h>
 #include <linux/input.h>
 #include <linux/joystick.h>
 #include <errno.h>
 #include <X11/extensions/XInput2.h>
+#endif
 
 extern LA MAIN;
 
@@ -74,6 +74,7 @@ laController* la_FindControllerWithID(int id){
 }
 
 void la_InitControllers(){
+#ifdef __linux__
     char path[32]="/dev/input/js";
     char name[128]={0};
     int numpos=strlen(path);
@@ -91,9 +92,11 @@ void la_InitControllers(){
 
         laController* c=la_NewController(name, path, fd, axes, buttons);
     }
+#endif
 }
 
 void la_UpdateControllerStatus(){
+#ifdef __linux__
     laJoystickEvent event; int HasEvent=0;
     for(laController* c=MAIN.Controllers.pFirst;c;c=c->Item.pNext){ if(c->Error) continue;
         int bytes; while((bytes=read(c->fd, &event, sizeof(laJoystickEvent)))>0){
@@ -111,6 +114,7 @@ void la_UpdateControllerStatus(){
         if(bytes<=0){ struct stat buffer; if(stat(c->Path->Ptr,&buffer)<0){ c->Error=1; HasEvent=1; } }
     }
     if(HasEvent){ laNotifyUsers("la.controllers"); laMappingRequestEval(); }
+#endif
 }
 
 void la_RefreshControllers(){
@@ -119,7 +123,9 @@ void la_RefreshControllers(){
 }
 int OPINV_RefreshControllers(){
     la_RefreshControllers();
+#ifdef __linux__
     la_ScanWacomDevices(MAIN.dpy,XIAllDevices);
+#endif
     return LA_FINISHED;
 }
 

+ 5 - 1
la_data.c

@@ -3213,7 +3213,7 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
                         if (!Parent && !IsExceptionNode){
                             if (p->UDFIsSingle && pp->EndInstance){ Instance = pp->EndInstance; la_ResetInstance(Instance, pc, IsItem); replaced=1; }
                             else{
-                                // if overwrite, find the instance here for hyper2, if not hyper 2 then notice can't overwrite.
+                                // if overwrite, find the instance here for hyper2, if not Hyper 2 then notice can't overwrite.
                                 if (pc->Hyper == 2){
                                     if(Mode==LA_UDF_MODE_OVERWRITE && ItemType == LA_UDF_HYPER_ITEM){
                                         laUID uid; la_PeekHyperUID(udf, &uid.String);
@@ -3740,6 +3740,7 @@ void laGetSubResourceDirectories(char* rootpath_with_slash, laListHandle* out){
     fclose(f);
 }
 void laRefreshUDFResourcesIn(char* rootpath){
+#ifdef __linux__
     char Final[2048];
     int len=strlen(rootpath);
     if (rootpath[len - 1] != '/') strcat(rootpath, "/");
@@ -3771,8 +3772,10 @@ void laRefreshUDFResourcesIn(char* rootpath){
         laGetSubResourceDirectories(rootpath, &additionals);
         while(s=lstPopPointer(&additionals)){ laRefreshUDFResourcesIn(s->Ptr); strSafeDestroy(&s); }
     }
+#endif
 }
 void laRefreshUDFRegistries(){
+#ifdef __linux__
     laClearUDFRegistries();
     char LookupM[PATH_MAX];
     for(laResourceFolder* rf = MAIN.ResourceFolders.pFirst;rf;rf=rf->Item.pNext){
@@ -3780,6 +3783,7 @@ void laRefreshUDFRegistries(){
         realpath(rf->Path->Ptr, LookupM);
         laRefreshUDFResourcesIn(LookupM);
     }
+#endif
 }
 
 void laStopManageUDF(laManagedUDF* m){

+ 49 - 15
la_interface.h

@@ -18,19 +18,23 @@
 
 #pragma once
 
+#include <GL/glew.h>
+//#include <GL/glxew.h>
+#include <GL/gl.h>
+
+#ifdef __linux__
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
 #include <X11/Xresource.h>
 #include <X11/Xlocale.h>
 #include <X11/XKBlib.h>
 #include <X11/Xatom.h>
-
-#include <GL/glew.h>
-//#include <GL/glxew.h>
-#include <GL/gl.h>
 #include <GL/glx.h>
 #include <GL/glext.h>
-#include <GL/glu.h>
+#endif
+#ifdef _WIN32
+#include <GL/wglew.h>
+#endif
 
 #include "la_5.h"
 #include "la_data.h"
@@ -96,6 +100,20 @@
 #define LA_KEY_ALT       (1<<22)
 #define LA_KEY_DELETE    (1<<23)
 #define LA_KEY_TAB       (1<<24)
+#ifdef _WIN32
+#define XK_F1  1
+#define XK_F2  2
+#define XK_F3  3
+#define XK_F4  4
+#define XK_F5  5
+#define XK_F6  6
+#define XK_F7  7
+#define XK_F8  8
+#define XK_F9  9
+#define XK_F10 10
+#define XK_F11 11
+#define XK_F12 12
+#endif
 #define LA_KEY_F1        XK_F1
 #define LA_KEY_F2        XK_F2
 #define LA_KEY_F3        XK_F3
@@ -153,7 +171,7 @@ NEED_STRUCTURE(laUiItem);
 NEED_STRUCTURE(laColumn);
 
 typedef void (*laUiDrawFunc)(void *, int);               //Instance,Theme
-typedef void (*laPanelDrawFunc)(void *, void *, void *); //Window,Instance,Theme
+typedef void (*laPanelDrawFunc)(void *, void *, void *); //SYSWINDOW,Instance,Theme
 //typedef void(*laUiDefineFunc)(laUiList*,laPropPack*,laPropPack*,laColumn*);//uil,collection inst+"This" inst,actuator inst,Extra column list.
 typedef void (*laOperatorArgumentParserFunc)(laStringSplitor *, uint32_t *, char *); //icon id,display string buf
 typedef int (*laUiGetHeightFunc)(laUiItem *);
@@ -272,9 +290,11 @@ STRUCTURE(laExtraPreferencePage){
 
 STRUCTURE(laProgressDisplay){
     char String[256];
-    Window* w;
+#ifdef __linux__
+    SYSWINDOW* w;
     GC gc;
     XGCValues gc_values;
+#endif
     laTimeRecorder TimeCalled;
     real p1,p2;
     int Called,Shown;
@@ -306,6 +326,7 @@ STRUCTURE(LA){
 
     char *InputBuf; int InputBufNext, InputBufMax;
     int32_t *InputBufU; int InputBufUNext, InputBufUMax;
+#ifdef __linux__
     Atom MsgDelWindow;
     Atom bufid;
     Atom fmtid;
@@ -316,17 +337,24 @@ STRUCTURE(LA){
 	Atom UTF8;
 	Atom selection;
     Atom wmstate,wmfullscr,wmfullscroff;
+#endif
     laSafeString* CopyPending;
 
     int GLMajor,GLMinor,BufferSamples;
-    Display* dpy;
+    SYSTEMDISPLAY* dpy;
+    SYSGLCONTEXT glc;
+#ifdef _WIN32
+    HINSTANCE hinstance;
+    HDC hdc;
+#endif
+#ifdef __linux__
     XVisualInfo* xvi;
     GLXFBConfig BestFBC;
-    GLXContext glc;
     Colormap cmap;
     XIM im;
     XIC ic;
     int xi_opcode;
+#endif
     int WacomDeviceStylus; real StylusPressure, StylusAngleX, StylusAngleY, StylusMaxPressure;
     int WacomDeviceEraser; real EraserPressure, EraserAngleX, EraserAngleY, EraserMaxPressure;
     int PointerIsEraser,IsPen;
@@ -543,8 +571,11 @@ NEED_STRUCTURE(laUiItem);
 STRUCTURE(laWindow){
     laListItem Item;
 
-    Window* win;
-    GLXContext glc;
+    SYSWINDOW* win;
+    SYSGLCONTEXT glc;
+#ifdef _WIN32
+    HDC hdc;
+#endif
 
     int X,Y,W,H;
     int CW,CH;
@@ -1580,7 +1611,9 @@ void logPrintT(int Type, char* format, ...);
 void logPrint(char* format, ...);
 void logPrintNew(char* format, ...);
 
-int LA_WindowProc(Window win, int message, int wparam, int lparam);
+#ifdef _WIN32
+LRESULT CALLBACK LA_WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam);
+#endif
 
 void la_RegisterMainOperators();
 void la_RegisterUiOperatorsBasic();
@@ -1745,14 +1778,14 @@ STRUCTURE(laManagedSaveExtra){
 void la_MakeTranslations();
 
 laCanvasTemplate *la_GetCanvasTemplate(char *TargetContainerID, char* TemplateID);
-laPropContainer* laUiHasExtraProps(laUiType *ut, int size, int hyper);
-laPropContainer* laCanvasHasExtraProps(laCanvasTemplate *ct, int size, int hyper);
+laPropContainer* laUiHasExtraProps(laUiType *ut, int size, int Hyper);
+laPropContainer* laCanvasHasExtraProps(laCanvasTemplate *ct, int size, int Hyper);
 laUiType *la_RegisterUiType(const char *Identifer, int ForType, const char *UseOperator, laBoxedTheme **bt, laUiDrawFunc *Draw, laUiGetHeightFunc GetHeight, laUiInitFunc Init, laUiDestroyFunc Destroy);
 
 void laSetWindowCursor(int id);
 void laRenameWindow(laWindow* wnd, char* name);
 
-void la_ScanWacomDevices(Display *display, int deviceid);
+void la_ScanWacomDevices(SYSTEMDISPLAY *display, int deviceid);
 
 void laSetFontFolderPath(char* absolute);
 int laGetReady();
@@ -1831,6 +1864,7 @@ void la_PropPanelUserRemover(void* This, laItemUserLinker* iul);
 void la_EnsurePanelExtras(laPanel *p);
 
 void laRedrawAllWindows();
+void laRefreshWindow();
 void laRedrawCurrentWindow();
 void laRedrawPanel(laPanel* p);
 void laRecalcPanel(laPanel* p);

+ 368 - 48
la_kernel.c

@@ -22,6 +22,7 @@
 #include <stdlib.h>
 #include <math.h>
 #include <time.h>
+#ifdef __linux__
 #include <sys/time.h>
 #include <X11/Xlib.h>
 #include <X11/Xutil.h>
@@ -34,8 +35,11 @@
 #include <X11/Xcursor/Xcursor.h>
 #include <X11/cursorfont.h>
 #include <GL/glx.h>
-//#include <GL/glext.h>
-//#include <GL/glu.h>
+#endif
+#ifdef _WIN32
+#include <GL/wglew.h>
+#include <GL/wgl.h>
+#endif
 
 LA MAIN;
 
@@ -48,13 +52,15 @@ laColumn *DEBUG_C;
 
 #define LA_GUI_WNDCLASS_NAME "NUL4_GUI_CLASS"
 
+#ifdef __linux__
 typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
 typedef Bool (*glXMakeContextCurrentARBProc)(Display*, GLXDrawable, GLXDrawable, GLXContext);
 typedef void (*glXSwapIntervalEXTProc)(Display *dpy, GLXDrawable drawable, int interval);
-
 glXCreateContextAttribsARBProc glXCreateContextAttribsF;
 glXSwapIntervalEXTProc glXSwapIntervalEXTF;
+#endif
 
+#ifdef __linux__
 static void la_PrintWacomValuators(Display *display, XIAnyClassInfo **classes, int num_classes){
     int i;
     for (i = 0; i < num_classes; i++) {
@@ -156,15 +162,15 @@ void la_XErrorHandler(Display *display, XErrorEvent *event){
     printf("X Error:\n%s\n",buf);
 }
 
-Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBlank, GLXContext* r_glc){
+SYSWINDOW la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBlank, GLXContext* r_glc){
     XSetWindowAttributes swa;
     XWindowAttributes wa;
     swa.event_mask = 
         KeyPressMask|KeyReleaseMask|StructureNotifyMask|SubstructureNotifyMask|
         ButtonMotionMask|ButtonPressMask|ButtonReleaseMask|ExposureMask|PointerMotionMask;
     swa.colormap = MAIN.cmap;
-    Window root = DefaultRootWindow(MAIN.dpy);
-    Window win = XCreateWindow(MAIN.dpy, root, x,y, w, h, 0, MAIN.xvi->depth, InputOutput, MAIN.xvi->visual, CWColormap | CWEventMask, &swa);
+    SYSWINDOW root = DefaultRootWindow(MAIN.dpy);
+    SYSWINDOW win = XCreateWindow(MAIN.dpy, root, x,y, w, h, 0, MAIN.xvi->depth, InputOutput, MAIN.xvi->visual, CWColormap | CWEventMask, &swa);
     XSetWMProtocols(MAIN.dpy , win, &MAIN.MsgDelWindow, 1);
 
     if(x>0||y>0){
@@ -211,37 +217,133 @@ Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBl
 
     return win;
 };
-int la_CreateSystemWindow(laWindow *window, int SyncToVBlank){
-    GLXContext glc;
-    Window hwnd = la_CreateWindowX11(window->X, window->Y, window->W, window->H, window->Title->Ptr, SyncToVBlank, &glc);
-    window->win = hwnd;
-    //if (!hwnd)
-    //{
-    //    MessageBox(0, "Error Creating Window!", "Error", 0);
-    //    return 0;
-    //};
-    //ImmAssociateContext(hwnd,0);
+void la_DestroySystemWindowX11(laWindow* w) {
+    glXMakeCurrent(MAIN.dpy, None, NULL);
+    glXDestroyContext(MAIN.dpy, w->glc);
+    XDestroyWindow(MAIN.dpy, w->win);
+};
+#endif //linux
+#ifdef _WIN32
+void laHideCursor() {
+    if (!MAIN.CurrentWindow) return; //impl
+}
+void laShowCursor() {
+    if (!MAIN.CurrentWindow) return; //impl
+}
+static PIXELFORMATDESCRIPTOR cpfd = {
+    sizeof(PIXELFORMATDESCRIPTOR),1,
+    PFD_DRAW_TO_WINDOW | PFD_SUPPORT_OPENGL | PFD_SWAP_COPY | PFD_DOUBLEBUFFER,
+    PFD_TYPE_RGBA,
+    8,
+    0, 0, 0, 0, 0, 0,
+    0, 0, 0,
+    0, 0, 0, 0,
+    32,
+    8, 0,
+    0,
+    0, 0, 0, 0
+};
+void la_SetupPxlFormat(HDC hdc, int* nRegularFormat, int* nMSFormat) {
+    int nBestMS = 0;
+    int i;
+    int iResults[9];
+    int iAttributes[9] = { WGL_SUPPORT_OPENGL_ARB, // 0
+        WGL_ACCELERATION_ARB,   // 1
+        WGL_DRAW_TO_WINDOW_ARB, // 2
+        WGL_DOUBLE_BUFFER_ARB,  // 3
+        WGL_PIXEL_TYPE_ARB,     // 4
+        WGL_DEPTH_BITS_ARB,     // 5
+        WGL_STENCIL_BITS_ARB,   // 6
+        WGL_SAMPLE_BUFFERS_ARB, // 7
+        WGL_SAMPLES_ARB };      // 8
+
+    // How many pixelformats are there?
+    int nFormatCount[] = { 0 };
+    int attrib[] = { WGL_NUMBER_PIXEL_FORMATS_ARB };
+
+    if (!wglGetPixelFormatAttribivARB)
+        wglGetPixelFormatAttribivARB = (PFNWGLGETPIXELFORMATATTRIBIVARBPROC)
+        wglGetProcAddress("wglGetPixelFormatAttribivARB");
+
+    wglGetPixelFormatAttribivARB(hdc, 1, 0, 1, attrib, nFormatCount);
+
+    for (i = 0; i < nFormatCount[0]; i++){
+        wglGetPixelFormatAttribivARB(hdc, i + 1, 0, 9, iAttributes, iResults);
+        if (iResults[0] == 1 && iResults[1] == WGL_FULL_ACCELERATION_ARB && iResults[2] == 1)
+            if (iResults[3] == 1)                    // Double buffered
+                if (iResults[4] == WGL_TYPE_RGBA_ARB)    // Full Color
+                    if (iResults[5] >= 24)                   // Any Depth greater than 16
+                        if (iResults[6] > 0) { *nRegularFormat = i; break; }
+    }
+    SetPixelFormat(hdc, *nRegularFormat, &cpfd);
+};
+void la_SetupGLEnviornment(laWindow* window, HWND hwnd) {
+    GLint Attrib[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, MAIN.GLMajor,
+                  WGL_CONTEXT_MINOR_VERSION_ARB, MAIN.GLMinor,
+        WGL_CONTEXT_PROFILE_MASK_ARB,WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB,
+        //WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB, GL_TRUE,
+        0 };
+    HGLRC hglrc = 0;
+    HDC hdc = 0;
+    int a, b;
+
+    hdc = GetDC(hwnd);
+    la_SetupPxlFormat(hdc, &a, &b);
+
+    wglMakeCurrent(0, 0);
+    hglrc = wglCreateContextAttribsARB(hdc, MAIN.glc, Attrib);
+
+    if (!hglrc) SEND_PANIC_ERROR("Can't Create Opengl Context!\n", );
+
+    //wglShareLists(hglrc, MAIN.glc);
+    wglMakeCurrent(hdc, hglrc);
+
+    window->win = hwnd; window->glc = hglrc; window->hdc = hdc;
+};
+SYSWINDOW la_CreateWindowWin32(int x, int y, int w, int h, char* title, int SyncToVBlank, SYSGLCONTEXT* r_glc) {
+    HINSTANCE* inst = &MAIN.hinstance;
+    HWND hwnd = CreateWindow(LA_GUI_WNDCLASS_NAME, title, WS_OVERLAPPEDWINDOW | WS_CLIPSIBLINGS | WS_CLIPCHILDREN,
+        x, y, w, h, 0, 0, *inst, 0);
+    if (!hwnd) { int a = GetLastError(); printf("%d", a); return 0; }
 
-    //la_SetupGLEnviornment(window, hwnd);
+    return hwnd;
+};
+void la_DestroySystemWindowWin32(laWindow* w) {
+    wglDeleteContext(w->glc);
+    ReleaseDC(w->win, w->hdc);
+};
+#endif
 
-    //GetClientRect(window->win, &rc);
-    //window->CW = rc.right - rc.left;
-    //window->CH = rc.bottom - rc.top;
+int la_CreateSystemWindow(laWindow *window, int SyncToVBlank){
+    SYSGLCONTEXT glc;
+#ifdef __linux__
+    SYSWINDOW hwnd = la_CreateWindowX11(window->X, window->Y, window->W, window->H, window->Title->Ptr, SyncToVBlank, &glc);
+#endif
+#ifdef _WIN32
+    SYSWINDOW hwnd = la_CreateWindowWin32(window->X, window->Y, window->W, window->H, window->Title->Ptr, SyncToVBlank, &glc);
+#endif
+    window->win = hwnd;
 
+#ifdef _WIN32
+    la_SetupGLEnviornment(window, hwnd);
+    RECT rc; GetClientRect(window->win, &rc);
+    window->CW = rc.right - rc.left;
+    window->CH = rc.bottom - rc.top;
+#endif
+#ifdef __linux__
     XWindowAttributes attr;
     XGetWindowAttributes(MAIN.dpy, window->win, &attr);
     window->CW =attr.width;
     window->CH = attr.height;
     window->glc = glc;
+#endif
     return 1;
 };
-void la_DestroySystemWindowX11(laWindow* w){
-    glXMakeCurrent(MAIN.dpy, None, NULL);
-    glXDestroyContext(MAIN.dpy, w->glc);
-    XDestroyWindow(MAIN.dpy, w->win);
-};
+
 int la_DestroySystemWindow(laWindow* wnd){
+#ifdef __linux__
     la_DestroySystemWindowX11(wnd);
+#endif
 }
 
 void la_DestroyWindow(laWindow *wnd){
@@ -270,7 +372,9 @@ void laRenameWindow(laWindow* wnd, char* name){
     if(!wnd) return;
     strSafeSet(&wnd->Title, name);
     if(!wnd->win) return;
+#ifdef __linux__
     XStoreName(MAIN.dpy, wnd->win, name);
+#endif
 }
 
 const char* la_ConvertCursorID(int id){
@@ -286,7 +390,6 @@ const char* la_ConvertCursorID(int id){
     return "arrow";
 }
 
-void la_MakePanelTitleBar(laPanel *p, laUiDefineFunc ReplaceDefine);
 void la_InitThreadEnviornment(){
     //pthread_spin_init(&MAIN.csNotifier, //pthread_PROCESS_PRIVATE);
 }
@@ -328,9 +431,11 @@ void logClear(){
     while(l=lstPopItem(&MAIN.Logs)){ strSafeDestroy(&l->Content); memFree(l); }
 }
 
+
 #define PROGRESSW (LA_RH*15)
 
 void laShowProgress(real p1, real p2){
+#ifdef __linux__
     laBoxedTheme *bt = _LA_THEME_TAB; real* fg=laThemeColor(bt,LA_BT_TEXT); real* bg=laThemeColor(bt,LA_BT_NORMAL);
     if(!MAIN.Progress.Called){
         laRecordTime(&MAIN.Progress.TimeCalled); MAIN.Progress.Called=1;
@@ -357,8 +462,10 @@ void laShowProgress(real p1, real p2){
     tnsDrawLCD7_ProgressX11(LA_RH*1.5,0,MAIN.Progress.p1);
     tnsDrawLCD7_ProgressX11(LA_RH*1.5,LA_RH,MAIN.Progress.p2);
     XSync(MAIN.dpy, 1); XFlush(MAIN.dpy);
+#endif
 }
 void laHideProgress(){
+#ifdef __linux__
     if(!MAIN.Progress.Shown){
         MAIN.Progress.Called=0; return;
     }
@@ -367,11 +474,13 @@ void laHideProgress(){
     if(t<0.2){ usleep((TNS_MIN2(0.2-t,0.2))*1000000); }
     XUnmapWindow(MAIN.dpy,MAIN.Progress.w); XSync(MAIN.dpy, 1); XFlush(MAIN.dpy);
     MAIN.Progress.Called = MAIN.Progress.Shown = 0;
+#endif
 }
 
 //=======================
 
 void la_InitProgressWindow(){
+#ifdef __linux__
     MAIN.Progress.w=XCreateSimpleWindow(MAIN.dpy, RootWindow(MAIN.dpy, 0), 0, 0, PROGRESSW+LA_RH*2, LA_RH*2, 0, BlackPixel(MAIN.dpy, 0), WhitePixel(MAIN.dpy, 0));
     if(!MAIN.Progress.w) return;
     Atom window_type = XInternAtom(MAIN.dpy, "_NET_WM_WINDOW_TYPE", False); long value = XInternAtom(MAIN.dpy, "_NET_WM_WINDOW_TYPE_DOCK", False);
@@ -381,6 +490,7 @@ void la_InitProgressWindow(){
     XSetFillStyle(MAIN.dpy, MAIN.Progress.gc, FillSolid);
     XSetLineAttributes(MAIN.dpy, MAIN.Progress.gc, 2, LineSolid, CapButt, JoinBevel);
     XSync(MAIN.dpy,0);
+#endif
 }
 
 void laSetFontFolderPath(char* absolute){
@@ -389,7 +499,8 @@ void laSetFontFolderPath(char* absolute){
 }
 
 int laGetReadyWith(int GLMajor, int GLMinor, int BufferSamples){
-    Window root, win;
+#ifdef __linux__
+    SYSWINDOW root, win;
     GLint att[] = {GLX_RGBA, GLX_DEPTH_SIZE, 24, GLX_DOUBLEBUFFER, None};
     XSetWindowAttributes swa={0};
     XWindowAttributes wa={0};
@@ -488,6 +599,74 @@ int laGetReadyWith(int GLMajor, int GLMinor, int BufferSamples){
     MAIN.wmstate=XInternAtom(MAIN.dpy,"_NET_WM_STATE",1);
     MAIN.wmfullscr=XInternAtom(MAIN.dpy,"_NET_WM_STATE_FULLSCREEN",0);
     MAIN.wmfullscroff=XInternAtom(MAIN.dpy,"_NET_WM_STATE_FULLSCREEN",0);
+#endif //linux
+#ifdef _WIN32
+    MAIN.hinstance = GetModuleHandle(NULL);
+
+    HINSTANCE* hInst = &MAIN.hinstance;
+    WNDCLASSEX wt;
+    wt.cbSize = sizeof(WNDCLASSEX);
+    wt.cbClsExtra = 0;
+    wt.cbWndExtra = 0;
+    wt.hbrBackground = 0;
+    wt.hCursor = LoadCursor(*hInst, IDC_ARROW);
+    wt.hIcon = LoadIcon(*hInst, IDI_WINLOGO);
+    wt.hIconSm = LoadIcon(*hInst, IDI_WINLOGO);
+    wt.hInstance = *hInst;
+    wt.lpfnWndProc = LA_WindowProc;
+    wt.lpszClassName = LA_GUI_WNDCLASS_NAME;
+    wt.lpszMenuName = 0;
+    wt.style = CS_HREDRAW | CS_VREDRAW | CS_OWNDC;
+    if (!RegisterClassEx(&wt)) return 0;
+
+    MAIN.GLMajor = GLMajor; MAIN.GLMinor = GLMinor; MAIN.BufferSamples = BufferSamples;
+
+    GLenum err;
+    PIXELFORMATDESCRIPTOR pfd;
+    HINSTANCE* hinst = &MAIN.hinstance;
+    HWND hwnd = CreateWindowEx(WS_EX_ACCEPTFILES, LA_GUI_WNDCLASS_NAME,
+        "Temp Window For Accessing GLEW!",
+        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, 100, 100,
+        0, 0, *hinst, 0);
+    HDC hdc = GetDC(hwnd);
+    HGLRC hglrc = 0;
+
+    SetPixelFormat(hdc, 1, &cpfd);
+    hglrc = wglCreateContext(hdc);
+    wglMakeCurrent(hdc, hglrc);
+    //MAIN.hdc = hdc;
+   // MAIN.tWND = hwnd;
+    MAIN.glc = hglrc;
+
+    if (err = glewInit()) {
+        printf("Init Glew Failed\n");
+        printf("glewGetErrorString: %s\n", glewGetErrorString(err));
+        return 0;
+    }
+
+    wglMakeCurrent(0, 0);
+    wglDeleteContext(MAIN.glc);
+    ReleaseDC(hwnd, hdc);
+    DestroyWindow(hwnd);
+
+    int a, b;
+    hwnd = CreateWindowEx(WS_EX_ACCEPTFILES, LA_GUI_WNDCLASS_NAME,
+        "Temp Window For Accessing GLEW!",
+        WS_OVERLAPPEDWINDOW | WS_CLIPCHILDREN | WS_CLIPSIBLINGS, 0, 0, 100, 100,
+        0, 0, *hinst, 0);
+    hdc = GetDC(hwnd);
+    la_SetupPxlFormat(hdc, &a, &b);
+    GLint Attrib[] = { WGL_CONTEXT_MAJOR_VERSION_ARB, MAIN.GLMajor,
+        WGL_CONTEXT_MINOR_VERSION_ARB, MAIN.GLMinor,
+        WGL_CONTEXT_PROFILE_MASK_ARB, WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB, 0};
+    hglrc = wglCreateContextAttribsARB(hdc, 0, Attrib);
+
+    if (!hglrc) SEND_PANIC_ERROR("Can't Create Opengl Context!\n", );
+    MAIN.glc = hglrc;
+    MAIN.hdc = hdc;
+    wglMakeCurrent(hdc, hglrc);
+
+#endif
 
     la_GetWorkingDirectoryInternal();
 
@@ -594,6 +773,9 @@ int laGetReady(){
     return laGetReadyWith(3,3,0);
 }
 
+void la_DestroyUiType(laUiType* uit);
+void la_FreeKeyMapItem(laKeyMapItem* kmi);
+
 void laShutoff(int SavePrefereces){
     if(MAIN.SavePreferenceOnExit && SavePrefereces){ laSaveUserPreferences(); }
     transDumpMissMatchRecord("TranslationDump.txt");
@@ -636,7 +818,12 @@ void laShutoff(int SavePrefereces){
     hshFree(&MAIN.DBInstMemLeft);
     memNoLonger();
 
+#ifdef __linux__
     glXDestroyContext(MAIN.dpy,MAIN.glc);
+#endif
+#ifdef _WIN32
+    wglDeleteContext(MAIN.glc);
+#endif
 }
 
 void laSaveUserPreferences(){
@@ -693,7 +880,7 @@ void laSetPreferenceTemplates(laUiDefineFunc PreferencePageDisplay, laUiDefineFu
 
 //MSG====================================================
 
-int la_IsThisSysWindow(laWindow *wnd, Window hwnd){
+int la_IsThisSysWindow(laWindow *wnd, SYSWINDOW hwnd){
     if (wnd->win == hwnd) return 1;
     else return 0;
 };
@@ -773,18 +960,25 @@ void la_UpdateUiPlacement(laWindow *w){
         laRecalcPanel(p);
     }
 }
-void la_CommandResizeWindow(Window hwnd, int x, int y, int w, int h){
+void la_CommandResizeWindow(SYSWINDOW hwnd, int x, int y, int w, int h){
     laWindow *window = lstFindItem(hwnd, la_IsThisSysWindow, &MAIN.Windows);
     if (!window) return;
-    
+#ifdef _WIN32
+    RECT rc; GetClientRect(window->win, &rc);
+    window->CW = rc.right - rc.left;
+    window->CH = rc.bottom - rc.top;
+    window->X = rc.left; window->Y = rc.top;
+#endif
+#ifdef __linux__
     XWindowAttributes attr;
     XGetWindowAttributes(MAIN.dpy, window->win, &attr);
     window->CW = w; window->CH = h;
     window->W = w; window->H = h;
     window->X = x; window->Y = y;
+#endif
     la_UpdateUiPlacement(window);
 }
-int la_OnWindowDestroy(Window wnd){
+int la_OnWindowDestroy(SYSWINDOW wnd){
     laListHandle *hlst = &MAIN.Windows;
     laWindow *w = lstFindItem(wnd, la_IsThisSysWindow, hlst);
     if (!w) return 0;
@@ -802,22 +996,26 @@ int la_OnWindowDestroy(Window wnd){
 
     la_DestroyWindow(w);
 
+#ifdef __linux__
     int done=0; for(laWindow* w=MAIN.Windows.pFirst;w;w=w->Item.pNext){
         if(done) glXSwapIntervalEXTF(MAIN.dpy, w->win, 0);
         else { glXSwapIntervalEXTF(MAIN.dpy, w->win, 1); done=1; while(l=lstPopItem(&h)){ lstAppendItem(&w->Layouts, l); } }
     }
+#endif
 
     return 0;
 }
 
-void la_MakeSpecialKeyBit(Window hwnd,laWindow*wnd,laEvent *e,int use_last_pos){
+void la_MakeSpecialKeyBit(SYSWINDOW hwnd,laWindow*wnd,laEvent *e,int use_last_pos){
     laListHandle *el = &wnd->EventList;
     laEvent* last_e=el->pLast;
-    Window root_ret, win_ret; int rrx=0,rry=0,rx=e->x,ry=e->y,rmask=0;
+    SYSWINDOW root_ret, win_ret; int rrx=0,rry=0,rx=e->x,ry=e->y,rmask=0;
+#ifdef __linux__
     XQueryPointer(MAIN.dpy, wnd->win, &root_ret,&win_ret,&rrx,&rry,&rx,&ry,&rmask);
     e->SpecialKeyBit = ((rmask&ShiftMask)?LA_KEY_SHIFT:0)|((rmask&ControlMask)?LA_KEY_CTRL:0)|((rmask&Mod1Mask)?LA_KEY_ALT:0);
+#endif
 }
-void la_SaveEvent(Window hwnd, laEvent *e, int use_last_pos){
+void la_SaveEvent(SYSWINDOW hwnd, laEvent *e, int use_last_pos){
     laListHandle *wl = &MAIN.Windows;
     laWindow* wnd = lstFindItem(hwnd, la_IsThisSysWindow, wl);
     if (!wnd){ memFree(e); return; }
@@ -835,17 +1033,17 @@ void la_SaveEvent(Window hwnd, laEvent *e, int use_last_pos){
     lstAppendItem(el, (laListItem *)e);
     laMappingRequestEval();
 };
-void la_SendKeyboardEvent(Window hwnd, int type, int key){
+void la_SendKeyboardEvent(SYSWINDOW hwnd, int type, int key){
     laEvent *e = memAcquireSimple(sizeof(laEvent)); e->Type = type; e->key = key;
     la_SaveEvent(hwnd, e, 1);
 };
-void la_SendInputEvent(Window hwnd, uint32_t Input){
+void la_SendInputEvent(SYSWINDOW hwnd, uint32_t Input){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
     e->Type = LA_INPUT; e->Input=Input;
 
     la_SaveEvent(hwnd, e, 1);
 }
-void la_SendEmptyEvent(Window hwnd){
+void la_SendEmptyEvent(SYSWINDOW hwnd){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
 
     e->Type = LA_EMPTY;
@@ -857,6 +1055,7 @@ void laSendOperatorTriggerEvent(){
     MAIN.ReTriggerOperators = 0;
 }
 int la_TranslateSpecialKey(int keysym){
+#ifdef __linux__
     switch(keysym){
     case XK_Return:    return LA_KEY_ENTER;
     case XK_BackSpace: return LA_KEY_BACKSPACE;
@@ -875,8 +1074,9 @@ int la_TranslateSpecialKey(int keysym){
     case XK_Alt_R:     return LA_KEY_ALT;
     default:           return keysym;
     }
+#endif
 }
-void la_SendMouseEvent(Window hwnd, int type, int x, int y){
+void la_SendMouseEvent(SYSWINDOW hwnd, int type, int x, int y){
     //if((type&LA_STATE_DOWN)&&(x!=MAIN.evLastX || y!=MAIN.evLastY)){
     //    laEvent *e = memAcquireSimple(sizeof(laEvent));
     //    e->Type = LA_MOUSEMOVE; e->x = x; e->y = y;
@@ -888,7 +1088,7 @@ void la_SendMouseEvent(Window hwnd, int type, int x, int y){
     la_SaveEvent(hwnd, e, 0);
     MAIN.evLastX=x; MAIN.evLastY=y;
 };
-void la_SendTimerEvent(Window hwnd, int type){
+void la_SendTimerEvent(SYSWINDOW hwnd, int type){
     laEvent *e = memAcquireSimple(sizeof(laEvent));
     e->Type = type;
     la_SaveEvent(hwnd, e, 1);
@@ -1781,6 +1981,8 @@ void la_ClearUnusedFramebuffers(laWindow* w){
     }
 }
 
+void laDeferredDestroyPanel(laPanel* p, int immediate);
+
 void la_WindowDefDraw(laWindow *w, laBoxedTheme *bt){
     laPanel *p, *NextP;
     laLayout *l = w->CurrentLayout;
@@ -1870,9 +2072,13 @@ void la_WindowDefDraw(laWindow *w, laBoxedTheme *bt){
     }
 }
 int laStartWindow(laWindow *w){
-    //ShowWindow(w->win, SW_SHOWNORMAL);
+#ifdef __linux__
     XMapWindow(MAIN.dpy,w->win);
     glXMakeContextCurrent(MAIN.dpy, w->win,w->win, w->glc);
+#endif
+#ifdef _WIN32
+    ShowWindow(w->win, SW_SHOWNORMAL);
+#endif
     MAIN.CurrentWindow = w;
     if(!w->CurrentLayout){
         if(!w->Layouts.pFirst){laDesignLayout(w, "Empty Layout");}
@@ -1892,7 +2098,7 @@ void la_AssignWindowPP(laWindow* w){
 laWindow *laDesignWindow(int X, int Y, int W, int H){
     laWindow *n = memAcquire(sizeof(laWindow));
 
-    strSafeSet(&n->Title, "Empty Window");
+    strSafeSet(&n->Title, "Empty SYSWINDOW");
     n->X = X; n->Y = Y; n->W = W; n->H = H;
     n->OutputShowStripes=1;
     n->Redraw=1;
@@ -1908,8 +2114,10 @@ laWindow *laDesignWindow(int X, int Y, int W, int H){
     return n;
 }
 void laSetWindowCursor(int id){
+#ifdef __linux__
     Cursor c = XcursorLibraryLoadCursor(MAIN.dpy, la_ConvertCursorID(id));
     XDefineCursor(MAIN.dpy, MAIN.CurrentWindow->win, c);
+#endif
 };
 void la_AssignBlockPP(laBlock* b){
     b->PP.EndInstance = b;
@@ -3148,8 +3356,8 @@ int laCheckAndMergeSubColumnsUiList(laUiList *TopUil, laColumn *c, int DoMerge){
     return Occupied;
 }
 
-laPropContainer* laUiHasExtraProps(laUiType *ut, int size, int hyper){
-    ut->ExtraProps = laAddPropertyContainer(ut->Identifier, 0,0,L'◳',0,size,0,0,hyper);
+laPropContainer* laUiHasExtraProps(laUiType *ut, int size, int Hyper){
+    ut->ExtraProps = laAddPropertyContainer(ut->Identifier, 0,0,L'◳',0,size,0,0,Hyper);
     ut->FakeProp = memAcquire(sizeof(laSubProp));
     ut->FakeProp->Base.SubProp = ut->ExtraProps;
     ut->FakeProp->Base.Identifier = ut->Identifier;
@@ -3159,8 +3367,8 @@ laPropContainer* laUiHasExtraProps(laUiType *ut, int size, int hyper){
     //ut->FakeProp->Base.Container = ut->ExtraProps;
     return ut->ExtraProps;
 }
-laPropContainer* laCanvasHasExtraProps(laCanvasTemplate *ct, int size, int hyper){
-    ct->ExtraProps = laAddPropertyContainer(ct->Identifier->Ptr, 0,0,L'◳',0,size,0,0,hyper);
+laPropContainer* laCanvasHasExtraProps(laCanvasTemplate *ct, int size, int Hyper){
+    ct->ExtraProps = laAddPropertyContainer(ct->Identifier->Ptr, 0,0,L'◳',0,size,0,0,Hyper);
     ct->FakeProp = memAcquire(sizeof(laSubProp));
     ct->FakeProp->Base.SubProp = ct->ExtraProps;
     ct->FakeProp->Base.Identifier = ct->Identifier->Ptr;
@@ -4319,6 +4527,7 @@ int la_ShrinkableRowElements(laRowInfo* ri){
     }
     return count;
 }
+void la_RecordSocketRuntimePosition(laUiItem* ui);
 int la_CalculateRowExpand(laRowInfo* ri, laUiItem* ui_end, int WaitAnimation){
     int Available=ri->MaxW-ri->NonExpandW-ri->TotalPadding;
     int ShareCount=0, Additional=0, AdditionalRemaining=0, Shrinkable=0; real NodeAddFraction=0;
@@ -4383,6 +4592,7 @@ void la_RecordSocketRuntimePosition(laUiItem* ui){
 laUiList* la_GiveExistingPage(laListHandle* from, void* instance){
     for(laUiList* uil=from->pFirst;uil;uil=uil->Item.pNext){ if(uil->Instance == instance){ lstRemoveItem(from,uil); return uil; } } return 0;
 }
+void la_SwitchThemeQuick(laTheme* t, laTheme* DefaultTheme);
 int la_UpdateUiListRecursive(laUiList *uil, int U, int L, int R, int B, int Fast, laPanel *ParentPanel){
     laUiItem *ui; laListHandle TempPages={0}; laUiList* FoundUil;
     laBoxedTheme *bt;
@@ -6266,14 +6476,14 @@ void laFinalizeOperators(){
 
 //=================
 
-
+#ifdef __linux__
 static void la_RecordWacomMotions(XIRawEvent *event)
 {
     double *valuator = event->valuators.values;
     int IsStylus=event->deviceid==MAIN.WacomDeviceStylus;
     if(!IsStylus) MAIN.PointerIsEraser = 1; else MAIN.PointerIsEraser = 0;
 
-    //Window root_return, child_return;
+    //SYSWINDOW root_return, child_return;
     //int root_x_return, root_y_return;
     //int win_x_return, win_y_return;
     //unsigned int mask_return;
@@ -6290,7 +6500,95 @@ static void la_RecordWacomMotions(XIRawEvent *event)
 
     MAIN.IsPen=1;
 }
+#endif
+#ifdef _WIN32
+#define PARAM_2_FROM(p) LOWORD(p),HIWORD(p)
+LRESULT CALLBACK LA_WindowProc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam) {
+    char buf[4] = { 0 };
+    short wheelmark = 0;
+    int  WheelDir = 0;
+    if (!hwnd) return DefWindowProc(hwnd, message, wparam, lparam);
+    switch (message) {
+    case WM_PAINT:
+        //SwapBuffers(GetDC(hwnd));
+        break;
+    case WM_MOUSEMOVE:
+        la_SendMouseEvent(hwnd, LA_MOUSEMOVE, PARAM_2_FROM(lparam));
+        break;
+
+    case WM_LBUTTONDOWN:
+        la_SendMouseEvent(hwnd, LA_L_MOUSE_DOWN, PARAM_2_FROM(lparam));
+        break;
+
+    case WM_LBUTTONUP:
+        la_SendMouseEvent(hwnd, LA_L_MOUSE_UP, PARAM_2_FROM(lparam));
+        break;
+
+    case WM_RBUTTONDOWN:
+        la_SendMouseEvent(hwnd, LA_R_MOUSE_DOWN, PARAM_2_FROM(lparam));
+        break;
+
+    case WM_RBUTTONUP:
+        //PrintControllerStack();
+        la_SendMouseEvent(hwnd, LA_R_MOUSE_UP, PARAM_2_FROM(lparam));
+        break;
 
+    case WM_MOUSEWHEEL:
+        if ((wheelmark = HIWORD(wparam)) > 0) WheelDir = LA_MOUSEUP;
+        else if ((wheelmark = HIWORD(wparam)) < 0) WheelDir = LA_MOUSEDOWN;
+
+        la_SendMouseEvent(hwnd, WheelDir|LA_KEY_MOUSE_SCROLL, PARAM_2_FROM(lparam));
+
+        break;
+
+    case WM_SYSCOMMAND:
+        switch (wparam) {
+        case SC_MAXIMIZE:
+        case SC_RESTORE:
+            la_CommandResizeWindow(hwnd, 0, 0, LOWORD(lparam), HIWORD(lparam));
+            break;
+        case SC_KEYMENU:
+            return 0;
+        }
+        break;
+    case WM_SIZE:
+        la_CommandResizeWindow(hwnd, 0, 0, LOWORD(lparam), HIWORD(lparam));
+        break;
+
+    //case WM_SYSKEYDOWN:
+    //    if (lparam & 0x40000000) break;
+    //    if (la_SendSpecialKey(hwnd, LA_STATE_DOWN, wparam))
+    //        break;
+    //case WM_KEYDOWN:
+    //    if (lparam & 0x40000000) break;
+    //    la_SendSpecialKey(hwnd, LA_STATE_DOWN, wparam);
+    //    break;
+    //
+    //case WM_SYSKEYUP:
+    //    if (la_SendSpecialKey(hwnd, LA_STATE_UP, wparam));
+    //    break;
+    //case WM_KEYUP:
+    //    la_SendSpecialKey(hwnd, LA_STATE_UP, wparam);
+    //    break;
+
+    case WM_CHAR:
+        buf[0] = wparam;
+        la_SendInputEvent(hwnd, buf);
+        break;
+
+    case WM_SHOWWINDOW:
+        //SendCommandEvent(hwnd, EVT_WND_SIZE_FINISH);
+        break;
+
+    case WM_DESTROY:
+        la_OnWindowDestroy(hwnd);
+        break;
+    default:
+        return DefWindowProc(hwnd, message, wparam, lparam);
+    }
+    return DefWindowProc(hwnd, message, wparam, lparam);
+}
+#endif
 
 int la_UpdateOperatorHints(laWindow* w){
     laSafeString* ss=0;
@@ -6441,12 +6739,15 @@ int la_AllowInput(uint32_t ch){
     return 0;
 }
 int laCopyToClipboard(unsigned char * text){
-	XEvent event; Window owner, window=MAIN.CurrentWindow->win;
+#ifdef __linux__
+	XEvent event; SYSWINDOW owner, window=MAIN.CurrentWindow->win;
 	XSetSelectionOwner(MAIN.dpy, MAIN.selection, window, 0);
 	if (XGetSelectionOwner (MAIN.dpy, MAIN.selection) != window) return 0;
     strSafeSet(&MAIN.CopyPending, text);
+#endif
 }
 int la_ProcessSysMessage(){
+#ifdef __linux__
     XEvent e;
     int type;
 
@@ -6572,6 +6873,18 @@ int la_ProcessSysMessage(){
     }
 
     return 1;
+#endif //linux
+#ifdef _WIN32
+    MSG msg;
+    int Processed = 0;
+    if (PeekMessage(&msg, 0, 0, 0, PM_NOREMOVE) != 0)
+        Processed = 1;
+
+    while (PeekMessage(&msg, 0, 0, 0, PM_REMOVE)) {
+        TranslateMessage(&msg);
+        DispatchMessage(&msg);
+    };
+#endif
 };
 
 void la_PrintOperatorStack(){
@@ -6636,7 +6949,12 @@ void laMainLoop(){
         }
         for(w=MAIN.Windows.pFirst;w;w=w->Item.pNext){
             if(!w->RedrawTouched) continue; w->RedrawTouched=0;
+#ifdef __linux__
             glXSwapBuffers(MAIN.dpy, w->win); //XSync(MAIN.dpy,0);
+#endif
+#ifdef _WIN32
+            SwapBuffers(w->hdc);
+#endif
         }
 
         if(MAIN.PostFrame){ MAIN.PostFrame(); }
@@ -6647,8 +6965,10 @@ void laMainLoop(){
         Pause = (1.0 / MAIN.TopFramerate - TimeInterval);
 
         if (Pause > 0){
+#ifdef __linux__
             int ms = Pause * 1000000.0;
             usleep(ms);
+#endif
         }
 
         MAIN.TimeAccum += (MAIN.LastFrameTime = Pause+TimeInterval);

+ 1 - 3
la_tns.h

@@ -65,9 +65,6 @@ typedef float tnsVector3f[3];
 
 typedef int tnsVector2i[2];
 
-//typedef double tnsMatrix33d[9];
-//typedef double tnsMatrix44d[16];
-//
 typedef struct _tnsMatrixStackItem tnsMatrixStackItem;
 struct _tnsMatrixStackItem
 {
@@ -1265,6 +1262,7 @@ void tnsCopyScreenTo2DTexture(tnsTexture *target, int x_lower_left, int y_lower_
 void tnsActiveTexture(GLenum tex);
 void tnsBindTexture(tnsTexture *t);
 void tnsUnbindTexture();
+void tnsUniformUseNormal(tnsShader* s, int Use);
 void tnsUniformUseTexture(tnsShader* s, int mode, int sample);
 void tnsUniformColorMode(tnsShader *s, int mode);
 void tnsUniformHCYGamma(tnsShader* s, float Gamma);

+ 24 - 15
la_tns_kernel.c

@@ -125,8 +125,13 @@ void tnsSwitchToCurrentWindowContext(void *wnd){
 //
     //int s = wglMakeCurrent(hdc, hglrc);
     laWindow* win = wnd;
+#ifdef __linux__
     glXMakeCurrent(MAIN.dpy,win->win, MAIN.glc);//on intel it should not be win->glc?
     //glXMakeContextCurrent(MAIN.dpy, win->win, win->win, win->glc);
+#endif
+#ifdef _WIN32
+    wglMakeCurrent(win->hdc, win->glc);
+#endif
 };
 void tnsViewportWithScissor(int x, int y, int w, int h){
     tnsShader *current_shader = 0;
@@ -1346,6 +1351,7 @@ void tnsDeleteBuiltinShaders(){
     tnsDeleteShaderProgram(T->ShadowShader); T->ShadowShader=0;
     tnsDeleteShaderProgram(T->RayShader); T->RayShader=0;
 }
+void tnsQuitFontManager();
 void tnsQuit(){
     tnsQuitFontManager();
 
@@ -2566,8 +2572,8 @@ void tnsPassColorBetweenOffscreens(tnsOffscreen *from, tnsOffscreen *to,
         GL_COLOR_BUFFER_BIT, FilterMode);
 }
 void tnsDrawToScreen(){
-    glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
-    glDrawBuffer(GL_BACK);
+    glBindFramebuffer(GL_FRAMEBUFFER, 0);
+    //glDrawBuffer(GL_BACK); printf("%d\n", glGetError());
     T->IsOffscreen = 0;
     T->BindedShader = 0;
 }
@@ -2956,6 +2962,7 @@ int tnsStringGetWidthU(uint32_t *contentU, int Count, int UseMono){
 }
 
 int tnsDrawLCD7_ProgressX11(real x, real y, real Percent){
+#ifdef __linux__
     real hgap=LA_RH/15; real vgap=LA_RH/5;
     real MA=FM->UsingFont->MonoAdvance;
     real w=MA-hgap*2, h=LA_RH-vgap*2; y+=vgap; x+=hgap-MA; real shear=h/12;
@@ -2977,6 +2984,8 @@ int tnsDrawLCD7_ProgressX11(real x, real y, real Percent){
         x-=MA;
     }
     return 1;
+#endif
+    return 0;
 }
 int tnsMakeLCD7(real x, real y, real w, real h, int ch){
     int uc=ch; real shear=h/12;
@@ -3262,7 +3271,7 @@ void tnsGlobalTransformValueChanged(tnsObject* o){
 void tnsSetCurrentRoot(tnsObject *o){
     if(o->Type!=TNS_OBJECT_ROOT) return;
     T->World.ActiveRoot=o;
-    // memAssignRef(s, &s->CurrentObject, o); we can't use this apparently because World is not hyper 2.
+    // memAssignRef(s, &s->CurrentObject, o); we can't use this apparently because World is not Hyper 2.
     // XXX: Needs fake mempool/user, or T->World prop redesign because T is runtime allocated.
 }
 void tnsInitObjectBase(tnsObject *o, tnsObject *under, char *Name, int Type,
@@ -3792,27 +3801,27 @@ tnsMaterial *tnsFindMaterial(char *name){
 extern LA MAIN;
 
 void tnssRGB2XYZ(tnsVector3d rgb,tnsVector3d xyz){
-	tnsMatrix44d mat={{0.4124564,0.3575761,0.1804375,0},
-				      {0.2126729,0.7151522,0.0721750,0},
-				      {0.0193339,0.1191920,0.9503041,0},{0,0,0,0}};
+	tnsMatrix44d mat={0.4124564,0.3575761,0.1804375,0,
+				      0.2126729,0.7151522,0.0721750,0,
+				      0.0193339,0.1191920,0.9503041,0,0,0,0,0};
     tnsApplyRotation33d(xyz,mat,rgb);
 }
 void tnsClay2XYZ(tnsVector3d rgb,tnsVector3d xyz){
-	tnsMatrix44d mat={{0.5767309,0.1855540,0.1881852,0},
-				      {0.2973769,0.6273491,0.0752741,0},
-				      {0.0270343,0.0706872,0.9911085,0},{0,0,0,0}};
+	tnsMatrix44d mat={0.5767309,0.1855540,0.1881852,0,
+				      0.2973769,0.6273491,0.0752741,0,
+				      0.0270343,0.0706872,0.9911085,0,0,0,0,0};
     tnsApplyRotation33d(xyz,mat,rgb);
 }
 void tnsXYZ2sRGB(tnsVector3d xyz,tnsVector3d rgb){
-	tnsMatrix44d mat={{3.2404542,-1.5371385,-0.4985314,0},
-				      {-0.9692660,1.8760108,0.0415560,0},
-				      {0.0556434,-0.2040259,1.0572252,0},{0,0,0,0}};
+	tnsMatrix44d mat={3.2404542,-1.5371385,-0.4985314,0,
+				      -0.9692660,1.8760108,0.0415560,0,
+				      0.0556434,-0.2040259,1.0572252,0,0,0,0,0};
     tnsApplyRotation33d(rgb,mat,xyz);
 }
 void tnsXYZ2Clay(tnsVector3d xyz,tnsVector3d rgb){
-	tnsMatrix44d mat={{2.0413690,-0.5649464,-0.3446944},
-                      {-0.9692660,1.8760108,0.0415560},
-                      {0.0134474,-0.1183897,1.0154096},{0,0,0,0}};
+	tnsMatrix44d mat={2.0413690,-0.5649464,-0.3446944,0,
+                      -0.9692660,1.8760108,0.0415560,0,
+                      0.0134474,-0.1183897,1.0154096,0,0,0,0,0};
     tnsApplyRotation33d(rgb,mat,xyz);
 }
 

+ 12 - 5
la_util.c

@@ -62,7 +62,9 @@ struct tm *laGetFullTime(){
 }
 
 void laRecordTime(laTimeRecorder *tr){
+#ifdef __linux__
     clock_gettime(CLOCK_REALTIME, &tr->ts);
+#endif
 }
 real laTimeElapsedSecondsf(laTimeRecorder *End, laTimeRecorder *Begin){
     real sec=End->ts.tv_sec-Begin->ts.tv_sec; sec+=((End->ts.tv_nsec-Begin->ts.tv_nsec)/1e9);
@@ -74,8 +76,8 @@ void laSetAuthorInfo(char *Name, char *CopyrightString){
     strSafeSet(&MAIN.Author.CopyrightString, CopyrightString);
 }
 
-void memCreateNUID(char* buf,laMemNodeHyper* hyper){
-    sprintf(buf, "%08X-%hd%02hd%02hd%02hd%02hd%02hd", hyper, LA_HYPER_CREATED_TIME(hyper));
+void memCreateNUID(char* buf,laMemNodeHyper* Hyper){
+    sprintf(buf, "%08X-%hd%02hd%02hd%02hd%02hd%02hd", Hyper, LA_HYPER_CREATED_TIME(Hyper));
 }
 
 void memHyperInfo(laPropPack* pp, char* buf){
@@ -119,9 +121,9 @@ void memMakeHyperData(laMemNodeHyper* hi){
     memCreateNUID(hi->NUID.String,hi);
 }
 void memMarkClean(void* HyperUserMem){
-    int hyper=0;
-    laMemNodeHyper* h = memGetHead(HyperUserMem, &hyper);
-    if(hyper!=2) return;
+    int Hyper=0;
+    laMemNodeHyper* h = memGetHead(HyperUserMem, &Hyper);
+    if(Hyper!=2) return;
     h->Modified=0;
 }
 
@@ -2031,6 +2033,10 @@ void strMoveView(laStringEdit *se, int DownLines, int RightCharacters){
 }
 
 int laCopyFile(char *to, char *from){
+#ifdef _WIN32
+    if(CopyFile(from, to, 0)) return 1; return 0;
+#endif
+#ifdef __linux__
     int fd_to, fd_from; char buf[4096];
     ssize_t nread; int saved_errno;
 
@@ -2057,6 +2063,7 @@ out_error:
     close(fd_from); if (fd_to >= 0) close(fd_to);
     errno = saved_errno;
     return -1;
+#endif //linux
 }
 
 //======================================================[ translation ]

+ 20 - 2
la_util.h

@@ -29,11 +29,29 @@
 #include "ft2build.h"
 #include "freetype/freetype.h"
 #include "la_icon.h"
-#include "pthread.h"
+#include <stddef.h>
+#include <stdint.h>
+#ifdef __linux__
 #include <fcntl.h>
 #include <unistd.h>
 #include <errno.h>
 #include <wchar.h>
+#define SYSWINDOW Window
+#define SYSGLCONTEXT GLXContext
+#define SYSTEMDC DC
+#define SYSTEMRC RC
+#define SYSTEMDISPLAY Display
+#endif
+#ifdef _WIN32
+#include <Windows.h>
+#define SYSWINDOW HWND
+#define SYSGLCONTEXT HGLRC
+#define SYSTEMDC HDC
+#define SYSTEMRC HRC
+#define SYSTEMDISPLAY int
+#define PATH_MAX 4096
+#endif
+
 
 #define NEED_STRUCTURE(a) \
 typedef struct _##a a;
@@ -420,7 +438,7 @@ int laTimeElapsedMilliseconds(laTimeRecorder* End, laTimeRecorder* Begin);
 
 void laSetAuthorInfo(char * Name, char * CopyrightString);
 
-void memCreateNUID(char* buf,laMemNodeHyper* hyper);
+void memCreateNUID(char* buf,laMemNodeHyper* Hyper);
 
 NEED_STRUCTURE(laPropPack);
 

+ 38 - 21
lagui-config.cmake

@@ -14,27 +14,44 @@ find_package(Freetype REQUIRED)
 find_package(GLEW REQUIRED)
 find_package(PNG REQUIRED)
 
-set(LAGUI_SHARED_LIBS
-    ${X11_LIBRARIES}
-    ${X11_X11_LIB}
-    ${GLEW_LIBRARIES}
-    ${OPENGL_LIBRARY}
-    ${FREETYPE_LIBRARIES}
-    ${X11_Xfixes_LIB}
-    ${PNG_LIBRARY}
-    m X11 Xi Xcursor
-    lagui
-    CACHE INTERNAL "LaGUI shared libs"
-)
-
-set(LAGUI_INCLUDE_DIRS_ALL
-    ${CMAKE_SOURCE_DIR}
-    ${X11_INCLUDE_DIR}
-    ${GLEW_INCLUDE_PATH}
-    ${FREETYPE_INCLUDE_DIRS}
-    ${LAGUI_INCLUDE_DIRS}
-    CACHE INTERNAL "Include dirs of LaGUI and dependencies"
-)
+if (CMAKE_SYSTEM_NAME MATCHES "Linux")
+    set(LAGUI_SHARED_LIBS
+        ${X11_LIBRARIES}
+        ${X11_X11_LIB}
+        ${GLEW_LIBRARIES}
+        ${OPENGL_LIBRARY}
+        ${FREETYPE_LIBRARIES}
+        ${X11_Xfixes_LIB}
+        ${PNG_LIBRARY}
+        m X11 Xi Xcursor
+        lagui
+        CACHE INTERNAL "LaGUI shared libs"
+    )
+    set(LAGUI_INCLUDE_DIRS_ALL
+        ${CMAKE_SOURCE_DIR}
+        ${X11_INCLUDE_DIR}
+        ${GLEW_INCLUDE_PATH}
+        ${FREETYPE_INCLUDE_DIRS}
+        ${LAGUI_INCLUDE_DIRS}
+        CACHE INTERNAL "Include dirs of LaGUI and dependencies"
+    )
+elseif (CMAKE_SYSTEM_NAME MATCHES "Windows")
+    set(LAGUI_SHARED_LIBS
+        ${GLEW_LIBRARIES}
+        ${OPENGL_LIBRARY}
+        ${FREETYPE_LIBRARIES}
+        ${PNG_LIBRARY}
+        lagui
+        CACHE INTERNAL "LaGUI shared libs"
+    )
+    set(LAGUI_INCLUDE_DIRS_ALL
+        ${CMAKE_SOURCE_DIR}
+        ${GLEW_INCLUDE_PATH}
+        ${FREETYPE_INCLUDE_DIRS}
+        ${LAGUI_INCLUDE_DIRS}
+        CACHE INTERNAL "Include dirs of LaGUI and dependencies"
+    )
+endif()
 
 # Build Types
 set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}

+ 2 - 2
resources/la_modelling.c

@@ -38,11 +38,11 @@ int OPINV_SetCursor(laOperator *a, laEvent *e){
     {
         if(!ex->ViewingCamera){ return LA_FINISHED_PASS; }
         real vv[4], gp[4]; tnsMatrix44d proj; tnsMatrix44d inv;
-        real focus=ex->ViewingCamera->FocusDistance, near=ex->ViewingCamera->ZMin, far=ex->ViewingCamera->ZMax;
+        real focus=ex->ViewingCamera->FocusDistance, _near=ex->ViewingCamera->ZMin, _far=ex->ViewingCamera->ZMax;
         tnsGetCameraViewProjection(proj,ui->R-ui->L,ui->B-ui->U,ex->ViewingCamera); tnsInverse44d(inv,proj);
         vv[0]=(real)(e->x-ui->L)/(real)(ui->R-ui->L)*2-1; vv[0]*=focus;
         vv[1]=(real)(ui->B-e->y)/(real)(ui->B-ui->U)*2-1; vv[1]*=focus;
-        vv[2]=tnsGetRatiod(1/near,1/far,1/focus)*focus;
+        vv[2]=tnsGetRatiod(1/_near,1/_far,1/focus)*focus;
         vv[3]=focus;
         tnsApplyTransform44dTrue(gp, inv, vv);
         tnsVectorMultiSelf3d(gp,1/gp[3]);

+ 36 - 29
resources/la_operators.c

@@ -195,7 +195,8 @@ void la_FileBrowserRebuildList(laFileBrowser *fb){
     real Ratio = 0;
 
     if (fb->Path[len - 1] != L'/') strcat(fb->Path, "/");
-    
+
+#ifdef __linux__
     struct dirent **NameList=0;
     int NumFiles=scandir(fb->Path,&NameList,0,alphasort);
 
@@ -234,33 +235,33 @@ void la_FileBrowserRebuildList(laFileBrowser *fb){
             //lstAppendItem(&fb->FileList, fi);
         }
     }
+    for (int i = 0; i < NumFiles; i++) { free(NameList[i]); } free(NameList);
+#endif
 
     lstCombineLists(&fb->FileList, &Files);
-    
-    for (int i=0;i<NumFiles;i++){ free(NameList[i]); } free(NameList);
 
     while (dl = lstPopItem(&fb->Disks)) memFree(dl);
 
-    //NumDisks = GetLogicalDriveStrings(256, DiskLabels) / 4;
-
-    //while (*pd)
-    //{
-    //    char Name[3] = "*:";
-    //    Name[0] = *pd;
-    //    if (GetDiskFreeSpaceEx(Name, &FreeAvailable, &TotalSpace, &FreeSpace_UNUSED))
-    //    {
-    //        dl = memAcquireSimple(sizeof(laDiskItem));
-    //        dl->ID = *pd;
-    //        dl->Total_GB = (real)TotalSpace / 1073741824.0f;   //B->GB
-    //        dl->Free_GB = (real)FreeAvailable / 1073741824.0f; //B->GB
-
-    //        if (Name[0] == fb->Path[0])
-    //            fb->RootDisk = dl;
-
-    //        lstAppendItem(&fb->Disks, dl);
-    //    }
-    //    pd += 4;
-    //}
+    NumDisks = GetLogicalDriveStrings(256, DiskLabels) / 4;
+
+#ifdef _WIN32
+    while (*pd){
+        char Name[3] = "*:";
+        Name[0] = *pd;
+        if (GetDiskFreeSpaceEx(Name, &FreeAvailable, &TotalSpace, &FreeSpace_UNUSED)){
+            dl = memAcquireSimple(sizeof(laDiskItem));
+            dl->ID = *pd;
+            dl->Total_GB = (real)TotalSpace / 1073741824.0f;   //B->GB
+            dl->Free_GB = (real)FreeAvailable / 1073741824.0f; //B->GB
+
+            if (Name[0] == fb->Path[0])
+                fb->RootDisk = dl;
+
+            lstAppendItem(&fb->Disks, dl);
+        }
+        pd += 4;
+    }
+#endif
 
     fb->Active = 0;
 }
@@ -455,10 +456,12 @@ int OPINV_FileBrowserConfirm(laOperator *a, laEvent *e){
         laFileBrowser* fb=a->This->LastPs->UseInstance;
         if(fb->WarnFileExists){
             char path[2048]; la_FileBrowserGetFullPath(fb, path);
+#ifdef __linux__
             if(access(path, F_OK)==0){
                 laEnableYesNoPanel(a,0,"File exists","Selected file already exists. Overwrite the file?",e->x-LA_RH,e->y-LA_RH,200,e);
                 fb->StatusWaitingWarning=1; return LA_RUNNING;
             }
+#endif
         }
         laConfirmInt(a, 0, LA_CONFIRM_OK); return LA_FINISHED_PASS;
     }
@@ -478,6 +481,7 @@ int OPMOD_FileBrowserConfirm(laOperator *a, laEvent *e){
     return LA_RUNNING;
 }
 
+void la_DestroyUDFContentNodeTreeRecursive(laUDFContentNode* ucn, int FreeRoot);
 int OPEXT_UDFOperation(laOperator *a, laEvent *e){
     laUDFPreviewExtra *upe = a->CustomData;
     laUDFContentNode *ucni, *NextUCNI;
@@ -513,7 +517,6 @@ int OPMOD_UDFRead(laOperator *a, laEvent *e){
 
     return LA_RUNNING;
 }
-void la_DestroyUDFContentNodeTreeRecursive(laUDFContentNode *ucn, int FreeRoot);
 int OPINV_UDFSaveInstance(laOperator *a, laEvent *e){
     laInvoke(a, "LA_file_dialog", e, 0, 0, 0);
     a->CustomData = memAcquireSimple(sizeof(laUDFPreviewExtra));
@@ -981,12 +984,14 @@ int OPINV_Fullscreen(laOperator *a, laEvent *e){
     int full=1;
     if(strArgumentMatch(a->ExtraInstructionsP,"restore","true")){ full=0; }
     if(strArgumentMatch(a->ExtraInstructionsP,"toggle","true")){ full=w->IsFullScreen?0:1; }
+#ifdef __linux__
     XClientMessageEvent msg = {
         .type = ClientMessage, .display = MAIN.dpy, .window = w->win,
         .message_type = XInternAtom(MAIN.dpy, "_NET_WM_STATE", True), .format = 32,
         .data = {.l = {full, XInternAtom(MAIN.dpy, "_NET_WM_STATE_FULLSCREEN", True), None, 0, 1 }}
     };
     XSendEvent(MAIN.dpy, XRootWindow(MAIN.dpy, XDefaultScreen(MAIN.dpy)), False, SubstructureRedirectMask | SubstructureNotifyMask, (XEvent*) &msg);
+#endif
     w->IsFullScreen=full;
     laRedrawCurrentWindow();
     return LA_FINISHED;
@@ -1480,7 +1485,9 @@ int la_GenericTopPanelProcessing(laOperator* a, laEvent* e){
     return 0;
 }
 int la_GeneratePasteEvent(laWindow* w){
+#ifdef __linux__
     XConvertSelection(MAIN.dpy, MAIN.bufid, MAIN.fmtid, MAIN.propid, w->win, CurrentTime);
+#endif
 }
 int OPINV_SystemPaste(laOperator *a, laEvent *e){ la_GeneratePasteEvent(MAIN.CurrentWindow); return LA_FINISHED; }
 int OPINV_Window(laOperator *a, laEvent *e){
@@ -2027,15 +2034,15 @@ void la_RegisterBuiltinOperators(){
 
     laCreateOperatorType("LA_translation_dump", "Dump Untranslated Text", "Dump Untranslated Text To File", 0, 0, 0, OPINV_TranslationDumpMisMatch, 0, L'📥', LA_ACTUATOR_SYSTEM);
     laCreateOperatorType("LA_open_internet_link", "Goto", "Open Internet Link", 0, 0, 0, OPINV_OpenInternetLink, 0, L'🌐', LA_ACTUATOR_SYSTEM);
-    laCreateOperatorType("LA_system_paste", "Window Paste", "Generate a syetem paste event",  0, 0, 0, OPINV_SystemPaste, 0, L'📋', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
+    laCreateOperatorType("LA_system_paste", "SYSWINDOW Paste", "Generate a syetem paste event",  0, 0, 0, OPINV_SystemPaste, 0, L'📋', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
     laCreateOperatorType("LA_string_copy", "Copy", "Copy string to clip board", 0, 0, 0, OPINV_StringCopy, 0, L'🗍', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
 
-    laCreateOperatorType("LA_window_operator", "Window Operator", "Handle All Unhandled Events",  0, 0, 0, OPINV_Window, OPMOD_Window, L'🖦', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
+    laCreateOperatorType("LA_window_operator", "SYSWINDOW Operator", "Handle All Unhandled Events",  0, 0, 0, OPINV_Window, OPMOD_Window, L'🖦', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
 
-    at = laCreateOperatorType("LA_switch_layout", "Switch Layout", "Cycle All Layouts In Current Window", 0, 0, 0, OPINV_SwitchLayout, OPMOD_FinishOnData, L'↔', LA_ACTUATOR_SYSTEM);
+    at = laCreateOperatorType("LA_switch_layout", "Switch Layout", "Cycle All Layouts In Current SYSWINDOW", 0, 0, 0, OPINV_SwitchLayout, OPMOD_FinishOnData, L'↔', LA_ACTUATOR_SYSTEM);
     at->UiDefine=laui_LayoutCycle;
 
-    at = laCreateOperatorType("LA_new_window", "New Window", "Create a new window", 0, 0, 0, OPINV_NewWindow, 0, L'🗗', LA_ACTUATOR_SYSTEM);
+    at = laCreateOperatorType("LA_new_window", "New SYSWINDOW", "Create a new window", 0, 0, 0, OPINV_NewWindow, 0, L'🗗', LA_ACTUATOR_SYSTEM);
 
     laCreateOperatorType("LA_combine_child_blocks", "Combine Child Block", "If Child Blocks Are Two Panel Blocks, Then Combine Them.",
                           OPCHK_CombineChildBlocks, 0, 0, OPINV_CombineChildBlocks, 0, L'□' , LA_ACTUATOR_SYSTEM);
@@ -2147,7 +2154,7 @@ void la_RegisterBuiltinOperators(){
             laAddEnumItemAs(ep, "meta", "Meta Data", "Meta Data Package", LA_FILETYPE_META, L'🖹');
             laAddEnumItemAs(ep, "blend", "Blend", "Blend File", LA_FILETYPE_BLEND, L'🖹');
             laAddEnumItemAs(ep, "pdf", "PDF", "PDF File", LA_FILETYPE_PDF, L'🖹');
-            laAddEnumItemAs(ep, "exe", "Executable", "Window Executable", LA_FILETYPE_EXEC, L'🖦');
+            laAddEnumItemAs(ep, "exe", "Executable", "SYSWINDOW Executable", LA_FILETYPE_EXEC, L'🖦');
             laAddEnumItemAs(ep, "sys", "System", "System Files", LA_FILETYPE_SYS, L'🖹');
             laAddEnumItemAs(ep, "folder", "Folder", "Folder", LA_FILETYPE_FOLDER, L'📁');
             laAddEnumItemAs(ep, "lasdexchange", "LaSDExchange", "LA Scene Descriptive Exchange File", LA_FILETYPE_LASDEXCHANGE, 0);

+ 7 - 5
resources/la_properties.c

@@ -655,7 +655,9 @@ void lapost_Panel(laPanel *p){
     }
     if(p->IsMenuPanel){ laui_DefaultMenuBarActual(&p->TitleBar, &p->PP, &p->PropLinkPP, 0, 0); }
     //if(p->Title) p->TitleWidth = tnsStringGetWidth(transLate(p->Title->Ptr), 0, 0);
+#ifdef __linux__
     XSync(MAIN.dpy,0);
+#endif
 }
 void lapost_Block(laBlock *b){
     la_AssignBlockPP(b);
@@ -1152,17 +1154,17 @@ void la_RegisterInternalProps(){
 
         // UI WINDOW ========================================================================================
 
-        p = laAddPropertyContainer("ui_window", "Window Node", "Property Container For A System Window", 0,0, sizeof(laWindow), lapost_Window, lapostim_Window,1);{
+        p = laAddPropertyContainer("ui_window", "SYSWINDOW Node", "Property Container For A System SYSWINDOW", 0,0, sizeof(laWindow), lapost_Window, lapostim_Window,1);{
             laAddStringProperty(p, "title", "Title", "The Title/Name Of A Panel", 0,0,0,0,1, offsetof(laWindow, Title), 0,0,0,0,LA_AS_IDENTIFIER);
-            laAddSubGroup(p, "layouts", "Layouts", "Layout List Of The Whole Window", "ui_layout",0,0,0,offsetof(laWindow, CurrentLayout), laget_WindowFirstLayout, laget_WindowActiveLayout,laget_ListNext, 0,0,laset_WindowActiveLayout, offsetof(laWindow, Layouts), 0);
+            laAddSubGroup(p, "layouts", "Layouts", "Layout List Of The Whole SYSWINDOW", "ui_layout",0,0,0,offsetof(laWindow, CurrentLayout), laget_WindowFirstLayout, laget_WindowActiveLayout,laget_ListNext, 0,0,laset_WindowActiveLayout, offsetof(laWindow, Layouts), 0);
             _LA_PROP_PANEL = laAddSubGroup(p, "panels", "Panels", "Panel list of this window", "ui_panel",0,0,0,-1,laget_SavePanel,0,lagetnext_SavePanel,0,0,0,offsetof(laWindow, Panels), 0);
             la_UDFAppendSharedTypePointer("_LA_PROP_PANEL", _LA_PROP_PANEL);
             laAddSubGroup(p, "maximized_block", "Maximized Block", "Maximized block in this window", "ui_block",0,0,0,offsetof(laWindow, MaximizedBlock), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
             laAddSubGroup(p, "maximized_ui", "Maximized Ui", "Maximized ui in this window", "ui_item",0,0,0,offsetof(laWindow, MaximizedUi), 0,0,0,0,0,0,0,LA_UDF_REFER|LA_UDF_IGNORE);
             laAddSubGroup(p, "panels_hidden", "Hidden Panels", "Hidden panels of this window", "ui_panel",0,0,0,-1, laget_FirstHiddenPanel, 0,laget_NextHiddenPanel, laset_WindowHiddenPanel, 0,0,0,LA_UDF_IGNORE);
-            laAddIntProperty(p, "position", "Position", "The Position Of A Window", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laWindow, X), 0,0,2, 0,0,0,0,0,0,0,0);
-            laAddIntProperty(p, "size", "Size", "The Size Of A Window", 0,"W,H", "px", 0,0,0,0,0,offsetof(laWindow, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
-            laAddIntProperty(p, "client_size", "Client Area Size", "Display Canvans Size Of A Window", 0,"W,H", "px", 0,0,1, 0,0,offsetof(laWindow, CW), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "position", "Position", "The Position Of A SYSWINDOW", 0,"X,Y", "px", 0,0,1, 0,0,offsetof(laWindow, X), 0,0,2, 0,0,0,0,0,0,0,0);
+            laAddIntProperty(p, "size", "Size", "The Size Of A SYSWINDOW", 0,"W,H", "px", 0,0,0,0,0,offsetof(laWindow, W), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
+            laAddIntProperty(p, "client_size", "Client Area Size", "Display Canvans Size Of A SYSWINDOW", 0,"W,H", "px", 0,0,1, 0,0,offsetof(laWindow, CW), 0,0,2, 0,0,0,0,0,0,0,LA_READ_ONLY);
             laAddStringProperty(p, "operator_hints", "Operator Hints", "Operator hints if there's any", LA_WIDGET_STRING_PLAIN, 0,0,0,1, offsetof(laWindow, OperatorHints), 0,0,0,0,LA_READ_ONLY|LA_UDF_IGNORE);
             ep = laAddEnumProperty(p, "output_color_space", "Output Color Space", "Output color space of this window, set this to the monitor's color space to get accurate result", 0,0,0,0,0,offsetof(laWindow, OutputColorSpace), 0,laset_WindowColorSpace, 0,0,0,0,0,0,0,0);{
                 laAddEnumItemAs(ep, "SRGB", "sRGB", "Standard sRGB diplay", TNS_COLOR_SPACE_SRGB, 0);

+ 1 - 1
resources/la_tns_shaders.cpp

@@ -472,7 +472,7 @@ vec3 okhsv_to_srgb(vec3 hsv){
 		srgb_transfer_function(rgb.g),
 		srgb_transfer_function(rgb.b)
 	);
-}
+})" R"(
 vec3 srgb_to_okhsv(vec3 rgb){
 	vec3 lab = linear_srgb_to_oklab(vec3(
 		srgb_transfer_function_inv(rgb.r),

+ 2 - 2
resources/la_translations.c

@@ -57,7 +57,7 @@ static const char *entries[]={
 "Log","对数",
 "Tangent","正切",
 "Subtract","相减",
-"Cycle All Layouts In Current Window","在当前窗口中循环所有布局",
+"Cycle All Layouts In Current SYSWINDOW","在当前窗口中循环所有布局",
 "The Title/Name Of A Panel","面板的标题/名字",
 "Themes Loaded In The Program","该程序已加载的主题",
 "Arcsin","反正弦",
@@ -206,7 +206,7 @@ static const char *entries[]={
 "Wire saggyness","连线松弛程度",
 "Inactive Saturation","未激活饱和度",
 "Get Folder Path","获得文件夹路径",
-"New Window","新窗口",
+"New SYSWINDOW","新窗口",
 "Resource Folders","资源文件夹",
 "Basics:","基础:",
 "Selected Edge Transparency","已选择边的透明度",