사용자는 텍스트를 선택하고 Ctrl+C를 누릅니다. command
이 작업 후에 어떻게 자동으로 실행할 수 있나요?
다음 솔루션이 필요합니다.
- 클립보드 상태에 대한 알림/확인 방법
- 알림/확인 후 명령이 자동으로 실행됩니다.
나는 모른다.
답변1
X11 클립보드를 모니터링할 수 있습니다. 이것은 콘솔 복사 및 붙여넣기, tmux 또는 기타 기능이 아닌 X11에서만 작동합니다. 따라서 이식성이 의심스러울 수 있으며 필요에 따라 세 개의 클립보드를 모두 모니터링해야 할 수도 있습니다.
// whenclipchange.c
// Run something when a X11 clipboard changes. Note that PRIMARY tends
// to be the traditional default, while certain software instead uses
// CLIPBOARD for I don't know what incompatible reason. There is also
// SECONDARY to make your life more interesting.
#define WHATCLIP "PRIMARY"
#include <sys/wait.h>
#include <assert.h>
#include <err.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/extensions/Xfixes.h>
void WatchSelection(Display *display, Window window, const char *bufname,
char *argv[]);
int
main(int argc, char *argv[])
{
#ifdef __OpenBSD__
if (pledge("exec inet proc rpath stdio unix", NULL) == -1)
err(1, "pledge failed");
#endif
if (argc < 2) err(1, "need a command to run");
argv++; // skip past command name of this program
Display *display = XOpenDisplay(NULL);
unsigned long color = BlackPixel(display, DefaultScreen(display));
Window window = XCreateSimpleWindow(display, DefaultRootWindow(display),
0, 0, 1, 1, 0, color, color);
WatchSelection(display, window, WHATCLIP, argv);
/* NOTREACHED */
XDestroyWindow(display, window);
XCloseDisplay(display);
exit(EXIT_FAILURE);
}
void
WatchSelection(Display *display, Window window, const char *bufname,
char *argv[])
{
int event_base, error_base;
XEvent event;
Atom bufid = XInternAtom(display, bufname, False);
assert(XFixesQueryExtension(display, &event_base, &error_base));
XFixesSelectSelectionInput(display, DefaultRootWindow(display), bufid,
XFixesSetSelectionOwnerNotifyMask);
while (1) {
XNextEvent(display, &event);
if (event.type == event_base + XFixesSelectionNotify &&
((XFixesSelectionNotifyEvent *) &event)->selection ==
bufid) {
pid_t pid = fork();
if (pid < 0) err(1, "fork failed");
if (pid) {
// NOTE this will block until the
// command finishes... so it might miss
// clipboard events?
int status;
wait(&status);
} else {
execvp(*argv, argv);
exit(EXIT_FAILURE);
}
}
}
}
다음과 같이 컴파일하고 실행하십시오.
$ cc -std=c99 -I/usr/X11R6/include -L/usr/X11R6/lib -lX11 -lXft -lXfixes -o whenclipchange whenclipchange.c
$ ./whenclipchange echo clipboard changed