View Issue Details

IDProjectCategoryView StatusLast Update
0011548LazarusIDEpublic2013-09-03 12:07
ReporterGerard V Assigned ToVincent Snijders  
PrioritynormalSeverityminorReproducibilityalways
Status closedResolutionfixed 
Product Version0.9.25 (SVN) 
Fixed in Version0.9.27 (SVN) 
Summary0011548: Copy editor code to clipboard produces a 'Clipboard copy operation failed' error
DescriptionI've seen this one a few times, but now I have reproductible sequence (at least on my setup: FPC 2.3.1, SVN 15559, windows XP SP2 32 bits).
Steps to reproduce:

1. Create a new standard project.
2. Click on the editor behind the autocreated main form.
3. Comment the form variable declaration (two lines) with { }
4. Comment either the 'private' or the 'public' reserved word in the form class declaration with //
5. Select the 'implementation' or 'initialization' reserved word -> Crash

All the navigation in the code editor is done by arrow keys.
Additional InformationThis is what the source code looks like just before step 5
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs;

type
  TForm1 = class(TForm)
  private
    { private declarations }
// public
    { public declarations }
  end;

{var
  Form1: TForm1; }

implementation

initialization
  {$I unit1.lrs}

end.
      
TagsNo tags attached.
Fixed in Revision18105,18106
LazTarget1.4
WidgetsetWin32/Win64
Attached Files

Relationships

has duplicate 0013088 closedPaul Ishenin First copy to clipboard in code editor raises error 

Activities

Paul Ishenin

2008-06-26 03:26

manager   ~0020360

Cannot reproduce.

Gerard V

2008-06-26 10:17

reporter   ~0020364

Seems to be fixed in release 15576.

Gerard V

2008-08-06 10:39

reporter   ~0021075

Sorry, but it rehappens since the latest (release 15965) SVN update.

Gerard V

2008-08-06 10:55

reporter   ~0021076

Last edited: 2008-08-06 11:03

Here's a backtrace:

(gdb) run
Starting program: G:\lazarus\src/lazarus.exe

Breakpoint 1, fpc_raiseexception (OBJ=0x6021298, ANADDR=0x68e3d3,
    AFRAME=0x584f614) at except.inc:195
195 except.inc: No such file or directory.
        in except.inc
(gdb) backtrace
#0 fpc_raiseexception (OBJ=0x6021298, ANADDR=0x68e3d3, AFRAME=0x584f614)
    at except.inc:195
0000001 0x0068e3df in TCUSTOMSYNEDIT__DOCOPYTOCLIPBOARD (STEXT=0x603ebe8,
    this=0x5e8e5e8) at synedit.pp:1355
0000002 0x0068e43e in TCUSTOMSYNEDIT__COPYTOCLIPBOARD (this=0x5e8e5e8)
    at synedit.pp:1416
0000003 0x0069e587 in TCUSTOMSYNEDIT__EXECUTECOMMAND (COMMAND=201, ACHAR='',
    DATA=0x0, this=0x5e8e5e8) at synedit.pp:8448
0000004 0x0069bd80 in TCUSTOMSYNEDIT__COMMANDPROCESSOR (COMMAND=201, ACHAR='',
    DATA=0x0, this=0x5e8e5e8) at synedit.pp:7589
0000005 0x0069058d in TCUSTOMSYNEDIT__KEYDOWN (KEY=0, SHIFT=[SSCTRL],
    this=0x5e8e5e8) at synedit.pp:2270
0000006 0x004dca56 in TWINCONTROL__KEYDOWNBEFOREINTERFACE (KEY=0, SHIFT=[SSCTRL],
    this=0x5e8e5e8) at wincontrol.inc:4947
0000007 0x004dcce5 in TWINCONTROL__DOKEYDOWNBEFOREINTERFACE (MESSAGE=
      {MSG = 48384, CHARCODE = 0, UNUSED = 32313, KEYDATA = 3014657, RESULT = 0}
, this=0x5e8e5e8) at wincontrol.inc:5083
0000008 0x004de847 in TWINCONTROL__CNKEYDOWN (MESSAGE=
      {MSG = 48384, CHARCODE = 0, UNUSED = 32313, KEYDATA = 3014657, RESULT = 0}
, this=0x5e8e5e8) at wincontrol.inc:6165
0000009 0x0040ae11 in TOBJECT__DISPATCH (MESSAGE=void, this=0x5e8e5e8)
    at objpas.inc:451
