소스 응용 프로그램 (컨텐츠가 복사 된 위치)을 닫으면 클립 보드 내용을 사용할 수없는 경우가 있습니다.
이것은 소스 어플리케이션이 무엇인지 (예를 들어 PID에 의해) 알 수 있는지 궁금하게 만듭니다.
왜? 소스 응용 프로그램이 터미널 인 경우 복사 된 내용이 상대 경로 인 경우 파일의 전체 경로를 구성하기 위해 터미널의 작업 디렉토리를 찾고 싶습니다.
참고로, 현재 클립 보드 내용을 결정하기 위해 xclip을 사용하고 있습니다.
xclip -selection primary -t STRING -o 2> /dev/null
답변
나는 평범한 응용 프로그램 이름 (예 : 테스트 한 것들 인 ‘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;
}