TrayIconWindowMaker::TrayIconWindowMaker(TrayIcon *object, const QPixmap &pm) : TrayIconPrivate(object, 32) { wharf = new TrayIconWharf(object, pm); initWM( wharf->winId() ); }
TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm) : TrayIconPrivate(object, 22) { initWM( winId() ); // initialize NetWM Display *dsp = QX11Info::display(); // dock the widget (adapted from SIM-ICQ) Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen int screen_id = XScreenNumberOfScreen(screen); // and it's number // tell X that we want to see ClientMessage and Deleted events, which // are picked up by QApplication::x11EventFilter Window root_window = QApplication::desktop()->winId(); XWindowAttributes attr; XGetWindowAttributes(dsp, root_window, &attr); XSelectInput(dsp, root_window, attr.your_event_mask | StructureNotifyMask); char buf[32]; snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id); Atom selection_atom = XInternAtom(dsp, buf, false); XGrabServer(dsp); Window manager_window = XGetSelectionOwner(dsp, selection_atom); if ( manager_window != None ) XSelectInput(dsp, manager_window, StructureNotifyMask); XUngrabServer(dsp); XFlush(dsp); if ( manager_window != None ) send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0); else { object->hide(); return; } // some KDE mumbo-jumbo... why is it there? anybody? Atom kwm_dockwindow_atom = XInternAtom(dsp, "KWM_DOCKWINDOW", false); Atom kde_net_system_tray_window_for_atom = XInternAtom(dsp, "_KDE_NET_WM_SYSTEM_TRAY_WINDOW_FOR", false); long data = 0; XChangeProperty(dsp, winId(), kwm_dockwindow_atom, kwm_dockwindow_atom, 32, PropModeReplace, (uchar*)&data, 1); XChangeProperty(dsp, winId(), kde_net_system_tray_window_for_atom, XA_WINDOW, 32, PropModeReplace, (uchar*)&data, 1); setPixmap(pm); }
TrayIconFreeDesktop::TrayIconFreeDesktop(TrayIcon *object, const QPixmap &pm) : TrayIconPrivate(object, 22) { initWM( winId() ); // initialize NetWM Display *dsp = QX11Info::display (); // dock the widget (adapted from SIM-ICQ) Screen *screen = XDefaultScreenOfDisplay(dsp); // get the screen int screen_id = XScreenNumberOfScreen(screen); // and it's number // tell X that we want to see ClientMessage and Deleted events, which // are picked up by QApplication::x11EventFilter Window root_window = QApplication::desktop()->winId(); XWindowAttributes attr; XGetWindowAttributes(dsp, root_window, &attr); XSelectInput(dsp, root_window, attr.your_event_mask | StructureNotifyMask); char buf[32]; snprintf(buf, sizeof(buf), "_NET_SYSTEM_TRAY_S%d", screen_id); Atom selection_atom = XInternAtom(dsp, buf, false); XGrabServer(dsp); Window manager_window = XGetSelectionOwner(dsp, selection_atom); if ( manager_window != None ) XSelectInput(dsp, manager_window, StructureNotifyMask); XUngrabServer(dsp); XFlush(dsp); if ( manager_window != None ) send_message(dsp, manager_window, SYSTEM_TRAY_REQUEST_DOCK, winId(), 0, 0); else { object->hide(); return; } setPixmap(pm); }