Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Loading…

Revert "FIX: Send Touch actions to the proper window" and properly solve #3996

Merged
merged 2 commits into from

4 participants

@koying
Collaborator

No description provided.

@Memphiz
Owner

Nice will test it on ios in a min...

@koying
Collaborator

Thanks.
I didn't seem to find an equivalent need for XBMC_SETFOCUS on ios, but I might have missed it.

@Memphiz
Owner

ios uses CGenericTouchActionHandler::focusControl aswell - no worries :)

@Memphiz
Owner

Feels nice already. One issue:

I can bring up the osd by single tap now - before your change i was able to 2finger swipe left to get rid of it - this doesn't work anymore now. (2finger swipe left is mapped to right click)...

@koying
Collaborator

Okido, will check that out.
Is the 2finger swipe mapping [global], from a keymap?

@Memphiz
Owner

yep it is in global < tap pointers="2" > RightClick < /tap >

@Memphiz Memphiz closed this
@Memphiz Memphiz reopened this
@Memphiz
Owner

ahh sorry ... i mean it is mapped to "Back" ..

in global
< swipe direction="left" pointers="2" >Back< /swipe >

the other one was 2 finger tap which is mapped to mouse rightclick and that works for hiding osd!

@koying
Collaborator

So 2 fingers tap for right-click is ok, but 2 fingers left swipe for back is not, right?

@Memphiz
Owner

yep that is correct.

Though this is only for videoosd ... 2 fingers left swipe for back works in the menus as usual...

@Memphiz
Owner

basically before this change the "back" action also closed the osd - it doesn't do that anymore ... could also be a feature imo ;)

@koying
Collaborator

Hehe... No, Back is meant to close the OSD. Works like that on my remote anyway...

@koying
Collaborator

@Memphiz Could you retry, please.
JM might have pointed out the issue, already ;)

@Memphiz
Owner

Nope ... there is a mapping in fullscreenvideo

< swipe direction="left" pointers="2" >SmallStepBack < /swipe >

This one works (e.x. when the osd is not visible the 2 finger swipe left will do the smallstepback) ...

here is my complete touchscreen.xml for testing:

http://pastebin.com/vpwbXigj

If i remove that smallstepback mapping it is working and the 2 finger swipe left closes the osd. So basically it seems that the mapping in fullscreenvideo somehow prevents the global mapping in osd window to happen.

@jmarshallnz
Owner

This is because the mapping is done in the handler for touch using GetActiveWindow() as the windowID. This is the active window - dialogs go on top of this.

Instead, it should ideally be using the mapping defined in CApplication::OnKey, though I suspect you can get away with a simpler implementation by ignoring some of the cases there.

https://github.com/xbmc/xbmc/blob/master/xbmc/Application.cpp#L2319

You want the hunk from line 2319-2358 that is determining the window ID. Probably if you just have the very start of that (i.e. HasModalDialog bit) it'll be good enough for touch?

@Memphiz
Owner

http://pastebin.com/ifsKCdVQ <- that fixes it ...

@jmarshallnz
Owner

Yup, that'll fix the OSD stuff. However, I think you'll find it'll break actions while fullscreen info is up (this might not be possible on touch, so may not be an issue). That's what all that other code in OnKey() is taking care of. Could REALLY do with a solid refactoring :)

@Memphiz
Owner

yep you are right ... now the actions mapped in fullscreenvideo are not working anymore when the osd is up but act like the one from the global section ;)

@jmarshallnz
Owner

Yes, that was point 2 back on the original PR - it happens on the remote and keyboard as well, so in that respect is by design.

There's basically 2 things at work:
1. Which window context to use to map from input -> action.
2. Which window to send the action to.

By changing the iWindow you change number 1 - i.e. when the video OSD is up, you don't read the actions in the fullscreen section of keymap.

By changing number 2, the action is sent to the dialog, rather than the window.

There's fallbacks in place for one specific window in the code: The fullscreen info dialog (in Confluence, it looks like the OSD without the play/pause buttons - bring it up via I on keyboard or INFO on remote).

The code in OnKey handles getting the correct context for number 1 above. The code in GUIWindowManager::OnAction handles re-routing the action to the fullscreen window if the dialog doesn't handle it.

@koying
Collaborator

