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

Fullscreen and udf verify and no tooltip etc

YimingWu 1 год назад
Родитель
Сommit
8759e156a1
9 измененных файлов с 92 добавлено и 23 удалено
  1. 23 11
      la_data.c
  2. 1 0
      la_data.h
  3. 4 0
      la_interface.h
  4. 14 2
      la_kernel.c
  5. 16 0
      resources/la_operators.c
  6. 1 0
      resources/la_properties.c
  7. 7 2
      resources/la_templates.c
  8. 12 1
      resources/la_translations.c
  9. 14 7
      resources/la_widgets.c

+ 23 - 11
la_data.c

@@ -2288,17 +2288,18 @@ void la_UDFAppendSharedTypePointer(char *ID, void *Pointer){
 #define la_UseUDF(udf) udf->Used = 1
 
 u64bit la_Tell(laUDF *udf){
-    if (udf->DiskFile)
-        return ftell(udf->DiskFile);
-    else
-        return udf->Seek;
+    if (udf->DiskFile) return ftell(udf->DiskFile);
+    else return udf->Seek;
 }
 int la_Seek(laUDF *udf, u64bit Offset){
-    if (udf->DiskFile)
-        return fseek(udf->DiskFile, Offset, SEEK_SET);
+    if (udf->DiskFile) return fseek(udf->DiskFile, Offset, SEEK_SET);
     udf->Seek = Offset;
     return 1;
 }
+u64bit la_FileSize(laUDF* udf){
+    if(udf->DiskFile){ u64bit a=ftell(udf->DiskFile); fseek(udf->DiskFile,0,SEEK_END); u64bit sz=ftell(udf->DiskFile); fseek(udf->DiskFile,a,SEEK_SET); return sz; }
+    return udf->FileContentSize;
+}
 void la_WriteString(laUDF *udf, char *String){
     short size = strlen(String);
     fwrite(&size, sizeof(short), 1, udf->DiskFile);
@@ -3155,6 +3156,7 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
                         if(mUDF) memAssignRef(Instance, &((laMemNodeHyper*)memGetHead(Instance, 0))->FromFile, mUDF);
                         memMarkClean(Instance);
                     }else la_ReadHyperData(udf, 0);
+                    if(Mode==LA_UDF_MODE_APPEND){ lstAppendPointer(&MAIN.RenewHyper2s,Instance); }
                 }
 
                 if (!Parent && p->SubProp->PostRead) la_AddPostReadNode(Instance, p->SubProp->PostRead);
