Skip to content

Commit a63cc3f

Browse files
committed
Added setting for disabling clipboard history and gamma/break warning when specific processes are running.
closes #13
1 parent bc63858 commit a63cc3f

File tree

4 files changed

+133
-27
lines changed

4 files changed

+133
-27
lines changed

src/com/esotericsoftware/clippy/Clippy.java

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@
4444
import java.util.Arrays;
4545
import java.util.Date;
4646
import java.util.List;
47+
import java.util.TimerTask;
4748

4849
import javax.swing.KeyStroke;
4950
import javax.swing.UIManager;
@@ -77,6 +78,7 @@ public class Clippy {
7778
final BreakWarning breakWarning;
7879
final Tobii tobii;
7980
boolean disabled;
81+
boolean processDisabled;
8082

8183
public Clippy () {
8284
instance = this;
@@ -269,9 +271,36 @@ public void run () {
269271
if (WARN) warn("Unable to write PID file.", ex);
270272
}
271273

274+
if (config.processesDisable != null) checkProcesses();
275+
272276
if (INFO) info("Started.");
273277
}
274278

279+
void checkProcesses () {
280+
System.out.println(1);
281+
282+
String process = Util.getRunningProcess(config.processesDisable);
283+
if (process != null) {
284+
if (!disabled) {
285+
if (TRACE) trace("Disabled, process running: " + process);
286+
setDisabled(true);
287+
processDisabled = true;
288+
}
289+
} else if (processDisabled) {
290+
processDisabled = false;
291+
if (disabled) {
292+
if (TRACE) trace("Enabled, process no longer running.");
293+
setDisabled(false);
294+
}
295+
}
296+
297+
Util.timer.schedule(new TimerTask() {
298+
public void run () {
299+
checkProcesses();
300+
}
301+
}, config.processesCheckSeconds * 1000);
302+
}
303+
275304
void upload () {
276305
String text = clipboard.getContents();
277306
switch (clipboard.getDataType()) {
@@ -290,10 +319,19 @@ void showPopup (KeyStroke keyStroke) {
290319
}
291320

292321
void store (String text) {
322+
if (config.processesDisableClipHistory != null) {
323+
String process = Util.getRunningProcess(config.processesDisableClipHistory);
324+
if (process != null) {
325+
if (TRACE) trace("Not storing clipboard text, process running: " + process);
326+
return;
327+
}
328+
}
329+
293330
if (text.length() > config.maxLengthToStore) {
294331
if (TRACE) trace("Text too large to store: " + text.length());
295332
return;
296333
}
334+
297335
if (TRACE) trace("Store clipboard text: " + text.trim());
298336
try {
299337
ClipConnection conn = db.getThreadConnection();
@@ -350,15 +388,17 @@ public int paste (String text) {
350388
return newID;
351389
}
352390

353-
public void setDisabled (boolean disabled) {
354-
if (this.disabled == disabled) return;
391+
public boolean setDisabled (boolean disabled) {
392+
if (this.disabled == disabled) return false;
355393
this.disabled = disabled;
356394
if (INFO) info("Disabled: " + disabled);
357395
gamma.toggle();
358396
breakWarning.toggle();
397+
processDisabled = false;
398+
return true;
359399
}
360400

361-
public static void main (String[] args) throws Exception {
401+
static public void main (String[] args) throws Exception {
362402
if (FindWindow(new WString("STATIC"), new WString("com.esotericsoftware.clippy")) != null) {
363403
if (ERROR) error("Already running.");
364404
return;

src/com/esotericsoftware/clippy/Config.java

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,27 +23,25 @@
2323
import static com.esotericsoftware.clippy.util.Util.*;
2424
import static com.esotericsoftware.minlog.Log.*;
2525

26-
import java.io.File;
27-
import java.io.IOException;
28-
import java.text.SimpleDateFormat;
29-
import java.util.ArrayList;
30-
import java.util.Calendar;
31-
import java.util.Collections;
32-
import java.util.Date;
33-
import java.util.HashMap;
34-
import java.util.Map.Entry;
35-
3626
import com.esotericsoftware.clippy.PhilipsHue.PhilipsHueTimeline;
3727
import com.esotericsoftware.clippy.util.ColorTimeline;
3828
import com.esotericsoftware.clippy.util.Sun;
3929
import com.esotericsoftware.jsonbeans.Json;
4030
import com.esotericsoftware.jsonbeans.JsonException;
4131
import com.esotericsoftware.jsonbeans.JsonReader;
42-
import com.esotericsoftware.jsonbeans.JsonSerializable;
4332
import com.esotericsoftware.jsonbeans.JsonValue;
4433
import com.esotericsoftware.jsonbeans.JsonWriter;
4534
import com.esotericsoftware.minlog.Log;
4635

36+
import java.io.File;
37+
import java.io.IOException;
38+
import java.text.SimpleDateFormat;
39+
import java.util.ArrayList;
40+
import java.util.Calendar;
41+
import java.util.Date;
42+
import java.util.HashMap;
43+
import java.util.Map.Entry;
44+
4745
/** @author Nathan Sweet */
4846
public class Config {
4947
static public final Clippy clippy = Clippy.instance;
@@ -63,7 +61,11 @@ public class Config {
6361
public boolean popupPastes = true;
6462
public String font = "Consolas-14";
6563

66-
public int clipBackupDays = 7;
64+
public String[] processesDisableClipHistory;
65+
public String[] processesDisable;
66+
public int processesCheckSeconds = 25;
67+
68+
public int clipBackupDays = 3;
6769

6870
public String screenshotHotkey = null;
6971
public String screenshotAppHotkey = "ctrl alt shift BACK_SLASH";

src/com/esotericsoftware/clippy/Win.java

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
import com.sun.jna.Structure;
3333
import com.sun.jna.WString;
3434
import com.sun.jna.ptr.IntByReference;
35+
import com.sun.jna.ptr.PointerByReference;
3536
import com.sun.jna.win32.W32APIOptions;
3637

3738
/** @author Nathan Sweet */
@@ -367,4 +368,37 @@ protected List<String> getFieldOrder () {
367368
return Arrays.asList("Red", "Green", "Blue");
368369
}
369370
}
371+
372+
static public class Wtsapi32 {
373+
static {
374+
Native.register(NativeLibrary.getInstance("wtsapi32", W32APIOptions.DEFAULT_OPTIONS));
375+
}
376+
377+
static public final int WTS_CURRENT_SERVER_HANDLE = 0;
378+
379+
static public native boolean WTSEnumerateProcesses (int hServer, Pointer Reserved, int Version,
380+
PointerByReference ppProcessInfo, IntByReference pCount);
381+
382+
static public native void WTSFreeMemory (Pointer pMemory);
383+
}
384+
385+
static public class WTS_PROCESS_INFO extends Structure {
386+
public int SessionId;
387+
public int ProcessId;
388+
public WString pProcessName;
389+
public Pointer pUserSid;
390+
391+
private WTS_PROCESS_INFO () {
392+
}
393+
394+
public WTS_PROCESS_INFO (Pointer p) {
395+
super(p);
396+
}
397+
398+
protected List<String> getFieldOrder () {
399+
return Arrays.asList("SessionId", "ProcessId", "pProcessName", "pUserSid");
400+
}
401+
402+
static public final int size = new WTS_PROCESS_INFO().size();
403+
}
370404
}

src/com/esotericsoftware/clippy/util/Util.java

Lines changed: 42 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,18 @@
2323
import static com.esotericsoftware.clippy.Win.User32.*;
2424
import static com.esotericsoftware.minlog.Log.*;
2525

26-
import java.awt.GraphicsEnvironment;
27-
import java.awt.Point;
28-
import java.awt.Robot;
26+
import com.esotericsoftware.clippy.Config.ColorTime;
27+
import com.esotericsoftware.clippy.Config.ColorTimesReference;
28+
import com.esotericsoftware.clippy.Win.POINT;
29+
import com.esotericsoftware.clippy.Win.WTS_PROCESS_INFO;
30+
import com.esotericsoftware.clippy.Win.Wtsapi32;
31+
import com.esotericsoftware.jsonbeans.Json;
32+
import com.esotericsoftware.jsonbeans.JsonException;
33+
import com.esotericsoftware.jsonbeans.JsonSerializer;
34+
import com.esotericsoftware.jsonbeans.JsonValue;
35+
import com.esotericsoftware.jsonbeans.JsonValue.PrettyPrintSettings;
36+
import com.esotericsoftware.jsonbeans.OutputType;
37+
2938
import java.io.Closeable;
3039
import java.io.File;
3140
import java.io.FileInputStream;
@@ -48,15 +57,13 @@
4857
import java.util.concurrent.Executors;
4958
import java.util.concurrent.ThreadFactory;
5059

51-
import com.esotericsoftware.clippy.Config.ColorTime;
52-
import com.esotericsoftware.clippy.Config.ColorTimesReference;
53-
import com.esotericsoftware.clippy.Win.POINT;
54-
import com.esotericsoftware.jsonbeans.Json;
55-
import com.esotericsoftware.jsonbeans.JsonException;
56-
import com.esotericsoftware.jsonbeans.JsonSerializer;
57-
import com.esotericsoftware.jsonbeans.JsonValue;
58-
import com.esotericsoftware.jsonbeans.JsonValue.PrettyPrintSettings;
59-
import com.esotericsoftware.jsonbeans.OutputType;
60+
import com.sun.jna.Pointer;
61+
import com.sun.jna.ptr.IntByReference;
62+
import com.sun.jna.ptr.PointerByReference;
63+
64+
import java.awt.GraphicsEnvironment;
65+
import java.awt.Point;
66+
import java.awt.Robot;
6067

6168
/** @author Nathan Sweet */
6269
public class Util {
@@ -331,4 +338,27 @@ static public void writeJson (Object object, File file) throws IOException {
331338
writer.write(json.prettyPrint(object, pretty));
332339
writer.close();
333340
}
341+
342+
/** @param names May be null.
343+
* @return May be null. */
344+
static public String getRunningProcess (String... names) {
345+
if (names == null) return null;
346+
347+
PointerByReference infosOut = new PointerByReference();
348+
IntByReference countOut = new IntByReference();
349+
if (!Wtsapi32.WTSEnumerateProcesses(Wtsapi32.WTS_CURRENT_SERVER_HANDLE, null, 1, infosOut, countOut)) return null;
350+
351+
Pointer infos = infosOut.getValue();
352+
try {
353+
int size = WTS_PROCESS_INFO.size, offset = 0;
354+
for (int i = 0, n = countOut.getValue(); i < n; i++, offset += size) {
355+
String name = new WTS_PROCESS_INFO(infos.share(offset)).readField("pProcessName").toString();
356+
for (int ii = 0, nn = names.length; ii < nn; ii++)
357+
if (name.equalsIgnoreCase(names[ii])) return name;
358+
}
359+
return null;
360+
} finally {
361+
Wtsapi32.WTSFreeMemory(infos);
362+
}
363+
}
334364
}

0 commit comments

Comments
 (0)