int mouse_binding_equals(MouseBinding* a, MouseBinding* b) { if((REMOVEBUTTONMASK(CLEANMASK(a->modifiers)) == REMOVEBUTTONMASK(CLEANMASK(b->modifiers))) && (a->button == b->button)) { return 0; } else { return -1; } }
gboolean keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { guint i, focus; gboolean processed = FALSE; if(ev->type != GDK_KEY_PRESS) return FALSE; if(GTK_WIDGET_HAS_FOCUS(c->searchbar)) focus = SearchBar; else if(GTK_WIDGET_HAS_FOCUS(c->uribar)) focus = UriBar; else focus = Browser; updatewinid(c); for(i = 0; i < LENGTH(keys); i++) { if(focus & keys[i].focus && gdk_keyval_to_lower(ev->keyval) == keys[i].keyval && CLEANMASK(ev->state) == keys[i].mod && keys[i].func) { keys[i].func(c, &(keys[i].arg)); processed = TRUE; } } return processed; }
static void keypress(XEvent *e) { static unsigned int len = sizeof key / sizeof key[0]; unsigned int i; KeySym keysym; XKeyEvent *ev = &e->xkey; keysym = XKeycodeToKeysym(dpy, (KeyCode)ev->keycode, 0); for(i = 0; i < len; i++) { if(keysym == key[i].keysym && CLEANMASK(key[i].mod) == CLEANMASK(ev->state)) { if(key[i].func) key[i].func(&key[i].arg); } } }
gboolean keypress(GtkWidget* w, GdkEventKey *ev, Client *c) { guint i; gboolean processed = FALSE; updatewinid(c); for(i = 0; i < LENGTH(keys); i++) { if(gdk_keyval_to_lower(ev->keyval) == keys[i].keyval && CLEANMASK(ev->state) == keys[i].mod && keys[i].func) { keys[i].func(c, &(keys[i].arg)); processed = TRUE; } } return processed; }
gboolean buttonevent(WebKitWebView *v, GdkEventButton *ev, Client *c) { guint i; gboolean processed = FALSE; updatewinid(c); if(ev->type == GDK_BUTTON_PRESS) { for(i = 0; i < LENGTH(buttons); i++) { if(ev->button == buttons[i].button && CLEANMASK(ev->state) == buttons[i].mod && buttons[i].func) { buttons[i].func(c, &(buttons[i].arg)); processed = TRUE; } } } return processed; }
static void buttonpress(XEvent *e) { Client *c; XButtonPressedEvent *ev = &e->xbutton; if((c = getclient(ev->window))) { focus(c); if(CLEANMASK(ev->state) != MODKEY) return; if(ev->button == Button1 && c->isfloat) { restack(); movemouse(c); } else if(ev->button == Button2) zoom(NULL); else if(ev->button == Button3 && c->isfloat && !c->isfixed) { restack(); resizemouse(c); } } }
void run() { XEvent ev; KeySym keysym; char buf[256]; char errbuf[256] = {"ERROR: "}; char *errmsg = NULL; /*struct timeval t1, t2;*/ struct config *c; XSync(dpy, False); while(!XNextEvent(dpy, &ev)) { if(ev.type == ButtonPress) { if(ev.xbutton.window == win && is_mapped) { XUnmapWindow(dpy, win); XFlush(dpy); is_mapped = False; } continue; } if(ev.type != KeyPress) continue; keysym = XkbKeycodeToKeysym(dpy, (KeyCode)ev.xkey.keycode, 0, 0); for(c=config; c; c=c->next) { if(c->key == keysym && CLEANMASK(c->mod) == CLEANMASK(ev.xkey.state)) { break; } } if(!c) continue; if(!is_mapped) { updategeom(); moveresizeclear(ww, wh); XMapRaised(dpy, win); /* Wait for window to be mapped */ while(1) { XMaskEvent(dpy, SubstructureNotifyMask, &ev); if ((ev.type == CreateNotify || ev.type == MapNotify) && ev.xcreatewindow.window == win) { break; } } is_mapped = True; } /* gettimeofday(&t1, NULL); */ readcmd(c->cmd, buf, sizeof buf, errbuf+7/*skip the 'ERROR: ' part of the buffer */, sizeof(errbuf)-7); /* gettimeofday(&t2, NULL); printf("cmd finished after %li ms\n", ((t2.tv_sec-t1.tv_sec)*1000) + ((t2.tv_usec-t1.tv_usec)/1000)); */ if(buf[strlen(buf)-1] == '\n') buf[strlen(buf)-1] = '\0'; if(errbuf[strlen(errbuf)-1] == '\n') errbuf[strlen(errbuf)-1] = '\0'; if(strlen(buf)) errmsg = NULL; else if(strlen(errbuf+7)) errmsg = errbuf; else errmsg = "ERROR: Command failed"; start_timer(); c->disp(c, errmsg ? errmsg : buf, errmsg ? True : False); XSync(dpy, False); } }
static void events_loop (void) { uint32_t values[3]; xcb_generic_event_t *ev; xcb_get_geometry_reply_t *geom; xcb_window_t win = 0; /* loop */ for (;;) { ev = xcb_wait_for_event(conn); if (ev == NULL) errx(1, "xcb connection broken"); switch (ev->response_type & ~0x80) { case XCB_CREATE_NOTIFY: { xcb_create_notify_event_t *e; e = (xcb_create_notify_event_t *)ev; if (!e->override_redirect) { setup_win(e->window); focus(e->window, ACTIVE); } } break; case XCB_DESTROY_NOTIFY: { xcb_destroy_notify_event_t *e; e = (xcb_destroy_notify_event_t *)ev; xcb_kill_client(conn, e->window); } break; case XCB_KEY_PRESS: { xcb_key_press_event_t *e; e = (xcb_key_press_event_t *)ev; xcb_keysym_t keysym = xcb_get_keysym(e->detail); for (unsigned int i=0; i < LENGTH(keys); i++) { if (keys[i].keysym == keysym && CLEANMASK(keys[i].mod) == CLEANMASK(e->state) && keys[i].mfunc) { keys[i].mfunc(keys[i].x, keys[i].y); } else if (keys[i].keysym == keysym && CLEANMASK(keys[i].mod) == CLEANMASK(e->state) && keys[i].func) { keys[i].func(); } } } break; case XCB_ENTER_NOTIFY: { xcb_enter_notify_event_t *e; e = (xcb_enter_notify_event_t *)ev; focus(e->event, ACTIVE); } break; case XCB_MAP_NOTIFY: { xcb_map_notify_event_t *e; e = (xcb_map_notify_event_t *)ev; if (!e->override_redirect) { xcb_map_window(conn, e->window); xcb_set_input_focus(conn, XCB_INPUT_FOCUS_POINTER_ROOT, e->window, XCB_CURRENT_TIME); } } break; case XCB_BUTTON_PRESS: { xcb_button_press_event_t *e; e = ( xcb_button_press_event_t *)ev; win = e->child; if (!win || win == scr->root) break; values[0] = XCB_STACK_MODE_ABOVE; xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_STACK_MODE, values); geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL); if (1 == e->detail) { values[2] = 1; center_pointer(win); } else { values[2] = 3; xcb_warp_pointer(conn, XCB_NONE, win, 0, 0, 0, 0, geom->width, geom->height); } xcb_grab_pointer(conn, 0, scr->root, XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_MOTION | XCB_EVENT_MASK_POINTER_MOTION_HINT, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, scr->root, XCB_NONE, XCB_CURRENT_TIME); xcb_flush(conn); } break; case XCB_MOTION_NOTIFY: { xcb_query_pointer_reply_t *pointer; pointer = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, scr->root), 0); if (values[2] == 1) { geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL); if (!geom) { break; } values[0] = (pointer->root_x + geom->width / 2 > scr->width_in_pixels - (BORDERWIDTH*2)) ? scr->width_in_pixels - geom->width - (BORDERWIDTH*2) : pointer->root_x - geom->width / 2; values[1] = (pointer->root_y + geom->height / 2 > scr->height_in_pixels - (BORDERWIDTH*2)) ? (scr->height_in_pixels - geom->height - (BORDERWIDTH*2)) : pointer->root_y - geom->height / 2; if (pointer->root_x < geom->width/2) values[0] = 0; if (pointer->root_y < geom->height/2) values[1] = 0; xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, values); xcb_flush(conn); } else if (values[2] == 3) { focus(win, RESIZE); geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL); values[0] = pointer->root_x - geom->x; values[1] = pointer->root_y - geom->y; xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, values); xcb_flush(conn); } } break; case XCB_BUTTON_RELEASE: focus(win, ACTIVE); xcb_ungrab_pointer(conn, XCB_CURRENT_TIME); break; } xcb_flush(conn); free(ev); } }
static void events_loop(void) { xcb_generic_event_t *ev; #ifdef ENABLE_MOUSE uint32_t values[3]; xcb_get_geometry_reply_t *geom; xcb_window_t win = 0; #endif /* loop */ for (;;) { ev = xcb_wait_for_event(conn); if (!ev) errx(1, "xcb connection broken"); switch (CLEANMASK(ev->response_type)) { case XCB_CREATE_NOTIFY: { xcb_create_notify_event_t *e; e = (xcb_create_notify_event_t *)ev; if (!e->override_redirect) { subscribe(e->window); focus(e->window, ACTIVE); } } break; case XCB_DESTROY_NOTIFY: { xcb_destroy_notify_event_t *e; e = (xcb_destroy_notify_event_t *)ev; xcb_kill_client(conn, e->window); } break; #ifdef ENABLE_SLOPPY case XCB_ENTER_NOTIFY: { xcb_enter_notify_event_t *e; e = (xcb_enter_notify_event_t *)ev; focus(e->event, ACTIVE); } break; #endif case XCB_MAP_NOTIFY: { xcb_map_notify_event_t *e; e = (xcb_map_notify_event_t *)ev; if (!e->override_redirect) { xcb_map_window(conn, e->window); focus(e->window, ACTIVE); } } break; #ifdef ENABLE_MOUSE case XCB_BUTTON_PRESS: { xcb_button_press_event_t *e; e = ( xcb_button_press_event_t *)ev; win = e->child; if (!win || win == scr->root) break; values[0] = XCB_STACK_MODE_ABOVE; xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_STACK_MODE, values); geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL); if (e->detail == 1) { values[2] = 1; xcb_warp_pointer(conn, XCB_NONE, win, 0, 0, 0, 0, geom->width/2, geom->height/2); } else { values[2] = 3; xcb_warp_pointer(conn, XCB_NONE, win, 0, 0, 0, 0, geom->width, geom->height); } xcb_grab_pointer(conn, 0, scr->root, XCB_EVENT_MASK_BUTTON_RELEASE | XCB_EVENT_MASK_BUTTON_MOTION | XCB_EVENT_MASK_POINTER_MOTION_HINT, XCB_GRAB_MODE_ASYNC, XCB_GRAB_MODE_ASYNC, scr->root, XCB_NONE, XCB_CURRENT_TIME); xcb_flush(conn); } break; case XCB_MOTION_NOTIFY: { xcb_query_pointer_reply_t *pointer; pointer = xcb_query_pointer_reply(conn, xcb_query_pointer(conn, scr->root), 0); if (values[2] == 1) { geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL); if (!geom) break; values[0] = (pointer->root_x + geom->width / 2 > scr->width_in_pixels - (BORDERWIDTH*2)) ? scr->width_in_pixels - geom->width - (BORDERWIDTH*2) : pointer->root_x - geom->width / 2; values[1] = (pointer->root_y + geom->height / 2 > scr->height_in_pixels - (BORDERWIDTH*2)) ? (scr->height_in_pixels - geom->height - (BORDERWIDTH*2)) : pointer->root_y - geom->height / 2; if (pointer->root_x < geom->width/2) values[0] = 0; if (pointer->root_y < geom->height/2) values[1] = 0; xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, values); xcb_flush(conn); } else if (values[2] == 3) { geom = xcb_get_geometry_reply(conn, xcb_get_geometry(conn, win), NULL); values[0] = pointer->root_x - geom->x; values[1] = pointer->root_y - geom->y; xcb_configure_window(conn, win, XCB_CONFIG_WINDOW_WIDTH | XCB_CONFIG_WINDOW_HEIGHT, values); xcb_flush(conn); } } break; case XCB_BUTTON_RELEASE: focus(win, ACTIVE); xcb_ungrab_pointer(conn, XCB_CURRENT_TIME); break; #endif case XCB_CONFIGURE_NOTIFY: { xcb_configure_notify_event_t *e; e = (xcb_configure_notify_event_t *)ev; if (e->window != focuswin) focus(e->window, INACTIVE); focus(focuswin, ACTIVE); } break; } xcb_flush(conn); free(ev); } }