*/}}
Browse Source

Usability improvements

YimingWu 1 year ago
parent
commit
9755db0332
7 changed files with 74 additions and 67 deletions
  1. 14 1
      la_interface.h
  2. 20 25
      la_kernel.c
  3. 1 0
      la_resource.c
  4. 1 1
      la_tns_kernel.c
  5. 1 1
      lagui-config.cmake
  6. 14 11
      resources/la_operators.c
  7. 23 28
      resources/la_widgets.c

+ 14 - 1
la_interface.h

@@ -54,10 +54,11 @@
 #define LA_GUI_WNDCLASS_NAME "LA_WINDOW_CLASS"
 #define LA_ARROW 1
 #define LA_CROSS 2
-#define LA_LEFT_RIGHT 3
+#define LA_LEFT_AND_RIGHT 3
 #define LA_UP_AND_DOWN 4
 #define LA_HAND 5
 #define LA_MOVE 6
+#define LA_CORNER 7
 
 #define EVT_WND_MOVE -1
 #define EVT_WND_SIZE_BEGIN -2
@@ -95,6 +96,18 @@
 #define LA_KEY_ALT       (1<<22)
 #define LA_KEY_DELETE    (1<<23)
 #define LA_KEY_TAB       (1<<24)
+#define LA_KEY_F1        XK_F1
+#define LA_KEY_F2        XK_F2
+#define LA_KEY_F3        XK_F3
+#define LA_KEY_F4        XK_F4
+#define LA_KEY_F5        XK_F5
+#define LA_KEY_F6        XK_F6
+#define LA_KEY_F7        XK_F7
+#define LA_KEY_F8        XK_F8
+#define LA_KEY_F9        XK_F9
+#define LA_KEY_F10       XK_F10
+#define LA_KEY_F11       XK_F11
+#define LA_KEY_F12       XK_F12
 
 #define LA_KEY_SPECIALS (LA_KEY_CTRL|LA_KEY_SHIFT|LA_KEY_ALT)
 

+ 20 - 25
la_kernel.c

@@ -30,6 +30,8 @@
 #include <X11/XKBlib.h>
 #include <X11/extensions/XInput2.h>
 #include <X11/extensions/Xfixes.h>
+#include <X11/Xcursor/Xcursor.h>
+#include <X11/cursorfont.h>
 #include <GL/glx.h>
 //#include <GL/glext.h>
 //#include <GL/glu.h>
@@ -65,8 +67,7 @@ static void la_PrintWacomValuators(Display *display, XIAnyClassInfo **classes, i
         }
     }
 }
