2003-01-23 17:25:16 +03:00
|
|
|
//------------------------------------------------------------------------------
|
2004-09-21 02:50:02 +04:00
|
|
|
// Copyright (c) 2001-2002, Haiku, Inc.
|
2003-01-23 17:25:16 +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: CursorManager.cpp
|
|
|
|
// Author: DarkWyrm <bpmagic@columbus.rr.com>
|
|
|
|
// Description: Handles the system's cursor infrastructure
|
|
|
|
//
|
|
|
|
//------------------------------------------------------------------------------
|
2003-01-24 18:19:27 +03:00
|
|
|
#include "DisplayDriver.h"
|
|
|
|
#include "Desktop.h"
|
2003-01-23 17:25:16 +03:00
|
|
|
#include "CursorManager.h"
|
|
|
|
#include "ServerCursor.h"
|
2003-07-16 03:27:50 +04:00
|
|
|
#include "CursorData.h"
|
2004-01-14 03:54:45 +03:00
|
|
|
#include "ServerScreen.h"
|
2003-07-24 23:38:24 +04:00
|
|
|
#include "ServerConfig.h"
|
2003-01-23 17:25:16 +03:00
|
|
|
#include <Errors.h>
|
2003-07-24 23:38:24 +04:00
|
|
|
#include <Directory.h>
|
|
|
|
#include <String.h>
|
2003-06-23 06:54:52 +04:00
|
|
|
#include <string.h>
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-01-24 17:00:48 +03:00
|
|
|
//! The global cursor manager object. Allocated and freed by AppServer class
|
|
|
|
CursorManager *cursormanager;
|
|
|
|
|
2003-01-23 17:25:16 +03:00
|
|
|
//! Initializes the CursorManager
|
|
|
|
CursorManager::CursorManager(void)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList=new BList(0);
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
// Error code for AddCursor
|
2004-06-26 06:15:48 +04:00
|
|
|
fTokenizer.ExcludeValue(B_ERROR);
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
// Set system cursors to "unassigned"
|
2003-07-16 03:27:50 +04:00
|
|
|
ServerCursor *cdefault=new ServerCursor(default_cursor_data);
|
|
|
|
AddCursor(cdefault);
|
2004-06-26 06:15:48 +04:00
|
|
|
fDefaultCursor=cdefault;
|
2003-07-16 03:27:50 +04:00
|
|
|
|
|
|
|
ServerCursor *ctext=new ServerCursor(default_text_data);
|
|
|
|
AddCursor(ctext);
|
2004-06-26 06:15:48 +04:00
|
|
|
fTextCursor=ctext;
|
2003-07-16 03:27:50 +04:00
|
|
|
|
2003-07-16 04:43:10 +04:00
|
|
|
ServerCursor *cmove=new ServerCursor(default_move_data);
|
|
|
|
AddCursor(cmove);
|
2004-06-26 06:15:48 +04:00
|
|
|
fMoveCursor=cmove;
|
2003-07-16 03:27:50 +04:00
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
ServerCursor *cdrag=new ServerCursor(default_drag_data);
|
|
|
|
AddCursor(cdrag);
|
2004-06-26 06:15:48 +04:00
|
|
|
fDragCursor=cdrag;
|
2003-07-24 23:38:24 +04:00
|
|
|
|
2003-07-16 03:27:50 +04:00
|
|
|
ServerCursor *cresize=new ServerCursor(default_resize_data);
|
|
|
|
AddCursor(cresize);
|
2004-06-26 06:15:48 +04:00
|
|
|
fResizeCursor=cresize;
|
2003-07-16 03:27:50 +04:00
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
ServerCursor *cresizenwse=new ServerCursor(default_resize_nwse_data);
|
|
|
|
AddCursor(cresizenwse);
|
2004-06-26 06:15:48 +04:00
|
|
|
fNWSECursor=cresizenwse;
|
2003-07-16 03:27:50 +04:00
|
|
|
|
|
|
|
ServerCursor *cresizenesw=new ServerCursor(default_resize_nesw_data);
|
|
|
|
AddCursor(cresizenesw);
|
2004-06-26 06:15:48 +04:00
|
|
|
fNESWCursor=cresizenesw;
|
2003-07-16 03:27:50 +04:00
|
|
|
|
|
|
|
ServerCursor *cresizens=new ServerCursor(default_resize_ns_data);
|
|
|
|
AddCursor(cresizens);
|
2004-06-26 06:15:48 +04:00
|
|
|
fNSCursor=cresizens;
|
2003-07-16 03:27:50 +04:00
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
ServerCursor *cresizeew=new ServerCursor(default_resize_ew_data);
|
|
|
|
AddCursor(cresizeew);
|
2004-06-26 06:15:48 +04:00
|
|
|
fEWCursor=cresizeew;
|
2003-07-24 23:38:24 +04:00
|
|
|
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
//! Does all the teardown
|
|
|
|
CursorManager::~CursorManager(void)
|
|
|
|
{
|
|
|
|
ServerCursor *temp;
|
2004-06-26 06:15:48 +04:00
|
|
|
for(int32 i=0; i<fCursorList->CountItems();i++)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=(ServerCursor*)fCursorList->ItemAt(i);
|
2003-01-23 17:25:16 +03:00
|
|
|
if(temp)
|
|
|
|
delete temp;
|
|
|
|
}
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->MakeEmpty();
|
|
|
|
delete fCursorList;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
// Note that it is not necessary to remove and delete the system
|
|
|
|
// cursors. These cursors are kept in the list with a NULL application
|
|
|
|
// signature so they cannot be removed very easily except via
|
|
|
|
// SetCursor(cursor_which). At shutdown, they are removed with the
|
|
|
|
// above loop.
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Registers a cursor with the manager.
|
|
|
|
\param sc ServerCursor object to register
|
|
|
|
\return The token assigned to the cursor or B_ERROR if sc is NULL
|
|
|
|
*/
|
|
|
|
int32 CursorManager::AddCursor(ServerCursor *sc)
|
|
|
|
{
|
|
|
|
if(!sc)
|
|
|
|
return B_ERROR;
|
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
Lock();
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->AddItem(sc);
|
|
|
|
int32 value=fTokenizer.GetToken();
|
2004-09-21 02:50:02 +04:00
|
|
|
sc->fToken=value;
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
return value;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Removes a cursor from the internal list and deletes it
|
|
|
|
\param token ID value of the cursor to be deleted
|
|
|
|
|
|
|
|
If the cursor is not found, this call does nothing
|
|
|
|
*/
|
|
|
|
void CursorManager::DeleteCursor(int32 token)
|
|
|
|
{
|
2003-07-24 23:38:24 +04:00
|
|
|
Lock();
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
ServerCursor *temp;
|
2004-06-26 06:15:48 +04:00
|
|
|
for(int32 i=0; i<fCursorList->CountItems();i++)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=(ServerCursor*)fCursorList->ItemAt(i);
|
2004-09-21 02:50:02 +04:00
|
|
|
if(temp && temp->fToken==token)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(i);
|
2003-01-23 17:25:16 +03:00
|
|
|
delete temp;
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Removes and deletes all of an application's cursors
|
|
|
|
\param signature Signature to which the cursors belong
|
|
|
|
*/
|
2004-10-06 03:00:47 +04:00
|
|
|
void CursorManager::RemoveAppCursors(team_id team)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
2003-07-24 23:38:24 +04:00
|
|
|
Lock();
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
ServerCursor *temp;
|
2004-06-26 06:15:48 +04:00
|
|
|
for(int32 i=0; i<fCursorList->CountItems();i++)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=(ServerCursor*)fCursorList->ItemAt(i);
|
2004-10-06 03:00:47 +04:00
|
|
|
if(temp && temp->OwningTeam()==team)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(i);
|
2003-01-23 17:25:16 +03:00
|
|
|
delete temp;
|
|
|
|
}
|
|
|
|
}
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
//! Wrapper around the DisplayDriver ShowCursor call
|
|
|
|
void CursorManager::ShowCursor(void)
|
|
|
|
{
|
2004-01-14 03:54:45 +03:00
|
|
|
Lock();
|
2003-01-24 18:19:27 +03:00
|
|
|
|
2004-01-14 03:54:45 +03:00
|
|
|
DisplayDriver *driver = desktop->ActiveScreen()->DDriver();
|
2003-01-24 18:19:27 +03:00
|
|
|
driver->ShowCursor();
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
//! Wrapper around the DisplayDriver HideCursor call
|
|
|
|
void CursorManager::HideCursor(void)
|
|
|
|
{
|
2004-01-14 03:54:45 +03:00
|
|
|
Lock();
|
2003-01-24 18:19:27 +03:00
|
|
|
|
2004-01-14 03:54:45 +03:00
|
|
|
DisplayDriver *driver = desktop->ActiveScreen()->DDriver();
|
2003-01-24 18:19:27 +03:00
|
|
|
driver->HideCursor();
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
//! Wrapper around the DisplayDriver ObscureCursor call
|
|
|
|
void CursorManager::ObscureCursor(void)
|
|
|
|
{
|
2004-01-14 03:54:45 +03:00
|
|
|
Lock();
|
2003-01-24 18:19:27 +03:00
|
|
|
|
2004-01-14 03:54:45 +03:00
|
|
|
DisplayDriver *driver = desktop->ActiveScreen()->DDriver();
|
2003-01-24 18:19:27 +03:00
|
|
|
driver->ObscureCursor();
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Set the screen's cursor
|
|
|
|
\param token ID of the screen's new cursor
|
|
|
|
*/
|
|
|
|
void CursorManager::SetCursor(int32 token)
|
|
|
|
{
|
2004-01-14 03:54:45 +03:00
|
|
|
Lock();
|
2004-06-26 06:15:48 +04:00
|
|
|
ServerCursor *c=FindCursor(token);
|
2003-01-23 17:25:16 +03:00
|
|
|
if(c)
|
|
|
|
{
|
2004-01-14 03:54:45 +03:00
|
|
|
DisplayDriver *driver = desktop->ActiveScreen()->DDriver();
|
2003-01-24 18:19:27 +03:00
|
|
|
driver->SetCursor(c);
|
2004-06-26 06:15:48 +04:00
|
|
|
fCurrentWhich=B_CURSOR_OTHER;
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
void CursorManager::SetCursor(cursor_which which)
|
|
|
|
{
|
2004-01-14 03:54:45 +03:00
|
|
|
Lock();
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-01-14 03:54:45 +03:00
|
|
|
DisplayDriver *driver = desktop->ActiveScreen()->DDriver();
|
2003-01-23 17:25:16 +03:00
|
|
|
switch(which)
|
|
|
|
{
|
|
|
|
case B_CURSOR_DEFAULT:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fDefaultCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_TEXT:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fTextCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_MOVE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fMoveCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_DRAG:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fDragCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fResizeCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NWSE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fNWSECursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NESW:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fNESWCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NS:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fNSCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_EW:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
driver->SetCursor(fEWCursor);
|
|
|
|
fCurrentWhich=which;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
2003-01-24 18:19:27 +03:00
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Sets all the cursors from a specified CursorSet
|
|
|
|
\param path Path to the cursor set
|
|
|
|
|
|
|
|
All cursors in the set will be assigned. If the set does not specify a cursor for a
|
|
|
|
particular cursor specifier, it will remain unchanged. This function will fail if passed
|
|
|
|
a NULL path, an invalid path, or the path to a non-CursorSet file.
|
|
|
|
*/
|
|
|
|
void CursorManager::SetCursorSet(const char *path)
|
|
|
|
{
|
|
|
|
Lock();
|
|
|
|
CursorSet cs(NULL);
|
|
|
|
|
|
|
|
if(!path || cs.Load(path)!=B_OK)
|
|
|
|
return;
|
|
|
|
ServerCursor *csr;
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_DEFAULT,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fDefaultCursor)
|
|
|
|
delete fDefaultCursor;
|
|
|
|
fDefaultCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_TEXT,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fTextCursor)
|
|
|
|
delete fTextCursor;
|
|
|
|
fTextCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_MOVE,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fMoveCursor)
|
|
|
|
delete fMoveCursor;
|
|
|
|
fMoveCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_DRAG,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fDragCursor)
|
|
|
|
delete fDragCursor;
|
|
|
|
fDragCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_RESIZE,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fResizeCursor)
|
|
|
|
delete fResizeCursor;
|
|
|
|
fResizeCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_RESIZE_NWSE,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fNWSECursor)
|
|
|
|
delete fNWSECursor;
|
|
|
|
fNWSECursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_RESIZE_NESW,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fNESWCursor)
|
|
|
|
delete fNESWCursor;
|
|
|
|
fNESWCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_RESIZE_NS,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fNSCursor)
|
|
|
|
delete fNSCursor;
|
|
|
|
fNSCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
|
|
|
|
if(cs.FindCursor(B_CURSOR_RESIZE_EW,&csr)==B_OK)
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fEWCursor)
|
|
|
|
delete fEWCursor;
|
|
|
|
fEWCursor=csr;
|
2003-07-24 23:38:24 +04:00
|
|
|
}
|
|
|
|
Unlock();
|
|
|
|
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Acquire the cursor which is used for a particular system cursor
|
|
|
|
\param which Which system cursor to get
|
|
|
|
\return Pointer to the particular cursor used or NULL if which is
|
|
|
|
invalid or the cursor has not been assigned
|
|
|
|
*/
|
|
|
|
ServerCursor *CursorManager::GetCursor(cursor_which which)
|
|
|
|
{
|
|
|
|
ServerCursor *temp=NULL;
|
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
Lock();
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
switch(which)
|
|
|
|
{
|
|
|
|
case B_CURSOR_DEFAULT:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fDefaultCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_TEXT:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fTextCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_MOVE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fMoveCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_DRAG:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fDragCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fResizeCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NWSE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fNWSECursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NESW:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fNESWCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NS:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fNSCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_EW:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fEWCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Gets the current system cursor value
|
|
|
|
\return The current cursor value or CURSOR_OTHER if some non-system cursor
|
|
|
|
*/
|
|
|
|
cursor_which CursorManager::GetCursorWhich(void)
|
|
|
|
{
|
|
|
|
cursor_which temp;
|
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
Lock();
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=fCurrentWhich;
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Sets the specified system cursor to the a particular cursor
|
|
|
|
\param which Which system cursor to change
|
|
|
|
\param token The ID of the cursor to become the new one
|
|
|
|
|
|
|
|
A word of warning: once a cursor has been assigned to the system, the
|
|
|
|
system will take ownership of the cursor and deleting the cursor
|
|
|
|
will have not effect on the system.
|
|
|
|
*/
|
|
|
|
void CursorManager::ChangeCursor(cursor_which which, int32 token)
|
|
|
|
{
|
2003-07-24 23:38:24 +04:00
|
|
|
Lock();
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
// Find the cursor, based on the token
|
2004-06-26 06:15:48 +04:00
|
|
|
ServerCursor *cursor=FindCursor(token);
|
2003-01-23 17:25:16 +03:00
|
|
|
|
|
|
|
// Did we find a cursor with this token?
|
|
|
|
if(!cursor)
|
|
|
|
{
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Do the assignment
|
|
|
|
switch(which)
|
|
|
|
{
|
|
|
|
case B_CURSOR_DEFAULT:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fDefaultCursor)
|
|
|
|
delete fDefaultCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fDefaultCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_TEXT:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fTextCursor)
|
|
|
|
delete fTextCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fTextCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_MOVE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fMoveCursor)
|
|
|
|
delete fMoveCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fMoveCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_DRAG:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fDragCursor)
|
|
|
|
delete fDragCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fDragCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fResizeCursor)
|
|
|
|
delete fResizeCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fResizeCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NWSE:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fNWSECursor)
|
|
|
|
delete fNWSECursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fNWSECursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NESW:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fNESWCursor)
|
|
|
|
delete fNESWCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fNESWCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_NS:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fNSCursor)
|
|
|
|
delete fNSCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fNSCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
case B_CURSOR_RESIZE_EW:
|
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
if(fEWCursor)
|
|
|
|
delete fEWCursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2004-06-26 06:15:48 +04:00
|
|
|
fEWCursor=cursor;
|
2003-01-23 17:25:16 +03:00
|
|
|
|
2003-10-04 23:10:11 +04:00
|
|
|
if(cursor->GetAppSignature())
|
|
|
|
cursor->SetAppSignature("");
|
2004-06-26 06:15:48 +04:00
|
|
|
fCursorList->RemoveItem(cursor);
|
2003-01-23 17:25:16 +03:00
|
|
|
break;
|
|
|
|
}
|
|
|
|
default:
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
2003-07-24 23:38:24 +04:00
|
|
|
Unlock();
|
2003-01-23 17:25:16 +03:00
|
|
|
}
|
|
|
|
|
|
|
|
/*!
|
|
|
|
\brief Internal function which finds the cursor with a particular ID
|
|
|
|
\param token ID of the cursor to find
|
|
|
|
\return The cursor or NULL if not found
|
|
|
|
*/
|
2004-06-26 06:15:48 +04:00
|
|
|
ServerCursor *CursorManager::FindCursor(int32 token)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
|
|
|
ServerCursor *temp;
|
2004-06-26 06:15:48 +04:00
|
|
|
for(int32 i=0; i<fCursorList->CountItems();i++)
|
2003-01-23 17:25:16 +03:00
|
|
|
{
|
2004-06-26 06:15:48 +04:00
|
|
|
temp=(ServerCursor*)fCursorList->ItemAt(i);
|
2004-09-21 02:50:02 +04:00
|
|
|
if(temp && temp->fToken==token)
|
2003-01-23 17:25:16 +03:00
|
|
|
return temp;
|
|
|
|
}
|
|
|
|
return NULL;
|
|
|
|
}
|
2003-07-24 23:38:24 +04:00
|
|
|
|
|
|
|
//! Sets the cursors to the defaults and saves them to CURSOR_SETTINGS_DIR/"d
|
|
|
|
void CursorManager::SetDefaults(void)
|
|
|
|
{
|
|
|
|
Lock();
|
|
|
|
CursorSet cs("Default");
|
|
|
|
cs.AddCursor(B_CURSOR_DEFAULT,default_cursor_data);
|
|
|
|
cs.AddCursor(B_CURSOR_TEXT,default_text_data);
|
|
|
|
cs.AddCursor(B_CURSOR_MOVE,default_move_data);
|
|
|
|
cs.AddCursor(B_CURSOR_DRAG,default_drag_data);
|
|
|
|
cs.AddCursor(B_CURSOR_RESIZE,default_resize_data);
|
|
|
|
cs.AddCursor(B_CURSOR_RESIZE_NWSE,default_resize_nwse_data);
|
|
|
|
cs.AddCursor(B_CURSOR_RESIZE_NESW,default_resize_nesw_data);
|
|
|
|
cs.AddCursor(B_CURSOR_RESIZE_NS,default_resize_ns_data);
|
|
|
|
cs.AddCursor(B_CURSOR_RESIZE_EW,default_resize_ew_data);
|
|
|
|
|
|
|
|
BDirectory dir;
|
|
|
|
if(dir.SetTo(CURSOR_SET_DIR)==B_ENTRY_NOT_FOUND)
|
|
|
|
create_directory(CURSOR_SET_DIR,0777);
|
|
|
|
|
|
|
|
BString string(CURSOR_SET_DIR);
|
|
|
|
string+="Default";
|
|
|
|
cs.Save(string.String(),B_CREATE_FILE | B_FAIL_IF_EXISTS);
|
|
|
|
|
|
|
|
SetCursorSet(string.String());
|
|
|
|
Unlock();
|
|
|
|
}
|
|
|
|
|