void SkOSWindow::loop() { Display* dsp = fUnixWindow.fDisplay; if (NULL == dsp) { return; } XSelectInput(dsp, fUnixWindow.fWin, EVENT_MASK); bool loop = true; XEvent evt; while (loop) { XNextEvent(dsp, &evt); switch (evt.type) { case Expose: if (evt.xexpose.count == 0) this->inval(NULL); break; case ConfigureNotify: this->resize(evt.xconfigure.width, evt.xconfigure.height); break; case ButtonPress: if (evt.xbutton.button == Button1) this->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kDown_State); break; case ButtonRelease: if (evt.xbutton.button == Button1) this->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kUp_State); break; case MotionNotify: this->handleClick(evt.xmotion.x, evt.xmotion.y, SkView::Click::kMoved_State); break; case KeyPress: { KeySym keysym = XkbKeycodeToKeysym(dsp, evt.xkey.keycode, 0, 0); //SkDebugf("pressed key %i!\n\tKeySym:%i\n", evt.xkey.keycode, XKeycodeToKeysym(dsp, evt.xkey.keycode, 0)); if (keysym == XK_Escape) { loop = false; break; } this->handleKey(XKeyToSkKey(keysym)); long uni = keysym2ucs(keysym); if (uni != -1) { this->handleChar((SkUnichar) uni); } break; } case KeyRelease: //SkDebugf("released key %i\n", evt.xkey.keycode); this->handleKeyUp(XKeyToSkKey(XkbKeycodeToKeysym(dsp, evt.xkey.keycode, 0, 0))); break; case ClientMessage: if (SkEvent::ProcessEvent()) { this->post_linuxevent(); } break; default: // Do nothing for other events break; } } }
SkOSWindow::NextXEventResult SkOSWindow::nextXEvent() { XEvent evt; Display* dsp = fUnixWindow.fDisplay; if (!MyXNextEventWithDelay(dsp, &evt)) { return kContinue_NextXEventResult; } switch (evt.type) { case Expose: if (0 == evt.xexpose.count) { return kPaintRequest_NextXEventResult; } break; case ConfigureNotify: this->resize(evt.xconfigure.width, evt.xconfigure.height); break; case ButtonPress: if (evt.xbutton.button == Button1) this->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kDown_State, NULL, getModi(evt)); break; case ButtonRelease: if (evt.xbutton.button == Button1) this->handleClick(evt.xbutton.x, evt.xbutton.y, SkView::Click::kUp_State, NULL, getModi(evt)); break; case MotionNotify: this->handleClick(evt.xmotion.x, evt.xmotion.y, SkView::Click::kMoved_State, NULL, getModi(evt)); break; case KeyPress: { int shiftLevel = (evt.xkey.state & ShiftMask) ? 1 : 0; KeySym keysym = XkbKeycodeToKeysym(dsp, evt.xkey.keycode, 0, shiftLevel); if (keysym == XK_Escape) { return kQuitRequest_NextXEventResult; } this->handleKey(XKeyToSkKey(keysym)); long uni = keysym2ucs(keysym); if (uni != -1) { this->handleChar((SkUnichar) uni); } break; } case KeyRelease: this->handleKeyUp(XKeyToSkKey(XkbKeycodeToKeysym(dsp, evt.xkey.keycode, 0, 0))); break; case ClientMessage: if ((Atom)evt.xclient.data.l[0] == wm_delete_window_message) { return kQuitRequest_NextXEventResult; } // fallthrough default: // Do nothing for other events break; } return kContinue_NextXEventResult; }