0000010 0x004e447c in TCONTROL__WNDPROC (THEMESSAGE=
---Type <return> to continue, or q <return> to quit---
      {MSG = 48384, WPARAM = 2117664768, LPARAM = 3014657, RESULT = 0, WPARAMLO
= 0, WPARAMHI = 32313, LPARAMLO = 1, LPARAMHI = 46, RESULTLO = 0, RESULTHI = 0},
 this=0x5e8e5e8) at control.inc:1583
0000011 0x004dc204 in TWINCONTROL__WNDPROC (MESSAGE=
      {MSG = 48384, WPARAM = 2117664768, LPARAM = 3014657, RESULT = 0, WPARAMLO
= 0, WPARAMHI = 32313, LPARAMLO = 1, LPARAMHI = 46, RESULTLO = 0, RESULTHI = 0},
 this=0x5e8e5e8) at wincontrol.inc:4715
0000012 0x0069aa8e in TCUSTOMSYNEDIT__WNDPROC (MSG=
      {MSG = 48384, WPARAM = 2117664768, LPARAM = 3014657, RESULT = 0, WPARAMLO
= 0, WPARAMHI = 32313, LPARAMLO = 1, LPARAMHI = 46, RESULTLO = 0, RESULTHI = 0},
 this=0x5e8e5e8) at synedit.pp:7100
0000013 0x0058ba43 in DELIVERMESSAGE (TARGET=0x5e8e5e8, AMESSAGE=void)
    at lclmessageglue.pas:103
0000014 0x0055c7b0 in WINDOWPROC (WINDOW=655588, MSG=256, WPARAM=67,
    LPARAM=3014657) at win32callback.inc:2387
0000015 0x7e398734 in USER32!GetDC () from C:\WINDOWS\system32\user32.dll
0000016 0x000a00e4 in ?? ()
0000017 0x00000100 in ?? ()
0000018 0x00000043 in ?? ()
0000019 0x002e0001 in ?? ()
0000020 0x0055a600 in GETNEEDPARENTPAINT (AWINDOWINFO=0x55a600,
    AWINCONTROL=0x584fd6c) at win32callback.inc:197
0000021 0x7e398816 in USER32!GetDC () from C:\WINDOWS\system32\user32.dll
---Type <return> to continue, or q <return> to quit---
0000022 0x0055a600 in GETNEEDPARENTPAINT (AWINDOWINFO=0x0, AWINCONTROL=0x7e398830)
    at win32callback.inc:197
0000023 0x7e3989cd in USER32!GetWindowLongW () from C:\WINDOWS\system32\user32.dll
0000024 0x00000000 in ?? () from
0000025 0x0055a600 in GETNEEDPARENTPAINT (AWINDOWINFO=0xffffffff,
    AWINCONTROL=0x7e3989f0) at win32callback.inc:197
0000026 0x7e3996c7 in USER32!DispatchMessageA ()
   from C:\WINDOWS\system32\user32.dll
0000027 0x0584fe60 in ?? ()
0000028 0x00000001 in ?? ()
0000029 0x0584fe80 in ?? ()
0000030 0x0055f71e in TWIN32WIDGETSET__APPPROCESSMESSAGES (this=0x1)
    at win32object.inc:305
0000031 0x0055f71e in TWIN32WIDGETSET__APPPROCESSMESSAGES (this=0x5db0068)
    at win32object.inc:305
0000032 0x0041eee9 in TAPPLICATION__HANDLEMESSAGE (this=0xe20c8)
    at application.inc:975
0000033 0x0041f17f in TAPPLICATION__RUNLOOP (this=0xe20c8) at application.inc:1086
0000034 0x00459db3 in TWIDGETSET__APPRUN (ALOOP=0x41f140 <TAPPLICATION__RUNLOOP>,
    this=0x5db0068) at interfacebase.inc:49
0000035 0x0041f13a in TAPPLICATION__RUN (this=0xe20c8) at application.inc:1073
0000036 0x00402ae9 in main () at lazarus.pp:104

Gerard V

2008-08-07 10:03

