static void gdk_mir_event_source_queue_event (GdkDisplay *display, GdkWindow *window, const MirEvent *event) { const MirInputEvent *input_event; // FIXME: Only generate events if the window wanted them? switch (mir_event_get_type (event)) { case mir_event_type_input: input_event = mir_event_get_input_event (event); switch (mir_input_event_get_type (input_event)) { case mir_input_event_type_key: handle_key_event (window, input_event); break; case mir_input_event_type_touch: handle_motion_event (window, input_event); break; case mir_input_event_type_pointer: handle_motion_event (window, input_event); break; } break; case mir_event_type_key: handle_key_event (window, mir_event_get_input_event (event)); break; case mir_event_type_motion: handle_motion_event (window, mir_event_get_input_event (event)); break; case mir_event_type_surface: handle_surface_event (window, mir_event_get_surface_event (event)); break; case mir_event_type_resize: handle_resize_event (window, mir_event_get_resize_event (event)); break; case mir_event_type_prompt_session_state_change: // FIXME? break; case mir_event_type_orientation: // FIXME? break; case mir_event_type_close_surface: handle_close_event (window, mir_event_get_close_surface_event (event)); break; default: g_warning ("Ignoring unknown Mir event %d", mir_event_get_type (event)); // FIXME? break; } }
static int x11_event(XEvent *ev) { switch (ev->type) { /* Graphics related events */ case ConfigureNotify: x11_window_xpos=ev->xconfigure.x; x11_window_ypos=ev->xconfigure.y; x11_window_width=ev->xconfigure.width; x11_window_height=ev->xconfigure.height; handle_resize_event(ev->xconfigure.width, ev->xconfigure.height); break; case NoExpose: break; case GraphicsExpose: expose_rect(ev->xgraphicsexpose.x, ev->xgraphicsexpose.y, ev->xgraphicsexpose.width, ev->xgraphicsexpose.height); break; case Expose: expose_rect(ev->xexpose.x, ev->xexpose.y, ev->xexpose.width, ev->xexpose.height); break; /* Copy/Paste events */ case SelectionClear: { XSelectionClearEvent *req; req=&(ev->xselectionclear); pthread_mutex_lock(©buf_mutex); if(req->selection==CONSOLE_CLIPBOARD) FREE_AND_NULL(copybuf); pthread_mutex_unlock(©buf_mutex); } break; case SelectionNotify: { int format; unsigned long len, bytes_left, dummy; Atom type; if(ev->xselection.selection != CONSOLE_CLIPBOARD) break; if(ev->xselection.requestor!=win) break; if(ev->xselection.property) { x11.XGetWindowProperty(dpy, win, ev->xselection.property, 0, 0, 0, AnyPropertyType, &type, &format, &len, &bytes_left, (unsigned char **)(&pastebuf)); if(bytes_left > 0 && format==8) x11.XGetWindowProperty(dpy, win, ev->xselection.property,0,bytes_left,0,AnyPropertyType,&type,&format,&len,&dummy,(unsigned char **)&pastebuf); else pastebuf=NULL; } else pastebuf=NULL; /* Set paste buffer */ sem_post(&pastebuf_set); sem_wait(&pastebuf_used); x11.XFree(pastebuf); pastebuf=NULL; } break; case SelectionRequest: { XSelectionRequestEvent *req; XEvent respond; req=&(ev->xselectionrequest); pthread_mutex_lock(©buf_mutex); if(copybuf==NULL) { respond.xselection.property=None; } else { if(req->target==XA_STRING) { x11.XChangeProperty(dpy, req->requestor, req->property, XA_STRING, 8, PropModeReplace, (unsigned char *)copybuf, strlen(copybuf)); respond.xselection.property=req->property; } else respond.xselection.property=None; } respond.xselection.type=SelectionNotify; respond.xselection.display=req->display; respond.xselection.requestor=req->requestor; respond.xselection.selection=req->selection; respond.xselection.target=req->target; respond.xselection.time=req->time; x11.XSendEvent(dpy,req->requestor,0,0,&respond); pthread_mutex_unlock(©buf_mutex); } break; /* Mouse Events */ case MotionNotify: { XMotionEvent *me = (XMotionEvent *)ev; me->x/=vstat.scaling; me->x/=vstat.charwidth; me->y/=vstat.scaling; me->y/=vstat.charheight; me->x++; me->y++; if(me->x<1) me->x=1; if(me->y<1) me->y=1; if(me->x>vstat.cols) me->x=vstat.cols; if(me->y>vstat.rows+1) me->y=vstat.rows+1; ciomouse_gotevent(CIOLIB_MOUSE_MOVE,me->x,me->y); } break; case ButtonRelease: { XButtonEvent *be = (XButtonEvent *)ev; be->x/=vstat.scaling; be->x/=vstat.charwidth; be->y/=vstat.scaling; be->y/=vstat.charheight; be->x++; be->y++; if(be->x<1) be->x=1; if(be->y<1) be->y=1; if(be->x>vstat.cols) be->x=vstat.cols; if(be->y>vstat.rows+1) be->y=vstat.rows+1; if (be->button <= 3) { ciomouse_gotevent(CIOLIB_BUTTON_RELEASE(be->button),be->x,be->y); } } break; case ButtonPress: { XButtonEvent *be = (XButtonEvent *)ev; be->x/=vstat.scaling; be->x/=vstat.charwidth; be->y/=vstat.scaling; be->y/=vstat.charheight; be->x++; be->y++; if(be->x<1) be->x=1; if(be->y<1) be->y=1; if(be->x>vstat.cols) be->x=vstat.cols; if(be->y>vstat.rows+1) be->y=vstat.rows+1; if (be->button <= 3) { ciomouse_gotevent(CIOLIB_BUTTON_PRESS(be->button),be->x,be->y); } } break; /* Keyboard Events */ case KeyPress: { static char buf[128]; KeySym ks; int n; int nlock = 0; WORD scan = 0xffff; n = x11.XLookupString((XKeyEvent *)ev, buf, sizeof(buf), &ks, 0); switch (ks) { case XK_Escape: scan = 1; goto docode; case XK_Tab: case XK_ISO_Left_Tab: scan = 15; goto docode; case XK_Return: case XK_KP_Enter: scan = 28; goto docode; case XK_Print: scan = 55; goto docode; case XK_F1: case XK_F2: case XK_F3: case XK_F4: case XK_F5: case XK_F6: case XK_F7: case XK_F8: case XK_F9: case XK_F10: scan = ks - XK_F1 + 59; goto docode; case XK_KP_7: nlock = 1; case XK_Home: case XK_KP_Home: scan = 71; goto docode; case XK_KP_8: nlock = 1; case XK_Up: case XK_KP_Up: scan = 72; goto docode; case XK_KP_9: nlock = 1; case XK_Prior: case XK_KP_Prior: scan = 73; goto docode; case XK_KP_Subtract: scan = 74; goto docode; case XK_KP_4: nlock = 1; case XK_Left: case XK_KP_Left: scan = 75; goto docode; case XK_KP_5: nlock = 1; case XK_Begin: case XK_KP_Begin: scan = 76; goto docode; case XK_KP_6: nlock = 1; case XK_Right: case XK_KP_Right: scan = 77; goto docode; case XK_KP_Add: scan = 78; goto docode; case XK_KP_1: nlock = 1; case XK_End: case XK_KP_End: scan = 79; goto docode; case XK_KP_2: nlock = 1; case XK_Down: case XK_KP_Down: scan = 80; goto docode; case XK_KP_3: nlock = 1; case XK_Next: case XK_KP_Next: scan = 81; goto docode; case XK_KP_0: nlock = 1; case XK_Insert: case XK_KP_Insert: scan = 82; goto docode; case XK_KP_Decimal: nlock = 1; scan = 83; goto docode; case XK_Delete: case XK_KP_Delete: /* scan = flipdelete ? 14 : 83; */ scan = 83; goto docode; case XK_BackSpace: /* scan = flipdelete ? 83 : 14; */ scan = 14; goto docode; case XK_F11: scan = 87; goto docode; case XK_F12: scan = 88; goto docode; case XK_KP_Divide: scan = Ascii2Scan['/']; goto docode; case XK_KP_Multiply: scan = Ascii2Scan['*']; goto docode; default: if (ks < ' ' || ks > '~') break; scan = Ascii2Scan[ks]; docode: if (nlock) scan |= 0x100; if ((scan & ~0x100) > 88) { scan = 0xffff; break; } if (ev->xkey.state & Mod1Mask) { scan = ScanCodes[scan & 0xff].alt; } else if ((ev->xkey.state & ShiftMask) || (scan & 0x100)) { scan = ScanCodes[scan & 0xff].shift; } else if (ev->xkey.state & ControlMask) { scan = ScanCodes[scan & 0xff].ctrl; } else scan = ScanCodes[scan & 0xff].base; break; } if (scan != 0xffff) { uint16_t key=scan; write(key_pipe[1], &key, (scan&0xff)?1:2); } return(1); } default: break; } return(0); }