@@ -3228,11 +3230,12 @@ int la_ExtractProp(laUDF *udf, laManagedUDF* mUDF, laPropPack *pp, void *ParentI
                         }
 
                         if (ItemType == LA_UDF_HYPER_ITEM){
-                            if (pc->Hyper == 2 && Mode==LA_UDF_MODE_OVERWRITE){
+                            if (pc->Hyper == 2){
                                 la_ReadHyperData(udf, Instance);
                                 if(mUDF) memAssignRef(Instance, &((laMemNodeHyper*)memGetHead(Instance, 0))->FromFile, mUDF);
                             }
                             else la_ReadHyperData(udf, 0);
+                            if(Mode==LA_UDF_MODE_APPEND){ lstAppendPointer(&MAIN.RenewHyper2s,Instance); }
                         }
                         if (!Parent && !IsExceptionNode){
                             if (pc->PostRead) la_AddPostReadNode(Instance, pc->PostRead);
@@ -3333,7 +3336,7 @@ int la_RematchPointers(int Mode){
     la_ExecutePtrSyncCommand(Mode);
 
     while(uprd=lstPopItem(&MAIN.PostReadNodes)){ uprd->Func(uprd->Instance); memFree(uprd); }
-    while(inst=lstPopPointer(&MAIN.RenewHyper2s)){ memMakeHyperData(memGetHead(inst,0)); }
+    while(inst=lstPopPointer(&MAIN.RenewHyper2s)){ laMemNodeHyper* h=memGetHead(inst,0);memMakeHyperData(h);memAssignRef(h,&h->FromFile,0);  }
 }
 
 int laPackUDF(laUDF *udf, int UseInstanceList){
@@ -3350,7 +3353,8 @@ int laPackUDF(laUDF *udf, int UseInstanceList){
 
     la_WriteOnlyMBString(udf, LA_UDF_IDENTIFIER);
 
-    // reserved for extension switches.
+    u64bit SizeAndExt=la_Tell(udf);
+    // reserved for extension switches and file size verifications.
     la_WritePointer(udf, 0);
 
     RefPos = la_Tell(udf);
@@ -3378,12 +3382,17 @@ int laPackUDF(laUDF *udf, int UseInstanceList){
 
     la_WriteHyperRecords(udf);
 
+    u64bit ActualSize=la_Tell(udf);
+
     la_Seek(udf, RefPos);
     la_WriteLong(udf, udf->TotalRefs);
 
     la_Seek(udf, nuidSeekRef);
     la_WritePointer(udf, nuidActualSeek);
 
+    la_Seek(udf, SizeAndExt);
+    la_WritePointer(udf, (ActualSize&(0x0000ffffffffffff))<<16);
+
     udf->Modified = 0;
 
     laCloseUDF(udf);
@@ -3407,8 +3416,10 @@ int laExtractUDF(laUDF *udf, laManagedUDF* mUDF, int Mode, laListHandle *Parent)
 
     la_ReadBuffer(udf, sizeof(LA_UDF_IDENTIFIER) - 1, Identifier);
 
-    // reserved for extension switches.
-    la_ReadPointer(udf);
+    // file size verification and extension switches.
+    u64bit verification=la_ReadPointer(udf);
+    u64bit FileSize=verification>>16; int Extensions=verification&0xffff;
+    if(FileSize && FileSize<la_FileSize(udf)){ logPrintNew("UDF verification failed for %s\n", udf->FileName->Ptr); return 0; }
 
     /*udf->TotalRefs = */ la_ReadLong(udf);
     NumSegments = la_ReadShort(udf);
@@ -3557,6 +3568,7 @@ void la_ReadUDFToMemory(laUDF *udf){
     fseek(udf->DiskFile, 0, SEEK_SET);
 
     udf->FileContent = calloc(1, SeekEnd);
+    udf->FileContentSize=SeekEnd;
 
     fread(udf->FileContent, SeekEnd, 1, udf->DiskFile);
 

+ 1 - 0
la_data.h

@@ -481,6 +481,7 @@ STRUCTURE(laUDF){
 
     u8bit *FileContent;
     u64bit Seek;
+    u64bit FileContentSize;
 
     long TotalRefs;
 

+ 4 - 0
la_interface.h

@@ -23,6 +23,7 @@
 #include <X11/Xresource.h>
 #include <X11/Xlocale.h>
 #include <X11/XKBlib.h>
+#include <X11/Xatom.h>
 
 #include <GL/glew.h>
 //#include <GL/glxew.h>
@@ -301,6 +302,7 @@ STRUCTURE(LA){
 	Atom text_atom;
 	Atom UTF8;
 	Atom selection;
+    Atom wmstate,wmfullscr,wmfullscroff;
     laSafeString* CopyPending;
 
     Display* dpy;
@@ -535,6 +537,7 @@ STRUCTURE(laWindow){
     int IsDocking;
     int OutputColorSpace;
     int OutputShowStripes;
+    int IsFullScreen;
 
     laPropPack PP;
     laPropStep FakePS;
@@ -990,6 +993,7 @@ STRUCTURE(laWidget){
 #define LA_UI_FLAGS_EXIT_WHEN_TRIGGERED LA_UI_FLAGS_COLOR_SPACE_CLAY
 #define LA_TEXT_LCD_16         (1<<27)
 #define LA_TEXT_LCD_7          (1<<28)
+#define LA_UI_FLAGS_NO_TOOLTIP LA_UI_FLAGS_PREFER_BOTTOM
 
 #define LA_UI_FLAGS_INT_ICON  (LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_EVENT|LA_UI_FLAGS_ICON)
 #define LA_UI_FLAGS_PLAIN     (LA_UI_FLAGS_NO_DECAL|LA_UI_FLAGS_NO_EVENT)

+ 14 - 2
la_kernel.c

@@ -43,8 +43,6 @@ laOperator *DEB;
 
 laColumn *DEBUG_C;
 
-Atom XA_ATOM = 4, XA_STRING = 31;
-
 #define LA_GUI_WNDCLASS_NAME "NUL4_GUI_CLASS"
 
 typedef GLXContext (*glXCreateContextAttribsARBProc)(Display*, GLXFBConfig, GLXContext, Bool, const int*);
@@ -136,6 +134,13 @@ void laShowCursor(){
     //if(!MAIN.CurrentWindow) return; XFixesShowCursor(MAIN.dpy, MAIN.CurrentWindow->win);
 }
 
+void la_XErrorHandler(Display *display, XErrorEvent *event){
+    char buf[512];
+    XGetErrorText(display, event->error_code, buf, sizeof(buf));
+    printf("X Error:\n%s",buf);
+    return 0;
+}
+
 Window la_CreateWindowX11(int x, int y, int w, int h, char *title, int SyncToVBlank, GLXContext* r_glc){
     XSetWindowAttributes swa;
     XWindowAttributes wa;
@@ -330,6 +335,7 @@ void laShowProgress(real p1, real p2){
             XSetForeground(MAIN.dpy,MAIN.Progress.gc,LA_COLOR3_TO_HEX(fg));
             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);
             MAIN.Progress.Shown=1;
         }
@@ -383,6 +389,8 @@ int laGetReady(){
     setlocale(LC_CTYPE, "zh_CN.utf8");
     XSetLocaleModifiers("");
 
+    XSetErrorHandler(la_XErrorHandler);
+
     int i;
 
     if ((MAIN.dpy = XOpenDisplay(NULL)) == NULL){
@@ -465,6 +473,10 @@ int laGetReady(){
     MAIN.selection =    XInternAtom(MAIN.dpy, "CLIPBOARD", 0);
 	if(MAIN.UTF8 == None) MAIN.UTF8 = XA_STRING;
 
+    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);
+
     la_GetWorkingDirectoryInternal();
     
     MAIN.FontSize = 0.6;

+ 16 - 0
resources/la_operators.c

@@ -977,6 +977,20 @@ void laui_PanelTemplateSelect(laUiList *uil, laPropPack *This, laPropPack *Opera
     laUiItem* ui=laShowItem(uil, c, OperatorProps, "template");ui->SymbolID=2; ui->Flags|=LA_UI_FLAGS_NO_DECAL;
 }
 
+int OPINV_Fullscreen(laOperator *a, laEvent *e){
+    laWindow* w=MAIN.CurrentWindow;
+    int full=1;
+    if(strArgumentMatch(a->ExtraInstructionsP,"restore","true")){ full=0; }
+    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);
+    w->IsFullScreen=full;
+    laRedrawCurrentWindow();
+    return LA_FINISHED;
+}
 int OPINV_NewLayout(laOperator *a, laEvent *e){
     laWindow* w=MAIN.CurrentWindow;
     laDesignLayout(w, "New Layout");
@@ -2010,6 +2024,8 @@ void la_RegisterBuiltinOperators(){
     laCreateOperatorType("LA_canvas_ui_maximize", "Maximize", "Maximize this UI item", 0, 0, 0, OPINV_CanvasUiMaximize, 0, L'⮼', LA_ACTUATOR_SYSTEM);
     laCreateOperatorType("LA_hide_menu_bar", "Hide Menu Bar", "Hide menu bar of the window", 0, 0, 0, OPINV_HideMenuBar, 0, L'⯅', LA_ACTUATOR_SYSTEM);
 
+    laCreateOperatorType("LA_fullscreen", "Fullscreen", "Switch full screen for the window",
+                          0, 0, 0, OPINV_Fullscreen, 0, L'🡵', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
     laCreateOperatorType("LA_new_layout", "New Layout", "Create a new layout in the window",
                           0, 0, 0, OPINV_NewLayout, 0, L'🞦', LA_ACTUATOR_SYSTEM | LA_ACTUATOR_HIDDEN);
     laCreateOperatorType("LA_panel_operator", "Panel Operator", "Handle Events On The Panel Level",

+ 1 - 0
resources/la_properties.c

@@ -1141,6 +1141,7 @@ void la_RegisterInternalProps(){
                 laAddEnumItemAs(ep, "NONE", "None", "Don't show overflow", 0,0);
                 laAddEnumItemAs(ep, "STRIPES", "Stripes", "Show overflowing colors as stripes", 1, 0);
             }
+            laAddIntProperty(p, "is_fullscreen", "Is Fullscreen", "Is the window fullscreen", 0,0,0,0,0,0,0,0,offsetof(laWindow, IsFullScreen),0,0,0,0,0,0,0,0,0,0,LA_READ_ONLY);
         }
 
         // UI LAYOUT ========================================================================================

+ 7 - 2
resources/la_templates.c

@@ -368,7 +368,7 @@ void laui_DefaultPanelTitleBar(laUiList *uil, laPropPack *Base, laPropPack *Extr
     cr = laRightColumn(c, 0);
 
     b1=laBeginRow(uil,cr,0,0);
-    laShowItemFull(uil, cr, Base, "title", LA_WIDGET_STRING_PLAIN,0, 0, 0)->Expand=1;
+    laUiItem* tu=laShowItemFull(uil, cr, Base, "title", LA_WIDGET_STRING_PLAIN,0, 0, 0);tu->Expand=1;tu->Flags|=LA_UI_FLAGS_NO_TOOLTIP;
     laShowItem(uil, cr, Base, "hide")->Flags|=LA_UI_FLAGS_ICON;
     laShowItem(uil, cr, Base, "dock")->Flags|=LA_UI_FLAGS_ICON;
     laShowItem(uil, cr, Base, "close")->Flags|=LA_UI_FLAGS_ICON;
@@ -405,7 +405,7 @@ void laui_DefaultOperatorPanelTitleBar(laUiList *uil, laPropPack *Base, laPropPa
     c = laFirstColumn(uil);
 
     b1 = laBeginRow(uil,c,0,0);
-    laShowItemFull(uil, c, Base, "title", LA_WIDGET_STRING_PLAIN,0, 0, 0)->Expand=1;
+    laUiItem* tu=laShowItemFull(uil, c, Base, "title", LA_WIDGET_STRING_PLAIN,0, 0, 0);tu->Expand=1;tu->Flags|=LA_UI_FLAGS_NO_TOOLTIP;
     laShowItem(uil, c, 0, "LA_cancel");//->Flags|=LA_UI_FLAGS_ICON;
     laEndRow(uil, b1);
 }
@@ -571,6 +571,11 @@ void laui_DefaultMenuBarActual(laUiList *uil, laPropPack *pp, laPropPack *actins
                 laShowItemFull(muil, mc, 0, "la.windows.panels_hidden", 0,0, laui_IdentifierOnly,0);
             }
         laEndCondition(uil, b1);
+        b1=laOnConditionThat(uil,c,laPropExpression(0,"la.windows.is_fullscreen"));{
+            laShowItemFull(uil,c,0,"LA_fullscreen",0,"restore=true;text=Restore;icon=🡷",0,0);
+        }laElse(uil,b1);{
+            laShowItemFull(uil,c,0,"LA_fullscreen",0,0,0,0);
+        }laEndCondition(uil, b1);
 
     }laEndCondition(uil,bb);
 

+ 12 - 1
resources/la_translations.c

@@ -19,6 +19,17 @@
 #include "la_5.h"
 
 static const char *entries[]={
+"Multiply (component)","相乘(分量)",
+"Cross","叉乘",
+"Dot","点乘",
+"Append","追加",
+"Restore","恢复",
+"Combine 🡲","合并",
+"New Layout","新布局",
+"Divide (component)","相除(分量)",
+"Color Picker Gamma","拾色器伽玛",
+"Color:","颜色:",
+"Normalize","归一化",
 "General Type Of The File","文件的一般类型",
 "File exists","文件已存在",
 "Selected file already exists. Overwrite the file?","所选文件已存在。覆盖该文件?",
@@ -40,7 +51,7 @@ static const char *entries[]={
 "Themes Loaded In The Program","该程序已加载的主题",
 "Arcsin","反正弦",
 "Atan2","正切2",
-"Divide","除",
+"Divide","除",
 "Arccosine","反余切",
 "Sine","正弦",
 "Arctangent","余弦",

+ 14 - 7
resources/la_widgets.c

@@ -1773,6 +1773,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
     int Len = laGetArrayLength(&ui->PP);
     int IsVertical=(ui->Flags&LA_UI_FLAGS_TRANSPOSE)!=0;
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
+    int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
     if (!laIsInUiItem(ui, e->x, e->y) && !ui->Extra->On){
         ui->State = LA_UI_NORMAL;
@@ -1781,7 +1782,7 @@ int OPMOD_IntArrayHorizon(laOperator *a, laEvent *e){
         return LA_FINISHED_PASS;
     }
 
-    if (e->Type == LA_TIME_IDLE && !uit->On && !uit->Edit){
+    if (e->Type == LA_TIME_IDLE && !uit->On && !uit->Edit && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -1895,8 +1896,9 @@ int OPMOD_FloatArrayHorizon(laOperator *a, laEvent *e){
     int IsVertical=(ui->Flags&LA_UI_FLAGS_TRANSPOSE)!=0;
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
     int IsRad=ui->PP.LastPs->p->IsRadAngle;
+    int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
-    if (!laIsInUiItem(ui, e->x, e->y) && !ui->Extra->On){
+    if (!laIsInUiItem(ui, e->x, e->y) && !ui->Extra->On && !NoTooltip){
         ui->State = LA_UI_NORMAL;
         ui->Extra->On = 0;
         laRedrawCurrentPanel();
@@ -2013,12 +2015,13 @@ int OPMOD_FloatColor(laOperator *a, laEvent *e){
     laGeneralUiExtraData *uit = a->CustomData;
     int Away = 0;
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
+    int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
     if (!laIsInUiItem(ui, e->x, e->y)){
         return LA_FINISHED_PASS;
     }
 
-    if (e->Type == LA_TIME_IDLE){
+    if (e->Type == LA_TIME_IDLE && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2126,6 +2129,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
     int at = 0;
     laEnumItem *Data[32];
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
+    int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
     // norm      e1
     // expand    e1 e2 e3
     // expand vertical  (vertical)
@@ -2143,7 +2147,7 @@ int OPMOD_EnumSelector(laOperator *a, laEvent *e){
 
     if (!laIsInUiItem(ui, e->x, e->y)){ return LA_FINISHED_PASS; }
     
-    if (e->Type == LA_TIME_IDLE){
+    if (e->Type == LA_TIME_IDLE && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2364,6 +2368,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
     int Away = 0;
     char _buf[LA_RAW_CSTR_MAX_LEN] = {0}; char* buf=_buf;
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
+    int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
     if (!laIsInUiItem(ui, e->x, e->y)){
         if (ui->State != LA_UI_EDITING){
@@ -2380,7 +2385,7 @@ int OPMOD_SingleLineString(laOperator *a, laEvent *e){
         }
     }
 
-    if (e->Type == LA_TIME_IDLE && !ui->State){
+    if (e->Type == LA_TIME_IDLE && !ui->State && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2451,6 +2456,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
     int Away = 0;
     char _buf[LA_RAW_CSTR_MAX_LEN] = {0}; char* buf=&_buf;
     int NoEvent = ui->Flags&LA_UI_FLAGS_NO_EVENT;
+    int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
 
     if (!laIsInUiItem(ui, e->x, e->y) && !es->Dragging){
         if ((e->Type & LA_MOUSEDOWN) == LA_MOUSEDOWN){
@@ -2463,7 +2469,7 @@ int OPMOD_MultiString(laOperator *a, laEvent *e){
         if(ui->State!=LA_UI_ACTIVE) return LA_FINISHED_PASS;
     }
 
-    if (e->Type == LA_TIME_IDLE && ui->State!=LA_UI_ACTIVE){
+    if (e->Type == LA_TIME_IDLE && ui->State!=LA_UI_ACTIVE && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;
@@ -2642,6 +2648,7 @@ int OPMOD_CollectionSelector(laOperator *a, laEvent *e){
     laGeneralUiExtraData *uit = a->CustomData;
     laEnumItem *ei;
     laEnumProp *ep = ui->PP.LastPs->p;
+    int NoTooltip=ui->Flags&LA_UI_FLAGS_NO_TOOLTIP;
     int at = 0;
 
     if (a->ConfirmData /* && a->ConfirmData->Mode == LA_CONFIRM_DATA*/){
@@ -2654,7 +2661,7 @@ int OPMOD_CollectionSelector(laOperator *a, laEvent *e){
         return LA_FINISHED;
     }
 
-    if (e->Type == LA_TIME_IDLE && !ui->State){
+    if (e->Type == LA_TIME_IDLE && !ui->State && !NoTooltip){
         int GX = e->x, GY = e->y; laLocalToWindow(a, a->ToPanel, &GX, &GY);
         laPanel *p = laEnableIdlePanel(a->ToPanel, a, 0, 0, &ui->PP, GX, GX + 150, GY, 600, 200, e);
         return LA_RUNNING;