diff --git a/src/servers/app/RootLayer.cpp b/src/servers/app/RootLayer.cpp index f6b80628a0..379b0e57a0 100644 --- a/src/servers/app/RootLayer.cpp +++ b/src/servers/app/RootLayer.cpp @@ -1757,6 +1757,42 @@ RootLayer::SetEventMaskLayer(Layer *lay, uint32 mask, uint32 options) Lock(); + if (mask & B_POINTER_EVENTS) { + if (fMouseEventsLayerList.HasItem(lay)) + fMouseEventsLayerList.AddItem(lay); + } + else { + if (options == 0) + fMouseEventsLayerList.RemoveItem(lay); + } + + if (mask & B_KEYBOARD_EVENTS) { + if (fKeyboardEventsLayerList.HasItem(lay)) + fKeyboardEventsLayerList.AddItem(lay); + } + else { + if (options == 0) + fKeyboardEventsLayerList.RemoveItem(lay); + } + + // TODO: set options!!! + // B_NO_POINTER_HISTORY only! How? By telling to the input_server? + + Unlock(); + + return returnValue; +} + +bool +RootLayer::SetMouseEventMaskLayer(Layer *lay, uint32 mask, uint32 options) +{ + if (!lay) + return false; + + bool returnValue = true; + + Lock(); + if (fEventMaskLayer && fEventMaskLayer != lay) { fprintf(stderr, "WARNING: fEventMaskLayer already set and different than the required one!\n"); returnValue = false; diff --git a/src/servers/app/RootLayer.h b/src/servers/app/RootLayer.h index 5ce8c2c23f..900d8f7668 100644 --- a/src/servers/app/RootLayer.h +++ b/src/servers/app/RootLayer.h @@ -115,6 +115,7 @@ public: BMessage* DragMessage(void) const; bool SetEventMaskLayer(Layer *lay, uint32 mask, uint32 options); + bool SetMouseEventMaskLayer(Layer *lay, uint32 mask, uint32 options); void LayerRemoved(Layer* layer); @@ -176,6 +177,8 @@ friend class Desktop; WinBorder* fMouseTargetWinBorder; int32 fViewAction; Layer* fEventMaskLayer; + BList fMouseEventsLayerList; + BList fKeyboardEventsLayerList; BLocker fAllRegionsLock; diff --git a/src/servers/app/ServerWindow.cpp b/src/servers/app/ServerWindow.cpp index 35c5307b6a..dccf4e910d 100644 --- a/src/servers/app/ServerWindow.cpp +++ b/src/servers/app/ServerWindow.cpp @@ -668,7 +668,7 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) fLink.Flush(); break; } - case AS_LAYER_SET_MOUSE_EVENT_MASK: + case AS_LAYER_SET_EVENT_MASK: { STRACE(("ServerWindow %s: Message AS_LAYER_SET_MOUSE_EVENT_MASK: Layer name: %s\n", fTitle, fCurrentLayer->Name())); @@ -680,6 +680,19 @@ ServerWindow::_DispatchMessage(int32 code, BPrivate::LinkReceiver &link) if (myRootLayer) myRootLayer->SetEventMaskLayer(fCurrentLayer, mask, options); + } + case AS_LAYER_SET_MOUSE_EVENT_MASK: + { + STRACE(("ServerWindow %s: Message AS_LAYER_SET_MOUSE_EVENT_MASK: Layer name: %s\n", fTitle, fCurrentLayer->Name())); + + uint32 mask; + uint32 options; + + link.Read(&mask); + link.Read(&options); + + if (myRootLayer) + myRootLayer->SetMouseEventMaskLayer(fCurrentLayer, mask, options); break; } case AS_LAYER_MOVE_TO: