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 )
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(); }
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; }