void    pfGUIMenuItem::IUpdate( void )
{
    if( fDynTextMap == nil )
        return;

    if( fSkin != nil )
    {
        IUpdateSkinBuffers();

        if( !fSkinBuffersUpdated )
            return;

        // Copy now from our skin buffer, plus set our text color
        uint16_t y = fDynTextMap->GetVisibleHeight();

        if( IsInteresting() )
        {
            fDynTextMap->DrawClippedImage( 0, 0, fDynTextMap, 0, y << 1, fDynTextMap->GetVisibleWidth(), y, plDynamicTextMap::kImgSprite );
            fDynTextMap->SetTextColor( GetColorScheme()->fSelForeColor );
        }
        else
        {
            fDynTextMap->DrawClippedImage( 0, 0, fDynTextMap, 0, y, fDynTextMap->GetVisibleWidth(), y, plDynamicTextMap::kImgSprite );
            fDynTextMap->SetTextColor( GetColorScheme()->fForeColor );
        }
    }
    else
    {
        if( IsInteresting() )
        {
            fDynTextMap->ClearToColor( GetColorScheme()->fSelBackColor );
            fDynTextMap->SetTextColor( GetColorScheme()->fSelForeColor );
        }
        else
        {
            fDynTextMap->ClearToColor( GetColorScheme()->fBackColor );
            fDynTextMap->SetTextColor( GetColorScheme()->fForeColor );
        }
    }

    fDynTextMap->SetJustify( plDynamicTextMap::kLeftJustify );

    if( fName != nil )
    {
        uint16_t ht;
        fDynTextMap->CalcStringWidth( fName, &ht );

        int16_t x = 0, y = ( fDynTextMap->GetVisibleHeight() - ht ) >> 1;
        if( fHowToSkin == kTop && fSkin != nil )
            y += fSkin->GetElement( pfGUISkin::kTopSpan ).fHeight >> 1;
        else if( fHowToSkin == kBottom && fSkin != nil )
Example #2
0
void Init()
{
  s_devnode_name_map.clear();

  // During initialization we use udev to iterate over all /dev/input/event* devices.
  // Note: the Linux kernel is currently limited to just 32 event devices. If this ever
  //            changes, hopefully udev will take care of this.

  udev* udev = udev_new();
  _assert_msg_(PAD, udev != nullptr, "Couldn't initialize libudev.");

  // List all input devices
  udev_enumerate* enumerate = udev_enumerate_new(udev);
  udev_enumerate_add_match_subsystem(enumerate, "input");
  udev_enumerate_scan_devices(enumerate);
  udev_list_entry* devices = udev_enumerate_get_list_entry(enumerate);

  // Iterate over all input devices
  udev_list_entry* dev_list_entry;
  udev_list_entry_foreach(dev_list_entry, devices)
  {
    const char* path = udev_list_entry_get_name(dev_list_entry);

    udev_device* dev = udev_device_new_from_syspath(udev, path);

    const char* devnode = udev_device_get_devnode(dev);
    // We only care about devices which we have read/write access to.
    if (devnode && access(devnode, W_OK) == 0)
    {
      // Unfortunately udev gives us no way to filter out the non event device interfaces.
      // So we open it and see if it works with evdev ioctls or not.
      std::string name = GetName(devnode);
      auto input = std::make_shared<evdevDevice>(devnode);

      if (input->IsInteresting())
      {
        g_controller_interface.AddDevice(std::move(input));
        s_devnode_name_map.insert(std::pair<std::string, std::string>(devnode, name));
      }
    }
    udev_device_unref(dev);
  }
  udev_enumerate_unref(enumerate);
  udev_unref(udev);

  StartHotplugThread();
}
Example #3
0
AmEvent* _AmControlTarget::InterestingEventAt(	const AmTrack* track,
												const AmPhraseEvent& topPhrase,
												const AmPhrase& phrase,
												AmTime time,
												float y,
												int32* extraData) const
{
	AmNode*		n = phrase.ChainHeadNode(time);
	if (!n) return NULL;
	/* Since control changes are single pixels, it can be a bit tricky
	 * for users to hit exactly the right pixel.  Compensate for this
	 * by finding the closest control change within a given fudge factor.
	 */
	AmTime		fudge = EventAtFudge();
	AmEvent*	closest = NULL;
	/* As soon as I've hit events that are within range of where I'm
	 * looking, I set this flag.  This lets me know to end the search
	 * as soon as I'm out of range.
	 */
	bool		beenInRange = false;
	while (n) {
		AmRange		eventRange = topPhrase.EventRange( n->Event() );
		if( (eventRange.start >= time - fudge) && (eventRange.start <= time + fudge) ) {
			beenInRange = true;
			if( IsInteresting( n->Event() ) ) {
				if (!closest)
					closest = n->Event();
				else if ( abs(time - eventRange.start) < abs(time - topPhrase.EventRange(closest).start) )
					closest = n->Event();
			}
		} else {
			if (beenInRange) return closest;
		}
		n = n->next;
	}
	return closest;
}