Rework listener interface as suggested by Axel.

git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@38072 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Clemens Zeidler 2010-08-12 23:05:31 +00:00
parent b960e45194
commit c84e125085
3 changed files with 122 additions and 139 deletions

View File

@ -251,21 +251,21 @@ MouseFilter::Filter(BMessage* message, EventTarget** _target, int32* _viewToken,
switch (message->what) {
case B_MOUSE_DOWN:
window->MouseDown(message, where, &viewToken);
fDesktop->InvokeMouseDown(window, message, where);
fDesktop->MouseDown(window, message, where);
break;
case B_MOUSE_UP:
window->MouseUp(message, where, &viewToken);
if (buttons == 0)
fDesktop->SetMouseEventWindow(NULL);
fDesktop->InvokeMouseUp(window, message, where);
fDesktop->MouseUp(window, message, where);
break;
case B_MOUSE_MOVED:
window->MouseMoved(message, where, &viewToken,
latestMouseMoved == NULL || latestMouseMoved == message,
false);
fDesktop->InvokeMouseMoved(window, message, where);
fDesktop->MouseMoved(window, message, where);
break;
}
@ -287,7 +287,7 @@ MouseFilter::Filter(BMessage* message, EventTarget** _target, int32* _viewToken,
fDesktop->SetLastMouseState(where, buttons, window);
fDesktop->InvokeMouseEvent(message);
fDesktop->MouseEvent(message);
fDesktop->UnlockAllWindows();
@ -492,7 +492,7 @@ Desktop::BroadcastToAllWindows(int32 code)
void
Desktop::KeyEvent(uint32 what, int32 key, int32 modifiers)
{
InvokeKeyEvent(what, key, modifiers);
KeyPressed(what, key, modifiers);
}
@ -921,7 +921,7 @@ Desktop::ActivateWindow(Window* window)
AutoWriteLocker _(fWindowLock);
InvokeActivateWindow(window);
WindowActitvated(window);
bool windowOnOtherWorkspace = !window->InWorkspace(fCurrentWorkspace);
if (windowOnOtherWorkspace
@ -1076,7 +1076,7 @@ Desktop::SendWindowBehind(Window* window, Window* behindOf)
_WindowChanged(window);
InvokeSendWindowBehind(window, behindOf);
WindowSentBehind(window, behindOf);
UnlockAllWindows();
@ -1121,8 +1121,6 @@ Desktop::ShowWindow(Window* window)
// it knows the mouse is over it.
_SendFakeMouseMoved(window);
InvokeShowWindow(window);
}
@ -1176,8 +1174,6 @@ Desktop::HideWindow(Window* window)
}
}
InvokeHideWindow(window);
UnlockAllWindows();
if (window == fWindowUnderMouse)
@ -1194,11 +1190,11 @@ Desktop::MinimizeWindow(Window* window, bool minimize)
if (minimize && !window->IsHidden()) {
HideWindow(window);
window->SetMinimized(minimize);
InvokeMinimizeWindow(window, minimize);
WindowMinimized(window, minimize);
} else if (!minimize && window->IsHidden()) {
ActivateWindow(window);
// this will unminimize the window for us
InvokeMinimizeWindow(window, minimize);
WindowMinimized(window, minimize);
}
UnlockAllWindows();
@ -1229,7 +1225,7 @@ Desktop::MoveWindowBy(Window* window, float x, float y, int32 workspace)
} else
window->MoveBy((int32)x, (int32)y);
InvokeMoveWindow(window);
WindowMoved(window);
UnlockAllWindows();
return;
}
@ -1284,7 +1280,7 @@ Desktop::MoveWindowBy(Window* window, float x, float y, int32 workspace)
B_DIRECT_START | B_BUFFER_MOVED | B_CLIPPING_MODIFIED);
}
InvokeMoveWindow(window);
WindowMoved(window);
UnlockAllWindows();
}
@ -1301,7 +1297,7 @@ Desktop::ResizeWindowBy(Window* window, float x, float y)
if (!window->IsVisible()) {
window->ResizeBy((int32)x, (int32)y, NULL);
InvokeResizeWindow(window);
WindowResized(window);
UnlockAllWindows();
return;
}
@ -1344,7 +1340,7 @@ Desktop::ResizeWindowBy(Window* window, float x, float y)
B_DIRECT_START | B_BUFFER_RESIZED | B_CLIPPING_MODIFIED);
}
InvokeResizeWindow(window);
WindowResized(window);
UnlockAllWindows();
}
@ -1360,7 +1356,7 @@ Desktop::SetWindowTabLocation(Window* window, float location)
if (changed)
RebuildAndRedrawAfterWindowChange(window, dirty);
InvokeSetWindowTabLocation(window, location);
WindowTabLocationChanged(window, location);
return changed;
}
@ -1373,7 +1369,7 @@ Desktop::SetWindowDecoratorSettings(Window* window, const BMessage& settings)
BRegion dirty;
bool changed = window->SetDecoratorSettings(settings, dirty);
bool listenerChanged = InvokeSetDecoratorSettings(window, settings);
bool listenerChanged = SetDecoratorSettings(window, settings);
if (changed || listenerChanged)
RebuildAndRedrawAfterWindowChange(window, dirty);
@ -1421,7 +1417,7 @@ Desktop::AddWindow(Window *window)
_ChangeWindowWorkspaces(window, 0, window->Workspaces());
InvokeAddWindow(window);
WindowAdded(window);
UnlockAllWindows();
}
@ -1441,7 +1437,7 @@ Desktop::RemoveWindow(Window *window)
_ChangeWindowWorkspaces(window, window->Workspaces(), 0);
InvokeRemoveWindow(window);
WindowRemoved(window);
UnlockAllWindows();
@ -2083,7 +2079,7 @@ Desktop::WriteWindowInfo(int32 serverToken, BPrivate::LinkSender& sender)
::Window* tmp = window->Window();
if (tmp) {
BMessage message;
InvokeGetDecoratorSettings(tmp, message);
GetDecoratorSettings(tmp, message);
if (tmp->GetDecoratorSettings(&message)) {
BRect tabFrame;
message.FindRect("tab frame", &tabFrame);
@ -2824,7 +2820,7 @@ Desktop::_ChangeWindowWorkspaces(Window* window, uint32 oldWorkspaces,
// take care about modals and floating windows
_UpdateSubsetWorkspaces(window);
InvokeSetWindowWorkspaces(window, newWorkspaces);
WindowWorkspacesChanged(window, newWorkspaces);
UnlockAllWindows();
}
@ -3229,7 +3225,7 @@ Desktop::_SetWorkspace(int32 index, bool moveFocusWindow)
// send B_WORKSPACES_CHANGED message
movedWindow->WorkspacesChanged(oldWorkspaces,
movedWindow->Workspaces());
InvokeSetWindowWorkspaces(movedWindow, movedWindow->Workspaces());
WindowWorkspacesChanged(movedWindow, movedWindow->Workspaces());
} else {
// make sure it's frontmost
_Windows(index).RemoveWindow(movedWindow);

View File

@ -53,154 +53,192 @@ DesktopObservable::GetDesktopListenerList()
void
DesktopObservable::InvokeAddWindow(Window* window)
DesktopObservable::WindowAdded(Window* window)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->AddWindow(window);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowAdded(window);
}
void
DesktopObservable::InvokeRemoveWindow(Window* window)
DesktopObservable::WindowRemoved(Window* window)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->RemoveWindow(window);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowRemoved(window);
}
void
DesktopObservable::InvokeKeyEvent(uint32 what, int32 key, int32 modifiers)
DesktopObservable::KeyPressed(uint32 what, int32 key, int32 modifiers)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->KeyEvent(what, key, modifiers);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->KeyPressed(what, key, modifiers);
}
void
DesktopObservable::InvokeMouseEvent(BMessage* message)
DesktopObservable::MouseEvent(BMessage* message)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->MouseEvent(message);
}
void
DesktopObservable::InvokeMouseDown(Window* window, BMessage* message,
DesktopObservable::MouseDown(Window* window, BMessage* message,
const BPoint& where)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->MouseDown(window, message, where);
}
void
DesktopObservable::InvokeMouseUp(Window* window, BMessage* message,
DesktopObservable::MouseUp(Window* window, BMessage* message,
const BPoint& where)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->MouseUp(window, message, where);
}
void
DesktopObservable::InvokeMouseMoved(Window* window, BMessage* message,
DesktopObservable::MouseMoved(Window* window, BMessage* message,
const BPoint& where)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->MouseMoved(window, message, where);
}
void
DesktopObservable::InvokeMoveWindow(Window* window)
DesktopObservable::WindowMoved(Window* window)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->MoveWindow(window);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowMoved(window);
}
void
DesktopObservable::InvokeResizeWindow(Window* window)
DesktopObservable::WindowResized(Window* window)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->ResizeWindow(window);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowResized(window);
}
void
DesktopObservable::InvokeActivateWindow(Window* window)
DesktopObservable::WindowActitvated(Window* window)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->ActivateWindow(window);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowActitvated(window);
}
void
DesktopObservable::InvokeSendWindowBehind(Window* window, Window* behindOf)
DesktopObservable::WindowSentBehind(Window* window, Window* behindOf)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->SendWindowBehind(window, behindOf);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowSentBehind(window, behindOf);
}
void
DesktopObservable::InvokeSetWindowTabLocation(Window* window, float location)
DesktopObservable::WindowWorkspacesChanged(Window* window, uint32 workspaces)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->SetWindowTabLocation(window, location);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowWorkspacesChanged(window, workspaces);
}
void
DesktopObservable::WindowMinimized(Window* window, bool minimize)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowMinimized(window, minimize);
}
void
DesktopObservable::WindowTabLocationChanged(Window* window, float location)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->WindowTabLocationChanged(window, location);
}
bool
DesktopObservable::InvokeSetDecoratorSettings(Window* window,
DesktopObservable::SetDecoratorSettings(Window* window,
const BMessage& settings)
{
if (fWeAreInvoking)
@ -208,7 +246,8 @@ DesktopObservable::InvokeSetDecoratorSettings(Window* window,
InvokeGuard invokeGuard(fWeAreInvoking);
bool changed = false;
FOR_ALL_DESKTOP_LISTENER
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
changed = changed | listener->SetDecoratorSettings(window, settings);
return changed;
@ -216,65 +255,18 @@ DesktopObservable::InvokeSetDecoratorSettings(Window* window,
void
DesktopObservable::InvokeGetDecoratorSettings(Window* window, BMessage& settings)
DesktopObservable::GetDecoratorSettings(Window* window, BMessage& settings)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
for (DesktopListener* listener = fDesktopListenerList.First();
listener != NULL; listener = fDesktopListenerList.GetNext(listener))
listener->GetDecoratorSettings(window, settings);
}
void
DesktopObservable::InvokeSetWindowWorkspaces(Window* window, uint32 workspaces)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->SetWindowWorkspaces(window, workspaces);
}
void
DesktopObservable::InvokeShowWindow(Window* window)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->ShowWindow(window);
}
void
DesktopObservable::InvokeHideWindow(Window* window)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->HideWindow(window);
}
void
DesktopObservable::InvokeMinimizeWindow(Window* window, bool minimize)
{
if (fWeAreInvoking)
return;
InvokeGuard invokeGuard(fWeAreInvoking);
FOR_ALL_DESKTOP_LISTENER
listener->MinimizeWindow(window, minimize);
}
DesktopObservable::InvokeGuard::InvokeGuard(bool& invoking)
:
fInvoking(invoking)