I think I now apply to gestures the same window logic as OnKey.
Hard to test most use cases on a plain tablet, though.

@Memphiz
Owner

Looks good from the code side to me - i will give this a shot after work :)

@jmarshallnz
Owner

Yup, code looks fine.

@Memphiz
Owner

Something is still strange. If OSD is up i still don't get my swipe up mapping ing from fullscreenvideo ...

Still using this touchscreen map

http://pastebin.com/vpwbXigj

@jmarshallnz
Owner

That's exactly as designed. The VideoOSD receives the action, and in addition is used for the mapping. Exactly the same as DPAD on remote when the VideoOSD is up.

@Memphiz
Owner

But there is no mapping in the videoosd for swipeup ... something i get wrong i think?

@jmarshallnz
Owner

Exactly, so nothing is done, right?

In addition, even if there was an action there, it would need to be handled by the video OSD.

@Memphiz
Owner

correct :)

@Memphiz
Owner

I take it - we have a winner? :)

@Memphiz
Owner

i testet it together with your other 2 pull requests (volume up/down and the swipe vs. intertial scroll thingy) - somehow each gesture brings up the osd again - their was a state in between a couple of days ago where the osd stayed hidden ... not sure what was the intended behaviour here finally.

@koying
Collaborator
@Memphiz
Owner

When i say OSD i normally mean the player controls and option buttons (like video options, audio options). This includes a progress aswell of course - but yeah i mean OSD ;)

@koying
Collaborator

Strange. Still fine by me (ie OSD stays hidden) and I haven't touched this one.
Does only including this one and not the others make a difference?

Also, could you send me your latest "test" touchscreen.xml, please.

@koying
Collaborator

Updated to only generate "detailed" actions for mouse/touch/gestures.
Superseeds #4015

@Memphiz
Owner

Well seems i had a wonky build. The touch mapping on videofllscreen is fine: this is my latest xml:

http://pastebin.com/xkesr5XM

@jmarshallnz
Owner

Code looks good. Squash it down and ready to go once tested on iOS.

@koying
Collaborator

@Memphiz Looking at the Obj-C code (I have zero knowledge about ;) ), postMouseMotionEvent() is never called, afaict.
CGenericTouchActionHandler::Get().OnTouchGestureStart is called instead, which does the focusing on the "generic" side.
Do you still want to keep it?

@Memphiz
Owner

Ignore it for now ... i am working for a replacement patch which handles focus on touchdown for ios.

@Memphiz
Owner

@koying wip

Memphiz@6798693

I know get a proper focus whenever my finger goes down (that was not the case before - but its an uninteded bugfix ;) ).

