- x11_fd = ConnectionNumber(server.dsp);
- XSync(server.dsp, False);
-
- while (1) {
- // thanks to AngryLlama for the timer
- // Create a File Description Set containing x11_fd
- FD_ZERO (&fd);
- FD_SET (x11_fd, &fd);
-
- tv.tv_usec = 500000;
- tv.tv_sec = 0;
-
- // Wait for X Event or a Timer
- if (select(x11_fd+1, &fd, 0, 0, &tv)) {
- while (XPending (server.dsp)) {
- XNextEvent(server.dsp, &e);
-
- switch (e.type) {
- case ButtonPress:
- //printf("ButtonPress %lx\n", e.xproperty.window);
- if (e.xbutton.button == 1) event_button_press (&e);
- break;
-
- case ButtonRelease:
- event_button_release (&e);
- break;
-
- case Expose:
- panel = get_panel(e.xany.window);
- if (!panel) break;
- //XCopyArea (server.dsp, panel.area.pix.pmap, server.root_win, server.gc_root, 0, 0, panel.area.width, panel.area.height, server.posx, server.posy);
- //XCopyArea (server.dsp, server.pmap, panel.main_win, server.gc, panel.area.paddingxlr, 0, panel.area.width-(2*panel.area.paddingxlr), panel.area.height, 0, 0);
- XCopyArea (server.dsp, panel->root_pmap, panel->main_win, server.gc, 0, 0, panel->area.width, panel->area.height, 0, 0);
- break;
-
- case PropertyNotify:
- //printf("PropertyNotify %lx\n", e.xproperty.window);
- event_property_notify (e.xproperty.window, e.xproperty.atom);
- break;
-
- case ConfigureNotify:
- if (e.xconfigure.window == server.root_win)
- goto load_config;
- else
- event_configure_notify (e.xconfigure.window);
- break;
- }
- }
- }
- else event_timer();
+ x11_fd = ConnectionNumber(server.dsp);
+ XSync(server.dsp, False);
+
+ while (1) {
+ // thanks to AngryLlama for the timer
+ // Create a File Description Set containing x11_fd
+ FD_ZERO (&fd);
+ FD_SET (x11_fd, &fd);
+
+ tv.tv_usec = 500000;
+ tv.tv_sec = 0;
+
+ // Wait for X Event or a Timer
+ if (select(x11_fd+1, &fd, 0, 0, &tv)) {
+ while (XPending (server.dsp)) {
+ XNextEvent(server.dsp, &e);
+
+ switch (e.type) {
+ case ButtonPress:
+ tooltip_hide();
+ event_button_press (&e);
+ break;
+
+ case ButtonRelease:
+ event_button_release(&e);
+ break;
+
+ case MotionNotify: {
+ Panel* panel = get_panel(e.xmotion.window);
+ Task* task = click_task(panel, e.xmotion.x, e.xmotion.y);
+ if (task)
+ tooltip_trigger_show(task, e.xmotion.x_root, e.xmotion.y_root);
+ else
+ tooltip_trigger_hide();
+ break;
+ }
+
+ case LeaveNotify:
+ tooltip_trigger_hide();
+ break;
+
+ case Expose:
+ event_expose(&e);
+ break;
+
+ case PropertyNotify:
+ event_property_notify(&e);
+ break;
+
+ case ConfigureNotify:
+ if (e.xconfigure.window == server.root_win)
+ goto load_config;
+ else
+ event_configure_notify (e.xconfigure.window);
+ break;
+
+ case ReparentNotify:
+ if (!systray.area.on_screen)
+ break;
+ panel = (Panel*)systray.area.panel;
+ if (e.xany.window == panel->main_win) // reparented to us
+ break;
+ // FIXME: 'reparent to us' badly detected => disabled
+ break;
+ case UnmapNotify:
+ case DestroyNotify:
+ if (!systray.area.on_screen)
+ break;
+ for (it = systray.list_icons; it; it = g_slist_next(it)) {
+ if (((TrayWindow*)it->data)->id == e.xany.window) {
+ remove_icon((TrayWindow*)it->data);
+ break;
+ }
+ }
+ break;
+
+ case ClientMessage:
+ if (!systray.area.on_screen) break;
+ if (e.xclient.message_type == server.atom._NET_SYSTEM_TRAY_OPCODE && e.xclient.format == 32 && e.xclient.window == net_sel_win) {
+ net_message(&e.xclient);
+ }
+ else if (e.xclient.message_type == server.atom.XdndPosition) {
+ dnd_message(&e.xclient);
+ }
+ break;
+ }
+ }
+ }
+ event_timer();