-static void la_RegisterWacomEventMasks(Display *display, int deviceid, real* max_pressure)
-{
+static void la_RegisterWacomEventMasks(Display *display, int deviceid, real* max_pressure) {
 	XIDeviceInfo *info, *dev;
 	int i, ndevices;
 
@@ -128,10 +129,10 @@ void la_ScanWacomDevices(Display *display, int deviceid){
 }
 
 void laHideCursor(){
-    //if(!MAIN.CurrentWindow) return; XFixesHideCursor(MAIN.dpy, MAIN.CurrentWindow->win);
+    if(!MAIN.CurrentWindow) return; XFixesHideCursor(MAIN.dpy, MAIN.CurrentWindow->win);
 }
 void laShowCursor(){
-    //if(!MAIN.CurrentWindow) return; XFixesShowCursor(MAIN.dpy, MAIN.CurrentWindow->win);
+    if(!MAIN.CurrentWindow) return; XFixesShowCursor(MAIN.dpy, MAIN.CurrentWindow->win);
 }
 
 void la_XErrorHandler(Display *display, XErrorEvent *event){
@@ -257,23 +258,17 @@ void laRenameWindow(laWindow* wnd, char* name){
     XStoreName(MAIN.dpy, wnd->win, name);
 }
 
-int la_ConvertCursorID(int id){
-    return 0;
-    //switch (id)
-    //{
-    //case LA_ARROW:
-    //    return IDC_ARROW;
-    //case LA_CROSS:
-    //    return IDC_CROSS;
-    //case LA_LEFT_RIGHT:
-    //    return IDC_SIZEWE;
-    //case LA_UP_AND_DOWN:
-    //    return IDC_SIZENS;
-    //case LA_MOVE:
-    //    return IDC_SIZEALL;
-    //case LA_HAND:
-    //    return IDC_HAND;
-    //}
+const char* la_ConvertCursorID(int id){
+    switch (id) {
+    case LA_ARROW: return "arrow";
+    case LA_CROSS: return "cross";
+    case LA_LEFT_AND_RIGHT: return "sb_h_double_arrow";
+    case LA_UP_AND_DOWN: return "sb_v_double_arrow";
+    case LA_MOVE: return "diamond_cross";
+    case LA_HAND: return "hand1";
+    case LA_CORNER: return "bottom_right_corner";
+    }
+    return "arrow";
 }
 
 void la_MakePanelTitleBar(laPanel *p, laUiDefineFunc ReplaceDefine);
@@ -336,7 +331,7 @@ void laShowProgress(real p1, real p2){
             XSetBackground(MAIN.dpy,MAIN.Progress.gc,LA_COLOR3_TO_HEX(bg));
             XSetWindowBackground(MAIN.dpy,MAIN.Progress.w,LA_COLOR3_TO_HEX(bg));
             if(MAIN.CurrentWindow) XSetTransientForHint(MAIN.dpy,MAIN.Progress.w,MAIN.CurrentWindow->win);
-            XMapWindow(MAIN.dpy,MAIN.Progress.w); XSync(MAIN.dpy, 0); XFlush(MAIN.dpy);
+            XMapWindow(MAIN.dpy,MAIN.Progress.w);
             MAIN.Progress.Shown=1;
         }
     }
@@ -1876,8 +1871,8 @@ laWindow *laDesignWindow(int X, int Y, int W, int H){
     return n;
 }
 void laSetWindowCursor(int id){
-    //SetClassLongPtr(MAIN.CurrentWindow->win,
-    //                GCLP_HCURSOR, LoadCursor(NULL, la_ConvertCursorID(id)));
+    Cursor c = XcursorLibraryLoadCursor(MAIN.dpy, la_ConvertCursorID(id));
+    XDefineCursor(MAIN.dpy, MAIN.CurrentWindow->win, c);
 };
 void la_AssignBlockPP(laBlock* b){
     b->PP.EndInstance = b;
@@ -6424,10 +6419,10 @@ int la_ProcessSysMessage(){
                 MAIN.InputBuf[InputCount]=0;
                 if (InputStatus==XBufferOverflow)  printf("XInputBufferOverflow\n");
                 if (InputStatus == XLookupKeySym || InputStatus == XLookupBoth) { /*printf("status: %d\n", InputStatus);*/ }
-                /*printf("pressed KEY: %d\n", (int)InputKeysym);*/
             if (InputCount){ MAIN.InputBuf[InputCount]=0; } strToUnicode(MAIN.InputBufU,MAIN.InputBuf); int UCount=strlenU(MAIN.InputBufU);
             for(int i=0;i<UCount;i++){ if(la_AllowInput(MAIN.InputBufU[i])) la_SendInputEvent(e.xkey.window, MAIN.InputBufU[i]); }
             if(InputKeysym=XkbKeycodeToKeysym(e.xkey.display, e.xkey.keycode, 0, 0)){
+                printf("pressed KEY: %d\n", (int)InputKeysym);
                 la_SendKeyboardEvent(e.xkey.window, LA_KEY_DOWN, la_TranslateSpecialKey(InputKeysym));
             }
             break;

+ 1 - 0
la_resource.c

@@ -108,6 +108,7 @@ void la_RegisterWindowKeys(){
     laAssignNewKey(km, 0, "LA_system_paste", 0, LA_KEY_CTRL, LA_KEY_DOWN, 'v', 0);
     laAssignNewKey(km, 0, "LA_undo", 0, LA_KEY_CTRL, LA_KEY_DOWN, 'z', 0);
     laAssignNewKey(km, 0, "LA_redo", 0, LA_KEY_CTRL|LA_KEY_SHIFT, LA_KEY_DOWN, 'z', 0);
+    laAssignNewKey(km, 0, "LA_fullscreen", 0, 0, LA_KEY_DOWN, LA_KEY_F11, "toggle=true;");
 }
 
 void la_RegisterMainThemes(){

+ 1 - 1
la_tns_kernel.c

@@ -2904,7 +2904,7 @@ int tnsLoadSystemFont(char* from, char* name){
             FT_Done_Face(face);
         }
         if(found){ f->ftface[f->NumFaces]=face; }else{ if (FT_New_Face(f->ftlib, buf, 0, &f->ftface[f->NumFaces])) continue; }
-        FT_Select_Charmap(f->ftface[f->NumFaces], FT_ENCODING_UNICODE);printf("%s",f->ftface[f->NumFaces]->family_name);
+        FT_Select_Charmap(f->ftface[f->NumFaces], FT_ENCODING_UNICODE);
         FT_Set_Char_Size(f->ftface[f->NumFaces], 0, GenHeight << 6, 96, 96);
         f->NumFaces++; FT_Glyph glyph; int half_adv=0;
         if(!f->MonoAdvance && !FT_Get_Advance(f->ftface[f->NumFaces],'a',FT_LOAD_TARGET_NORMAL | FT_LOAD_NO_HINTING | FT_LOAD_NO_BITMAP, &half_adv)){

+ 1 - 1
lagui-config.cmake

@@ -22,7 +22,7 @@ set(LAGUI_SHARED_LIBS
     ${FREETYPE_LIBRARIES}
     ${X11_Xfixes_LIB}
     #${PNG_LIBRARY}
-    m X11 Xi
+    m X11 Xi Xcursor
     lagui
     CACHE INTERNAL "LaGUI shared libs"
 )

+ 14 - 11
resources/la_operators.c

@@ -981,6 +981,7 @@ int OPINV_Fullscreen(laOperator *a, laEvent *e){
     laWindow* w=MAIN.CurrentWindow;
     int full=1;
     if(strArgumentMatch(a->ExtraInstructionsP,"restore","true")){ full=0; }
+    if(strArgumentMatch(a->ExtraInstructionsP,"toggle","true")){ full=w->IsFullScreen?0:1; }
     XClientMessageEvent msg = {
         .type = ClientMessage, .display = MAIN.dpy, .window = w->win,
         .message_type = XInternAtom(MAIN.dpy, "_NET_WM_STATE", True), .format = 32,
@@ -1373,7 +1374,7 @@ int la_ProcessBlockEdgeEvent(laOperator *WindowAct, laLayout *l, laBlock *b, laE
     }
     if (ob = la_OnBlockSeperator(b, e)){
         ob->B1->OnButton=ob->B2->OnButton=0;
-        l->MovingBlock = ob;
+        l->MovingBlock = ob; laSetWindowCursor(ob->Vertical?LA_UP_AND_DOWN:LA_LEFT_AND_RIGHT);
         if (e->Type == LA_L_MOUSE_DOWN){
             l->IsMoving = 1;
         }elif (e->Type == LA_L_MOUSE_UP){
@@ -1384,7 +1385,7 @@ int la_ProcessBlockEdgeEvent(laOperator *WindowAct, laLayout *l, laBlock *b, laE
         }
         return 1;
     }
-    l->MovingBlock = 0;
+    if(l->MovingBlock){ l->MovingBlock = 0; laSetWindowCursor(LA_ARROW); }
     return 0;
 }
 
@@ -1623,7 +1624,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     if(MAIN.DockingPanel){return LA_FINISHED; }
 
     if (!p->Show || (!laIsInPanel(p, x, y) && !uid->TargetIndexVali)){
-        p->ShowCorner=0; return LA_FINISHED_PASS;
+        p->ShowCorner=0; laSetWindowCursor(LA_ARROW); return LA_FINISHED_PASS;
     }
 
     int NoPrimaryUI=(p==MAIN.CurrentWindow->MaximizedUiPanel);
@@ -1673,12 +1674,13 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     lstClearPointer(&Locals);
     
     if (p->Mode && e->Type&LA_MOUSE_EVENT && !uid->TargetIndexVali){ p->ShowCorner=0;
-        if (!p->IsMenuPanel && e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ if(!a->Item.pPrev) p->ShowCorner=1;
+        if (!p->IsMenuPanel && e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ if(!a->Item.pPrev){ p->ShowCorner=1; laSetWindowCursor(LA_CORNER); }
             if(e->Type==LA_L_MOUSE_DOWN){ uid->TargetIndexVali = 2; uid->LastX=e->x;uid->LastY=e->y; }
             return LA_RUNNING;
         }else{
             if(e->Type==LA_L_MOUSE_DOWN){  uid->TargetIndexVali = 1; uid->LastX=e->x;uid->LastY=e->y; return LA_RUNNING; }
         }
+        if(!p->ShowCorner){ laSetWindowCursor(LA_ARROW); }
     }
 
     if (e->Type == LA_MOUSEMOVE){
@@ -1714,7 +1716,7 @@ int OPMOD_Panel(laOperator *a, laEvent *e){
     }
 
     if (e->Type == LA_L_MOUSE_UP){
-        uid->TargetIndexVali = 0;
+        uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
         return LA_RUNNING;
     }
 
@@ -1834,7 +1836,7 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
     }
 
-    if (!laIsInPanel(p, e->x, e->y) && !uid->TargetIndexVali) return LA_RUNNING;
+    if (!laIsInPanel(p, e->x, e->y) && !uid->TargetIndexVali){ p->ShowCorner=0; laSetWindowCursor(LA_ARROW); return LA_RUNNING; }
 
     if(p->PanelTemplate && laKeyMapExecuteEvent(a, &p->PanelTemplate->KeyMap, e)) return LA_RUNNING_PASS;
 
@@ -1867,12 +1869,12 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
     }
     lstClearPointer(&Locals);
 
-    int insize=0; if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ insize=1; if(!a->Item.pPrev) p->ShowCorner=1; }else{p->ShowCorner=0;}
-    if(!a->Item.pPrev) p->ShowCorner=1;
-    if (e->Type == LA_L_MOUSE_DOWN){
+    int insize=0; if (e->x + e->y > p->W + p->H - LA_SCROLL_W*2){ insize=1;
+        if(!a->Item.pPrev) p->ShowCorner=1; }else{p->ShowCorner=0; laSetWindowCursor(LA_ARROW); }
+    if(!a->Item.pPrev) p->ShowCorner=1;    if (e->Type == LA_L_MOUSE_DOWN){
         uid->LastX = e->x;
         uid->LastY = e->y;
-        if(insize) uid->TargetIndexVali = 2;
+        if(insize){ uid->TargetIndexVali = 2; laSetWindowCursor(LA_CORNER); }
         else uid->TargetIndexVali = 1;
         return LA_RUNNING;
     }
@@ -1906,9 +1908,10 @@ int OPMOD_ModalPanel(laOperator *a, laEvent *e){
             laRedrawCurrentPanel();
             return LA_RUNNING;
         }
+        if(uid->TargetIndexVali==2){laSetWindowCursor(LA_CORNER);}
     }
     if (e->Type == LA_L_MOUSE_UP){
-        uid->TargetIndexVali = 0;
+        uid->TargetIndexVali = 0; laSetWindowCursor(LA_ARROW);
         return LA_RUNNING;
     }
 

+ 23 - 28
resources/la_widgets.c

@@ -784,10 +784,10 @@ void la_EnumSelectorDraw(laUiItem *ui, int h){
                 tnsPackAs(GL_LINE_LOOP);
             }
 
-
             if (ui->ExtraInstructions){
                 if (ui->Type->OperatorType->ParseArgs){
-                    int ico; buf[0]=0; ui->Type->OperatorType->ParseArgs(ui->Instructions, &ico, buf);
+                    char buft[48]={0}; int ico; ui->Type->OperatorType->ParseArgs(ui->Instructions, &ico, buft); 
+                    sprintf(buf,"%s",transLate(buft));
                 }
             }
             if(Highlight){ if(!buf[0] && ArrLen==1) strcpy(buf, transLate(ui->PP.LastPs->p->Name)); else{ if(i<8)strcat(buf, &prefix[i]); } }
@@ -1868,13 +1868,6 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         }
     }
     
-    if (uit->Edit){
-        if (la_ProcessTextEdit(e, uit->Edit, ui)){
-            laRedrawCurrentPanel();
-            return LA_RUNNING;
-        }
-    }
-
     if (e->Type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, Len);
@@ -1883,6 +1876,11 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
+    if (ui->State == LA_UI_EDITING){
+        if (la_ProcessTextEdit(e, uit->Edit, ui))laRedrawCurrentPanel();
+        return LA_RUNNING;
+    }
+
     return LA_RUNNING_PASS;
 }
 int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
@@ -1992,13 +1990,6 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         }
     }
 
-    if (uit->Edit){
-        if (la_ProcessTextEdit(e, uit->Edit, ui)){
-            laRedrawCurrentPanel();
-            return LA_RUNNING;
-        }
-    }
-
     if (e->Type == LA_R_MOUSE_DOWN){
         int GX = e->x, GY = e->y;
         ui->PP.LastIndex = la_DetectColumn(ui, e->x, laGetArrayLength(&ui->PP));
@@ -2007,6 +1998,11 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
+    if (uit->Edit){
+        if (la_ProcessTextEdit(e, uit->Edit, ui)) laRedrawCurrentPanel();
+        return LA_RUNNING;
+    }
+
     return LA_RUNNING_PASS;
 }
 int OPMOD_FloatColor(laOperator *a, laEvent *e){
@@ -2410,11 +2406,6 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
 
     if(laKeyMapExecuteEventEx(a, &ui->ExtraPP, &ui->Type->KeyMapper, e)) return LA_RUNNING;
 
-    if (ui->State == LA_UI_EDITING){
-        laRedrawCurrentPanel();
-        if (la_ProcessTextEdit(e, se, ui)) return LA_RUNNING;
-    }
-
     if (e->Type == LA_L_MOUSE_DOWN){
         if (ui->State == LA_UI_NORMAL){
             if(laIsPropertyReadOnly(&ui->PP)) return LA_RUNNING;
@@ -2438,9 +2429,13 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
-    if (ui->State != LA_UI_EDITING) return LA_RUNNING_PASS;
-    else
+    if (ui->State == LA_UI_EDITING){
+        if (la_ProcessTextEdit(e, se, ui))laRedrawCurrentPanel();
         return LA_RUNNING;
+    }
+
+    if (ui->State != LA_UI_EDITING) return LA_RUNNING_PASS;
+    else return LA_RUNNING;
 }
 void la_SetMultistringViewRange(laUiItem* ui, laStringEdit* se, laBoxedTheme* bt){
     int NumberWidth=0; int MonoWidth=tnsGetMonoFontAdvance(); int Count=se->TotalLines;
@@ -2503,11 +2498,6 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
             es->Dragging=0; es->HeightCoeff=es->TargetIndexVali; laRecalcCurrentPanel();la_SetMultistringViewRange(ui,se,bt); }
         return LA_RUNNING;
     }
-
-    if (ui->State == LA_UI_ACTIVE){
-        laRedrawCurrentPanel();
-        if (la_ProcessTextEdit(e, se, ui)) return LA_RUNNING;
-    }
     
     int NoInactiveScroll=ui->Flags&LA_UI_FLAGS_NO_SCROLL_INACTIVE;
     if((!NoInactiveScroll) || (ui->State==LA_UI_ACTIVE)){
@@ -2533,6 +2523,11 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
         return LA_RUNNING;
     }
 
+    if (ui->State == LA_UI_EDITING){
+        if (la_ProcessTextEdit(e, se, ui))laRedrawCurrentPanel();
+        return LA_RUNNING;
+    }
+
     if (ui->State != LA_UI_ACTIVE) return LA_RUNNING_PASS;
     else return LA_RUNNING;
 }