88
99namespace Flow . Launcher . Plugin . ClipboardHistory
1010{
11- public class ClipboardHistory : IPlugin
11+ public class ClipboardHistory : IPlugin , IDisposable
1212 {
13- private const int MaxDataCount = 5000 ;
14- //private readonly KeyboardSimulator keyboardSimulator = new KeyboardSimulator(new InputSimulator());
13+ private const int MaxDataCount = 1000 ;
1514 private readonly InputSimulator inputSimulator = new InputSimulator ( ) ;
1615 private PluginInitContext context ;
17- LinkedList < string > dataList = new LinkedList < string > ( ) ;
16+ private int currentScore = 1 ;
17+ LinkedList < ClipboardData > dataList = new LinkedList < ClipboardData > ( ) ;
1818
19+ public struct ClipboardData : IEquatable < ClipboardData > {
20+ public object data ;
21+ public string text ;
22+ public string displayText ;
23+ public int score ;
24+
25+ public override bool Equals ( object obj ) => obj is ClipboardData && Equals ( ( ClipboardData ) obj ) ;
26+ public bool Equals ( ClipboardData other ) => text . Equals ( other . text ) ;
27+ public override int GetHashCode ( ) => text . GetHashCode ( ) ;
28+ }
29+
1930 public List < Result > Query ( Query query )
2031 {
2132 var results = new List < Result > ( ) ;
22- IEnumerable < string > displayData ;
33+ IEnumerable < ClipboardData > displayData ;
2334
24- if ( query . Terms . Length == 0 )
35+ if ( query . Search . Trim ( ) . Length == 0 )
2536 {
2637 displayData = dataList ;
2738 }
2839 else
2940 {
30- displayData = dataList . Where ( i => i . ToLower ( ) . Contains ( query . SecondToEndSearch . ToLower ( ) ) ) ;
41+ displayData = dataList . Where ( i => i . text . ToLower ( ) . Contains ( query . Search . ToLower ( ) ) ) ;
3142 }
3243
3344 results . AddRange ( displayData . Select ( o => new Result
3445 {
35- Title = o . Trim ( ) . Replace ( " \r \n " , " " ) . Replace ( ' \n ' , ' ' ) ,
46+ Title = o . displayText ,
3647 IcoPath = "Images\\ clipboard.png" ,
48+ Score = o . score ,
3749 Action = c =>
3850 {
39- if ( ! ClipboardMonitor . ClipboardWrapper . SetText ( o ) )
51+ if ( ! ClipboardMonitor . ClipboardWrapper . SetDataObject ( o . data ) )
4052 return false ;
4153
4254 Task . Delay ( 50 ) . ContinueWith ( t => inputSimulator . Keyboard . ModifiedKeyStroke ( VirtualKeyCode . CONTROL , VirtualKeyCode . VK_V ) ) ;
@@ -62,12 +74,18 @@ void ClipboardMonitor_OnClipboardChange(ClipboardFormat format, object data)
6274 {
6375 if ( data != null && ! string . IsNullOrEmpty ( data . ToString ( ) . Trim ( ) ) )
6476 {
65- LinkedListNode < string > node = dataList . Find ( data . ToString ( ) ) ;
77+ ClipboardData obj = new ClipboardData { } ;
78+ obj . data = data ;
79+ obj . text = data . ToString ( ) ;
80+ obj . displayText = obj . text . Trim ( ) . Replace ( "\r \n " , " " ) . Replace ( '\n ' , ' ' ) ;
81+ obj . score = currentScore ++ * 1000 ;
82+
83+ LinkedListNode < ClipboardData > node = dataList . Find ( obj ) ;
6684 if ( node != null )
6785 {
6886 dataList . Remove ( node ) ;
6987 }
70- dataList . AddFirst ( data . ToString ( ) ) ;
88+ dataList . AddFirst ( obj ) ;
7189
7290 if ( dataList . Count > MaxDataCount )
7391 {
@@ -76,5 +94,9 @@ void ClipboardMonitor_OnClipboardChange(ClipboardFormat format, object data)
7694 }
7795 }
7896 }
97+
98+ public void Dispose ( ) {
99+ ClipboardMonitor . Stop ( ) ;
100+ }
79101 }
80102}
0 commit comments