View File

@ -26,10 +26,10 @@ public:
virtual void ListenerRegistered(Desktop* desktop) = 0;
virtual void ListenerUnregistered() = 0;
virtual void AddWindow(Window* window) = 0;
virtual void RemoveWindow(Window* window) = 0;
virtual void WindowAdded(Window* window) = 0;
virtual void WindowRemoved(Window* window) = 0;
virtual void KeyEvent(uint32 what, int32 key,
virtual void KeyPressed(uint32 what, int32 key,
int32 modifiers) = 0;
virtual void MouseEvent(BMessage* message) = 0;
virtual void MouseDown(Window* window, BMessage* message,
@ -39,19 +39,17 @@ public:
virtual void MouseMoved(Window* window, BMessage* message,
const BPoint& where) = 0;
virtual void MoveWindow(Window* window) = 0;
virtual void ResizeWindow(Window* window) = 0;
virtual void ActivateWindow(Window* window) = 0;
virtual void SendWindowBehind(Window* window,
virtual void WindowMoved(Window* window) = 0;
virtual void WindowResized(Window* window) = 0;
virtual void WindowActitvated(Window* window) = 0;
virtual void WindowSentBehind(Window* window,
Window* behindOf) = 0;
virtual void SetWindowWorkspaces(Window* window,
virtual void WindowWorkspacesChanged(Window* window,
uint32 workspaces) = 0;
virtual void ShowWindow(Window* window) = 0;
virtual void HideWindow(Window* window) = 0;
virtual void MinimizeWindow(Window* window,
virtual void WindowMinimized(Window* window,
bool minimize) = 0;
virtual void SetWindowTabLocation(Window* window,
virtual void WindowTabLocationChanged(Window* window,
float location) = 0;
virtual bool SetDecoratorSettings(Window* window,
@ -73,36 +71,33 @@ public:
void UnregisterListener(DesktopListener* listener);
const DesktopListenerDLList& GetDesktopListenerList();
void InvokeAddWindow(Window* window);
void InvokeRemoveWindow(Window* window);
void WindowAdded(Window* window);
void WindowRemoved(Window* window);
void InvokeKeyEvent(uint32 what, int32 key,
void KeyPressed(uint32 what, int32 key,
int32 modifiers);
void InvokeMouseEvent(BMessage* message);
void InvokeMouseDown(Window* window, BMessage* message,
void MouseEvent(BMessage* message);
void MouseDown(Window* window, BMessage* message,
const BPoint& where);
void InvokeMouseUp(Window* window, BMessage* message,
void MouseUp(Window* window, BMessage* message,
const BPoint& where);
void InvokeMouseMoved(Window* window, BMessage* message,
void MouseMoved(Window* window, BMessage* message,
const BPoint& where);
void InvokeMoveWindow(Window* window);
void InvokeResizeWindow(Window* window);
void InvokeActivateWindow(Window* window);
void InvokeSendWindowBehind(Window* window,
Window* behindOf);
void InvokeSetWindowWorkspaces(Window* window,
void WindowMoved(Window* window);
void WindowResized(Window* window);
void WindowActitvated(Window* window);
void WindowSentBehind(Window* window, Window* behindOf);
void WindowWorkspacesChanged(Window* window,
uint32 workspaces);
void InvokeShowWindow(Window* window);
void InvokeHideWindow(Window* window);
void InvokeMinimizeWindow(Window* window, bool minimize);
void WindowMinimized(Window* window, bool minimize);
void InvokeSetWindowTabLocation(Window* window,
void WindowTabLocationChanged(Window* window,
float location);
bool InvokeSetDecoratorSettings(Window* window,
bool SetDecoratorSettings(Window* window,
const BMessage& settings);
void InvokeGetDecoratorSettings(Window* window,
void GetDecoratorSettings(Window* window,
BMessage& settings);
private: