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

Fix crash on right-click: open dialog via QueueAsyncCall instead of in MouseDown

- Avoids re-entrancy with drag/mouse capture on GTK/Qt\n- After OK, re-scale and invalidate the cover to refresh display
Codex CLI 4 месяцев назад
Родитель
Сommit
a052f3f85d
1 измененных файлов с 23 добавлено и 13 удалено
  1. 23 13
      src/book.pas

+ 23 - 13
src/book.pas

@@ -52,7 +52,27 @@ procedure SetPdfCoverGenerationEnabled(AEnabled: Boolean);
 
 implementation
 
-uses UnitBookDialog;
+uses UnitBookDialog, Forms;
+
+procedure OpenBookEditDialogAsync(Data: PtrInt);
+var
+  b: TBook;
+  dlg: TBookEditDialog;
+begin
+  b := TBook(Data);
+  if b = nil then Exit;
+  dlg := TBookEditDialog.Create(nil);
+  try
+    dlg.LoadBook(b);
+    if dlg.ShowModal = mrOK then
+    begin
+      b.EnsureScaledToCoverSize;
+      if Assigned(b.Cover) then b.Cover.Invalidate;
+    end;
+  finally
+    dlg.Free;
+  end;
+end;
 
 var
   gPdfCoverEnabled: Boolean = True;
@@ -88,22 +108,12 @@ var
   i: Integer;
   ctrl: TControl;
   otherBook: TBook;
-  dlg: TBookEditDialog;
 begin
   // Right-click: open edit dialog immediately
   if Button = mbRight then
   begin
-    dlg := TBookEditDialog.Create(nil);
-    try
-      dlg.LoadBook(Self);
-      if dlg.ShowModal = mrOK then
-      begin
-        EnsureScaledToCoverSize;
-        if Assigned(mCover) then mCover.Invalidate;
-      end;
-    finally
-      dlg.Free;
-    end;
+    // Defer to message queue to avoid re-entrancy during mouse handling/drag
+    Application.QueueAsyncCall(@OpenBookEditDialogAsync, PtrInt(Self));
     Exit;
   end;