如何反转和反转(刷新)另一个进程的X11窗口?

时间:2019-10-25 15:19:16

标签: c x11 kde konsole

我需要为Konsole实现视觉效果,因为它不符合我的Ubuntu / KDE设置上的辅助功能设置。

我拼凑了一个实用程序来反转当前聚焦的X11窗口,并由Konsole触发它,但是我想不出如何简单地从两次调用invert程序的情况下弄清楚如何使其重新反转窗口。一个shell脚本(有效,但是很丑)。

#include <X11/Xlib.h>
#include <unistd.h>
#include <stdlib.h>
#include <time.h>

int main(void) {
    Display *dpy;
    Window focused=0;
    Window rr;
    int revert_to=0;
    GC gc;
    XGCValues gcv;
    int xr, yr;
    unsigned int wr, hr, bwr, dr;

    struct timespec tp1;
    struct timespec tp2;

    dpy = XOpenDisplay(":0.0");
    XGetInputFocus(dpy, &focused, &revert_to);
    XGetGeometry(dpy, focused, &rr, &xr, &yr, &wr, &hr, &bwr, &dr);

    gc = XCreateGC(dpy, focused, 0, NULL);
    XSetSubwindowMode(dpy, gc, IncludeInferiors);

    gcv.function = GXcopyInverted;
    XChangeGC(dpy, gc, GCFunction, &gcv);
    XFlushGC(dpy, gc);
    XCopyArea(dpy, focused, focused, gc, xr, yr, wr, hr, 0, 0);

    clock_gettime(CLOCK_REALTIME, &tp1);

    for(;;) {
      XEvent e;
      while (XPending(dpy)) XNextEvent(dpy, &e);

      usleep(5000);

      clock_gettime(CLOCK_REALTIME, &tp2);
      if (((tp2.tv_nsec - tp1.tv_nsec)/1000000 + 1000 * (tp2.tv_sec - tp1.tv_sec)) > 15)
        break;
    }

    exit(0);
}

我尝试添加第二个复制操作-反转或同相-如下:

int invert=0;
long slept=0;

for(;;) {
  XEvent e;
  while (XPending(dpy)) XNextEvent(dpy, &e);

  if (invert == 0 || slept > 29) {
    switch (invert++) {
      case 1:
        gcv.function = GXcopyInverted;
        break;
      case 2:
        gcv.function = GXcopyInverted;
        // gcv.function = GXcopy;
        break;
      case 3:
        exit(0);
    }
    XChangeGC(dpy, gc, GCFunction, &gcv);
    XFlushGC(dpy, gc);
    XCopyArea(dpy, focused, focused, gc, xr, yr, wr, hr, 0, 0);

    clock_gettime(CLOCK_REALTIME, &tp1);
    slept=0;
  }

  usleep(5000);

  clock_gettime(CLOCK_REALTIME, &tp2);
  slept = ((tp2.tv_nsec - tp1.tv_nsec)/1000000 + 1000 * (tp2.tv_sec - tp1.tv_sec));
}

有时它可以工作,有时它只是使窗口空白,有时却什么也没做。控制台很容易地刷新空白或反转的数据,但这很令人困惑。

我想我必须在反转操作之间以某种方式将控制权返回给X11,以便进行同步,但是我真的不知道我在做什么。 :)

stole the basis of this from的代码创建了一个位图(以显示在另一个窗口中),所以我想我可以将原图复制到位图中,然后再复制回去,但是我对上面的第一个清单很感兴趣需要。

帮助?

0 个答案:

没有答案