int clientwin_handle(ClientWin *cw, XEvent *ev) { if((ev->type == ButtonRelease && ev->xbutton.button == 1 && cw->mainwin->pressed == cw)) { if((ev->xbutton.x >= 0 && ev->xbutton.y >= 0 && ev->xbutton.x < cw->mini.width && ev->xbutton.y < cw->mini.height)) childwin_focus(cw); cw->mainwin->pressed = 0; return 1; } else if(ev->type == KeyRelease) { if(ev->xkey.keycode == cw->mainwin->key_up) focus_up(cw); else if(ev->xkey.keycode == cw->mainwin->key_down) focus_down(cw); else if(ev->xkey.keycode == cw->mainwin->key_left) focus_left(cw); else if(ev->xkey.keycode == cw->mainwin->key_right) focus_right(cw); else if(ev->xkey.keycode == cw->mainwin->key_enter || ev->xkey.keycode == cw->mainwin->key_space) { childwin_focus(cw); return 1; } } else if(ev->type == ButtonPress && ev->xbutton.button == 1) { cw->mainwin->pressed = cw; } else if(ev->type == FocusIn) { cw->focused = 1; clientwin_render(cw); XFlush(cw->mainwin->dpy); } else if(ev->type == FocusOut) { cw->focused = 0; clientwin_render(cw); XFlush(cw->mainwin->dpy); } else if(ev->type == EnterNotify) { if(cw->mainwin->tooltip) { int win_title_len = 0; FcChar8 *win_title = wm_get_window_title(cw->mainwin->dpy, cw->client.window, &win_title_len); if(win_title) { tooltip_map(cw->mainwin->tooltip, ev->xcrossing.x_root + 20, ev->xcrossing.y_root + 20, win_title, win_title_len); free(win_title); } } } else if(ev->type == LeaveNotify) { if(cw->mainwin->tooltip) tooltip_unmap(cw->mainwin->tooltip); } return 0; }
void clientwin_map(ClientWin *cw) { if(cw->damage) XDamageDestroy(cw->mainwin->dpy, cw->damage); cw->damage = XDamageCreate(cw->mainwin->dpy, cw->client.window, XDamageReportDeltaRectangles); XRenderSetPictureTransform(cw->mainwin->dpy, cw->origin, &cw->mainwin->transform); clientwin_render(cw); XMapWindow(cw->mainwin->dpy, cw->mini.window); }
void clientwin_map(ClientWin *cw) { session_t *ps = cw->mainwin->ps; free_damage(ps, &cw->damage); cw->damage = XDamageCreate(ps->dpy, cw->src.window, XDamageReportDeltaRectangles); XRenderSetPictureTransform(ps->dpy, cw->origin, &cw->mainwin->transform); clientwin_render(cw); XMapWindow(ps->dpy, cw->mini.window); XRaiseWindow(ps->dpy, cw->mini.window); }
void mainwin_update_background(MainWin *mw) { Pixmap dummy = wm_get_root_pmap(mw->dpy); Window dummy_root; int x, y; unsigned int root_w, root_h, border_width, depth; XGetGeometry(mw->dpy, mw->root, &dummy_root, &x, &y, &root_w, &root_h, &border_width, &depth); if(mw->background != 0) { imlib_context_set_image(mw->background); imlib_free_image(); } if(dummy != None) { unsigned int width, height; mw->background = imlib_create_image(root_w, root_h); imlib_context_set_image(mw->background); XGetGeometry(mw->dpy, dummy, &dummy_root, &x, &y, &width, &height, &border_width, &depth); imlib_context_set_drawable(dummy); imlib_copy_drawable_to_image(0, 0, 0, width, height, 0, 0, 1); for(x = 1; x < (int)ceil((double)root_w / width); ++x) imlib_image_copy_rect(0, 0, width, height, x * width, 0); for(y = 1; y < (int)ceil((double)root_h / height); ++y) imlib_image_copy_rect(0, 0, root_w, height, 0, y * height); } else { mw->background = imlib_create_image(root_w, root_h); imlib_context_set_image(mw->background); imlib_image_clear(); } mainwin_update_bg_pixmap(mw); REDUCE(clientwin_render((ClientWin*)iter->data), mw->cod); }
int clientwin_handle(ClientWin *cw, XEvent *ev) { MainWin *mw = cw->mainwin; session_t *ps = mw->ps; if (ev->type == ButtonRelease) { const unsigned button = ev->xbutton.button; if (cw->mainwin->pressed_mouse) { if (button < MAX_MOUSE_BUTTONS) { int ret = clientwin_action(cw, ps->o.bindings_miwMouse[button]); if (ret) { printfef("(): Quitting."); return ret; } } } else printfef("(): ButtonRelease %u ignored.", button); } else if (ev->type == KeyRelease) { if (cw->mainwin->pressed_key) { if (ev->xkey.keycode == cw->mainwin->key_up || ev->xkey.keycode == cw->mainwin->key_k) focus_up(cw); else if (ev->xkey.keycode == cw->mainwin->key_down || ev->xkey.keycode == cw->mainwin->key_j) focus_down(cw); else if (ev->xkey.keycode == cw->mainwin->key_left || ev->xkey.keycode == cw->mainwin->key_h) focus_left(cw); else if (ev->xkey.keycode == cw->mainwin->key_right || ev->xkey.keycode == cw->mainwin->key_l) focus_right(cw); else if (ev->xkey.keycode == cw->mainwin->key_enter || ev->xkey.keycode == cw->mainwin->key_space) { childwin_focus(cw); return 1; } else report_key_unbinded(ev); } else report_key_ignored(ev); } else if (ev->type == ButtonPress) { cw->mainwin->pressed_mouse = true; /* if (ev->xbutton.button == 1) cw->mainwin->pressed = cw; */ } else if (KeyPress == ev->type) { cw->mainwin->pressed_key = true; } else if(ev->type == FocusIn) { cw->focused = 1; clientwin_render(cw); XFlush(ps->dpy); } else if(ev->type == FocusOut) { cw->focused = 0; clientwin_render(cw); XFlush(ps->dpy); } else if(ev->type == EnterNotify) { XSetInputFocus(ps->dpy, cw->mini.window, RevertToParent, CurrentTime); if (cw->mainwin->tooltip) { int win_title_len = 0; FcChar8 *win_title = wm_get_window_title(ps, cw->wid_client, &win_title_len); if (win_title) { tooltip_map(cw->mainwin->tooltip, ev->xcrossing.x_root, ev->xcrossing.y_root, win_title, win_title_len); free(win_title); } } } else if(ev->type == LeaveNotify) { // XSetInputFocus(ps->dpy, mw->window, RevertToParent, CurrentTime); if(cw->mainwin->tooltip) tooltip_unmap(cw->mainwin->tooltip); } return 0; }
static dlist * skippy_run(MainWin *mw, dlist *clients, Window focus, Window leader, Bool all_xin) { XEvent ev; int die = 0; Bool refocus = False; int last_rendered; /* Update the main window's geometry (and Xinerama info if applicable) */ mainwin_update(mw); #ifdef XINERAMA if(all_xin) mw->xin_active = 0; #else /* ! XINERAMA */ if(all_xin); #endif /* XINERAMA */ /* Map the main window and run our event loop */ if(mw->lazy_trans) { mainwin_map(mw); XFlush(mw->dpy); } clients = do_layout(mw, clients, focus, leader); if(! mw->cod) return clients; /* Map the main window and run our event loop */ if(! mw->lazy_trans) mainwin_map(mw); last_rendered = time_in_millis(); while(! die) { int i, j, now, timeout; int move_x = -1, move_y = -1; struct pollfd r_fd; XFlush(mw->dpy); r_fd.fd = ConnectionNumber(mw->dpy); r_fd.events = POLLIN; if(mw->poll_time > 0) timeout = MAX(0, mw->poll_time + last_rendered - time_in_millis()); else timeout = -1; i = poll(&r_fd, 1, timeout); now = time_in_millis(); if(now >= last_rendered + mw->poll_time) { REDUCE(if( ((ClientWin*)iter->data)->damaged ) clientwin_repair(iter->data), mw->cod); last_rendered = now; } i = XPending(mw->dpy); for(j = 0; j < i; ++j) { XNextEvent(mw->dpy, &ev); if (ev.type == MotionNotify) { move_x = ev.xmotion.x_root; move_y = ev.xmotion.y_root; } else if(ev.type == DestroyNotify || ev.type == UnmapNotify) { dlist *iter = dlist_find(clients, clientwin_cmp_func, (void *)ev.xany.window); if(iter) { ClientWin *cw = (ClientWin *)iter->data; clients = dlist_first(dlist_remove(iter)); iter = dlist_find(mw->cod, clientwin_cmp_func, (void *)ev.xany.window); if(iter) mw->cod = dlist_first(dlist_remove(iter)); clientwin_destroy(cw, True); if(! mw->cod) { die = 1; break; } } } else if (mw->poll_time >= 0 && ev.type == mw->damage_event_base + XDamageNotify) { XDamageNotifyEvent *d_ev = (XDamageNotifyEvent *)&ev; dlist *iter = dlist_find(mw->cod, clientwin_cmp_func, (void *)d_ev->drawable); if(iter) { if(mw->poll_time == 0) clientwin_repair((ClientWin *)iter->data); else ((ClientWin *)iter->data)->damaged = True; } } else if(ev.type == KeyRelease && ev.xkey.keycode == mw->key_q) { DIE_NOW = 1; die = 1; break; } else if(ev.type == KeyRelease && ev.xkey.keycode == mw->key_escape) { refocus = True; die = 1; break; } else if(ev.xany.window == mw->window) die = mainwin_handle(mw, &ev); else if(ev.type == PropertyNotify) { if(ev.xproperty.atom == ESETROOT_PMAP_ID || ev.xproperty.atom == _XROOTPMAP_ID) { mainwin_update_background(mw); REDUCE(clientwin_render((ClientWin *)iter->data), mw->cod); } } else if(mw->tooltip && ev.xany.window == mw->tooltip->window) tooltip_handle(mw->tooltip, &ev); else { dlist *iter; for(iter = mw->cod; iter; iter = iter->next) { ClientWin *cw = (ClientWin *)iter->data; if(cw->mini.window == ev.xany.window) { die = clientwin_handle(cw, &ev); if(die) break; } } if(die) break; } } if(mw->tooltip && move_x != -1) tooltip_move(mw->tooltip, move_x + 20, move_y + 20); }