*/}}
Просмотр исходного кода

New structure and improving external content api

Yiming Wu 1 год назад
Родитель
Сommit
63b1b08201
10 измененных файлов с 220 добавлено и 119 удалено
  1. 4 0
      .gitignore
  2. 25 1
      CMakeLists.txt
  3. 6 0
      la_data.c
  4. 5 0
      la_data.h
  5. 9 0
      la_interface.h
  6. 5 2
      la_kernel.c
  7. 7 29
      la_util.c
  8. 3 17
      la_util.h
  9. 94 0
      lagui-config.cmake
  10. 62 70
      resources/la_templates.c

+ 4 - 0
.gitignore

@@ -0,0 +1,4 @@
+build/*
+.vscode/
+screenshots/
+*.udf

+ 25 - 1
CMakeLists.txt

@@ -1,5 +1,14 @@
 cmake_minimum_required(VERSION 3.1)
-#project (lagui)
+project (lagui)
+
+if (POLICY CMP0072)
+  set(OpenGL_GL_PREFERENCE GLVND)
+endif()
+
+find_package(OpenGL REQUIRED)
+find_package(X11 REQUIRED)
+find_package(Freetype REQUIRED)
+find_package(GLEW REQUIRED)
 
 file(GLOB_RECURSE SOURCE_FILES 
 	./**.c
@@ -12,4 +21,19 @@ file(GLOB_RECURSE HEADER_FILES
 
 add_definitions(-w)
 
+include_directories(
+	${CMAKE_SOURCE_DIR}
+	${X11_INCLUDE_DIR}
+	${GLEW_INCLUDE_PATH}
+	${GLM_INCLUDE_PATH}
+	${FREETYPE_INCLUDE_DIRS}
+    ${ODE_INCLUDE_DIRS}
+    lagui
+)
+
 add_library(lagui ${HEADER_FILES} ${SOURCE_FILES})
+
+install(FILES ${HEADER_FILES} DESTINATION include/lagui)
+install(TARGETS lagui EXPORT lagui-targets DESTINATION lib/lagui)
+install(EXPORT lagui-targets DESTINATION lib/lagui)
+install(FILES lagui-config.cmake DESTINATION lib/lagui)

+ 6 - 0
la_data.c

@@ -3,6 +3,12 @@
 
 extern LA MAIN;
 
+const char* LA_UDF_EXTENSION_STRINGS[]={
+    "LA_UDF_EXTENSION_FLOAT32",
+    "LA_UDF_EXTENSION_RAW",
+    "",
+};
+
 int la_IsThisProp(laProp *p, char *id){
     return (!strcmp(p->Identifier, id));
 }

+ 5 - 0
la_data.h

@@ -608,6 +608,11 @@ STRUCTURE(laDiffPost){
 /* Only little endian are supported right now */
 #define LA_UDF_IDENTIFIER "UDF_LE"
 
+#define LA_UDF_EXTENSION_FLOAT32 (1<<0)
+#define LA_UDF_EXTENSION_RAW (1<<1)
+
+#define LA_UDF_EXTENSION_BITS 0
+
 #define LA_UDF_MARK_TIMESTAMP 3
 
 #define LA_UDF_MODE_APPEND 0

+ 9 - 0
la_interface.h