reporter   ~0021108

This is very annoying, the problem is intermitent, and I have no way to reproduce it systematically.
I have traced it back to TClipboard.AddFormat wich gets a negative value from TClipboard.EndUpdate, wich gets a negative result from TClipboard.GetOwnerShip;
On getting that negative, TClipboard.AddFormat raises an exception, but it seems that the copy operation was successfull, since all those cheks are done afterwards?

Vincent Snijders

2008-08-08 14:53

manager   ~0021150

I cannot fix it, if I cannot reproduce it.

Alexander S. Klenin

2008-10-11 16:12

developer   ~0022694

I can reproduce it too.

The simplest method of reproduction seems to be:
1) Select any text in editor.
2) Hold "Ctrl" key and press "C" many times in quick succession.
  Exception is raised after 5 to 20 keypresses.

It seems to be timing-related: for example, after I uncommented debugging output
in AddFormat and GetOwnerShip functions and started lazarus with --debug-log,
the problem became harder to reproduce (apparently due to a delay introduced by
logging).

The source of problem is failed Windows.OpenClipboard(FAppHandle) call in
TWin32WidgetSet.ClipboardGetOwnerShip function.
It is hard to know why it fails since, contrary to WinAPI docs,
it does not seem to set GetLastError code
(see confirmation e.g. in WINE code -- http://www.google.com/codesearch?hl=en&q=test_ClipboardOwner)

Alexander S. Klenin

2008-10-11 16:25

developer   ~0022695

Oops, Mantis included closing bracket in URL. It should be:
http://www.google.com/codesearch?hl=en&q=test_ClipboardOwner

2008-10-12 08:34

 

cilpbrd_operation_failed_fix.patch (383 bytes)   
Index: lcl/include/clipbrd.inc
===================================================================
--- lcl/include/clipbrd.inc	(revision 16933)
+++ lcl/include/clipbrd.inc	(working copy)
@@ -140,7 +140,6 @@
     FData[i].Stream.Clear;
     if Size>0 then
       FData[i].Stream.Write(Buffer,Size);
-    FSupportedFormatsChanged:=true;
   finally
     Result:=EndUpdate;
   end;

Alexander S. Klenin

2008-10-12 08:34

developer   ~0022708

I think I have found a fix -- after the attached trivial patch,
I can not reproduce the issue any more.

It prevents extraneous GetOwnerShip calls on every copy operation.
If supported formats have really changed, IndexOfCachedFormatID notices it
and sets FSupportedFormatsChanged by itself.
I verified that column selection is still working.

Please test.

2008-10-12 08:39

 

synedit_docopytocilpboard_cleanup.patch (6,035 bytes)   
Index: components/synedit/synedit.pp
===================================================================
--- components/synedit/synedit.pp	(revision 16933)
+++ components/synedit/synedit.pp	(working copy)
@@ -1325,95 +1325,86 @@
   SLen: integer;
   Failed: boolean;
 begin
-  if SText <> '' then begin
-    Failed := TRUE; // assume the worst.
-    SLen := Length(SText);
-    {$IFDEF SYN_LAZARUS}
-    try
-      Clipboard.Clear;
-      Clipboard.AsText:=SText;
-      Failed:=not Clipboard.HasFormat(CF_TEXT);
-    except
+  if SText = '' then exit;
+  SLen := Length(SText);
+  {$IFDEF SYN_LAZARUS}
+  Clipboard.Clear;
+  Clipboard.AsText:=SText;
+  if not Clipboard.HasFormat(CF_TEXT) then
+    raise ESynEditError.Create('Clipboard copy operation failed: HasFormat');
+  // Copy it in our custom format so we know what kind of block it is.
+  // That effects how it is pasted in.
+  BufSize:=SLen+SizeOf(TSynSelectionMode)+1;
+  GetMem(Buf,BufSize);
+  if Buf = nil then
+    raise ESynEditError.Create('Clipboard copy operation failed: GetMem');
+  try
+    P:=PChar(Buf);
+    // Our format:  TSynSelectionMode value followed by text.
+    PSynSelectionMode(P)^ := SelectionMode;
+    inc(P, SizeOf(TSynSelectionMode));
+    if SLen>0 then begin
+      Move(SText[1], P^, SLen);
+      inc(P,SLen);
     end;
+    P[0]:=#0;
+    if not Clipboard.AddFormat(SynEditClipboardFormat,Buf^,BufSize) then
+      raise ESynEditError.Create('Clipboard copy operation failed: AddFormat');
+  finally
+    FreeMem(Buf);
+  end;
+  {$ELSE}
+  Failed := true; // assume the worst.
+  // Open and Close are the only TClipboard methods we use because TClipboard
+  // is very hard (impossible) to work with if you want to put more than one
+  // format on it at a time.
+  Clipboard.Open;
+  try
+    // Clear anything already on the clipboard.
+    EmptyClipboard;
+    // Put it on the clipboard as normal text format so it can be pasted into
+    // things like notepad or Delphi.
+    Mem := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, SLen + 1);
+    if Mem <> 0 then begin
+      P := GlobalLock(Mem);
+      try
+        if P <> nil then begin
+          Move(PChar(SText)^, P^, SLen + 1);
+          // Put it on the clipboard in text format
+          Failed := SetClipboardData(CF_TEXT, Mem) = 0;
+        end;
+      finally
+        GlobalUnlock(Mem);
+      end;
+    end;
+    // Don't free Mem!  It belongs to the clipboard now, and it will free it
+    // when it is done with it.
     if not Failed then begin
