LINUX.ORG.RU

Xlib EnterNotify/LeaveNotify - не работает

 


0

2

Не получается завести эти события (присутствие/отсутствие курсора в окне), лишь после закрытия окна видно что они есть. При закрытии окна ошибка:

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server ":0"
      after 42 requests (40 known processed) with 0 events remaining.

После долгого перебора аттрибутов и mask ошибки нет, но нет даже признаков выполнения событий EnterNotify/LeaveNotify. В xev первый называется немного иначе: MotionNotify, но оно тоже не работает.

#include <stdio.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>

int main(int argc, char **argv)
 {
  Display *ourDisplay;
  int ourScreen;
  Window  myWindow, rootWindow, childWindow;
  unsigned long bgcolor;
  int myDepth;
  XSetWindowAttributes myAttr;
  Visual *myVisual;  
  XSizeHints mySizeHints;
  XClassHint myClassHint;
  char *myPropertyData;
  char *myClassName="example";
  char *myResName="example";
  char *iconName;
  
  
  ourDisplay=XOpenDisplay(NULL);
  if (ourDisplay==NULL)
    {
      printf("Не удалось установить соединение с графическим терминалом.\n");
      return 1;
    };

  /* Получим предварительные сведения */
  ourScreen=DefaultScreen(ourDisplay);           /* Экран по-умолчанию        */
  rootWindow=RootWindow(ourDisplay, ourScreen);  /* Корневое окно             */
  bgcolor=WhitePixel(ourDisplay, ourScreen);     /* Белый цвет экрана         */
  myDepth=DefaultDepth(ourDisplay, ourScreen);   /* Глубина цветности экрана  */
  myVisual=DefaultVisual(ourDisplay, ourScreen); /* Визуальные характеристики */

  myAttr.colormap = DefaultColormap(ourDisplay,ourScreen);
  myAttr.override_redirect = True;
  
  unsigned long mask = CWEventMask | CWColormap | CWBorderPixel | CWBackPixel | CWOverrideRedirect;

  myWindow=XCreateWindow(ourDisplay,rootWindow,100, 100, 320, 200,
    0, myDepth, InputOutput, myVisual, mask, &myAttr);
    
  /* Делаем окна видимыми */
  XMapWindow(ourDisplay, myWindow);
   XEvent report;
   XSelectInput(ourDisplay, myWindow, EnterWindowMask | LeaveWindowMask | StructureNotifyMask);
while ( 1 ) {
  XNextEvent ( ourDisplay, &report );
    switch ( report.type ) {
    case EnterNotify :
     printf("enter");
     break;
         case LeaveNotify :
     printf("leave");
     break;
  }

}

  XFlush(ourDisplay);
  XDestroyWindow(ourDisplay, myWindow);
  XCloseDisplay(ourDisplay);

  return 0;
 };

Нигде в интернетах примеров этих событий не нашел. Может быть, кто-то может подсказать? Спасибо.


Не получается завести эти события (присутствие/отсутствие курсора в окне), лишь после закрытия окна видно что они есть

Что значит «после закрытия окна видно»? В закрытое окно события не приходят.

После долгого перебора аттрибутов и mask ошибки нет, но нет даже признаков выполнения событий EnterNotify/LeaveNotify. В xev первый называется немного иначе: MotionNotify, но оно тоже не работает.

Motion и Enter это разные события. В xev винды оба, разумеется.

printf(«enter»);

Оно не выведется пока не переполнится буфер вывода. Либо делай fflush() либо ставь \n в конец.

firkax ★★★★★
()
Ответ на: комментарий от firkax

Оно не выведется пока не переполнится буфер вывода. Либо делай fflush() либо ставь \n в конец.

Спасибо тебе, добрый человек, всё заработало)

el8mn
() автор топика