@@ -315,6 +315,9 @@ STRUCTURE(LA){
     
     laListHandle PanelTemplates;
     laListHandle View2DTemplates;
+    laUiDefineFunc MenuButtons;
+    laUiDefineFunc MenuExtras;
+    const char* MenuProgramName;
 
     laHash256 GlobalMemPool;
     int ByteCount;
@@ -1432,6 +1435,10 @@ void laui_LinkerSelectionProp(laUiList *uil, laPropPack *Base, laPropPack *Opera
 void laui_LinkerSelectionInstance(laUiList *uil, laPropPack *Base, laPropPack *OperatorInst, laColumn *ExtraColumns, int context);
 void laui_DefaultOperatorPanelTitleBar(laUiList *uil, laPropPack *Base, laPropPack *OperatorInst, laColumn *ExtraColumns, int context);
 void laui_ColumnItem(laUiList *uil, laPropPack *Base, laPropPack *UNUSED_This, laColumn *UNUSED_Colums, int context);
+void laui_DefaultMenuButtonsFileEntries(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context);
+void laui_DefaultMenuButtonsOptionEntries(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context);
+void laui_DefaultMenuButtons(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context);
+void laui_DefaultMenuExtras(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context);
 void laui_DefaultMenuBarActual(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context);
 void laui_DefaultSubWindowMenuBarActual(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context);
 void laui_ThemeListItem(laUiList *uil, laPropPack *Base, laPropPack *UNUSED_This, laColumn *UNUSED_Colums, int context);
@@ -1749,6 +1756,8 @@ laUiList *la_DetectUiListRecursiveDeep(laUiList *uil, int x, int y, int LimH, la
 
 int laStartWindow(laWindow *w);
 
+void laSetMenuBarTemplates(laUiDefineFunc MenuButtons, laUiDefineFunc MenuExtras, const char* ProgramName);
+
 void laMainLoop();
 
 void la_DestroyOperatorType(laOperatorType* at);

+ 5 - 2
la_kernel.c

@@ -433,6 +433,8 @@ int laGetReady(){
     laAddResourceFolder(".");
     laAddResourceFolder("/home/yiming/Documents/sync/Projects/2022/nul5/build");
 
+    laSetMenuBarTemplates(laui_DefaultMenuButtons, laui_DefaultMenuExtras, "🧩LaGUI 2022");
+
     //tns_RegisterResourcesForSoftwareRender();
     la_RegisterGeneralProps();
     la_RegisterInternalTemplates();
@@ -1596,6 +1598,9 @@ void la_ClearUnusedFramebuffers(laWindow* w){
     }
 }
 
+void laSetMenuBarTemplates(laUiDefineFunc MenuButtons, laUiDefineFunc MenuExtras, const char* ProgramName){
+    MAIN.MenuButtons=MenuButtons; MAIN.MenuExtras=MenuExtras; MAIN.MenuProgramName=ProgramName;
+}
 void la_WindowDefDraw(laWindow *w, laBoxedTheme *bt){
     laPanel *p, *NextP;
     laLayout *l = w->CurrentLayout;
@@ -1913,7 +1918,6 @@ void laDockPanel(laWindow* from, laBlock* b, laPanel* p){
 
     laNotifyUsers("la.windows.panels");
 }
-
 void laPopPanel(laPanel *p){
     if (p->Mode == LA_PANEL_FLOATING_PASSIVE){
         lstRemoveItem(&p->Parent->SubPanels, p);
@@ -1924,7 +1928,6 @@ void laPopPanel(laPanel *p){
         laNotifyUsers("la.windows.panels");
     }
 }
-
 void la_EnsurePanelExtras(laPanel *p){
     laUiTemplate* uit=p->PanelTemplate;
 

+ 7 - 29
la_util.c

@@ -2053,9 +2053,12 @@ void transState(void *UNUSED, int val){
     laRedrawCurrentWindow();
 }
 
-//=========================================================[ Internet ]
+void laOpenInternetLink(char *url){
+    laSafeString* s=0; strSafePrint(&s, "xdg-open %s", url);
+    system(s->Ptr);
+    strSafeDestroy(&s);
 
-void laOpenInternetLink(char *link){
+    //these were windows stuff
     //HKEY hkRoot, hSubKey;
     //char ValueName[256]={0};
     //char DataValue[256]={0};
@@ -2063,33 +2066,8 @@ void laOpenInternetLink(char *link){
     //unsigned long cbDataValue = 256;
     //char ShellChar[512]={0};
     //DWORD dwType;
-//
+    //
     //ShellExecute(0, "open", link, 0, 0, SW_SHOWNORMAL);
-//
+    //
     //return;
 }
-
-//===========================================================[ deprecated ]
-
-void laSendPanic(char *message){
-    printf("Panic: %s\n",message);
-    exit(0);
-}
-
-//===========================================================[ file util ]
-
-char *txtReadFileAsString(char *FileName){
-    FILE *f = fopen(FileName, "r");
-    int length;
-    fseek(f, 0, SEEK_END);
-    length = ftell(f);
-    fseek(f, 0, SEEK_SET);
-
-    char *buffer = CreateNewBuffer(char, length);
-
-    fread(buffer, sizeof(char), length, f);
-
-    fclose(f);
-
-    return buffer;
-}

+ 3 - 17
la_util.h

@@ -370,24 +370,9 @@ STRUCTURE(laBaseNode){
 };
 
 
-
-char * txtReadFileAsString(char * FileName);
-
-
-void laSendPanic(char * message);
-
-#define SEND_PANIC_ERROR(message)\
-    laSendPanic(message)
-
-#define SEND_NORMAL_ERROR(message)
-
-#define SEND_USER_MESSAGE(message)                                                
-    //MessageBox(0,message, "Message here:",0)
-
 #define CreateNew(Type)\
     calloc(sizeof(Type),1)
 
-
 #define CreateNew_Size(size)\
     calloc(size,1)
 
@@ -647,6 +632,7 @@ void transState(void* UNUSED, int val);
 void transInitTranslation_zh_cn();
 
 
-void laOpenInternetLink(char * link);
-
+void laOpenInternetLink(char* url);
 
+#define SEND_PANIC_ERROR(msg)\
+	{printf(msg); exit(0);}

+ 94 - 0
lagui-config.cmake

@@ -0,0 +1,94 @@
+# LaGUI CMake config file.
+
+get_filename_component(SELF_DIR "${CMAKE_CURRENT_LIST_FILE}" PATH)
+include(${SELF_DIR}/lagui-targets.cmake)
+get_filename_component(LAGUI_INCLUDE_DIRS "${SELF_DIR}/../../include/lagui" ABSOLUTE)
+
+if (POLICY CMP0072)
+  set(OpenGL_GL_PREFERENCE GLVND)
+endif()
+
+find_package(OpenGL REQUIRED)
+find_package(X11 REQUIRED)
+find_package(Freetype REQUIRED)
+find_package(GLEW REQUIRED)
+#find_package(PNG REQUIRED)
+find_package(ODE REQUIRED)
+
+set(LAGUI_SHARED_LIBS
+    ${X11_LIBRARIES}
+    ${X11_X11_LIB}
+    ${GLEW_LIBRARIES}
+    ${OPENGL_LIBRARY}
+    ${FREETYPE_LIBRARIES}
+    #${PNG_LIBRARY}
+    m X11 Xi
+    lagui
+    CACHE INTERNAL "LaGUI shared libs"
+)
+
+set(LAGUI_INCLUDE_DIRS_ALL
+    ${CMAKE_SOURCE_DIR}
+    ${X11_INCLUDE_DIR}
+    ${GLEW_INCLUDE_PATH}
+    ${GLM_INCLUDE_PATH}
+    ${FREETYPE_INCLUDE_DIRS}
+    ${ODE_INCLUDE_DIRS}
+    ${LAGUI_INCLUDE_DIRS}
+    CACHE INTERNAL "Include dirs of LaGUI and dependencies"
+)
+
+# Build Types
+set(CMAKE_BUILD_TYPE ${CMAKE_BUILD_TYPE}
+    CACHE STRING "Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel tnsan asan lsan msan ubsan"
+    FORCE)
+
+# ThreadSanitizer
+set(CMAKE_C_FLAGS_TSAN
+    "-fsanitize=thread -g -O1"
+    CACHE STRING "Flags used by the C compiler during ThreadSanitizer builds."
+    FORCE)
+set(CMAKE_CXX_FLAGS_TSAN
+    "-fsanitize=thread -g -O1"
+    CACHE STRING "Flags used by the C++ compiler during ThreadSanitizer builds."
+    FORCE)
+
+# AddressSanitize
+set(CMAKE_C_FLAGS_ASAN
+    "-fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g"
+    CACHE STRING "Flags used by the C compiler during AddressSanitizer builds."
+    FORCE)
+set(CMAKE_CXX_FLAGS_ASAN
+    "-fsanitize=address -fno-optimize-sibling-calls -fsanitize-address-use-after-scope -fno-omit-frame-pointer -g"
+    CACHE STRING "Flags used by the C++ compiler during AddressSanitizer builds."
+    FORCE)
+
+# LeakSanitizer
+set(CMAKE_C_FLAGS_LSAN
+    "-fsanitize=leak -fno-omit-frame-pointer -g"
+    CACHE STRING "Flags used by the C compiler during LeakSanitizer builds."
+    FORCE)
+set(CMAKE_CXX_FLAGS_LSAN
+    "-fsanitize=leak -fno-omit-frame-pointer -g"
+    CACHE STRING "Flags used by the C++ compiler during LeakSanitizer builds."
+    FORCE)
+
+# MemorySanitizer
+set(CMAKE_C_FLAGS_MSAN
+    "-fsanitize=memory -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g"
+    CACHE STRING "Flags used by the C compiler during MemorySanitizer builds."
+    FORCE)
+set(CMAKE_CXX_FLAGS_MSAN
+    "-fsanitize=memory -fno-optimize-sibling-calls -fsanitize-memory-track-origins=2 -fno-omit-frame-pointer -g"
+    CACHE STRING "Flags used by the C++ compiler during MemorySanitizer builds."
+    FORCE)
+
+# UndefinedBehaviour
+set(CMAKE_C_FLAGS_UBSAN
+    "-fsanitize=undefined"
+    CACHE STRING "Flags used by the C compiler during UndefinedBehaviourSanitizer builds."
+    FORCE)
+set(CMAKE_CXX_FLAGS_UBSAN
+    "-fsanitize=undefined"
+    CACHE STRING "Flags used by the C++ compiler during UndefinedBehaviourSanitizer builds."
+	FORCE)

+ 62 - 70
resources/la_templates.c

@@ -2,7 +2,7 @@
 
 extern LA MAIN;
 extern struct _tnsMain *T;
-
+extern const char* LA_UDF_EXTENSION_STRINGS[];
 
 int laget_InstanceModified(void* instance);
 void laget_TimeString(laTimeInfo *ti, char *result, char** resultdirect);
@@ -461,40 +461,55 @@ void laui_ColumnItem(laUiList *uil, laPropPack *Base, laPropPack *UNUSED_This, l
     laEndCondition(uil, bracket);
 }
 
+void laui_DefaultMenuButtonsFileEntries(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context){
+    laColumn* c=laFirstColumn(uil);
+            
+    laShowLabel(uil, c, "Function Test", 0, 0);
+    laShowItem(uil, c, 0, "LA_pure_yes_no");
+    laShowItem(uil, c, 0, "LA_file_dialog");
+    laShowItem(uil, c, 0, "LA_udf_read");
+    laShowItem(uil, c, 0, "LA_managed_save");
+    laShowItem(uil, c, 0, "LA_manage_udf");
+
+    laShowLabel(uil, c, "Other Entries", 0, 0);
+    laShowItemFull(uil, c, 0, "LA_panel_activator", 0, "panel_id=LAUI_about;text=About;", 0, 0);
+    laShowItem(uil, c, 0, "LA_terminate_program");
+}
+void laui_DefaultMenuButtonsOptionEntries(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context){
+    laColumn* c=laFirstColumn(uil);
+    laShowLabel(uil, c, "Settings", 0, 0);
+    laShowItemFull(uil, c, 0, "LA_panel_activator", 0, "panel_id=LAUI_user_preferences;", 0, 0);
+}
+void laui_DefaultMenuButtons(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context){
+    laUiList *muil; laColumn *mc,*c = laFirstColumn(uil);
+    muil = laMakeMenuPage(uil, c, "File");{
+        mc = laFirstColumn(muil); laui_DefaultMenuButtonsFileEntries(muil,pp,actinst,extracol,0);
+    }
+    muil = laMakeMenuPage(uil, c, "Options"); {
+        mc = laFirstColumn(muil); laui_DefaultMenuButtonsOptionEntries(muil,pp,actinst,extracol,0);
+    }
+}
+void laui_DefaultMenuExtras(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context){
+    laColumn *c = laFirstColumn(uil);
+    laShowLabel(uil, c, MAIN.MenuProgramName, 0, 0)->Expand=1;
+}
+        
 void laui_DefaultMenuBarActual(laUiList *uil, laPropPack *pp, laPropPack *actinst, laColumn *extracol, int context){
     laUiList *muil;
-    laColumn *c, *c1, *c1r, *c2, *c2r, *c3, *c3r, *c4, *c4r, *mc, *mcl, *mcr;
+    laColumn *c,*mc;
     laUiItem* bb;
 
     c = laFirstColumn(uil);
     laUiItem* row=laBeginRow(uil,c,0,0);
 
     bb=laOnConditionThat(uil,c,laPropExpression(0,"la.windows.operator_hints"));{
-        
+
         laShowItem(uil,c,0,"la.windows.operator_hints");
 
     }laElse(uil,bb);{
         laShowItem(uil, c, 0, "LA_new_panel")->Flags=LA_UI_FLAGS_ICON;
-        muil = laMakeMenuPage(uil, c, "File");{
-            mc = laFirstColumn(muil);
-            laShowItem(muil, mc, 0, "TNS_load_exchange");
-
-            laShowLabel(muil, mc, "Function Test", 0, 0);
-            laShowItem(muil, mc, 0, "LA_pure_yes_no");
-            laShowItem(muil, mc, 0, "LA_file_dialog");
-            laShowItem(muil, mc, 0, "LA_udf_read");
-            laShowItem(muil, mc, 0, "LA_managed_save");
-            laShowItem(muil, mc, 0, "LA_manage_udf");
-
-            laShowLabel(muil, mc, "Other Entries", 0, 0);
-            laShowItemFull(muil, mc, 0, "LA_panel_activator", 0, "panel_id=LAUI_about;text=About;", 0, 0);
-            laShowItem(muil, mc, 0, "LA_terminate_program");
-        }
-        muil = laMakeMenuPage(uil, c, "Options"); {
-            mc = laFirstColumn(muil);
-            laShowLabel(muil, mc, "Settings", 0, 0);
-            laShowItemFull(muil, mc, 0, "LA_panel_activator", 0, "panel_id=LAUI_user_preferences;", 0, 0);
-        }
+
+        if(MAIN.MenuButtons){ MAIN.MenuButtons(uil,0,0,0,0); }
 
         laShowSeparator(uil,c);
 
@@ -512,8 +527,7 @@ void laui_DefaultMenuBarActual(laUiList *uil, laPropPack *pp, laPropPack *actins
             }laEndCondition(uil, ui);
         }laEndCondition(uil,mui);
 
-        laShowSeparator(uil,c);
-        laShowLabel(uil, c, "🧩LaGUI 2022", 0, 0)->Expand=1;
+        if(MAIN.MenuExtras){ laShowSeparator(uil,c); MAIN.MenuExtras(uil,0,0,0,0); }
 
         laUiItem* b1=laOnConditionThat(uil,c,laPropExpression(0,"la.windows.panels_hidden"));
             laShowSeparator(uil,c);
@@ -529,9 +543,6 @@ void laui_DefaultMenuBarActual(laUiList *uil, laPropPack *pp, laPropPack *actins
 }
 void laui_DefaultMenuBar(laWindow *w){
     laPanel *p;
-    laUiList *uil, *muil;
-    laColumn *c, *c1, *c1r, *c2, *c2r, *c3, *c3r, *c4, *c4r, *mc;
-    laUiItem *bracket;
 
     p =laCreateTopPanel(w, 0, 0, 0, 0, LA_RH, 0, 0, 0, 0, -1, -1, -1, 0);
     p->IsMenuPanel = 1;
@@ -1275,57 +1286,40 @@ void laui_About(laUiList *uil, laPropPack *Base, laPropPack *OperatorInst, laCol
     c = laFirstColumn(uil);
 
     laShowLabel(uil, c, "LaGUI", 0, 0);
-    laShowLabel(uil, c, "2022", 0, 0);
+    laShowLabel(uil, c, "A graphical user interface application toolkit", 0, 0)->Flags|=LA_TEXT_LINE_WRAP;
     laShowLabel(uil, c, "(C)Yiming Wu", 0, 0);
 
     t = laMakeTab(uil, c, 0);{
         first = u = laAddTabPage(t, "Version");
-        u->HeightCoeff=-1;
         tc = laFirstColumn(u);
 
-        g = laMakeGroup(u, tc, "User Interface", 0);
+        g = laMakeGroup(u, tc, "LaGUI information", 0);
         gu = g->Page;{
             gc = laFirstColumn(gu);
+            sprintf(buf, "LaGUI.%d.%d.%d", LA_VERSION_MAIN, LA_VERSION_SUB, LA_VERSION_MINOR);
+            laShowLabel(gu, gc, buf, 0, 0)->Flags|=LA_TEXT_MONO;
+            sprintf(buf, "Program built on:[UTC+8] %s %s", __DATE__, __TIME__);
+            laShowLabel(gu, gc, buf, 0, 0)->Flags|=LA_TEXT_MONO;
+            sprintf(buf, "UDF Capability %s %d.%d.%d",LA_UDF_IDENTIFIER, LA_UDF_CAPABILITY_MAIN, LA_UDF_CAPABILITY_SUB, LA_UDF_CAPABILITY_MINOR);
+            laShowLabel(gu, gc, buf, 0, 0)->Flags|=LA_TEXT_MONO;
+            laShowLabel(gu, gc, "UDF Extensions:", 0, 0)->Flags|=LA_TEXT_MONO;
+            laShowLabel(gu, gc, "🗸 LA_UDF_BASICS", 0, 0)->Flags|=LA_TEXT_MONO;
+            for(int i=0;i<64;i++){
+                if(!LA_UDF_EXTENSION_STRINGS[i][0]) break; int gray=!((1<<i)&LA_UDF_EXTENSION_BITS);
+                sprintf(buf,"%s %s",gray?" ":"🗸",LA_UDF_EXTENSION_STRINGS[i]);
+                laUiItem* ext=laShowLabel(gu, gc, buf, 0, 0); ext->Flags|=LA_TEXT_MONO;
+                if(gray){ ext->Flags|=LA_UI_FLAGS_DISABLED; }
+            }
 
-            //laShowSymbol(gu, gc, 0, 0);
-            laShowSymbol(gu, gc, 0, 0);
-            laShowLabel(gu, gc, "A graphical user interface application toolkit", 0, 0)->Flags|=LA_TEXT_LINE_WRAP;;
-            laShowLabel(gu, gc, "(C)YimingWu", 0, 0);
-
-            sprintf(buf, "🛈 LA.%d.%d.%d", LA_VERSION_MAIN, LA_VERSION_SUB, LA_VERSION_MINOR);
-            laShowLabelDynamic(gu, gc, buf, 0, 0);
-            laShowLabel(gu, gc, "🗇" " Branch:master", 0, 0);
-            sprintf(buf, "📅 Date:[UTC+8] %s %s", __DATE__, __TIME__);
-            laShowLabelDynamic(gu, gc, buf, 0, 0);
-            sprintf(buf, "🖹 UDF Capability %d.%d.%d", LA_UDF_CAPABILITY_MAIN, LA_UDF_CAPABILITY_SUB, LA_UDF_CAPABILITY_MINOR);
-            laShowLabelDynamic(gu, gc, buf, 0, 0);
         }
         
-        g = laMakeGroup(u, tc, "Graphics Information", 0);
-        gu = g->Page;{
-            gc = laFirstColumn(gu);
-            laSplitColumn(gu, gc, 0.6);
-            gcl = laLeftColumn(gc, 0);
-            gcr = laRightColumn(gc, 0);
-            laShowSymbol(gu, gcl, 0, 0);
-
-            laShowLabel(gu, gc, "The interface uses OpenGL as the graphics backend", 0, 0)->Flags|=LA_TEXT_LINE_WRAP;
-
-            sprintf(buf, "🛈" " OpenGL Version: %s", T->GLVersionStr);
-            laShowLabelDynamic(gu, gc, buf, 0, 0);
-            sprintf(buf, "🛈" " OpenGL Vendor: %s", T->GLVendorStr);
-            laShowLabelDynamic(gu, gc, buf, 0, 0);
-            sprintf(buf, "🛈" " OpenGL Renderer: %s", T->GLRendererStr);
-            laShowLabelDynamic(gu, gc, buf, 0, 0);
-            sprintf(buf, "🛈" " GLSL Version: %s", T->GLSLVersionStr);
-            laShowLabelDynamic(gu, gc, buf, 0, 0);
-        }
-
-        g = laMakeGroup(u, tc, "Build Tool", 0);
+        g = laMakeGroup(u, tc, "Graphics", 0);
         gu = g->Page;{
             gc = laFirstColumn(gu);
-            laShowSymbol(gu, gc, 0, 0);
-            laShowLabel(gu, gc, "This Program Is Built With GCC Tool Chain", 0, 0)->Flags|=LA_TEXT_LINE_WRAP;
+            sprintf(buf, "OpenGL Version: %s", T->GLVersionStr);   laShowLabel(gu, gc, buf, 0, 0)->Flags|=LA_TEXT_MONO;
+            sprintf(buf, "OpenGL Vendor: %s", T->GLVendorStr);     laShowLabel(gu, gc, buf, 0, 0)->Flags|=LA_TEXT_MONO;
+            sprintf(buf, "OpenGL Renderer: %s", T->GLRendererStr); laShowLabel(gu, gc, buf, 0, 0)->Flags|=LA_TEXT_MONO;
+            sprintf(buf, "GLSL Version: %s", T->GLSLVersionStr);   laShowLabel(gu, gc, buf, 0, 0)->Flags|=LA_TEXT_MONO;
         }
 
         u = laAddTabPage(t, "Props");{
@@ -1360,10 +1354,10 @@ void laui_About(laUiList *uil, laPropPack *Base, laPropPack *OperatorInst, laCol
             }
         }
 
-        u = laAddTabPage(t, "Contact");
+        u = laAddTabPage(t, "Author");
         tc = laFirstColumn(u);
         laSplitColumn(u, tc, 0.8);
-        tcl = laLeftColumn(tc, 60);
+        tcl = laLeftColumn(tc, 3);
         tcr = laRightColumn(tc, 00);
 
         strSafeSet(&laShowSymbol(u, tc, 0, 0)->ExtraInstructions, "mode=invert;preserve=5;");
@@ -1499,8 +1493,6 @@ void laui_Drivers(laUiList *uil, laPropPack *This, laPropPack *Extra, laColumn *
 
 
 void la_RegisterBuiltinTemplates(){
-    //laRegisterUiTemplate("LAUI_default_subwindow_menubar", "Menu", laui_DefaultSubWindowMenuBarActual, 0);
-    //laRegisterUiTemplate("LAUI_default_menubar", "Menu", laui_DefaultMenuBarActual, 0);
     laRegisterUiTemplate("LAUI_user_preferences", "User Preferences", laui_UserPreference, 0, 0);
     laRegisterUiTemplate("LAUI_about", "About", laui_About, 0, 0);
     laRegisterUiTemplate("LAUI_texture_inspector", "Texture Inspector", laui_TextureInspector, lauidetached_TextureInspector, 0);