Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了c – 如何等待窗口映射和可见大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

等待X11窗口映射和查看的正确方法是什么?确切地说,我想等到我可以安全地调用XSetInputFocus()而不会遇到以下错误导致X服务器回火的任何风险:// X Error of failed request: BadMatch (invalid parameter attributes) // Major opcode of failed reques

等待X11窗口映射和查看的正确方法是什么?确切地说,我想等到我可以安全地调用XSetInputFocus()而不会遇到以下错误导致X服务器回火的任何风险:

// X Error of Failed request:  BadMatch (invalid parameter attributes)
// Major opcode of Failed request:  42 (X_SetInputFocus)    

目前这种错误经常发生,尤其是在慢速X服务器上或者在使用libXrandr更改了监视器分辨率后立即尝试打开新窗口时.

我已经有了这个问题的解决方案,但它非常hacky因为它轮询window属性所以我想知道是否有更清洁的版本.

这是我目前的做法:

static Bool predicate(Display *display,XEvent *ev,XPointer arg)
{
    return(ev->type == MapNotify);
}

static void waitmapnotify(struct osdisplayinfo *osd)
{
    XEvent ev;
    XWindowAttributes xwa;

    XPeekIfEvent(osd->display,&ev,predicate,NULL);

    do {
        XGetWindowAttributes(osd->display,osd->window,&xwa);
        usleep(1);
    } while(xwa.map_state != IsViewable);   
}

这段代码工作得很好,但它很hacky所以我在这里讨论它 – 以防万一有一个更干净的方式来做这件事.

最佳答案
在根窗口中选择SubstructureNotifyMask.每次顶层窗口被映射,取消映射,移动,引发,调整大小等时,您都应该获得一个事件.这些事件可能会改变顶级窗口的可见性.每当发生此类事件时,此程序都会打印一条消息:

#include <>dio.h>
int main ()
{
  Display* d = XOpenDisplay(0);
  int cnt = 0;
  XEvent ev;    
  XSelectInput (d,RootWindow(d,DefaultScreen(d)),SubstructureNotifyMask);    
  while (1)
  {
    XNextEvent(d,&ev);
    printf ("Got an event %d!\n",cnt++);
    // <----- do="" your="" xgetwindowattributes(...)="" check="" here="" }="" }="">

请注意,您可能无法获得有关您自己的窗口映射的事件.这是因为WM很可能将顶级窗口重新定义为不是根目录的子节点,而是中间装饰窗口的子节点.

有两种方法可以应对这种情况:

>检查您的窗口父级,父级的父级,…等是否是事件的映射窗口.
>添加XSelectInput(d,yourwindow,StructureNotifyMask);混合.

注意,第一个选择具有SubstructureNotifyMask,第二个选择具有不同的MaskNotifyMask.

大佬总结

以上是大佬教程为你收集整理的c – 如何等待窗口映射和可见全部内容,希望文章能够帮你解决c – 如何等待窗口映射和可见所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。
标签: