259
259
// Event processing cycle begins.
260
260
_inside_event_processing = true;
262
if ((event.e_event == NUX_KEYDOWN) ||
263
(event.e_event == NUX_KEYUP))
265
Area *keyboard_grab_area = GetKeyboardGrabArea ();
266
if (keyboard_grab_area)
268
ViewWindowPreEventCycle ();
270
DispatchEventToView (event, (View*) keyboard_grab_area, 0, 0);
272
ViewWindowPostEventCycle ();
278
262
if ((event.e_event == NUX_MOUSE_PRESSED) ||
279
263
(event.e_event == NUX_MOUSE_RELEASED) ||
280
264
(event.e_event == NUX_MOUSE_MOVE) ||
281
265
(event.e_event == NUX_MOUSE_WHEEL) ||
282
(event.e_event == NUX_MOUSE_DOUBLECLICK))
266
(event.e_event == NUX_MOUSE_DOUBLECLICK) ||
267
(event.e_event == NUX_KEYDOWN) ||
268
(event.e_event == NUX_KEYUP))
284
270
Area *pointer_grab_area = GetPointerGrabArea ();
285
if (pointer_grab_area)
271
Area *keyboard_grab_area = GetKeyboardGrabArea ();
273
if (pointer_grab_area || keyboard_grab_area)
275
SetCurrentEvent (&event);
278
long ProcessEventInfo = 0;
279
bool MouseIsOverMenu = 0;
281
// Let the Menus process the event.
283
ret = MenuEventCycle (event, 0, 0);
287
if (ret & eMouseEventSolved)
289
// If one menu processed the event, then stop all other element from processing it.
290
ProcessEventInfo = eDoNotProcess;
291
MouseIsOverMenu = TRUE;
293
SetCurrentEvent (NULL);
287
299
ViewWindowPreEventCycle ();
289
DispatchEventToView (event, (View*) pointer_grab_area, 0, 0);
300
SetProcessingTopView (NUX_STATIC_CAST (BaseWindow*, pointer_grab_area->GetTopLevelViewWindow ()));
302
if (pointer_grab_area &&
303
((event.e_event == NUX_MOUSE_PRESSED) ||
304
(event.e_event == NUX_MOUSE_RELEASED) ||
305
(event.e_event == NUX_MOUSE_MOVE) ||
306
(event.e_event == NUX_MOUSE_WHEEL) ||
307
(event.e_event == NUX_MOUSE_DOUBLECLICK))
310
DispatchEventToView (event, (View*) pointer_grab_area, 0, 0);
313
if (keyboard_grab_area &&
314
((event.e_event == NUX_KEYDOWN) ||
315
(event.e_event == NUX_KEYUP))
318
ret = DispatchEventToView (event, NUX_STATIC_CAST (View*, keyboard_grab_area), ret, ProcessEventInfo);
321
SetProcessingTopView (NULL);
291
322
ViewWindowPostEventCycle ();
324
SetCurrentEvent (NULL);
327
360
SetWidgetDrawingOverlay (NULL, NULL);
331
// Let all the menu area check the event first. Beside, they are on top of everything else.
363
std::list<MenuPage*>::iterator menu_it;
364
// Let all the menu area check the event first.
332
365
for (menu_it = m_MenuList->begin(); menu_it != m_MenuList->end(); menu_it++)
334
367
// The deepest menu in the menu cascade is in the front of the list.
343
376
SetCurrentEvent (&event);
345
if (!InExclusiveInputMode ()) // Menus are not enabled in exclusive mode
347
if (m_MenuWindow.IsValid())
349
event.e_x_root = m_MenuWindow->GetBaseX();
350
event.e_y_root = m_MenuWindow->GetBaseY();
353
// Let all the menu area check the event first. Beside, they are on top of everything else.
354
for (menu_it = m_MenuList->begin(); menu_it != m_MenuList->end(); menu_it++)
356
// The deepest menu in the menu cascade is in the front of the list.
357
ret = (*menu_it)->ProcessEvent (event, ret, 0);
360
if ( (event.e_event == NUX_MOUSE_PRESSED) && m_MenuList->size() )
364
for (menu_it = m_MenuList->begin(); menu_it != m_MenuList->end(); menu_it++)
366
Geometry geo = (*menu_it)->GetGeometry();
368
if (PT_IN_BOX ( event.e_x - event.e_x_root, event.e_y - event.e_y_root,
369
geo.x, geo.x + geo.width, geo.y, geo.y + geo.height ) )
378
(*m_MenuList->begin() )->NotifyMouseDownOutsideMenuCascade (event.e_x - event.e_x_root, event.e_y - event.e_y_root);
382
if (m_MenuWindow.IsValid())
388
if ( (event.e_event == NUX_MOUSE_RELEASED) )
390
SetWidgetDrawingOverlay (NULL, NULL);
393
if ( (event.e_event == NUX_SIZE_CONFIGURATION) && m_MenuList->size() )
395
(*m_MenuList->begin() )->NotifyTerminateMenuCascade();
378
// Let the Menus process the event.
399
380
long ProcessEventInfo = 0;
400
381
bool MouseIsOverMenu = 0;
402
if (ret & eMouseEventSolved)
404
// If one menu processed the event, then stop all other element from processing it.
405
ProcessEventInfo = eDoNotProcess;
406
MouseIsOverMenu = TRUE;
383
MenuEventCycle (event, 0, 0);
385
if (ret & eMouseEventSolved)
387
// If one menu processed the event, then stop all other element from processing it.
388
ProcessEventInfo = eDoNotProcess;
389
MouseIsOverMenu = TRUE;
409
/////////////////////////////////////////
410
// Start ViewWindow event processing.
411
/////////////////////////////////////////
393
// Let the ViewWindow process the event.
413
394
ViewWindowPreEventCycle ();
415
396
std::list< ObjectWeakPtr<BaseWindow> >::iterator it;
513
494
EnsureAlwaysOnFrontWindow ();
497
long WindowCompositor::MenuEventCycle (Event &event, long TraverseInfo, long ProcessEventInfo)
499
long ret = TraverseInfo;
500
std::list<MenuPage*>::iterator menu_it;
502
if (m_MenuWindow.IsValid())
504
event.e_x_root = m_MenuWindow->GetBaseX ();
505
event.e_y_root = m_MenuWindow->GetBaseY ();
508
// Let all the menu area check the event first. Beside, they are on top of everything else.
509
for (menu_it = m_MenuList->begin (); menu_it != m_MenuList->end (); menu_it++)
511
// The deepest menu in the menu cascade is in the front of the list.
512
ret = (*menu_it)->ProcessEvent (event, ret, ProcessEventInfo);
515
if ((event.e_event == NUX_MOUSE_PRESSED) && m_MenuList->size ())
519
for (menu_it = m_MenuList->begin (); menu_it != m_MenuList->end (); menu_it++)
521
Geometry geo = (*menu_it)->GetGeometry ();
523
if (PT_IN_BOX (event.e_x - event.e_x_root, event.e_y - event.e_y_root,
524
geo.x, geo.x + geo.width, geo.y, geo.y + geo.height))
533
(*m_MenuList->begin ())->NotifyMouseDownOutsideMenuCascade (event.e_x - event.e_x_root, event.e_y - event.e_y_root);
537
if (m_MenuWindow.IsValid ())
543
if ( (event.e_event == NUX_MOUSE_RELEASED) )
545
SetWidgetDrawingOverlay (NULL, NULL);
548
if ( (event.e_event == NUX_SIZE_CONFIGURATION) && m_MenuList->size() )
550
(*m_MenuList->begin() )->NotifyTerminateMenuCascade();
516
556
void WindowCompositor::StartModalWindow (ObjectWeakPtr<BaseWindow> window)
1437
1477
if ( (*menu_it)->IsActive() == false)
1479
if (GetMouseFocusArea () == (*menu_it))
1481
SetMouseFocusArea (NULL);
1483
if (GetMouseOverArea () == (*menu_it))
1485
SetMouseOverArea (NULL);
1487
if (GetPreviousMouseOverArea () == (*menu_it))
1489
SetPreviousMouseOverArea (NULL);
1439
1492
menu_it = m_MenuList->erase (menu_it);
1440
1493
m_MenuRemoved = true;
1446
1501
if (m_MenuList->size() == 0)