-      Failed:=true;
       // Copy it in our custom format so we know what kind of block it is.
       // That effects how it is pasted in.
-      BufSize:=SLen+SizeOf(TSynSelectionMode)+1;
-      GetMem(Buf,BufSize);
-      if Buf<>nil then
+      Mem := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, SLen +
+        SizeOf(TSynSelectionMode) + 1);
+      P := GlobalLock(Mem);
       try
-        P:=PChar(Buf);
-        // Our format:  TSynSelectionMode value followed by text.
-        PSynSelectionMode(P)^ := SelectionMode;
-        inc(P, SizeOf(TSynSelectionMode));
-        if SLen>0 then begin
-          Move(SText[1], P^, SLen);
-          inc(P,SLen);
+        if P <> nil then begin
+          // Our format:  TSynSelectionMode value followed by text.
+          PSynSelectionMode(P)^ := SelectionMode;
+          inc(P, SizeOf(TSynSelectionMode));
+          Move(PChar(SText)^, P^, SLen + 1);
+          Failed := SetClipboardData(SynEditClipboardFormat, Mem) = 0;
         end;
-        P[0]:=#0;
-        try
-          Failed:=not Clipboard.AddFormat(SynEditClipboardFormat,Buf^,BufSize);
-        except
-        end;
       finally
-        FreeMem(Buf);
+        GlobalUnlock(Mem);
       end;
+      // Don't free Mem!  It belongs to the clipboard now, and it will free it
+      // when it is done with it.
     end;
+  finally
+    Clipboard.Close;
     if Failed then
       raise ESynEditError.Create('Clipboard copy operation failed');
-    {$ELSE}
-    // Open and Close are the only TClipboard methods we use because TClipboard
-    // is very hard (impossible) to work with if you want to put more than one
-    // format on it at a time.
-    Clipboard.Open;
-    try
-      // Clear anything already on the clipboard.
-      EmptyClipboard;
-      // Put it on the clipboard as normal text format so it can be pasted into
-      // things like notepad or Delphi.
-      Mem := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, SLen + 1);
-      if Mem <> 0 then begin
-        P := GlobalLock(Mem);
-        try
-          if P <> nil then begin
-            Move(PChar(SText)^, P^, SLen + 1);
-            // Put it on the clipboard in text format
-            Failed := SetClipboardData(CF_TEXT, Mem) = 0;
-          end;
-        finally
-          GlobalUnlock(Mem);
-        end;
-      end;
-      // Don't free Mem!  It belongs to the clipboard now, and it will free it
-      // when it is done with it.
-      if not Failed then begin
-        // Copy it in our custom format so we know what kind of block it is.
-        // That effects how it is pasted in.
-        Mem := GlobalAlloc(GMEM_MOVEABLE or GMEM_DDESHARE, SLen +
-          SizeOf(TSynSelectionMode) + 1);
-        P := GlobalLock(Mem);
-        try
-          if P <> nil then begin
-            // Our format:  TSynSelectionMode value followed by text.
-            PSynSelectionMode(P)^ := SelectionMode;
-            inc(P, SizeOf(TSynSelectionMode));
-            Move(PChar(SText)^, P^, SLen + 1);
-            Failed := SetClipboardData(SynEditClipboardFormat, Mem) = 0;
-          end;
-        finally
-          GlobalUnlock(Mem);
-        end;
-        // Don't free Mem!  It belongs to the clipboard now, and it will free it
-        // when it is done with it.
-      end;
-    finally
-      Clipboard.Close;
-      if Failed then
-        raise ESynEditError.Create('Clipboard copy operation failed');
-    end;
-    {$ENDIF}
   end;
