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);
	}
Example #2
0
  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;
  }