* Implemented private do_window_action() function, used by the Deskbar to bring
windows to front (or minimize them). * Desktop::ActivateWindow() no longer crashes in case the window to be activated is not on the current workspace - instead, it doesn't do anything at this point. IOW it doesn't handle workspace activation at all, yet. * Renamed ServerWindow::GetWindowLayer() to ServerWindow::Window(). git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@16550 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
3b723f7914
commit
bfe698736d
@ -33,11 +33,12 @@ enum {
|
||||
AS_REGISTER_INPUT_SERVER = 1,
|
||||
AS_GET_DESKTOP,
|
||||
|
||||
// Desktop definitions
|
||||
// Desktop definitions (through the ServerApp, though)
|
||||
AS_GET_WINDOW_LIST,
|
||||
AS_GET_WINDOW_INFO,
|
||||
AS_MINIMIZE_TEAM,
|
||||
AS_BRING_TEAM_TO_FRONT,
|
||||
AS_WINDOW_ACTION,
|
||||
|
||||
// Application definitions
|
||||
AS_CREATE_APP,
|
||||
|
@ -999,10 +999,17 @@ void do_minimize_team(BRect zoomRect, team_id team, bool zoom);
|
||||
|
||||
|
||||
void
|
||||
do_window_action(int32 window_id, int32 action,
|
||||
do_window_action(int32 windowToken, int32 action,
|
||||
BRect zoomRect, bool zoom)
|
||||
{
|
||||
// ToDo: implement me, needed for Deskbar!
|
||||
BPrivate::AppServerLink link;
|
||||
|
||||
link.StartMessage(AS_WINDOW_ACTION);
|
||||
link.Attach<int32>(windowToken);
|
||||
link.Attach<int32>(action);
|
||||
// we don't have any zooming effect
|
||||
|
||||
link.Flush();
|
||||
}
|
||||
|
||||
|
||||
|
@ -1103,6 +1103,11 @@ Desktop::ActivateWindow(WindowLayer* window)
|
||||
{
|
||||
// printf("ActivateWindow(%p, %s)\n", window, window ? window->Title() : "<none>");
|
||||
|
||||
// TODO: handle this case correctly! (ie. honour B_NOT_ANCHORED_ON_ACTIVATE,
|
||||
// B_NO_WORKSPACE_ACTIVATION, switch workspaces, ...)
|
||||
if (!window->InWorkspace(fCurrentWorkspace))
|
||||
return;
|
||||
|
||||
if (window == NULL) {
|
||||
fBack = NULL;
|
||||
fFront = NULL;
|
||||
@ -1808,6 +1813,30 @@ Desktop::BringApplicationToFront(team_id team)
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Desktop::WindowAction(int32 windowToken, int32 action)
|
||||
{
|
||||
if (action != B_MINIMIZE_WINDOW && action != B_BRING_TO_FRONT)
|
||||
return;
|
||||
|
||||
LockAllWindows();
|
||||
|
||||
::ServerWindow* serverWindow;
|
||||
if (BPrivate::gDefaultTokens.GetToken(windowToken,
|
||||
B_SERVER_TOKEN, (void**)&serverWindow) != B_OK)
|
||||
return;
|
||||
|
||||
if (action == B_BRING_TO_FRONT
|
||||
&& !serverWindow->Window()->IsMinimized()) {
|
||||
// the window is visible, we just need to make it the front window
|
||||
ActivateWindow(serverWindow->Window());
|
||||
} else
|
||||
serverWindow->NotifyMinimize(action == B_MINIMIZE_WINDOW);
|
||||
|
||||
UnlockAllWindows();
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
Desktop::WriteWindowList(team_id team, BPrivate::LinkSender& sender)
|
||||
{
|
||||
|
@ -162,6 +162,7 @@ class Desktop : public MessageLooper, public ScreenOwner {
|
||||
|
||||
void MinimizeApplication(team_id team);
|
||||
void BringApplicationToFront(team_id team);
|
||||
void WindowAction(int32 windowToken, int32 action);
|
||||
|
||||
void WriteWindowList(team_id team,
|
||||
BPrivate::LinkSender& sender);
|
||||
|
@ -455,6 +455,19 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
|
||||
break;
|
||||
}
|
||||
|
||||
case AS_WINDOW_ACTION:
|
||||
{
|
||||
int32 token;
|
||||
int32 action;
|
||||
|
||||
link.Read<int32>(&token);
|
||||
if (link.Read<int32>(&action) != B_OK)
|
||||
break;
|
||||
|
||||
fDesktop->WindowAction(token, action);
|
||||
break;
|
||||
}
|
||||
|
||||
case AS_UPDATE_COLORS:
|
||||
{
|
||||
// NOTE: R2: Eventually we will have windows which will notify their children of changes in
|
||||
@ -466,7 +479,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
|
||||
|
||||
for(int32 i = 0; i < fWindowList.CountItems(); i++) {
|
||||
win=(ServerWindow*)fWindowList.ItemAt(i);
|
||||
win->GetWindowLayer()->UpdateColors();
|
||||
win->Window()->UpdateColors();
|
||||
win->SendMessageToClient(AS_UPDATE_COLORS, msg);
|
||||
}
|
||||
*/ break;
|
||||
@ -483,7 +496,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
|
||||
for(int32 i=0; i<fSWindowList->CountItems(); i++)
|
||||
{
|
||||
win=(ServerWindow*)fSWindowList->ItemAt(i);
|
||||
win->GetWindowLayer()->UpdateFont();
|
||||
win->Window()->UpdateFont();
|
||||
win->SendMessageToClient(AS_UPDATE_FONTS, msg);
|
||||
}
|
||||
*/ break;
|
||||
@ -598,7 +611,7 @@ ServerApp::_DispatchMessage(int32 code, BPrivate::LinkReceiver& link)
|
||||
/* for (int32 i = 0; i < fWindowList.CountItems(); i++) {
|
||||
ServerWindow *window = fWindowList.ItemAt(i);
|
||||
window->Lock();
|
||||
const_cast<WindowLayer *>(window->GetWindowLayer())->UpdateDecorator();
|
||||
const_cast<WindowLayer *>(window->Window())->UpdateDecorator();
|
||||
window->Unlock();
|
||||
}
|
||||
*/ break;
|
||||
@ -2564,7 +2577,7 @@ ServerApp::InWorkspace(int32 index) const
|
||||
|
||||
for (int32 i = fWindowList.CountItems(); i-- > 0;) {
|
||||
ServerWindow* window = fWindowList.ItemAt(i);
|
||||
const WindowLayer* layer = window->GetWindowLayer();
|
||||
const WindowLayer* layer = window->Window();
|
||||
|
||||
// only normal and unhidden windows count
|
||||
|
||||
@ -2588,7 +2601,7 @@ ServerApp::Workspaces() const
|
||||
|
||||
for (int32 i = fWindowList.CountItems(); i-- > 0;) {
|
||||
ServerWindow* window = fWindowList.ItemAt(i);
|
||||
const WindowLayer* layer = window->GetWindowLayer();
|
||||
const WindowLayer* layer = window->Window();
|
||||
|
||||
// only normal and unhidden windows count
|
||||
|
||||
|
@ -407,6 +407,9 @@ ServerWindow::NotifyQuitRequested()
|
||||
void
|
||||
ServerWindow::NotifyMinimize(bool minimize)
|
||||
{
|
||||
if (fWindowLayer->Feel() != B_NORMAL_WINDOW_FEEL)
|
||||
return;
|
||||
|
||||
// The client is responsible for the actual minimization
|
||||
|
||||
BMessage msg(B_MINIMIZE);
|
||||
@ -451,6 +454,14 @@ ServerWindow::GetInfo(window_info& info)
|
||||
}
|
||||
|
||||
|
||||
WindowLayer*
|
||||
ServerWindow::Window() const
|
||||
{
|
||||
// TODO: ensure desktop is locked!
|
||||
return fWindowLayer;
|
||||
}
|
||||
|
||||
|
||||
ViewLayer*
|
||||
ServerWindow::_CreateLayerTree(BPrivate::LinkReceiver &link, ViewLayer **_parent)
|
||||
{
|
||||
|
@ -82,7 +82,7 @@ public:
|
||||
// to who we belong. who do we own. our title.
|
||||
inline ServerApp* App() const { return fServerApp; }
|
||||
::Desktop* Desktop() const { return fDesktop; }
|
||||
inline const WindowLayer* GetWindowLayer() const { return fWindowLayer; }
|
||||
::WindowLayer* Window() const;
|
||||
|
||||
void SetTitle(const char* newTitle);
|
||||
inline const char* Title() const { return fTitle; }
|
||||
|
Loading…
Reference in New Issue
Block a user