+  {$ENDIF}
 end;
 
 procedure TCustomSynEdit.CopyToClipboard;

Alexander S. Klenin

2008-10-12 08:41

developer   ~0022709

While investigating this issue, I have made small cleanups to TCustomSynEdit.DoCopyToClipboard procedure.
See attached patch.
There are not functional changes -- only indentation, simplification and
slightly better error messages.

Paul Ishenin

2009-01-04 18:28

manager   ~0024174

Thanks, applied. Gerard, please test and close if ok.

Gerard V

2009-01-07 16:51

reporter   ~0024248

Cannot reproduce anymore, thanks Alexander.

Gerard V

2009-01-21 12:53

reporter   ~0024608

Sorry, but it happens again, same error with revision 18370.
Now it is just start Lazarus, Select some text in the editor, CTRL-C (just one keypress) and I get
"Clipboard copy operation failed: AddFormat. Press Ok.."
Windows XP SP2.
If I press Ok, the text has been copied and can be pasted, and I can go on without any problem.

Paul Ishenin

2009-01-21 14:51

manager   ~0024613

It did not happen here since the time of commit. It does not happen now. If only you have this problem not then try to research yourself.

Paul Ishenin

2009-01-21 14:51

manager   ~0024614

1. Try to check on another computer
2. Try to remember - maybe you've changed something in your windows

Gerard V

2009-01-21 19:49

reporter   ~0024623

Windows is the same, just with the current security updates.
I'll try with other computers.

Gerard V

2009-02-01 15:39

reporter   ~0024990

Last edited: 2009-02-02 09:51

I tested again with 3 different computers other than the one at work wich has this problem (2 XP, 1 Win2000) and I can't reproduce it there, wich I'm afraid doesn't prove anything.
I'll try to dig into the windows clipboard and formats when I have some time.

Paul Ishenin

2009-02-01 16:18

manager   ~0024992

Since the time we tried to fix this issue I had it only once (about month at moment). Not a big problem imo :) Maybe as a possible solution we just need to remove that raise there or to catch it outside.

Alexander S. Klenin

2009-02-05 16:03

developer   ~0025143

Sigh. As I suspected, my patch only mitigated the issue,
not fixed it entirely.
I too still see this error pop up, although much less frequently --
about once per day of heavy Lazarus usage.
I think that, indeed, we may "sweep it under the carpet" for now
by removing the raise.
In that case, I suggest to keep this bug open as a remainder/future reference.

Vincent Snijders

2009-04-29 15:04

manager   ~0027186

Alexander, can you confirm the issue still occurs after r19668?

Alexander S. Klenin

2009-04-29 18:36

developer   ~0027193

I was unable to reproduce it in a few tries.
However it happened rarely, so may be I was just (un)lucky.
So I suggest to wait about a week before closing.

Vincent Snijders

2009-05-25 12:10

manager   ~0027953

Waited for 4 weeks, resolving now.

Issue History

