2012-05-13 10 views
4

시스템을 X11에 이식하고 클립 보드 복사에 문제가 있습니다 (붙여 넣기가 이미 작동 중입니다). 나는 this을 따라 갔다. 잠시 후 나는 그의 모범이 효과가 없다는 것을 알아 차렸다. 문제는 XA_STRING 대신 요청 된 원자 ID가 434인데 어딘가에 붙여 넣으려고 할 때입니다.이 원자의 내용을 찾을 수 없습니다. XA_STRING을 434로 변경하면 다른 오류가 발생합니다. 다음은 코드입니다. 내가 434에 XA_STRING을 교체하기위한 가지고클립 보드 선택 전송이 작동하지 않습니다.

void SetClipboardText(const std::string &text) { 
    XSetSelectionOwner (display, XA_CLIPBOARD, windowhandle, CurrentTime); 
    copiedtext=text; 
    XFlush(display); 
    std::cout<<"COPIED"<<std::endl; 
} 

... 
case SelectionRequest: 
    XEvent respond; 

    std::cout<<"SELTYPE: "<<event.xselectionrequest.target<<std::endl; 

    if(event.xselectionrequest.target==XA_STRING && 
     event.xselectionrequest.selection==XA_CLIPBOARD) { 
     std::cout<<"REQUESTED"<<std::endl; 

     XChangeProperty (display, 
      event.xselectionrequest.requestor, 
      event.xselectionrequest.property, 
      XA_STRING, 
      copiedtext.length(), 
      PropModeReplace, 
      (unsigned char*) copiedtext.c_str(), 
      copiedtext.length() 
     ); 
     respond.xselection.property=event.xselectionrequest.property; 
    } 
    else { 
     respond.xselection.property= None; 
    } 
    respond.xselection.type= SelectionNotify; 
    respond.xselection.display= event.xselectionrequest.display; 
    respond.xselection.requestor= event.xselectionrequest.requestor; 
    respond.xselection.selection=event.xselectionrequest.selection; 
    respond.xselection.target= event.xselectionrequest.target; 
    respond.xselection.time = event.xselectionrequest.time; 
    XSendEvent (display, event.xselectionrequest.requestor,0,0,&respond); 
    XFlush (display); 
    break; 

오류 :

X Error of failed request: BadValue (integer parameter out of range for operation) 
    Major opcode of failed request: 18 (X_ChangeProperty) 
    Value in failed request: 0x4 
    Serial number of failed request: 33 
    Current serial number in output stream: 36 

관련 경우에, 나는 KDE 4.8 사용하고 klipper 현재 닫혀 있습니다.

편집 : 웹 사이트의 예.

#include <X11/Xlib.h> 
#include <X11/Xatom.h> 
#include <assert.h> 
#include <unistd.h> 
#include <stdio.h> 
#include <stdlib.h> 

main() 
{ 
Display *dpy = XOpenDisplay(NULL); 
assert(dpy); 
Window w = XCreateSimpleWindow(dpy, DefaultRootWindow(dpy), 0, 0, 
       200, 100, 0, 0, 0); 
XSelectInput(dpy, w, StructureNotifyMask); 
XMapWindow(dpy, w); 
XSelectionRequestEvent *req; 
XEvent e, respond; 
for(;;) { 
    XNextEvent(dpy, &e); 
    if (e.type == MapNotify) break; 
} 
XFlush(dpy); 
// 
Atom a1, a2, a3, type; 
XSelectInput(dpy, w, StructureNotifyMask+ExposureMask); 
int format, result; 
unsigned long len, bytes_left, dummy; 
unsigned char *data; 
Window Sown; 
for (int ii = 0; ii < 50; ii++) { 
    XSetSelectionOwner (dpy, XA_PRIMARY, w, CurrentTime); 
    XFlush (dpy); 
    XNextEvent (dpy, &e); 
    if (e.type == SelectionRequest) 
    // 
    // Somebody wants our data 
    // 
    { 
     req=&(e.xselectionrequest); 
     printf ("Selection Request from Mr %i I am %i\n", 
      (int)e.xselection.requestor, (int)w); 
     printf ("prop:%i tar:%i sel:%i\n", req->property, 
      req->target, req->selection); 
     if (req->target == XA_STRING) 
     { 
      XChangeProperty (dpy, 
       req->requestor, 
       req->property, 
       XA_STRING, 
       8, 
       PropModeReplace, 
       (unsigned char*) "It Works", 
       8); 
      respond.xselection.property=req->property; 
     } 
     else // Strings only please 
     { 
      printf ("No String %i\n", 
       (int)req->target); 
      respond.xselection.property= None; 
     } 
     respond.xselection.type= SelectionNotify; 
     respond.xselection.display= req->display; 
     respond.xselection.requestor= req->requestor; 
     respond.xselection.selection=req->selection; 
     respond.xselection.target= req->target; 
     respond.xselection.time = req->time; 
     XSendEvent (dpy, req->requestor,0,0,&respond); 
     XFlush (dpy); 
    } 
} 
} 

gcc copytest.c -o copytest -std=c99 -lX11 
+1

컴파일 할 수있는 전체 소스 코드를 게시 할 수 있습니까? –

+0

@Riateche : 문제 일 수 있습니다. 매우 큰 프레임 워크에 100 개의 파일이 들어 있습니다. 그러나 최소한의 작업 샘플을 만들거나 참조로 사용한 응용 프로그램을 보낼 수도 있습니다. 그것도 잘 작동하지 않습니다. –

+0

이 예제는 나를 위해 우분투 12.04와 함께 작동합니다. 나는이 오류를 일으킬 수있는 것이 무엇인지 모른다. –

답변

2

를 사용하여 컴파일 당신은 XChangeProperty에 대한 PARAM의 형식을 copiedtext.length()을 통과

else if(event.xselectionrequest.target==XA_TARGETS && 
    event.xselectionrequest.selection==XA_CLIPBOARD) { 
    Atom supported[]={XA_STRING}; 
    XChangeProperty (display, 
     event.xselectionrequest.requestor, 
     event.xselectionrequest.property, 
     XA_TARGETS, 
     8, 
     PropModeReplace, 
     (unsigned char *)(&supported), 
     sizeof(supported) 
    ); 
} 
0

KDE 응용 프로그램에 대한 작업을 requied됩니다 팔로우; 이것은 잘못된 것입니다.

당신은 int*에 대한 short*32에 대한 char*16에 대한 8을 통과해야한다.