Problem is now that i still trigger the swipe when i start scrolling through a list (an now i am using basically the same code as on android - i don't know why this doesn't happen on your android device :(

Beside that i have another issue which i need to track down (out of time for today though). I go into a list and do a longtap for bringing up the context menu. Now i hit the "x" of the context menu - when i do that the context menu vanishes and at the same time the stupid left hand slide out dialog slides out :(

All in all - its getting better on one side and worse on the other :( - i don't really want to hold off this PR - it seems ios related.

@koying
Collaborator
@koying
Collaborator

... but it is related to #4017 and not this one.
Let's first properly close this one. Could you retest with only this, excluding #4017 , please.

Expected results:

  • Swipe on fullscreen properly trigger mapped actions (e.g. play/pause/stepforward, ...) and doesn't trigger the OSD
  • Swipe with a mapping of vol up/vol down in [global] works
  • Obviously, no regression

Known issue (not regression):

  • a swipe on a inertial scrolling enabled control triggers both the action and intertial scrolling (to be solved by #4017 )
@koying
Collaborator

@Memphiz @jmarshallnz Ok to merge this one?

@Memphiz
Owner

@koying please cherry-pick Memphiz@6798693 for this also i can confirm the behaviour as you described it in your last comment 22 days ago (which i have missed at that time sadly). Also you seem to have fixed the issue where tapping "x" in the context menu triggered the slide out menu - cool thing :)

@jmarshallnz
Owner

jenkins build this please

@jmarshallnz jmarshallnz merged commit a75ebdd into from
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Commits on Feb 6, 2014
  1. @koying

    FIX: [touch] properly handle touch/gesture actions

    koying authored
    This reverts commit b891c24.
  2. @Memphiz @koying
This page is out of date. Refresh to see the latest.
View
64 xbmc/Application.cpp
@@ -515,23 +515,66 @@ bool CApplication::OnEvent(XBMC_Event& newEvent)
return g_application.OnAppCommand(newEvent.appcommand.action);
case XBMC_TOUCH:
{
- int windowId = g_windowManager.GetActiveWindow() & WINDOW_ID_MASK;
-
if (newEvent.touch.action == ACTION_TOUCH_TAP)
{ // Send a mouse motion event with no dx,dy for getting the current guiitem selected
g_application.OnAction(CAction(ACTION_MOUSE_MOVE, 0, newEvent.touch.x, newEvent.touch.y, 0, 0));
}
int actionId = 0;
if (newEvent.touch.action == ACTION_GESTURE_BEGIN || newEvent.touch.action == ACTION_GESTURE_END)
- {
actionId = newEvent.touch.action;
- windowId = WINDOW_INVALID;
+ else
+ {
+ int iWin = g_windowManager.GetActiveWindow() & WINDOW_ID_MASK;
+ // change this if we have a dialog up
+ if (g_windowManager.HasModalDialog())
+ {
+ iWin = g_windowManager.GetTopMostModalDialogID() & WINDOW_ID_MASK;
+ }
+ if (iWin == WINDOW_DIALOG_FULLSCREEN_INFO)
+ { // fullscreen info dialog - special case
+ CButtonTranslator::GetInstance().TranslateTouchAction(iWin, newEvent.touch.action, newEvent.touch.pointers, actionId);
+ if (actionId <= 0)
+ iWin = WINDOW_FULLSCREEN_VIDEO; // fallthrough to the main window
+ }
+ if (actionId <= 0)
+ {
+ if (iWin == WINDOW_FULLSCREEN_VIDEO)
+ {
+ // current active window is full screen video.
+ if (g_application.m_pPlayer->IsInMenu())
+ {
+ // if player is in some sort of menu, (ie DVDMENU) map buttons differently
+ CButtonTranslator::GetInstance().TranslateTouchAction(WINDOW_VIDEO_MENU, newEvent.touch.action, newEvent.touch.pointers, actionId);
+ }
+ else if (g_PVRManager.IsStarted() && g_application.CurrentFileItem().HasPVRChannelInfoTag())
+ {
+ // check for PVR specific keymaps in FULLSCREEN_VIDEO window
+ CButtonTranslator::GetInstance().TranslateTouchAction(WINDOW_FULLSCREEN_LIVETV, newEvent.touch.action, newEvent.touch.pointers, actionId);
+
+ // if no PVR specific action/mapping is found, fall back to default
+ if (actionId <= 0)
+ CButtonTranslator::GetInstance().TranslateTouchAction(iWin, newEvent.touch.action, newEvent.touch.pointers, actionId);
+ }
+ else
+ {
+ // in any other case use the fullscreen window section of keymap.xml to map key->action
+ CButtonTranslator::GetInstance().TranslateTouchAction(iWin, newEvent.touch.action, newEvent.touch.pointers, actionId);
+ }
+ }
+ else // iWin != WINDOW_FULLSCREEN_VIDEO
+ CButtonTranslator::GetInstance().TranslateTouchAction(iWin, newEvent.touch.action, newEvent.touch.pointers, actionId);
+ }
}
- else if (!CButtonTranslator::GetInstance().TranslateTouchAction(newEvent.touch.action, newEvent.touch.pointers, windowId, actionId) ||
- actionId <= 0)
+
+ if (actionId <= 0)
return false;
- CApplicationMessenger::Get().SendAction(CAction(actionId, 0, newEvent.touch.x, newEvent.touch.y, newEvent.touch.x2, newEvent.touch.y2), windowId, false);
+ if ((actionId >= ACTION_TOUCH_TAP && actionId <= ACTION_GESTURE_END)
+ || (actionId >= ACTION_MOUSE_START && actionId <= ACTION_MOUSE_END) )
+ CApplicationMessenger::Get().SendAction(CAction(actionId, 0, newEvent.touch.x, newEvent.touch.y, newEvent.touch.x2, newEvent.touch.y2), WINDOW_INVALID, false);
+ else
+ CApplicationMessenger::Get().SendAction(CAction(actionId), WINDOW_INVALID, false);
+
// Post an unfocus message for touch device after the action.
if (newEvent.touch.action == ACTION_GESTURE_END || newEvent.touch.action == ACTION_TOUCH_TAP)
{
@@ -540,6 +583,13 @@ bool CApplication::OnEvent(XBMC_Event& newEvent)
}
break;
}
+ case XBMC_SETFOCUS:
+ // Reset the screensaver
+ g_application.ResetScreenSaver();
+ g_application.WakeUpScreenSaverAndDPMS();
+ // Send a mouse motion event with no dx,dy for getting the current guiitem selected
+ g_application.OnAction(CAction(ACTION_MOUSE_MOVE, 0, newEvent.focus.x, newEvent.focus.y, 0, 0));
+ break;
}
return true;
}
View
5 xbmc/input/ButtonTranslator.cpp
@@ -889,7 +889,7 @@ bool CButtonTranslator::TranslateJoystickString(int window, const char* szDevice
return (action > 0);
}
-bool CButtonTranslator::TranslateTouchAction(int touchAction, int touchPointers, int &window, int &action)
+bool CButtonTranslator::TranslateTouchAction(int window, int touchAction, int touchPointers, int &action)
{
action = 0;
if (touchPointers <= 0)
@@ -900,10 +900,7 @@ bool CButtonTranslator::TranslateTouchAction(int touchAction, int touchPointers,
action = GetTouchActionCode(window, touchAction);
if (action <= 0)
- {
- window = WINDOW_INVALID;
action = GetTouchActionCode(-1, touchAction);
- }
return action > 0;
}
View
2  xbmc/input/ButtonTranslator.h
@@ -98,7 +98,7 @@ class CButtonTranslator
bool &fullrange);
#endif
- bool TranslateTouchAction(int touchAction, int touchPointers, int &window, int &action);
+ bool TranslateTouchAction(int window, int touchAction, int touchPointers, int &action);
private:
typedef std::multimap<uint32_t, CButtonAction> buttonMap; // our button map to fill in
View
9 xbmc/input/touch/generic/GenericTouchActionHandler.cpp
@@ -184,14 +184,13 @@ void CGenericTouchActionHandler::sendEvent(int actionId, float x, float y, float
void CGenericTouchActionHandler::focusControl(float x, float y)
{
- // Send a mouse motion event for getting the current guiitem selected
XBMC_Event newEvent;
memset(&newEvent, 0, sizeof(newEvent));
- newEvent.type = XBMC_MOUSEMOTION;
- newEvent.motion.type = XBMC_MOUSEMOTION;
- newEvent.motion.x = (uint16_t)x;
- newEvent.motion.y = (uint16_t)y;
+ newEvent.type = XBMC_SETFOCUS;
+ newEvent.focus.type = XBMC_SETFOCUS;
+ newEvent.focus.x = (uint16_t)x;
+ newEvent.focus.y = (uint16_t)y;
CWinEvents::MessagePush(&newEvent);
}
View
57 xbmc/osx/ios/XBMCController.mm
@@ -388,7 +388,7 @@ - (void)createGestureRecognizers
UITapGestureRecognizer *singleFingerSingleTap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleFingerSingleTap:)];
- singleFingerSingleTap.delaysTouchesBegan = YES;
+ singleFingerSingleTap.delaysTouchesBegan = NO;
singleFingerSingleTap.numberOfTapsRequired = 1;
singleFingerSingleTap.numberOfTouchesRequired = 1;
@@ -401,7 +401,7 @@ - (void)createGestureRecognizers
UITapGestureRecognizer *doubleFingerSingleTap = [[UITapGestureRecognizer alloc]
initWithTarget:self action:@selector(handleDoubleFingerSingleTap:)];
- doubleFingerSingleTap.delaysTouchesBegan = YES;
+ doubleFingerSingleTap.delaysTouchesBegan = NO;
doubleFingerSingleTap.numberOfTapsRequired = 1;
doubleFingerSingleTap.numberOfTouchesRequired = 2;
[m_glView addGestureRecognizer:doubleFingerSingleTap];
@@ -411,8 +411,8 @@ - (void)createGestureRecognizers
UILongPressGestureRecognizer *singleFingerSingleLongTap = [[UILongPressGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSingleFingerSingleLongTap:)];
- singleFingerSingleLongTap.delaysTouchesBegan = YES;
- singleFingerSingleLongTap.delaysTouchesEnded = YES;
+ singleFingerSingleLongTap.delaysTouchesBegan = NO;
+ singleFingerSingleLongTap.delaysTouchesEnded = NO;
[m_glView addGestureRecognizer:singleFingerSingleLongTap];
[singleFingerSingleLongTap release];
@@ -420,7 +420,7 @@ - (void)createGestureRecognizers
UISwipeGestureRecognizer *swipeLeft2 = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
- swipeLeft2.delaysTouchesBegan = YES;
+ swipeLeft2.delaysTouchesBegan = NO;
swipeLeft2.numberOfTouchesRequired = 2;
swipeLeft2.direction = UISwipeGestureRecognizerDirectionLeft;
swipeLeft2.delegate = self;
@@ -431,7 +431,7 @@ - (void)createGestureRecognizers
UISwipeGestureRecognizer *swipeLeft = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
- swipeLeft.delaysTouchesBegan = YES;
+ swipeLeft.delaysTouchesBegan = NO;
swipeLeft.numberOfTouchesRequired = 1;
swipeLeft.direction = UISwipeGestureRecognizerDirectionLeft;
swipeLeft.delegate = self;
@@ -442,7 +442,7 @@ - (void)createGestureRecognizers
UISwipeGestureRecognizer *swipeRight = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
- swipeRight.delaysTouchesBegan = YES;
+ swipeRight.delaysTouchesBegan = NO;
swipeRight.numberOfTouchesRequired = 1;
swipeRight.direction = UISwipeGestureRecognizerDirectionRight;
swipeRight.delegate = self;
@@ -453,7 +453,7 @@ - (void)createGestureRecognizers
UISwipeGestureRecognizer *swipeUp = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
- swipeUp.delaysTouchesBegan = YES;
+ swipeUp.delaysTouchesBegan = NO;
swipeUp.numberOfTouchesRequired = 1;
swipeUp.direction = UISwipeGestureRecognizerDirectionUp;
swipeUp.delegate = self;
@@ -464,7 +464,7 @@ - (void)createGestureRecognizers
UISwipeGestureRecognizer *swipeDown = [[UISwipeGestureRecognizer alloc]
initWithTarget:self action:@selector(handleSwipe:)];
- swipeDown.delaysTouchesBegan = YES;
+ swipeDown.delaysTouchesBegan = NO;
swipeDown.numberOfTouchesRequired = 1;
swipeDown.direction = UISwipeGestureRecognizerDirectionDown;
swipeDown.delegate = self;
@@ -475,7 +475,7 @@ - (void)createGestureRecognizers
UIPanGestureRecognizer *pan = [[UIPanGestureRecognizer alloc]
initWithTarget:self action:@selector(handlePan:)];
- pan.delaysTouchesBegan = YES;
+ pan.delaysTouchesBegan = NO;
pan.maximumNumberOfTouches = 1;
[m_glView addGestureRecognizer:pan];
[pan release];
@@ -484,7 +484,7 @@ - (void)createGestureRecognizers
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc]
initWithTarget:self action:@selector(handlePinch:)];
- pinch.delaysTouchesBegan = YES;
+ pinch.delaysTouchesBegan = NO;
pinch.delegate = self;
[m_glView addGestureRecognizer:pinch];
[pinch release];
@@ -493,7 +493,7 @@ - (void)createGestureRecognizers
UIRotationGestureRecognizer *rotate = [[UIRotationGestureRecognizer alloc]
initWithTarget:self action:@selector(handleRotate:)];
- rotate.delaysTouchesBegan = YES;
+ rotate.delaysTouchesBegan = NO;
rotate.delegate = self;
[m_glView addGestureRecognizer:rotate];
[rotate release];
@@ -512,7 +512,19 @@ - (void) deactivateKeyboard:(UIView *)view
[self becomeFirstResponder];
}
//--------------------------------------------------------------
--(void)handlePinch:(UIPinchGestureRecognizer*)sender
+-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event
+{
+ if( [m_glView isXBMCAlive] )//NO GESTURES BEFORE WE ARE UP AND RUNNING
+ {
+ UITouch *touch = (UITouch *)[[touches allObjects] objectAtIndex:0];
+ CGPoint point = [touch locationInView:m_glView];
+ point.x *= screenScale;
+ point.y *= screenScale;
+ CGenericTouchActionHandler::Get().OnSingleTouchStart(point.x, point.y);
+ }
+}
+//--------------------------------------------------------------
+-(void)handlePinch:(UIPinchGestureRecognizer*)sender
{
if( [m_glView isXBMCAlive] )//NO GESTURES BEFORE WE ARE UP AND RUNNING
{
@@ -660,23 +672,6 @@ - (IBAction)handleSwipe:(UISwipeGestureRecognizer *)sender
}
}
//--------------------------------------------------------------
-- (void)postMouseMotionEvent:(CGPoint)point
-{
- XBMC_Event newEvent;
-
- memset(&newEvent, 0, sizeof(newEvent));
-
- newEvent.type = XBMC_MOUSEMOTION;
- newEvent.motion.type = XBMC_MOUSEMOTION;
- newEvent.motion.which = 0;
- newEvent.motion.state = 0;
- newEvent.motion.x = point.x;
- newEvent.motion.y = point.y;
- newEvent.motion.xrel = 0;
- newEvent.motion.yrel = 0;
- CWinEvents::MessagePush(&newEvent);
-}
-//--------------------------------------------------------------
- (IBAction)handleSingleFingerSingleTap:(UIGestureRecognizer *)sender
{
if( [m_glView isXBMCAlive] )//NO GESTURES BEFORE WE ARE UP AND RUNNING
@@ -713,7 +708,7 @@ - (IBAction)handleSingleFingerSingleLongTap:(UIGestureRecognizer *)sender
{
lastGesturePoint = point;
// mark the control
- CGenericTouchActionHandler::Get().OnSingleTouchStart((float)point.x, (float)point.y);
+ //CGenericTouchActionHandler::Get().OnSingleTouchStart((float)point.x, (float)point.y);
}
if (sender.state == UIGestureRecognizerStateEnded)
View
2  xbmc/video/windows/GUIWindowFullScreen.cpp
@@ -518,7 +518,7 @@ EVENT_RESULT CGUIWindowFullScreen::OnMouseEvent(const CPoint &point, const CMous
{
return g_application.OnAction(CAction(ACTION_ANALOG_SEEK_BACK, 0.5f)) ? EVENT_RESULT_HANDLED : EVENT_RESULT_UNHANDLED;
}
- if (event.m_id == ACTION_GESTURE_NOTIFY)
+ if (event.m_id >= ACTION_GESTURE_NOTIFY && event.m_id <= ACTION_GESTURE_END) // gestures
return EVENT_RESULT_UNHANDLED;
if (event.m_id != ACTION_MOUSE_MOVE || event.m_offsetX || event.m_offsetY)
{ // some other mouse action has occurred - bring up the OSD
View
8 xbmc/windowing/XBMC_events.h
@@ -68,6 +68,7 @@ typedef enum {
XBMC_VIDEOEXPOSE, /* Screen needs to be redrawn */
XBMC_APPCOMMAND, /* Media commands, such as WM_APPCOMMAND on Windows for media keys. */
XBMC_TOUCH,
+ XBMC_SETFOCUS,
XBMC_USEREVENT,
XBMC_MAXEVENT = 256 /* XBMC_EventType is represented as uchar */
@@ -204,6 +205,12 @@ typedef struct XBMC_TouchEvent {
int pointers; /* number of touch pointers */
} XBMC_TouchEvent;
+typedef struct XBMC_SetFocusEvent {
+ unsigned char type; /* XBMC_SETFOCUS */
+ int x; /* x position */
+ int y; /* y position */
+} XBMC_SetFocusEvent;
+
/* General event structure */
typedef union XBMC_Event {
unsigned char type;
@@ -223,6 +230,7 @@ typedef union XBMC_Event {
XBMC_SysWMEvent syswm;
XBMC_AppCommandEvent appcommand;
XBMC_TouchEvent touch;
+ XBMC_SetFocusEvent focus;
} XBMC_Event;
#endif /* _XBMC_events_h */
Something went wrong with that request. Please try again.