View Issue Details

IDProjectCategoryView StatusLast Update
0013414FPCRTLpublic2009-03-29 14:13
ReporterDanny MilosavljevicAssigned To 
PrioritynormalSeverityminorReproducibilityalways
Status newResolutionopen 
Product Version2.3.1Product Build 
Target VersionFixed in Version 
Summary0013414: keyboard (UNIX) - add highlight tracking SpecialSequence
DescriptionAttached is a patch to add a SpecialSequence translation for xterm mouse highlight tracking.

XTerm mouse highlight tracking is a kind (the only kind?) of mouse reporting that does BOTH
1) report mouse events to the application AND
2) allow selection of text into the primary selection (clipboard).
at the same time.

XTerm mouse highlight tracking would be enabled by echo -n -e "\033[?1001h"; the patch doesn't do this - in the interest of minimal invasion.

Disable by: echo -n -e "\033[?1001l"

Note that if you enable highlight tracking, the user clicks somewhere and you do not answer back with a range, XTerm will hang. So do not enable highlight tracking without doing all of the following:

The entire conversation between XTerm and the application looks like:
1. to XTerm: \033[?1001h
2. (let user mouse-down somewhere)
3. from XTerm: \033[M!!!
4. to XTerm(with a boundary range): \033[1;<start-x>;<start-y>;<first-valid-row>;<last-valid-row>T
5. (user releases mouse button:) from XTerm: \033[t!!
   (or something like \033[T!!!!!! if the selection was not valid text)
6. to XTerm: \033[?1001l

Coordinates and row indices are 1-based.

The patch adds 5. only, the only part that has to be done in the RTL (as far as I can tell).
TagsNo tags attached.
Fixed in Revision
FPCOldBugId
FPCTarget
Attached Files
  • Freepascal-trunk-keyboard-mouse-highlight_tracking_end.patch (4,069 bytes)
    Index: keyboard.pp
    ===================================================================
    --- keyboard.pp	(Revision 12973)
    +++ keyboard.pp	(Arbeitskopie)
    @@ -475,6 +475,58 @@
         Action : 0;
       );
     
    +  procedure GenHighlightTrackingEndEventValid;
    +  var MouseEvent: TMouseEvent;
    +      ch : char;
    +      fdsin : tfdSet;
    +  begin // CSI t endx endy
    +     fpFD_ZERO(fdsin);
    +     fpFD_SET(StdInputHandle,fdsin);
    +     if inhead=intail then
    +       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.x:=Ord(ch)-ord(' ')-1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.y:=Ord(ch)-ord(' ')-1;
    +     MouseEvent.action:=MouseActionUp;
    +     PutMouseEvent(MouseEvent);
    +  end;
    +  
    +  procedure GenHighlightTrackingEndEventInvalid;
    +  var MouseEvent: TMouseEvent;
    +      ch : char;
    +      fdsin : tfdSet;
    +  begin // CSI T startx, starty, endx, endy, mousex, and mousey
    +     fpFD_ZERO(fdsin);
    +     fpFD_SET(StdInputHandle,fdsin);
    +     if inhead=intail then
    +       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     //MouseEvent.x:=Ord(ch)-ord(' ')-1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     //MouseEvent.y:=Ord(ch)-ord(' ')-1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.x := Ord(ch) - ord(' ') - 1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.y := Ord(ch) - ord(' ') - 1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.action:=MouseActionUp;
    +     PutMouseEvent(MouseEvent);
    +  end;
    +  
       procedure GenMouseEvent;
       var MouseEvent: TMouseEvent;
           ch : char;
    @@ -1034,12 +1086,22 @@
            (char:0;scan:0;st:#27'[?7h')
           );
     
    +{ highlight tracking:
    +mouse released at valid text coordinates: CSI t C x C y . 
    +If either coordinate is past the end of the line: CSI T C x C y C x C y C x C y
    +}
    +
     procedure LoadDefaultSequences;
     
     var i:cardinal;
     
     begin
       AddSpecialSequence(#27'[M',@GenMouseEvent);
    +  if copy(fpgetenv('TERM'),1,5) = 'xterm' then begin
    +    AddSpecialSequence(#27'[t', @GenHighlightTrackingEndEventValid);
    +    AddSpecialSequence(#27'[T', @GenHighlightTrackingEndEventInvalid);
    +  end;
    +  
       {Unix backspace/delete hell... Is #127 a backspace or delete?}
       if copy(fpgetenv('TERM'),1,4)='cons' then
         begin
    @@ -1111,47 +1173,6 @@
       NPT,NNPT : PTreeElement;
     
     
    -  procedure GenMouseEvent;
    -
    -  var MouseEvent: TMouseEvent;
    -
    -  begin
    -    Fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
    -    case ch of
    -      #32 : {left button pressed }
    -        MouseEvent.buttons:=1;
    -      #33 : {middle button pressed }
    -        MouseEvent.buttons:=2;
    -      #34 : { right button pressed }
    -        MouseEvent.buttons:=4;
    -      #35 : { no button pressed };
    -      end;
    -     if inhead=intail then
    -       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    -     ch:=ttyRecvChar;
    -     MouseEvent.x:=Ord(ch)-ord(' ')-1;
    -     if inhead=intail then
    -      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    -     ch:=ttyRecvChar;
    -     MouseEvent.y:=Ord(ch)-ord(' ')-1;
    -     if (MouseEvent.buttons<>0) then
    -       MouseEvent.action:=MouseActionDown
    -     else
    -       begin
    -         if (LastMouseEvent.Buttons<>0) and
    -            ((LastMouseEvent.X<>MouseEvent.X) or (LastMouseEvent.Y<>MouseEvent.Y)) then
    -           begin
    -             MouseEvent.Action:=MouseActionMove;
    -             MouseEvent.Buttons:=LastMouseEvent.Buttons;
    -             PutMouseEvent(MouseEvent);
    -             MouseEvent.Buttons:=0;
    -           end;
    -         MouseEvent.Action:=MouseActionUp;
    -       end;
    -     PutMouseEvent(MouseEvent);
    -     LastMouseEvent:=MouseEvent;
    -  end;
    -
         procedure RestoreArray;
           var
             i : byte;
    
  • Freepascal-trunk-keyboard-mouse-highlight_tracking_end-v2.patch (4,199 bytes)
    Index: keyboard.pp
    ===================================================================
    --- keyboard.pp	(Revision 12976)
    +++ keyboard.pp	(Arbeitskopie)
    @@ -475,6 +475,62 @@
         Action : 0;
       );
     
    +  procedure GenHighlightTrackingEndEventValid;
    +  var MouseEvent: TMouseEvent;
    +      ch : char;
    +      fdsin : tfdSet;
    +  begin // CSI t endx endy
    +     fpFD_ZERO(fdsin);
    +     fpFD_SET(StdInputHandle,fdsin);
    +     if inhead=intail then
    +       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.x:=Ord(ch)-ord(' ')-1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.y:=Ord(ch)-ord(' ')-1;
    +     MouseEvent.buttons := 0;
    +     MouseEvent.action:=MouseActionUp;
    +     PutMouseEvent(MouseEvent);
    +     LastMouseEvent:=MouseEvent;
    +  end;
    +  
    +  procedure GenHighlightTrackingEndEventInvalid;
    +  var MouseEvent: TMouseEvent;
    +      ch : char;
    +      fdsin : tfdSet;
    +  begin // CSI T startx, starty, endx, endy, mousex, and mousey
    +     fpFD_ZERO(fdsin);
    +     fpFD_SET(StdInputHandle,fdsin);
    +     if inhead=intail then
    +       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     //MouseEvent.x:=Ord(ch)-ord(' ')-1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     //MouseEvent.y:=Ord(ch)-ord(' ')-1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.x := Ord(ch) - ord(' ') - 1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.y := Ord(ch) - ord(' ') - 1;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     if inhead=intail then
    +      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    +     ch:=ttyRecvChar;
    +     MouseEvent.buttons := 0;
    +     MouseEvent.action:=MouseActionUp;
    +     PutMouseEvent(MouseEvent);
    +     LastMouseEvent:=MouseEvent;
    +  end;
    +  
       procedure GenMouseEvent;
       var MouseEvent: TMouseEvent;
           ch : char;
    @@ -1034,12 +1090,22 @@
            (char:0;scan:0;st:#27'[?7h')
           );
     
    +{ highlight tracking:
    +mouse released at valid text coordinates: CSI t C x C y . 
    +If either coordinate is past the end of the line: CSI T C x C y C x C y C x C y
    +}
    +
     procedure LoadDefaultSequences;
     
     var i:cardinal;
     
     begin
       AddSpecialSequence(#27'[M',@GenMouseEvent);
    +  if copy(fpgetenv('TERM'),1,5) = 'xterm' then begin
    +    AddSpecialSequence(#27'[t', @GenHighlightTrackingEndEventValid);
    +    AddSpecialSequence(#27'[T', @GenHighlightTrackingEndEventInvalid);
    +  end;
    +  
       {Unix backspace/delete hell... Is #127 a backspace or delete?}
       if copy(fpgetenv('TERM'),1,4)='cons' then
         begin
    @@ -1111,47 +1177,6 @@
       NPT,NNPT : PTreeElement;
     
     
    -  procedure GenMouseEvent;
    -
    -  var MouseEvent: TMouseEvent;
    -
    -  begin
    -    Fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
    -    case ch of
    -      #32 : {left button pressed }
    -        MouseEvent.buttons:=1;
    -      #33 : {middle button pressed }
    -        MouseEvent.buttons:=2;
    -      #34 : { right button pressed }
    -        MouseEvent.buttons:=4;
    -      #35 : { no button pressed };
    -      end;
    -     if inhead=intail then
    -       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    -     ch:=ttyRecvChar;
    -     MouseEvent.x:=Ord(ch)-ord(' ')-1;
    -     if inhead=intail then
    -      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
    -     ch:=ttyRecvChar;
    -     MouseEvent.y:=Ord(ch)-ord(' ')-1;
    -     if (MouseEvent.buttons<>0) then
    -       MouseEvent.action:=MouseActionDown
    -     else
    -       begin
    -         if (LastMouseEvent.Buttons<>0) and
    -            ((LastMouseEvent.X<>MouseEvent.X) or (LastMouseEvent.Y<>MouseEvent.Y)) then
    -           begin
    -             MouseEvent.Action:=MouseActionMove;
    -             MouseEvent.Buttons:=LastMouseEvent.Buttons;
    -             PutMouseEvent(MouseEvent);
    -             MouseEvent.Buttons:=0;
    -           end;
    -         MouseEvent.Action:=MouseActionUp;
    -       end;
    -     PutMouseEvent(MouseEvent);
    -     LastMouseEvent:=MouseEvent;
    -  end;
    -
         procedure RestoreArray;
           var
             i : byte;
    

Activities

2009-03-29 03:04

 

Freepascal-trunk-keyboard-mouse-highlight_tracking_end.patch (4,069 bytes)
Index: keyboard.pp
===================================================================
--- keyboard.pp	(Revision 12973)
+++ keyboard.pp	(Arbeitskopie)
@@ -475,6 +475,58 @@
     Action : 0;
   );
 
+  procedure GenHighlightTrackingEndEventValid;
+  var MouseEvent: TMouseEvent;
+      ch : char;
+      fdsin : tfdSet;
+  begin // CSI t endx endy
+     fpFD_ZERO(fdsin);
+     fpFD_SET(StdInputHandle,fdsin);
+     if inhead=intail then
+       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.x:=Ord(ch)-ord(' ')-1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.y:=Ord(ch)-ord(' ')-1;
+     MouseEvent.action:=MouseActionUp;
+     PutMouseEvent(MouseEvent);
+  end;
+  
+  procedure GenHighlightTrackingEndEventInvalid;
+  var MouseEvent: TMouseEvent;
+      ch : char;
+      fdsin : tfdSet;
+  begin // CSI T startx, starty, endx, endy, mousex, and mousey
+     fpFD_ZERO(fdsin);
+     fpFD_SET(StdInputHandle,fdsin);
+     if inhead=intail then
+       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     //MouseEvent.x:=Ord(ch)-ord(' ')-1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     //MouseEvent.y:=Ord(ch)-ord(' ')-1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.x := Ord(ch) - ord(' ') - 1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.y := Ord(ch) - ord(' ') - 1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.action:=MouseActionUp;
+     PutMouseEvent(MouseEvent);
+  end;
+  
   procedure GenMouseEvent;
   var MouseEvent: TMouseEvent;
       ch : char;
@@ -1034,12 +1086,22 @@
        (char:0;scan:0;st:#27'[?7h')
       );
 
+{ highlight tracking:
+mouse released at valid text coordinates: CSI t C x C y . 
+If either coordinate is past the end of the line: CSI T C x C y C x C y C x C y
+}
+
 procedure LoadDefaultSequences;
 
 var i:cardinal;
 
 begin
   AddSpecialSequence(#27'[M',@GenMouseEvent);
+  if copy(fpgetenv('TERM'),1,5) = 'xterm' then begin
+    AddSpecialSequence(#27'[t', @GenHighlightTrackingEndEventValid);
+    AddSpecialSequence(#27'[T', @GenHighlightTrackingEndEventInvalid);
+  end;
+  
   {Unix backspace/delete hell... Is #127 a backspace or delete?}
   if copy(fpgetenv('TERM'),1,4)='cons' then
     begin
@@ -1111,47 +1173,6 @@
   NPT,NNPT : PTreeElement;
 
 
-  procedure GenMouseEvent;
-
-  var MouseEvent: TMouseEvent;
-
-  begin
-    Fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
-    case ch of
-      #32 : {left button pressed }
-        MouseEvent.buttons:=1;
-      #33 : {middle button pressed }
-        MouseEvent.buttons:=2;
-      #34 : { right button pressed }
-        MouseEvent.buttons:=4;
-      #35 : { no button pressed };
-      end;
-     if inhead=intail then
-       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
-     ch:=ttyRecvChar;
-     MouseEvent.x:=Ord(ch)-ord(' ')-1;
-     if inhead=intail then
-      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
-     ch:=ttyRecvChar;
-     MouseEvent.y:=Ord(ch)-ord(' ')-1;
-     if (MouseEvent.buttons<>0) then
-       MouseEvent.action:=MouseActionDown
-     else
-       begin
-         if (LastMouseEvent.Buttons<>0) and
-            ((LastMouseEvent.X<>MouseEvent.X) or (LastMouseEvent.Y<>MouseEvent.Y)) then
-           begin
-             MouseEvent.Action:=MouseActionMove;
-             MouseEvent.Buttons:=LastMouseEvent.Buttons;
-             PutMouseEvent(MouseEvent);
-             MouseEvent.Buttons:=0;
-           end;
-         MouseEvent.Action:=MouseActionUp;
-       end;
-     PutMouseEvent(MouseEvent);
-     LastMouseEvent:=MouseEvent;
-  end;
-
     procedure RestoreArray;
       var
         i : byte;

2009-03-29 13:59

 

Freepascal-trunk-keyboard-mouse-highlight_tracking_end-v2.patch (4,199 bytes)
Index: keyboard.pp
===================================================================
--- keyboard.pp	(Revision 12976)
+++ keyboard.pp	(Arbeitskopie)
@@ -475,6 +475,62 @@
     Action : 0;
   );
 
+  procedure GenHighlightTrackingEndEventValid;
+  var MouseEvent: TMouseEvent;
+      ch : char;
+      fdsin : tfdSet;
+  begin // CSI t endx endy
+     fpFD_ZERO(fdsin);
+     fpFD_SET(StdInputHandle,fdsin);
+     if inhead=intail then
+       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.x:=Ord(ch)-ord(' ')-1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.y:=Ord(ch)-ord(' ')-1;
+     MouseEvent.buttons := 0;
+     MouseEvent.action:=MouseActionUp;
+     PutMouseEvent(MouseEvent);
+     LastMouseEvent:=MouseEvent;
+  end;
+  
+  procedure GenHighlightTrackingEndEventInvalid;
+  var MouseEvent: TMouseEvent;
+      ch : char;
+      fdsin : tfdSet;
+  begin // CSI T startx, starty, endx, endy, mousex, and mousey
+     fpFD_ZERO(fdsin);
+     fpFD_SET(StdInputHandle,fdsin);
+     if inhead=intail then
+       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     //MouseEvent.x:=Ord(ch)-ord(' ')-1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     //MouseEvent.y:=Ord(ch)-ord(' ')-1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.x := Ord(ch) - ord(' ') - 1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.y := Ord(ch) - ord(' ') - 1;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     if inhead=intail then
+      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
+     ch:=ttyRecvChar;
+     MouseEvent.buttons := 0;
+     MouseEvent.action:=MouseActionUp;
+     PutMouseEvent(MouseEvent);
+     LastMouseEvent:=MouseEvent;
+  end;
+  
   procedure GenMouseEvent;
   var MouseEvent: TMouseEvent;
       ch : char;
@@ -1034,12 +1090,22 @@
        (char:0;scan:0;st:#27'[?7h')
       );
 
+{ highlight tracking:
+mouse released at valid text coordinates: CSI t C x C y . 
+If either coordinate is past the end of the line: CSI T C x C y C x C y C x C y
+}
+
 procedure LoadDefaultSequences;
 
 var i:cardinal;
 
 begin
   AddSpecialSequence(#27'[M',@GenMouseEvent);
+  if copy(fpgetenv('TERM'),1,5) = 'xterm' then begin
+    AddSpecialSequence(#27'[t', @GenHighlightTrackingEndEventValid);
+    AddSpecialSequence(#27'[T', @GenHighlightTrackingEndEventInvalid);
+  end;
+  
   {Unix backspace/delete hell... Is #127 a backspace or delete?}
   if copy(fpgetenv('TERM'),1,4)='cons' then
     begin
@@ -1111,47 +1177,6 @@
   NPT,NNPT : PTreeElement;
 
 
-  procedure GenMouseEvent;
-
-  var MouseEvent: TMouseEvent;
-
-  begin
-    Fillchar(MouseEvent,SizeOf(TMouseEvent),#0);
-    case ch of
-      #32 : {left button pressed }
-        MouseEvent.buttons:=1;
-      #33 : {middle button pressed }
-        MouseEvent.buttons:=2;
-      #34 : { right button pressed }
-        MouseEvent.buttons:=4;
-      #35 : { no button pressed };
-      end;
-     if inhead=intail then
-       fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
-     ch:=ttyRecvChar;
-     MouseEvent.x:=Ord(ch)-ord(' ')-1;
-     if inhead=intail then
-      fpSelect(StdInputHandle+1,@fdsin,nil,nil,10);
-     ch:=ttyRecvChar;
-     MouseEvent.y:=Ord(ch)-ord(' ')-1;
-     if (MouseEvent.buttons<>0) then
-       MouseEvent.action:=MouseActionDown
-     else
-       begin
-         if (LastMouseEvent.Buttons<>0) and
-            ((LastMouseEvent.X<>MouseEvent.X) or (LastMouseEvent.Y<>MouseEvent.Y)) then
-           begin
-             MouseEvent.Action:=MouseActionMove;
-             MouseEvent.Buttons:=LastMouseEvent.Buttons;
-             PutMouseEvent(MouseEvent);
-             MouseEvent.Buttons:=0;
-           end;
-         MouseEvent.Action:=MouseActionUp;
-       end;
-     PutMouseEvent(MouseEvent);
-     LastMouseEvent:=MouseEvent;
-  end;
-
     procedure RestoreArray;
       var
         i : byte;

Issue History

Date Modified Username Field Change
2009-03-29 03:04 Danny Milosavljevic New Issue
2009-03-29 03:04 Danny Milosavljevic File Added: Freepascal-trunk-keyboard-mouse-highlight_tracking_end.patch
2009-03-29 13:59 Danny Milosavljevic File Added: Freepascal-trunk-keyboard-mouse-highlight_tracking_end-v2.patch