2004-01-17 21:37:57 +03:00
|
|
|
//------------------------------------------------------------------------------
|
2005-06-15 01:28:56 +04:00
|
|
|
// Copyright (c) 2001-2005, Haiku, Inc.
|
2004-01-17 21:37:57 +03:00
|
|
|
//
|
|
|
|
// Permission is hereby granted, free of charge, to any person obtaining a
|
|
|
|
// copy of this software and associated documentation files (the "Software"),
|
|
|
|
// to deal in the Software without restriction, including without limitation
|
|
|
|
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
|
|
// and/or sell copies of the Software, and to permit persons to whom the
|
|
|
|
// Software is furnished to do so, subject to the following conditions:
|
|
|
|
//
|
|
|
|
// The above copyright notice and this permission notice shall be included in
|
|
|
|
// all copies or substantial portions of the Software.
|
|
|
|
//
|
|
|
|
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
|
|
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
|
|
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
|
|
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
|
|
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
|
|
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
|
|
// DEALINGS IN THE SOFTWARE.
|
|
|
|
//
|
|
|
|
// File Name: Desktop.cpp
|
2005-01-17 00:35:02 +03:00
|
|
|
// Author: Adi Oanca <adioanca@cotty.iren.ro>
|
2004-01-17 21:37:57 +03:00
|
|
|
// Description: Class used to encapsulate desktop management
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
2004-01-13 03:56:36 +03:00
|
|
|
#include <stdio.h>
|
|
|
|
#include <Region.h>
|
2004-01-12 01:12:55 +03:00
|
|
|
#include <Message.h>
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2004-01-22 03:32:07 +03:00
|
|
|
#include "AppServer.h"
|
2004-01-13 03:56:36 +03:00
|
|
|
#include "Desktop.h"
|
2004-01-22 03:32:07 +03:00
|
|
|
#include "DisplayDriver.h"
|
2005-04-18 22:48:19 +04:00
|
|
|
#include "DisplayDriverPainter.h"
|
2004-01-22 03:32:07 +03:00
|
|
|
#include "Globals.h"
|
2004-01-12 01:12:55 +03:00
|
|
|
#include "Layer.h"
|
2004-01-22 03:32:07 +03:00
|
|
|
#include "RootLayer.h"
|
|
|
|
#include "ServerConfig.h"
|
|
|
|
#include "ServerScreen.h"
|
2005-02-28 23:23:51 +03:00
|
|
|
#include "ServerApp.h"
|
2004-01-22 03:32:07 +03:00
|
|
|
#include "ServerWindow.h"
|
2004-01-12 01:12:55 +03:00
|
|
|
#include "WinBorder.h"
|
|
|
|
#include "Workspace.h"
|
2003-02-12 14:24:26 +03:00
|
|
|
|
2004-01-22 03:32:07 +03:00
|
|
|
//#define DEBUG_DESKTOP
|
2003-02-12 14:24:26 +03:00
|
|
|
|
2004-01-22 03:32:07 +03:00
|
|
|
#ifdef DEBUG_DESKTOP
|
|
|
|
#define STRACE(a) printf(a)
|
|
|
|
#else
|
|
|
|
#define STRACE(a) /* nothing */
|
|
|
|
#endif
|
2003-02-14 14:04:01 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
2004-01-22 03:32:07 +03:00
|
|
|
Desktop::Desktop(void)
|
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
fActiveRootLayer = NULL;
|
|
|
|
fActiveScreen = NULL;
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
2004-01-22 03:32:07 +03:00
|
|
|
Desktop::~Desktop(void)
|
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
for (int32 i = 0; WinBorder *border = (WinBorder *)fWinBorderList.ItemAt(i); i++)
|
|
|
|
delete border;
|
2005-01-17 00:35:02 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
for (int32 i = 0; RootLayer *rootLayer = (RootLayer *)fRootLayerList.ItemAt(i); i++)
|
|
|
|
delete rootLayer;
|
2003-01-24 18:19:27 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
for (int32 i = 0; Screen *screen = (Screen *)fScreenList.ItemAt(i); i++)
|
|
|
|
delete screen;
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2005-03-29 19:39:08 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::Init(void)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-03-29 19:39:08 +04:00
|
|
|
DisplayDriver *driver = NULL;
|
|
|
|
|
2005-04-18 22:48:19 +04:00
|
|
|
// Eventually we will loop through drivers until
|
|
|
|
// one can't initialize in order to support multiple monitors.
|
|
|
|
// For now, we'll just load one and be done with it.
|
2005-01-23 21:22:48 +03:00
|
|
|
|
2005-03-29 19:39:08 +04:00
|
|
|
bool initDrivers = true;
|
|
|
|
while (initDrivers) {
|
2005-04-12 12:22:16 +04:00
|
|
|
driver = new DisplayDriverPainter();
|
2005-03-29 19:39:08 +04:00
|
|
|
AddDriver(driver);
|
|
|
|
initDrivers = false;
|
2004-01-12 01:12:55 +03:00
|
|
|
}
|
2003-02-14 14:04:01 +03:00
|
|
|
|
2005-03-29 19:39:08 +04:00
|
|
|
if (fScreenList.CountItems() < 1) {
|
2004-01-12 01:12:55 +03:00
|
|
|
delete this;
|
2004-03-28 19:02:53 +04:00
|
|
|
return;
|
|
|
|
}
|
2005-03-29 19:39:08 +04:00
|
|
|
|
2004-01-12 01:12:55 +03:00
|
|
|
InitMode();
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2004-01-12 01:12:55 +03:00
|
|
|
SetActiveRootLayerByIndex(0);
|
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-03-29 19:39:08 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::AddDriver(DisplayDriver *driver)
|
2005-01-23 21:22:48 +03:00
|
|
|
{
|
2005-03-28 18:29:18 +04:00
|
|
|
if (driver->Initialize()) {
|
2005-05-26 13:21:51 +04:00
|
|
|
Screen *screen = new Screen(driver, fScreenList.CountItems() + 1);
|
2005-06-08 05:40:22 +04:00
|
|
|
// The driver is now owned by the screen
|
|
|
|
|
|
|
|
// TODO: be careful of screen initialization - monitor may not support 640x480
|
2005-06-15 01:28:56 +04:00
|
|
|
screen->SetMode(800, 600, B_RGB32, 60.f);
|
2005-05-26 13:21:51 +04:00
|
|
|
|
|
|
|
fScreenList.AddItem(screen);
|
2005-03-28 18:29:18 +04:00
|
|
|
} else {
|
2005-01-23 21:22:48 +03:00
|
|
|
driver->Shutdown();
|
|
|
|
delete driver;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::InitMode(void)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
|
|
|
// this is init mode for n-SS.
|
2005-04-25 18:14:09 +04:00
|
|
|
fActiveScreen = (Screen *)fScreenList.ItemAt(0);
|
|
|
|
|
|
|
|
for (int32 i = 0; i < fScreenList.CountItems(); i++) {
|
|
|
|
Screen *screen = (Screen *)fScreenList.ItemAt(i);
|
|
|
|
|
|
|
|
char name[32];
|
|
|
|
sprintf(name, "RootLayer %ld", i + 1);
|
|
|
|
|
|
|
|
RootLayer *rootLayer = new RootLayer(name, 4, this, GetDisplayDriver());
|
|
|
|
rootLayer->SetScreens(&screen, 1, 1);
|
|
|
|
rootLayer->RunThread();
|
|
|
|
|
|
|
|
fRootLayerList.AddItem(rootLayer);
|
2003-03-01 23:25:08 +03:00
|
|
|
}
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
2004-01-13 03:56:36 +03:00
|
|
|
//---------------------------------------------------------------------------
|
2004-01-22 03:32:07 +03:00
|
|
|
// Methods for multiple monitors.
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
inline Screen *
|
|
|
|
Desktop::ScreenAt(int32 index) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
return static_cast<Screen *>(fScreenList.ItemAt(index));
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline int32
|
|
|
|
Desktop::ScreenCount(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
return fScreenList.CountItems();
|
2003-02-24 18:47:06 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline Screen *
|
|
|
|
Desktop::ActiveScreen(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-14 03:54:45 +03:00
|
|
|
return fActiveScreen;
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline void
|
|
|
|
Desktop::SetActiveRootLayerByIndex(int32 listIndex)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
RootLayer *rootLayer = RootLayerAt(listIndex);
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
if (rootLayer != NULL)
|
|
|
|
SetActiveRootLayer(rootLayer);
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline void
|
|
|
|
Desktop::SetActiveRootLayer(RootLayer *rootLayer)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
if (fActiveRootLayer == rootLayer)
|
2004-01-12 01:12:55 +03:00
|
|
|
return;
|
2003-01-24 18:19:27 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
fActiveRootLayer = rootLayer;
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
RootLayer *
|
|
|
|
Desktop::ActiveRootLayer(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
return fActiveRootLayer;
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline int32
|
|
|
|
Desktop::ActiveRootLayerIndex(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
int32 rootLayerCount = CountRootLayers();
|
|
|
|
|
|
|
|
for (int32 i = 0; i < rootLayerCount; i++) {
|
|
|
|
if (fActiveRootLayer == (RootLayer *)fRootLayerList.ItemAt(i))
|
2004-01-12 01:12:55 +03:00
|
|
|
return i;
|
|
|
|
}
|
|
|
|
return -1;
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline RootLayer *
|
|
|
|
Desktop::RootLayerAt(int32 index)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
return static_cast<RootLayer *>(fRootLayerList.ItemAt(index));
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline int32
|
|
|
|
Desktop::CountRootLayers() const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
return fRootLayerList.CountItems();
|
|
|
|
}
|
2003-09-09 01:18:39 +04:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
inline DisplayDriver *
|
|
|
|
Desktop::GetDisplayDriver() const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-05-26 13:21:51 +04:00
|
|
|
return ScreenAt(0)->GetDisplayDriver();
|
2004-01-13 03:56:36 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
2004-01-13 03:56:36 +03:00
|
|
|
//---------------------------------------------------------------------------
|
2004-01-22 03:32:07 +03:00
|
|
|
// Methods for layer(WinBorder) manipulation.
|
|
|
|
//---------------------------------------------------------------------------
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::AddWinBorder(WinBorder *winBorder)
|
2005-02-28 23:23:51 +03:00
|
|
|
{
|
|
|
|
if (!winBorder)
|
|
|
|
return;
|
|
|
|
|
2005-03-19 22:08:19 +03:00
|
|
|
// R2: how to determine the RootLayer to which this window should be added???
|
|
|
|
// for now, use ActiveRootLayer() because we only have one instance.
|
|
|
|
|
2005-04-16 17:30:49 +04:00
|
|
|
int32 feel = winBorder->Feel();
|
2005-02-28 23:23:51 +03:00
|
|
|
|
2005-03-19 22:08:19 +03:00
|
|
|
// we are ServerApp thread, we need to lock RootLayer here.
|
|
|
|
ActiveRootLayer()->Lock();
|
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// we're playing with window list. lock first.
|
|
|
|
Lock();
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
if (fWinBorderList.HasItem(winBorder)) {
|
2005-02-28 23:23:51 +03:00
|
|
|
Unlock();
|
2005-03-31 00:06:50 +04:00
|
|
|
ActiveRootLayer()->Unlock();
|
2005-02-28 23:23:51 +03:00
|
|
|
debugger("AddWinBorder: WinBorder already in Desktop list\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// we have a new window. store a record of it.
|
|
|
|
fWinBorderList.AddItem(winBorder);
|
|
|
|
|
|
|
|
// add FLOATING_APP windows to the local list of all normal windows.
|
|
|
|
// This is to keep the order all floating windows (app or subset) when we go from
|
|
|
|
// one normal window to another.
|
2005-04-25 18:14:09 +04:00
|
|
|
if (feel == B_FLOATING_APP_WINDOW_FEEL || feel == B_NORMAL_WINDOW_FEEL) {
|
|
|
|
WinBorder *wb = NULL;
|
|
|
|
int32 count = fWinBorderList.CountItems();
|
|
|
|
int32 feelToLookFor = (feel == B_NORMAL_WINDOW_FEEL ?
|
|
|
|
B_FLOATING_APP_WINDOW_FEEL : B_NORMAL_WINDOW_FEEL);
|
|
|
|
|
|
|
|
for (int32 i = 0; i < count; i++) {
|
|
|
|
wb = (WinBorder *)fWinBorderList.ItemAt(i);
|
|
|
|
|
2005-06-23 21:40:35 +04:00
|
|
|
if (wb->App()->ClientTeam() == winBorder->App()->ClientTeam()
|
2005-04-25 18:14:09 +04:00
|
|
|
&& wb->Feel() == feelToLookFor) {
|
2005-02-28 23:23:51 +03:00
|
|
|
// R2: RootLayer comparison is needed.
|
2005-03-13 22:53:44 +03:00
|
|
|
feel == B_NORMAL_WINDOW_FEEL ?
|
2005-06-17 20:34:22 +04:00
|
|
|
winBorder->fSubWindowList.AddWinBorder(wb) :
|
|
|
|
wb->fSubWindowList.AddWinBorder(winBorder);
|
2005-02-28 23:23:51 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// add application's list of modal windows.
|
2005-04-25 18:14:09 +04:00
|
|
|
if (feel == B_MODAL_APP_WINDOW_FEEL) {
|
2005-06-17 20:34:22 +04:00
|
|
|
winBorder->App()->fAppSubWindowList.AddWinBorder(winBorder);
|
2005-02-28 23:23:51 +03:00
|
|
|
}
|
|
|
|
|
2005-03-19 22:08:19 +03:00
|
|
|
// send WinBorder to be added to workspaces
|
|
|
|
ActiveRootLayer()->AddWinBorder(winBorder);
|
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// hey, unlock!
|
|
|
|
Unlock();
|
|
|
|
|
2005-03-19 22:08:19 +03:00
|
|
|
ActiveRootLayer()->Unlock();
|
2005-02-28 23:23:51 +03:00
|
|
|
}
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::RemoveWinBorder(WinBorder *winBorder)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-02-28 23:23:51 +03:00
|
|
|
if (!winBorder)
|
|
|
|
return;
|
|
|
|
|
2005-03-19 22:08:19 +03:00
|
|
|
// we are ServerApp thread, we need to lock RootLayer here.
|
|
|
|
ActiveRootLayer()->Lock();
|
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// we're playing with window list. lock first.
|
|
|
|
Lock();
|
|
|
|
|
|
|
|
// remove from main WinBorder list.
|
2005-04-25 18:14:09 +04:00
|
|
|
if (fWinBorderList.RemoveItem(winBorder)) {
|
|
|
|
int32 feel = winBorder->Feel();
|
2005-02-28 23:23:51 +03:00
|
|
|
|
|
|
|
// floating app/subset and modal_subset windows require special atention because
|
|
|
|
// they are/may_be added to the list of a lot normal windows.
|
|
|
|
if (feel == B_FLOATING_SUBSET_WINDOW_FEEL
|
|
|
|
|| feel == B_MODAL_SUBSET_WINDOW_FEEL
|
|
|
|
|| feel == B_FLOATING_APP_WINDOW_FEEL)
|
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
WinBorder *wb = NULL;
|
|
|
|
int32 count = fWinBorderList.CountItems();
|
2004-06-19 17:04:50 +04:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
for (int32 i = 0; i < count; i++) {
|
|
|
|
wb = (WinBorder*)fWinBorderList.ItemAt(i);
|
2005-02-28 23:23:51 +03:00
|
|
|
|
2005-04-16 17:30:49 +04:00
|
|
|
if (wb->Feel() == B_NORMAL_WINDOW_FEEL
|
2005-06-23 21:40:35 +04:00
|
|
|
&& wb->App()->ClientTeam() == winBorder->App()->ClientTeam()) {
|
2005-02-28 23:23:51 +03:00
|
|
|
// R2: RootLayer comparison is needed. We'll see.
|
2005-06-17 20:34:22 +04:00
|
|
|
wb->fSubWindowList.RemoveItem(winBorder);
|
2005-02-28 23:23:51 +03:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// remove from application's list
|
2005-04-25 18:14:09 +04:00
|
|
|
if (feel == B_MODAL_APP_WINDOW_FEEL) {
|
2005-06-17 20:34:22 +04:00
|
|
|
winBorder->App()->fAppSubWindowList.RemoveItem(winBorder);
|
2005-02-28 23:23:51 +03:00
|
|
|
}
|
2005-04-25 18:14:09 +04:00
|
|
|
} else {
|
2005-02-28 23:23:51 +03:00
|
|
|
Unlock();
|
2005-03-31 00:06:50 +04:00
|
|
|
ActiveRootLayer()->Unlock();
|
2005-02-28 23:23:51 +03:00
|
|
|
debugger("RemoveWinBorder: WinBorder not found in Desktop list\n");
|
2003-02-20 21:05:35 +03:00
|
|
|
return;
|
2005-02-28 23:23:51 +03:00
|
|
|
}
|
2003-02-20 21:05:35 +03:00
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// Tell to winBorder's RootLayer about this.
|
|
|
|
ActiveRootLayer()->RemoveWinBorder(winBorder);
|
|
|
|
|
2005-03-18 22:00:45 +03:00
|
|
|
Unlock();
|
2005-03-19 22:08:19 +03:00
|
|
|
ActiveRootLayer()->Unlock();
|
2005-02-28 23:23:51 +03:00
|
|
|
}
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::AddWinBorderToSubset(WinBorder *winBorder, WinBorder *toWinBorder)
|
2005-02-28 23:23:51 +03:00
|
|
|
{
|
2005-03-18 22:00:45 +03:00
|
|
|
// NOTE: we can safely lock the entire method body, because this method is called from
|
|
|
|
// RootLayer's thread only.
|
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// we're playing with window list. lock first.
|
|
|
|
Lock();
|
|
|
|
|
|
|
|
if (!winBorder || !toWinBorder
|
2005-04-25 18:14:09 +04:00
|
|
|
|| !fWinBorderList.HasItem(winBorder)
|
|
|
|
|| !fWinBorderList.HasItem(toWinBorder)) {
|
2005-02-28 23:23:51 +03:00
|
|
|
Unlock();
|
|
|
|
debugger("AddWinBorderToSubset: NULL WinBorder or not found in Desktop list\n");
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
if ((winBorder->Feel() == B_FLOATING_SUBSET_WINDOW_FEEL
|
2005-04-16 17:30:49 +04:00
|
|
|
|| winBorder->Feel() == B_MODAL_SUBSET_WINDOW_FEEL)
|
2005-04-25 18:14:09 +04:00
|
|
|
&& toWinBorder->Feel() == B_NORMAL_WINDOW_FEEL
|
2005-06-23 21:40:35 +04:00
|
|
|
&& toWinBorder->App()->ClientTeam() == winBorder->App()->ClientTeam()
|
2005-06-17 20:34:22 +04:00
|
|
|
&& !toWinBorder->fSubWindowList.HasItem(winBorder)) {
|
2005-02-28 23:23:51 +03:00
|
|
|
// add to normal_window's list
|
2005-06-17 20:34:22 +04:00
|
|
|
toWinBorder->fSubWindowList.AddWinBorder(winBorder);
|
2005-04-25 18:14:09 +04:00
|
|
|
} else {
|
2005-02-28 23:23:51 +03:00
|
|
|
Unlock();
|
|
|
|
debugger("AddWinBorderToSubset: you must add a subset_window to a normal_window's subset with the same team_id\n");
|
|
|
|
return;
|
|
|
|
}
|
2004-01-13 03:56:36 +03:00
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// send WinBorder to be added to workspaces, if not already in there.
|
|
|
|
ActiveRootLayer()->AddSubsetWinBorder(winBorder, toWinBorder);
|
2005-03-18 22:00:45 +03:00
|
|
|
|
|
|
|
Unlock();
|
2004-01-12 01:12:55 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::RemoveWinBorderFromSubset(WinBorder *winBorder, WinBorder *fromWinBorder)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-03-18 22:00:45 +03:00
|
|
|
// NOTE: we can safely lock the entire method body, because this method is called from
|
|
|
|
// RootLayer's thread only.
|
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
// we're playing with window list. lock first.
|
|
|
|
Lock();
|
|
|
|
|
|
|
|
if (!winBorder || !fromWinBorder
|
2005-04-25 18:14:09 +04:00
|
|
|
|| !fWinBorderList.HasItem(winBorder)
|
|
|
|
|| !fWinBorderList.HasItem(fromWinBorder)) {
|
2005-02-28 23:23:51 +03:00
|
|
|
Unlock();
|
|
|
|
debugger("RemoveWinBorderFromSubset: NULL WinBorder or not found in Desktop list\n");
|
|
|
|
return;
|
|
|
|
}
|
2004-06-19 17:04:50 +04:00
|
|
|
|
2005-03-18 22:00:45 +03:00
|
|
|
// remove WinBorder from workspace, if needed - some other windows may still have it in their subset
|
|
|
|
ActiveRootLayer()->RemoveSubsetWinBorder(winBorder, fromWinBorder);
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
if (fromWinBorder->Feel() == B_NORMAL_WINDOW_FEEL) {
|
2005-02-28 23:23:51 +03:00
|
|
|
//remove from this normal_window's subset.
|
2005-06-17 20:34:22 +04:00
|
|
|
fromWinBorder->fSubWindowList.RemoveItem(winBorder);
|
2005-04-25 18:14:09 +04:00
|
|
|
} else {
|
2005-02-28 23:23:51 +03:00
|
|
|
Unlock();
|
|
|
|
debugger("RemoveWinBorderFromSubset: you must remove a subset_window from a normal_window's subset\n");
|
|
|
|
return;
|
|
|
|
}
|
2003-09-09 01:18:39 +04:00
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
Unlock();
|
2003-08-31 21:38:34 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::SetWinBorderFeel(WinBorder *winBorder, uint32 feel)
|
2005-04-21 22:57:34 +04:00
|
|
|
{
|
|
|
|
// NOTE: this method is called from RootLayer thread only
|
|
|
|
|
|
|
|
// we're playing with window list. lock first.
|
|
|
|
Lock();
|
|
|
|
|
|
|
|
RemoveWinBorder(winBorder);
|
|
|
|
winBorder->QuietlySetFeel(feel);
|
|
|
|
AddWinBorder(winBorder);
|
|
|
|
|
|
|
|
Unlock();
|
|
|
|
}
|
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
WinBorder *
|
|
|
|
Desktop::FindWinBorderByServerWindowTokenAndTeamID(int32 token, team_id teamID)
|
2005-02-28 23:23:51 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
WinBorder *wb;
|
2005-02-28 23:23:51 +03:00
|
|
|
|
|
|
|
Lock();
|
2005-04-25 18:14:09 +04:00
|
|
|
for (int32 i = 0; (wb = (WinBorder *)fWinBorderList.ItemAt(i)); i++) {
|
2005-02-28 23:23:51 +03:00
|
|
|
if (wb->Window()->ClientToken() == token
|
2005-06-23 21:40:35 +04:00
|
|
|
&& wb->Window()->ClientTeam() == teamID)
|
2005-02-28 23:23:51 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
Unlock();
|
2005-04-25 18:14:09 +04:00
|
|
|
|
2005-02-28 23:23:51 +03:00
|
|
|
return wb;
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
2004-01-13 03:56:36 +03:00
|
|
|
//---------------------------------------------------------------------------
|
2004-01-22 03:32:07 +03:00
|
|
|
// Methods for various desktop stuff handled by the server
|
|
|
|
//---------------------------------------------------------------------------
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::SetScrollBarInfo(const scroll_bar_info &info)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
fScrollBarInfo = info;
|
2003-01-24 18:19:27 +03:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
scroll_bar_info
|
|
|
|
Desktop::ScrollBarInfo(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
return fScrollBarInfo;
|
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::SetMenuInfo(const menu_info &info)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
fMenuInfo = info;
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
menu_info
|
|
|
|
Desktop::MenuInfo(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
return fMenuInfo;
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::UseFFMouse(const bool &useffm)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
fFFMouseMode = useffm;
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
bool
|
|
|
|
Desktop::FFMouseInUse(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
return fFFMouseMode;
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::SetFFMouseMode(const mode_mouse &value)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2005-04-25 18:14:09 +04:00
|
|
|
fMouseMode = value;
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
mode_mouse
|
|
|
|
Desktop::FFMouseMode(void) const
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
return fMouseMode;
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::PrintToStream(void)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
printf("RootLayer List:\n=======\n");
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
for (int32 i = 0; i < fRootLayerList.CountItems(); i++) {
|
2004-01-12 01:12:55 +03:00
|
|
|
printf("\t%s\n", ((RootLayer*)fRootLayerList.ItemAt(i))->GetName());
|
|
|
|
((RootLayer*)fRootLayerList.ItemAt(i))->PrintToStream();
|
|
|
|
printf("-------\n");
|
|
|
|
}
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
printf("=======\nActive RootLayer: %s\n",
|
|
|
|
fActiveRootLayer ? fActiveRootLayer->GetName() : "NULL");
|
2004-01-13 03:56:36 +03:00
|
|
|
// printf("Active WinBorder: %s\n", fActiveWinBorder? fActiveWinBorder->Name(): "NULL");
|
2005-04-25 18:14:09 +04:00
|
|
|
|
2004-01-12 01:12:55 +03:00
|
|
|
printf("Screen List:\n");
|
2005-04-25 18:14:09 +04:00
|
|
|
for (int32 i = 0; i < fScreenList.CountItems(); i++)
|
2004-01-12 01:12:55 +03:00
|
|
|
printf("\t%ld\n", ((Screen*)fScreenList.ItemAt(i))->ScreenNumber());
|
2003-07-06 23:48:17 +04:00
|
|
|
}
|
2004-01-22 03:32:07 +03:00
|
|
|
|
2005-04-25 18:14:09 +04:00
|
|
|
|
|
|
|
void
|
|
|
|
Desktop::PrintVisibleInRootLayerNo(int32 no)
|
2004-01-22 03:32:07 +03:00
|
|
|
{
|
2004-01-12 01:12:55 +03:00
|
|
|
}
|