Прервать WM_DELETE_WINDOW на X11?

Что относительно констант класса?

<?php

class YourClass
{
    const SOME_CONSTANT = 1;

    public function echoConstant()
    {
        echo self::SOME_CONSTANT;
    }
}

echo YourClass::SOME_CONSTANT;

$c = new YourClass;
$c->echoConstant();
13
задан Michael Trausch 30 July 2009 в 04:28
поделиться

2 ответа

Я не знаю X11, но я погуглил, используя «Перехватить WM_DELETE_WINDOW X11» как ключевые слова. Найдено 17k - MarkMail и Mplayer-совершает r154 - trunk / libvo . В обоих случаях они делают одно и то же.

 /* This is used to intercept window closing requests.  */
 static Atom wm_delete_window;

в static void x11_init () ,

XMapWindow(display, win);
wm_delete_window = XInternAtom(display, "WM_DELETE_WINDOW", False);
XSetWMProtocols(display, win, &wm_delete_window, 1);

затем в static int x11_check_events () ,

XEvent Event;
while (XPending(display)) {
    XNextEvent(display, &Event);
    if (Event.type == ClientMessage) {
        if ((Atom)Event.xclient.data.l[0] == wm_delete_window) {
            /* your code here */
        }
    }
}

См. XInternAtom , XSetWMP и XNextEvent .

После того, как я написал выше, я обнаружил, что Окно обработки закрывается в приложении X11 :

Когда пользователь нажимает кнопку закрытия [x] в нашем приложении X11 мы хотим это чтобы открыть диалоговое окно с вопросом «вы действительно хотите бросить курить? ». Это равнина X приложение. Никаких модных виджетов GTK или QT Вот. Итак, как поймать «окно» закрывается »?

Ответ - сообщить Окну Менеджер нас интересует эти событие, вызвав XSetWMProtocols и регистрация сообщения WM_DELETE_WINDOW с этим. Тогда мы получим клиента сообщение от диспетчера окон, если кто-то пытается закрыть окно, и это не закроет, это оставит нас до нас. Вот пример…

// example.cpp
#include <X11/Xlib.h>
#include <X11/Xatom.h>
#include <iostream>

int main()
{
   Display* display = XOpenDisplay(NULL);
   Window window = XCreateSimpleWindow(display,
                                       DefaultRootWindow(display),
                                       0, 0,
                                       500, 400,
                                       0,
                                       0, 0);

   // register interest in the delete window message
   Atom wmDeleteMessage = XInternAtom(display, "WM_DELETE_WINDOW", False);
   XSetWMProtocols(display, window, &wmDeleteMessage, 1);

   std::cout << "Starting up..." << std::endl;
   XMapWindow(display, window);

   while (true) {
      XEvent event;
      XNextEvent(display, &event);

      if (event.type == ClientMessage &&
          event.xclient.data.l[0] == wmDeleteMessage) {
         std::cout << "Shutting down now!!!" << std::endl;
         break;
      }
   }

   XCloseDisplay(display);
   return 0;
}
13
ответ дан 2 December 2019 в 00:31
поделиться

Хорошо, чтобы уточнить мое предыдущее предложение, вы можете исследовать XEmbed . По крайней мере, это может дать вам несколько идей, которые можно попробовать.

В противном случае я бы посмотрел, как может работать другое подобное программное обеспечение (например, wmdock или как реализован GtkPlug / GtkSocket), хотя я верю в в обоих случаях требуется явная поддержка в приложениях.

Надеюсь, что это будет более полезно.

0
ответ дан 2 December 2019 в 00:31
поделиться
Другие вопросы по тегам:

Похожие вопросы: