콘텐츠가 복사된 원본 응용 프로그램이 닫히면 클립보드 콘텐츠를 사용할 수 없게 되는 경우가 가끔 있습니다.
이로 인해 소스 애플리케이션이 무엇인지(예: PID를 통해) 알 수 있는지 궁금합니다.
왜? 소스 응용 프로그램이 터미널인 경우 복사된 내용이 상대 경로인 경우 터미널의 작업 디렉터리를 찾아서 파일의 전체 경로를 구성하고 싶습니다.
참고로 저는 현재 xclip을 사용하여 클립보드 내용을 확인하고 있습니다.
xclip -selection primary -t STRING -o 2> /dev/null
답변1
나는 일반적인 애플리케이션 이름(예: 테스트한 "Terminal", "gedit" 또는 "SmartGit")을 반환하는 도구를 작성했습니다. 대부분의 코드는 @Harvey에서 뻔뻔스럽게 도난당했습니다.여기.
// gcc clipboard-owner.c -lX11 -o clipboard-owner
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#define MAX_PROPERTY_VALUE_LEN 4096
typedef unsigned long ulong;
static char *get_property(Display *, Window, Atom , const char *, ulong *);
int main(void) {
// Open the Display
Display *display = XOpenDisplay(NULL);
// Get the selection window
Window selection_owner = XGetSelectionOwner(display, XA_PRIMARY);
if(!selection_owner) {
exit(0);
} else {
char *window_name = get_property(display, selection_owner, XA_STRING, "WM_NAME", NULL);
printf("%s\n", window_name);
}
XCloseDisplay(display);
}
static char *get_property (Display *disp, Window win,
Atom xa_prop_type, const char *prop_name, ulong *size) {
Atom xa_prop_name;
Atom xa_ret_type;
int ret_format;
ulong ret_nitems;
ulong ret_bytes_after;
ulong tmp_size;
unsigned char *ret_prop;
char *ret;
xa_prop_name = XInternAtom(disp, prop_name, False);
if (XGetWindowProperty(disp, win, xa_prop_name, 0,
MAX_PROPERTY_VALUE_LEN / 4, False,
xa_prop_type, &xa_ret_type, &ret_format,
&ret_nitems, &ret_bytes_after, &ret_prop) != Success) {
printf("Cannot get %s property.\n", prop_name);
return NULL;
}
if (xa_ret_type != xa_prop_type) {
printf("Invalid type of %s property.\n", prop_name);
XFree(ret_prop);
return NULL;
}
/* null terminate the result to make string handling easier */
tmp_size = (ret_format / 8) * ret_nitems;
/* Correct 64 Architecture implementation of 32 bit data */
if(ret_format==32) tmp_size *= sizeof(long)/4;
ret = (char *)malloc(tmp_size + 1);
memcpy(ret, ret_prop, tmp_size);
ret[tmp_size] = '\0';
if (size) {
*size = tmp_size;
}
XFree(ret_prop);
return ret;
}