- }
- if (!i)
- i = config_read ();
- if (!i) {
- fprintf(stderr, "usage: tint2 [-c] <config_file>\n");
- cleanup();
- exit(1);
- }
- config_finish();
-
- 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:
- event_button_press (&e);
- break;
-
- case ButtonRelease:
- event_button_release(&e);
- 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;
+
+ // thanks to AngryLlama for the timer
+ // Create a File Description Set containing x11_fd
+ FD_ZERO (&fdset);
+ FD_SET (x11_fd, &fdset);
+ update_next_timeout();
+ if (next_timeout.tv_sec >= 0 && next_timeout.tv_usec >= 0)
+ timeout = &next_timeout;
+ else
+ timeout = 0;
+
+ // Wait for X Event or a Timer
+ if (select(x11_fd+1, &fdset, 0, 0, timeout) > 0) {
+ while (XPending (server.dsp)) {
+ XNextEvent(server.dsp, &e);
+
+ panel = get_panel(e.xany.window);
+ if (panel && panel_autohide) {
+ if (e.type == EnterNotify)
+ autohide_trigger_show(panel);
+ else if (e.type == LeaveNotify)
+ autohide_trigger_hide(panel);
+ if (panel->is_hidden) {
+ if (e.type == ClientMessage && e.xclient.message_type == server.atom.XdndPosition) {
+ hidden_dnd = 1;
+ autohide_show(panel);
+ }
+ else
+ continue; // discard further processing of this event because the panel is not visible yet
+ }
+ else if (hidden_dnd && e.type == ClientMessage && e.xclient.message_type == server.atom.XdndLeave) {
+ hidden_dnd = 0;
+ autohide_hide(panel);
+ }
+ }
+
+ switch (e.type) {
+ case ButtonPress:
+ tooltip_hide(0);
+ event_button_press (&e);
+ break;
+
+ case ButtonRelease:
+ event_button_release(&e);
+ break;
+
+ case MotionNotify: {
+ unsigned int button_mask = Button1Mask | Button2Mask | Button3Mask | Button4Mask | Button5Mask;
+ if (e.xmotion.state & button_mask)
+ event_button_motion_notify (&e);
+
+ if (!g_tooltip.enabled) break;
+ Panel* panel = get_panel(e.xmotion.window);
+ Area* area = click_area(panel, e.xmotion.x, e.xmotion.y);
+ if (area->_get_tooltip_text)
+ tooltip_trigger_show(area, panel, &e);
+ else
+ tooltip_trigger_hide();
+ break;
+ }
+
+ case LeaveNotify:
+ if (g_tooltip.enabled)
+ tooltip_trigger_hide();
+ break;
+
+ case Expose:
+ event_expose(&e);
+ break;
+
+ case PropertyNotify:
+ event_property_notify(&e);
+ break;
+
+ case ConfigureNotify:
+ event_configure_notify (e.xconfigure.window);
+ break;