Date Modified Username Field Change
2008-06-24 12:47 Gerard V New Issue
2008-06-24 12:47 Gerard V Widgetset => Win32
2008-06-24 19:06 Vincent Snijders LazTarget => 1.0
2008-06-24 19:06 Vincent Snijders Status new => acknowledged
2008-06-26 03:26 Paul Ishenin Note Added: 0020360
2008-06-26 08:41 Vincent Snijders LazTarget 1.0 => 0.9.26
2008-06-26 08:41 Vincent Snijders Assigned To => Marc Weustink
2008-06-26 08:41 Vincent Snijders Status acknowledged => assigned
2008-06-26 08:41 Vincent Snijders Target Version => 0.9.26
2008-06-26 10:17 Gerard V Note Added: 0020364
2008-06-26 10:36 Vincent Snijders Assigned To Marc Weustink => Vincent Snijders
2008-06-26 10:37 Vincent Snijders Status assigned => resolved
2008-06-26 10:37 Vincent Snijders Resolution open => no change required
2008-08-06 10:39 Gerard V Status resolved => assigned
2008-08-06 10:39 Gerard V Resolution no change required => reopened
2008-08-06 10:39 Gerard V Note Added: 0021075
2008-08-06 10:55 Gerard V Note Added: 0021076
2008-08-06 11:03 Gerard V Note Edited: 0021076
2008-08-07 10:03 Gerard V Note Added: 0021108
2008-08-08 14:53 Vincent Snijders LazTarget 0.9.26 => 1.0
2008-08-08 14:53 Vincent Snijders Note Added: 0021150
2008-08-08 14:53 Vincent Snijders Assigned To Vincent Snijders =>
2008-08-08 14:53 Vincent Snijders Status assigned => acknowledged
2008-08-08 14:53 Vincent Snijders Target Version 0.9.26 => 1.0.0
2008-10-11 16:12 Alexander S. Klenin Note Added: 0022694
2008-10-11 16:25 Alexander S. Klenin Note Added: 0022695
2008-10-12 08:34 Alexander S. Klenin File Added: cilpbrd_operation_failed_fix.patch
2008-10-12 08:34 Alexander S. Klenin Note Added: 0022708
2008-10-12 08:39 Alexander S. Klenin File Added: synedit_docopytocilpboard_cleanup.patch
2008-10-12 08:41 Alexander S. Klenin Note Added: 0022709
2009-01-04 18:28 Paul Ishenin Fixed in Revision => 18105,18106
2009-01-04 18:28 Paul Ishenin Status acknowledged => resolved
2009-01-04 18:28 Paul Ishenin Fixed in Version => 0.9.27 (SVN)
2009-01-04 18:28 Paul Ishenin Resolution reopened => fixed
2009-01-04 18:28 Paul Ishenin Assigned To => Paul Ishenin
2009-01-04 18:28 Paul Ishenin Note Added: 0024174
2009-01-07 16:51 Gerard V Status resolved => closed
2009-01-07 16:51 Gerard V Note Added: 0024248
2009-01-21 12:53 Gerard V Status closed => assigned
2009-01-21 12:53 Gerard V Resolution fixed => reopened
2009-01-21 12:53 Gerard V Note Added: 0024608
2009-01-21 14:51 Paul Ishenin LazTarget 1.0 => post 1.2
2009-01-21 14:51 Paul Ishenin Note Added: 0024613
2009-01-21 14:51 Paul Ishenin Assigned To Paul Ishenin =>
2009-01-21 14:51 Paul Ishenin Status assigned => feedback
2009-01-21 14:51 Paul Ishenin Target Version 1.0.0 =>
2009-01-21 14:51 Paul Ishenin Note Added: 0024614
2009-01-21 19:49 Gerard V Note Added: 0024623
2009-02-01 07:15 Paul Ishenin Relationship added has duplicate 0013088
2009-02-01 15:39 Gerard V Note Added: 0024990
2009-02-01 16:18 Paul Ishenin Note Added: 0024992
2009-02-02 09:51 Gerard V Note Edited: 0024990
2009-02-05 16:03 Alexander S. Klenin Note Added: 0025143
2009-04-21 12:27 Vincent Snijders Status feedback => acknowledged
2009-04-29 15:04 Vincent Snijders Note Added: 0027186
2009-04-29 15:06 Vincent Snijders Status acknowledged => feedback
2009-04-29 18:36 Alexander S. Klenin Note Added: 0027193
2009-05-25 12:10 Vincent Snijders Status feedback => resolved
2009-05-25 12:10 Vincent Snijders Resolution reopened => fixed
2009-05-25 12:10 Vincent Snijders Assigned To => Vincent Snijders
2009-05-25 12:10 Vincent Snijders Note Added: 0027953
2009-10-23 00:39 Marc Weustink Status resolved => closed
2013-09-03 12:07 Martin Friebe LazTarget post 1.2 => 1.4