handle *frontend_controller::profile(const void *in_image_address) { if (1 == _InterlockedIncrement(_worker_refcount.get())) { shared_ptr<void> exit_event(::CreateEvent(NULL, TRUE, FALSE, NULL), &::CloseHandle); auto_ptr<thread> frontend_thread(new thread(bind(&frontend_controller::frontend_worker, _frontend_thread.get(), _factory, &_collector, _image_load_queue, exit_event))); _frontend_thread.release(); swap(_exit_event, exit_event); swap(_frontend_thread, frontend_thread); } return new profiler_instance(in_image_address, _image_load_queue, _worker_refcount, _exit_event); }
void InputThreadX11::run() { LOGI << "Supporting the WM_DELETE_WINDOW protocol." << endl; Atom wm_delete_window = XInternAtom(window_->display_, "WM_DELETE_WINDOW", False); XSetWMProtocols(window_->display_, window_->window_, &wm_delete_window, 1); XEvent event; while (isRunning()) { // The input event that occured. IInputEvent* input_event = 0; // Wait for the next event. XNextEvent(window_->display_, &event); // If we received a keypress or keyrelease message. if (event.type == KeyPress || event.type == KeyRelease) { // Get the keysym. char buf[16]; KeySym key_sym; XLookupString(&event.xkey, buf, 16, &key_sym, 0); bool supported_key = true; ushort key = key_sym; // LOG(LOGDEBUG) << "KeyCode: " << event.xkey.keycode << " '" // << static_cast<char>(event.xkey.keycode) // << "', KeySym: " << key_sym << " '" << // static_cast<char>(key_sym) // << "', String: '" << buf << "'" << endl; // If character is not printable. if (buf[0] == 0) { switch (key_sym) { case XK_Return: key = Key::Enter; break; case XK_Control_L: key = Key::Control_L; break; case XK_Control_R: key = Key::Control_R; break; case XK_Shift_L: key = Key::Shift_L; break; case XK_Shift_R: key = Key::Shift_R; break; case XK_Alt_L: key = Key::Alt_L; break; case XK_Alt_R: key = Key::Alt_R; break; case XK_Super_L: key = Key::Super_L; break; case XK_Super_R: key = Key::Super_R; break; case XK_Escape: key = Key::Escape; break; case XK_F1: key = Key::F1; break; default: supported_key = false; break; } } if (supported_key) { if (event.type == KeyPress) { input_event = new KeyboardInputEvent(KeyboardInputEvent::KEY_DOWN, key); } else { input_event = new KeyboardInputEvent(KeyboardInputEvent::KEY_UP, key); } } } // If we received a client message. else if (event.type == ClientMessage) { // If we received a delete window event. if (static_cast<Atom>(event.xclient.data.l[0]) == wm_delete_window) { LOGI << "Received a delete window event. Sending an exit game event." << endl; // Send an exit game event. StrongIEventPtr exit_event(new ExitGameEvent); game_logic->getEventManager()->queueEvent(exit_event); } // This is probably a dummy event. else { // Do nothing with the dummy event. } } // Tell the logic what input event we got. if (input_event) { game_logic->onInputEvent(input_event); // After the event was handled we need to delete it again. delete input_event; input_event = 0; } } LOGI << "Input threads run method ended." << endl; }