Windows receive focus when shown

System cursor API and infrastructure largely implemented
Added Decorator::SetFont
Removed unnecessary parameter copying in WinBorder class API
Optimized screen updates when a decorator button is clicked
Moved TokenHandler and BitmapManager to libappserver to allow decorators to use bitmaps
Began reworking of DefaultDecorator::_DrawFrame to draw only what it is asked to
Partly implemented ViewDriver::StrokeLineArray - calls StrokeLine
Fixed a Layer init bug - visibility regions were initialized to Bounds() and not Frame()


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4060 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm 2003-07-24 19:38:24 +00:00
parent aea9bed9de
commit 2a8283e420
15 changed files with 451 additions and 129 deletions

View File

@ -618,6 +618,11 @@ void AppServer::DispatchMessage(int32 code, int8 *buffer)
_exit_poller=true; _exit_poller=true;
break; break;
} }
case AS_SET_SYSCURSOR_DEFAULTS:
{
cursormanager->SetDefaults();
break;
}
default: default:
// we should never get here. // we should never get here.
break; break;
@ -980,7 +985,10 @@ Decorator *new_decorator(BRect rect, const char *title, int32 wlook, int32 wfeel
dec=app_server->make_decorator(rect,wlook,wfeel,wflags); dec=app_server->make_decorator(rect,wlook,wfeel,wflags);
gui_colorset.Lock(); gui_colorset.Lock();
dec->SetDriver(ddriver);
dec->SetColors(gui_colorset); dec->SetColors(gui_colorset);
dec->SetFont(fontserver->GetSystemPlain());
dec->SetTitle(title);
gui_colorset.Unlock(); gui_colorset.Unlock();
return dec; return dec;

View File

@ -29,7 +29,10 @@
#include "CursorManager.h" #include "CursorManager.h"
#include "ServerCursor.h" #include "ServerCursor.h"
#include "CursorData.h" #include "CursorData.h"
#include "ServerConfig.h"
#include <Errors.h> #include <Errors.h>
#include <Directory.h>
#include <String.h>
#include <string.h> #include <string.h>
//! The global cursor manager object. Allocated and freed by AppServer class //! The global cursor manager object. Allocated and freed by AppServer class
@ -39,7 +42,6 @@ CursorManager *cursormanager;
CursorManager::CursorManager(void) CursorManager::CursorManager(void)
{ {
_cursorlist=new BList(0); _cursorlist=new BList(0);
_lock=create_sem(1,"cursor_manager_sem");
// Error code for AddCursor // Error code for AddCursor
_tokenizer.ExcludeValue(B_ERROR); _tokenizer.ExcludeValue(B_ERROR);
@ -53,21 +55,21 @@ CursorManager::CursorManager(void)
AddCursor(ctext); AddCursor(ctext);
_textcsr=ctext; _textcsr=ctext;
ServerCursor *cdrag=new ServerCursor(default_drag_data);
AddCursor(cdrag);
_dragcsr=cdrag;
ServerCursor *cmove=new ServerCursor(default_move_data); ServerCursor *cmove=new ServerCursor(default_move_data);
AddCursor(cmove); AddCursor(cmove);
_movecsr=cmove; _movecsr=cmove;
ServerCursor *cdrag=new ServerCursor(default_drag_data);
AddCursor(cdrag);
_dragcsr=cdrag;
ServerCursor *cresize=new ServerCursor(default_resize_data); ServerCursor *cresize=new ServerCursor(default_resize_data);
AddCursor(cresize); AddCursor(cresize);
_resizecsr=cresize; _resizecsr=cresize;
ServerCursor *cresizeew=new ServerCursor(default_resize_ew_data); ServerCursor *cresizenwse=new ServerCursor(default_resize_nwse_data);
AddCursor(cresizeew); AddCursor(cresizenwse);
_resize_ew_csr=cresizeew; _resize_nwse_csr=cresizenwse;
ServerCursor *cresizenesw=new ServerCursor(default_resize_nesw_data); ServerCursor *cresizenesw=new ServerCursor(default_resize_nesw_data);
AddCursor(cresizenesw); AddCursor(cresizenesw);
@ -77,9 +79,10 @@ CursorManager::CursorManager(void)
AddCursor(cresizens); AddCursor(cresizens);
_resize_ns_csr=cresizens; _resize_ns_csr=cresizens;
ServerCursor *cresizenwse=new ServerCursor(default_resize_nwse_data); ServerCursor *cresizeew=new ServerCursor(default_resize_ew_data);
AddCursor(cresizenwse); AddCursor(cresizeew);
_resize_nwse_csr=cresizenwse; _resize_ew_csr=cresizeew;
} }
//! Does all the teardown //! Does all the teardown
@ -95,8 +98,6 @@ CursorManager::~CursorManager(void)
_cursorlist->MakeEmpty(); _cursorlist->MakeEmpty();
delete _cursorlist; delete _cursorlist;
delete_sem(_lock);
// Note that it is not necessary to remove and delete the system // Note that it is not necessary to remove and delete the system
// cursors. These cursors are kept in the list with a NULL application // cursors. These cursors are kept in the list with a NULL application
// signature so they cannot be removed very easily except via // signature so they cannot be removed very easily except via
@ -114,11 +115,11 @@ int32 CursorManager::AddCursor(ServerCursor *sc)
if(!sc) if(!sc)
return B_ERROR; return B_ERROR;
acquire_sem(_lock); Lock();
_cursorlist->AddItem(sc); _cursorlist->AddItem(sc);
int32 value=_tokenizer.GetToken(); int32 value=_tokenizer.GetToken();
sc->_token=value; sc->_token=value;
release_sem(_lock); Unlock();
return value; return value;
} }
@ -131,7 +132,7 @@ int32 CursorManager::AddCursor(ServerCursor *sc)
*/ */
void CursorManager::DeleteCursor(int32 token) void CursorManager::DeleteCursor(int32 token)
{ {
acquire_sem(_lock); Lock();
ServerCursor *temp; ServerCursor *temp;
for(int32 i=0; i<_cursorlist->CountItems();i++) for(int32 i=0; i<_cursorlist->CountItems();i++)
@ -144,7 +145,7 @@ void CursorManager::DeleteCursor(int32 token)
break; break;
} }
} }
release_sem(_lock); Unlock();
} }
/*! /*!
@ -156,7 +157,7 @@ void CursorManager::RemoveAppCursors(const char *signature)
// OPTIMIZATION: For an optimization, it perhaps may be wise down // OPTIMIZATION: For an optimization, it perhaps may be wise down
// the road to replace the ServerCursor's app signature with a // the road to replace the ServerCursor's app signature with a
// pointer to its application and compare ServerApp pointers instead. // pointer to its application and compare ServerApp pointers instead.
acquire_sem(_lock); Lock();
ServerCursor *temp; ServerCursor *temp;
for(int32 i=0; i<_cursorlist->CountItems();i++) for(int32 i=0; i<_cursorlist->CountItems();i++)
@ -170,37 +171,37 @@ void CursorManager::RemoveAppCursors(const char *signature)
break; break;
} }
} }
release_sem(_lock); Unlock();
} }
//! Wrapper around the DisplayDriver ShowCursor call //! Wrapper around the DisplayDriver ShowCursor call
void CursorManager::ShowCursor(void) void CursorManager::ShowCursor(void)
{ {
acquire_sem(_lock); Lock();
DisplayDriver *driver=GetGfxDriver(ActiveScreen()); DisplayDriver *driver=GetGfxDriver(ActiveScreen());
driver->ShowCursor(); driver->ShowCursor();
release_sem(_lock); Unlock();
} }
//! Wrapper around the DisplayDriver HideCursor call //! Wrapper around the DisplayDriver HideCursor call
void CursorManager::HideCursor(void) void CursorManager::HideCursor(void)
{ {
acquire_sem(_lock); Lock();
DisplayDriver *driver=GetGfxDriver(ActiveScreen()); DisplayDriver *driver=GetGfxDriver(ActiveScreen());
driver->HideCursor(); driver->HideCursor();
release_sem(_lock); Unlock();
} }
//! Wrapper around the DisplayDriver ObscureCursor call //! Wrapper around the DisplayDriver ObscureCursor call
void CursorManager::ObscureCursor(void) void CursorManager::ObscureCursor(void)
{ {
acquire_sem(_lock); Lock();
DisplayDriver *driver=GetGfxDriver(ActiveScreen()); DisplayDriver *driver=GetGfxDriver(ActiveScreen());
driver->ObscureCursor(); driver->ObscureCursor();
release_sem(_lock); Unlock();
} }
/*! /*!
@ -209,7 +210,7 @@ void CursorManager::ObscureCursor(void)
*/ */
void CursorManager::SetCursor(int32 token) void CursorManager::SetCursor(int32 token)
{ {
acquire_sem(_lock); Lock();
ServerCursor *c=_FindCursor(token); ServerCursor *c=_FindCursor(token);
if(c) if(c)
{ {
@ -217,12 +218,12 @@ void CursorManager::SetCursor(int32 token)
driver->SetCursor(c); driver->SetCursor(c);
_current_which=B_CURSOR_OTHER; _current_which=B_CURSOR_OTHER;
} }
release_sem(_lock); Unlock();
} }
void CursorManager::SetCursor(cursor_which which) void CursorManager::SetCursor(cursor_which which)
{ {
acquire_sem(_lock); Lock();
DisplayDriver *driver=GetGfxDriver(ActiveScreen()); DisplayDriver *driver=GetGfxDriver(ActiveScreen());
switch(which) switch(which)
@ -285,7 +286,90 @@ void CursorManager::SetCursor(cursor_which which)
break; break;
} }
release_sem(_lock); 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)
{
if(_defaultcsr)
delete _defaultcsr;
_defaultcsr=csr;
}
if(cs.FindCursor(B_CURSOR_TEXT,&csr)==B_OK)
{
if(_textcsr)
delete _textcsr;
_textcsr=csr;
}
if(cs.FindCursor(B_CURSOR_MOVE,&csr)==B_OK)
{
if(_movecsr)
delete _movecsr;
_movecsr=csr;
}
if(cs.FindCursor(B_CURSOR_DRAG,&csr)==B_OK)
{
if(_dragcsr)
delete _dragcsr;
_dragcsr=csr;
}
if(cs.FindCursor(B_CURSOR_RESIZE,&csr)==B_OK)
{
if(_resizecsr)
delete _resizecsr;
_resizecsr=csr;
}
if(cs.FindCursor(B_CURSOR_RESIZE_NWSE,&csr)==B_OK)
{
if(_resize_nwse_csr)
delete _resize_nwse_csr;
_resize_nwse_csr=csr;
}
if(cs.FindCursor(B_CURSOR_RESIZE_NESW,&csr)==B_OK)
{
if(_resize_nesw_csr)
delete _resize_nesw_csr;
_resize_nesw_csr=csr;
}
if(cs.FindCursor(B_CURSOR_RESIZE_NS,&csr)==B_OK)
{
if(_resize_ns_csr)
delete _resize_ns_csr;
_resize_ns_csr=csr;
}
if(cs.FindCursor(B_CURSOR_RESIZE_EW,&csr)==B_OK)
{
if(_resize_ew_csr)
delete _resize_ew_csr;
_resize_ew_csr=csr;
}
Unlock();
} }
/*! /*!
@ -298,7 +382,7 @@ ServerCursor *CursorManager::GetCursor(cursor_which which)
{ {
ServerCursor *temp=NULL; ServerCursor *temp=NULL;
acquire_sem(_lock); Lock();
switch(which) switch(which)
{ {
@ -351,7 +435,7 @@ ServerCursor *CursorManager::GetCursor(cursor_which which)
break; break;
} }
release_sem(_lock); Unlock();
return temp; return temp;
} }
@ -363,9 +447,9 @@ cursor_which CursorManager::GetCursorWhich(void)
{ {
cursor_which temp; cursor_which temp;
acquire_sem(_lock); Lock();
temp=_current_which; temp=_current_which;
release_sem(_lock); Unlock();
return temp; return temp;
} }
@ -380,7 +464,7 @@ cursor_which CursorManager::GetCursorWhich(void)
*/ */
void CursorManager::ChangeCursor(cursor_which which, int32 token) void CursorManager::ChangeCursor(cursor_which which, int32 token)
{ {
acquire_sem(_lock); Lock();
// Find the cursor, based on the token // Find the cursor, based on the token
ServerCursor *cursor=_FindCursor(token); ServerCursor *cursor=_FindCursor(token);
@ -388,7 +472,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
// Did we find a cursor with this token? // Did we find a cursor with this token?
if(!cursor) if(!cursor)
{ {
release_sem(_lock); Unlock();
return; return;
} }
@ -407,6 +491,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_TEXT: case B_CURSOR_TEXT:
@ -421,6 +506,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_MOVE: case B_CURSOR_MOVE:
@ -435,6 +521,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_DRAG: case B_CURSOR_DRAG:
@ -449,6 +536,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_RESIZE: case B_CURSOR_RESIZE:
@ -463,6 +551,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_RESIZE_NWSE: case B_CURSOR_RESIZE_NWSE:
@ -477,6 +566,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_RESIZE_NESW: case B_CURSOR_RESIZE_NESW:
@ -491,6 +581,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_RESIZE_NS: case B_CURSOR_RESIZE_NS:
@ -505,6 +596,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
case B_CURSOR_RESIZE_EW: case B_CURSOR_RESIZE_EW:
@ -519,13 +611,14 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token)
delete cursor->_app_signature; delete cursor->_app_signature;
cursor->_app_signature=NULL; cursor->_app_signature=NULL;
} }
_cursorlist->RemoveItem(cursor);
break; break;
} }
default: default:
break; break;
} }
release_sem(_lock); Unlock();
} }
/*! /*!
@ -544,3 +637,31 @@ ServerCursor *CursorManager::_FindCursor(int32 token)
} }
return NULL; return NULL;
} }
//! 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();
}

View File

@ -30,6 +30,7 @@
#include <List.h> #include <List.h>
#include <OS.h> #include <OS.h>
#include <SysCursor.h> #include <SysCursor.h>
#include <Locker.h>
#include "TokenHandler.h" #include "TokenHandler.h"
class ServerCursor; class ServerCursor;
@ -42,7 +43,7 @@ class ServerCursor;
any BeOS platform. It also provides tokens for BCursors and frees all any BeOS platform. It also provides tokens for BCursors and frees all
of an application's cursors whenever an application closes. of an application's cursors whenever an application closes.
*/ */
class CursorManager class CursorManager : public BLocker
{ {
public: public:
CursorManager(void); CursorManager(void);
@ -55,16 +56,16 @@ public:
void ObscureCursor(void); void ObscureCursor(void);
void SetCursor(int32 token); void SetCursor(int32 token);
void SetCursor(cursor_which which); void SetCursor(cursor_which which);
void SetCursorSet(const char *path);
ServerCursor *GetCursor(cursor_which which); ServerCursor *GetCursor(cursor_which which);
cursor_which GetCursorWhich(void); cursor_which GetCursorWhich(void);
void ChangeCursor(cursor_which which, int32 token); void ChangeCursor(cursor_which which, int32 token);
void SetDefaults(void);
private: private:
ServerCursor *_FindCursor(int32 token); ServerCursor *_FindCursor(int32 token);
BList *_cursorlist; BList *_cursorlist;
TokenHandler _tokenizer; TokenHandler _tokenizer;
sem_id _lock;
// System cursor members // System cursor members
ServerCursor *_defaultcsr, ServerCursor *_defaultcsr,

View File

@ -160,6 +160,21 @@ void Decorator::SetFeel(int32 wfeel)
_feel=wfeel; _feel=wfeel;
} }
/*
\brief Sets the decorator's font
\param font The new font object to copy from
*/
void Decorator::SetFont(ServerFont *font)
{
if(!font)
return;
if(_layerdata.font)
delete _layerdata.font;
_layerdata.font=new ServerFont(*font);
}
/*! /*!
\brief Sets the decorator's window look \brief Sets the decorator's window look
\param wflags New value for the look \param wflags New value for the look

View File

@ -31,9 +31,8 @@
#include "ColorUtils.h" #include "ColorUtils.h"
#include "DefaultDecorator.h" #include "DefaultDecorator.h"
#include "RGBColor.h" #include "RGBColor.h"
#include "RectUtils.h"
//#define DEBUG_DECORATOR #include <stdio.h>
#define USE_VIEW_FILL_HACK #define USE_VIEW_FILL_HACK
@ -44,22 +43,19 @@
DefaultDecorator::DefaultDecorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags) DefaultDecorator::DefaultDecorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags)
: Decorator(rect,wlook,wfeel,wflags) : Decorator(rect,wlook,wfeel,wflags)
{ {
taboffset=0; taboffset=0;
titlepixelwidth=0; titlepixelwidth=0;
framecolors=new RGBColor[5];
framecolors[0].SetColor(255,255,255);
framecolors[1].SetColor(216,216,216);
framecolors[2].SetColor(152,152,152);
framecolors[3].SetColor(136,136,136);
framecolors[4].SetColor(96,96,96);
_SetFocus(); _SetFocus();
// These hard-coded assignments will go bye-bye when the system _colors
// API is implemented
frame_highercol.SetColor(216,216,216);
frame_lowercol.SetColor(110,110,110);
textcol.SetColor(0,0,0);
frame_highcol=frame_lowercol.MakeBlendColor(frame_highercol,0.75);
frame_midcol=frame_lowercol.MakeBlendColor(frame_highercol,0.5);
frame_lowcol=frame_lowercol.MakeBlendColor(frame_highercol,0.25);
_DoLayout(); _DoLayout();
// This flag is used to determine whether or not we're moving the tab // This flag is used to determine whether or not we're moving the tab
@ -81,6 +77,7 @@ DefaultDecorator::~DefaultDecorator(void)
#ifdef DEBUG_DECORATOR #ifdef DEBUG_DECORATOR
printf("DefaultDecorator: ~DefaultDecorator()\n"); printf("DefaultDecorator: ~DefaultDecorator()\n");
#endif #endif
delete [] framecolors;
} }
click_type DefaultDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers) click_type DefaultDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers)
@ -183,6 +180,21 @@ printf("DefaultDecorator: Do Layout\n");
_resizerect=_frame; _resizerect=_frame;
_borderrect=_frame; _borderrect=_frame;
_closerect=_frame; _closerect=_frame;
switch(GetLook())
{
case B_BORDERED_WINDOW_LOOK:
case B_TITLED_WINDOW_LOOK:
case B_DOCUMENT_WINDOW_LOOK:
borderwidth=5;
break;
case B_FLOATING_WINDOW_LOOK:
case B_MODAL_WINDOW_LOOK:
borderwidth=3;
break;
default:
borderwidth=0;
}
textoffset=(_look==B_FLOATING_WINDOW_LOOK)?5:7; textoffset=(_look==B_FLOATING_WINDOW_LOOK)?5:7;
@ -190,8 +202,22 @@ printf("DefaultDecorator: Do Layout\n");
_closerect.top+=(_look==B_FLOATING_WINDOW_LOOK)?6:4; _closerect.top+=(_look==B_FLOATING_WINDOW_LOOK)?6:4;
_closerect.right=_closerect.left+10; _closerect.right=_closerect.left+10;
_closerect.bottom=_closerect.top+10; _closerect.bottom=_closerect.top+10;
_borderrect.top+=19; _borderrect.top+=19;
if(borderwidth)
{
// Set up the border rectangles to handle the window's frame
rightborder=leftborder=topborder=bottomborder=_borderrect;
// We want the rectangles to intersect because of the beveled intersections, so all
// that is necessary is to set the short dimension of each side
leftborder.right=leftborder.left+borderwidth;
rightborder.left=rightborder.right-borderwidth;
topborder.bottom=topborder.top+borderwidth;
bottomborder.top=bottomborder.bottom-borderwidth;
}
_resizerect.top=_resizerect.bottom-18; _resizerect.top=_resizerect.bottom-18;
_resizerect.left=_resizerect.right-18; _resizerect.left=_resizerect.right-18;
@ -307,7 +333,7 @@ printf("DefaultDecorator: Draw(%.1f,%.1f,%.1f,%.1f)\n",update.left,update.top,up
_layerdata.highcolor=_colors->document_background; _layerdata.highcolor=_colors->document_background;
if(_borderrect.Intersects(update)) if(_borderrect.Intersects(update))
_driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh); _driver->FillRect(_borderrect & update,&_layerdata,(int8*)&solidhigh);
_DrawFrame(update); _DrawFrame(update);
} }
@ -318,9 +344,9 @@ void DefaultDecorator::Draw(void)
// things // things
// Draw the top view's client area - just a hack :) // Draw the top view's client area - just a hack :)
_layerdata.highcolor=_colors->document_background; // _layerdata.highcolor=_colors->document_background;
_driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh); // _driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh);
DrawFrame(); DrawFrame();
DrawTab(); DrawTab();
@ -354,7 +380,7 @@ void DefaultDecorator::_DrawTab(BRect r)
_layerdata.highcolor=(GetFocus())?_colors->window_tab:_colors->inactive_window_tab; _layerdata.highcolor=(GetFocus())?_colors->window_tab:_colors->inactive_window_tab;
_driver->FillRect(_tabrect,&_layerdata,(int8*)&solidhigh); _driver->FillRect(_tabrect,&_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowcol; _layerdata.highcolor=framecolors[3];
_driver->StrokeLine(_tabrect.LeftBottom(),_tabrect.RightBottom(),&_layerdata,(int8*)&solidhigh); _driver->StrokeLine(_tabrect.LeftBottom(),_tabrect.RightBottom(),&_layerdata,(int8*)&solidhigh);
_DrawTitle(_tabrect); _DrawTitle(_tabrect);
@ -423,69 +449,154 @@ void DefaultDecorator::DrawBlendedRect(BRect r, bool down)
// _layerdata.highcolor=startcol; // _layerdata.highcolor=startcol;
// _driver->FillRect(r,&_layerdata,(int8*)&solidhigh); // _driver->FillRect(r,&_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowcol; _layerdata.highcolor=framecolors[3];
_driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh);
} }
void DefaultDecorator::_DrawFrame(BRect rect) void DefaultDecorator::_DrawFrame(BRect invalid)
{ {
// Duh, draws the window frame, I think. ;) // We need to test each side to determine whether or not it needs drawn. Additionally,
// we must clip the lines drawn by this function to the invalid rectangle we are given
#ifdef USE_VIEW_FILL_HACK
_driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh);
#endif
#ifdef USE_VIEW_FILL_HACK if(!borderwidth)
_driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh);
#endif
if(_look==B_NO_BORDER_WINDOW_LOOK)
return; return;
BRect r=_borderrect; // Data specifically for the StrokeLineArray call.
int32 numlines=0, maxlines=20;
_layerdata.highcolor=frame_midcol; BPoint points[maxlines*2];
RGBColor colors[maxlines];
// For quick calculation of gradients for each side. Top is same as left, right is same as
// bottom
int8 rightindices[borderwidth],leftindices[borderwidth];
if(borderwidth==5)
{
leftindices[0]=2;
leftindices[1]=0;
leftindices[2]=1;
leftindices[3]=3;
leftindices[4]=2;
rightindices[0]=2;
rightindices[1]=0;
rightindices[2]=1;
rightindices[3]=3;
rightindices[4]=4;
}
else
{
// TODO: figure out border colors for floating window look
}
// Right side
if(TestRectIntersection(rightborder,invalid))
{
// We may not have to redraw the entire width of the frame itself. Rare case, but
// it must be accounted for.
int32 startx=(int32) MAX(invalid.left,rightborder.left);
int32 endx=(int32) MIN(invalid.right,rightborder.right);
// We'll need these flags to see if we must include the corners in final line
// calculations
BRect r(rightborder);
r.bottom=r.top+borderwidth;
bool topcorner=TestRectIntersection(invalid,r);
r=rightborder;
r.top=r.bottom-borderwidth;
bool bottomcorner=TestRectIntersection(invalid,r);
// Generate the lines for this side
for(int32 i=startx; i<endx; i++)
{
BPoint start, end;
start.x=end.x=i;
if(topcorner)
{
start.y=rightborder.top+(borderwidth-(i-rightborder.left));
start.y=MAX(start.y,invalid.top);
}
else
start.y=MAX(start.y+borderwidth,invalid.top);
if(bottomcorner)
{
end.y=rightborder.bottom-(borderwidth-(i-rightborder.left));
end.y=MAX(end.y,invalid.top);
}
else
end.y=MAX(end.y-borderwidth,invalid.top);
// Make the appropriate
points[numlines*2]=start;
points[(numlines*2)+1]=end;
colors[numlines]=framecolors[rightindices[endx-i]];
numlines++;
}
}
debugger("");
_driver->StrokeLineArray(points,numlines,colors,&_layerdata);
/* BRect r=_borderrect;
_layerdata.highcolor=framecolors[2];
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowcol; _layerdata.highcolor=framecolors[3];
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowercol; _layerdata.highcolor=framecolors[4];
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowercol; _layerdata.highcolor=framecolors[4];
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
r.InsetBy(1,1); r.InsetBy(1,1);
_layerdata.highcolor=frame_highercol; _layerdata.highcolor=framecolors[0];
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_highercol; _layerdata.highcolor=framecolors[0];
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_midcol; _layerdata.highcolor=framecolors[2];
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_midcol; _layerdata.highcolor=framecolors[2];
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
r.InsetBy(1,1); r.InsetBy(1,1);
_layerdata.highcolor=frame_highcol; _layerdata.highcolor=framecolors[1];
_driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh);
r.InsetBy(1,1); r.InsetBy(1,1);
_layerdata.highcolor=frame_lowercol; _layerdata.highcolor=framecolors[4];
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_lowercol; _layerdata.highcolor=framecolors[4];
_driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_highercol; _layerdata.highcolor=framecolors[0];
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_layerdata.highcolor=frame_highercol; _layerdata.highcolor=framecolors[0];
_driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_driver->StrokeRect(_borderrect,&_layerdata,(int8*)&solidhigh); _driver->StrokeRect(_borderrect,&_layerdata,(int8*)&solidhigh);
// Draw the resize thumb if we're supposed to // Draw the resize thumb if we're supposed to
if(!(_flags & B_NOT_RESIZABLE)) if(!(_flags & B_NOT_RESIZABLE))
{ {
@ -501,10 +612,10 @@ _driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh);
int steps=(w<h)?w:h; int steps=(w<h)?w:h;
startcol=frame_highercol.GetColor32(); startcol=framecolors[0].GetColor32();
endcol=frame_lowercol.GetColor32(); endcol=framecolors[4].GetColor32();
halfcol=frame_highercol.MakeBlendColor(frame_lowercol,0.5).GetColor32(); halfcol=framecolors[0].MakeBlendColor(framecolors[4],0.5).GetColor32();
rstep=(startcol.red-halfcol.red)/steps; rstep=(startcol.red-halfcol.red)/steps;
gstep=(startcol.green-halfcol.green)/steps; gstep=(startcol.green-halfcol.green)/steps;
@ -525,16 +636,18 @@ _driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh);
_driver->StrokeLine(BPoint(r.left+steps,r.top+i), _driver->StrokeLine(BPoint(r.left+steps,r.top+i),
BPoint(r.left+i,r.top+steps),&_layerdata,(int8*)&solidhigh); BPoint(r.left+i,r.top+steps),&_layerdata,(int8*)&solidhigh);
} }
_layerdata.highcolor=frame_lowercol; _layerdata.highcolor=framecolors[4];
_driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh);
} }
else else
{ {
_layerdata.highcolor=frame_lowercol; _layerdata.highcolor=framecolors[4];
_driver->StrokeLine(BPoint(r.right,r.top),BPoint(r.right-3,r.top), _driver->StrokeLine(BPoint(r.right,r.top),BPoint(r.right-3,r.top),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
_driver->StrokeLine(BPoint(r.left,r.bottom),BPoint(r.left,r.bottom-3), _driver->StrokeLine(BPoint(r.left,r.bottom),BPoint(r.left,r.bottom-3),
&_layerdata,(int8*)&solidhigh); &_layerdata,(int8*)&solidhigh);
} }
} }
*/
} }

View File

@ -59,7 +59,14 @@ protected:
RGBColor frame_highcol, frame_midcol, frame_lowcol, frame_highercol, RGBColor frame_highcol, frame_midcol, frame_lowcol, frame_highercol,
frame_lowercol; frame_lowercol;
RGBColor textcol; RGBColor textcol;
RGBColor *framecolors;
// Individual rects for handling window frame rendering the proper way
BRect rightborder,leftborder,topborder,bottomborder;
uint64 solidhigh, solidlow; uint64 solidhigh, solidlow;
int32 borderwidth;
bool slidetab; bool slidetab;
int textoffset; int textoffset;

View File

@ -28,8 +28,7 @@
#include "ServerFont.h" #include "ServerFont.h"
#include FT_CACHE_H #include FT_CACHE_H
FTC_Manager ftmanager; FTC_Manager ftmanager;
FT_Library ftlib;
/*! /*!
\brief Constructor \brief Constructor

View File

@ -37,6 +37,8 @@
#include "ServerFont.h" #include "ServerFont.h"
#include "ServerConfig.h" #include "ServerConfig.h"
extern FTC_Manager ftmanager;
FT_Library ftlib;
FontServer *fontserver; FontServer *fontserver;
/*! /*!

View File

@ -7,6 +7,9 @@ UsePrivateHeaders app interface [ FDirName servers app ] ;
UseFreeTypeHeaders ; UseFreeTypeHeaders ;
SharedLibrary appserver : SharedLibrary appserver :
areafunc.c
bget.c
BitmapManager.cpp
ColorSet.cpp ColorSet.cpp
Decorator.cpp Decorator.cpp
DisplayDriver.cpp DisplayDriver.cpp
@ -17,7 +20,9 @@ SharedLibrary appserver :
ServerBitmap.cpp ServerBitmap.cpp
ServerCursor.cpp ServerCursor.cpp
ServerFont.cpp ServerFont.cpp
SysCursor.cpp
SystemPalette.cpp SystemPalette.cpp
TokenHandler.cpp
; ;
LinkSharedOSLibs libappserver.so : root be LinkSharedOSLibs libappserver.so : root be
@ -26,11 +31,8 @@ LinkSharedOSLibs libappserver.so : root be
Server app_server : Server app_server :
# Misc. Sources # Misc. Sources
areafunc.c
Angle.cpp Angle.cpp
bget.c
CursorData.cpp CursorData.cpp
TokenHandler.cpp
PicturePlayer.cpp PicturePlayer.cpp
PNGDump.cpp PNGDump.cpp
@ -39,7 +41,6 @@ Server app_server :
# Manager Classes # Manager Classes
AppServer.cpp AppServer.cpp
BitmapDriver.cpp BitmapDriver.cpp
BitmapManager.cpp
CursorManager.cpp CursorManager.cpp
Desktop.cpp Desktop.cpp
ServerApp.cpp ServerApp.cpp

View File

@ -36,7 +36,7 @@
#include "RectUtils.h" #include "RectUtils.h"
//#define DEBUG_LAYER //#define DEBUG_LAYER
#define DEBUG_REGIONS //#define DEBUG_REGIONS
#ifdef DEBUG_REGIONS #ifdef DEBUG_REGIONS
#include "Desktop.h" #include "Desktop.h"
@ -71,9 +71,9 @@ Layer::Layer(BRect frame, const char *name, int32 resize, int32 flags,ServerWind
_topchild=NULL; _topchild=NULL;
_bottomchild=NULL; _bottomchild=NULL;
_visible=new BRegion(Bounds()); _visible=new BRegion(Frame());
_full=new BRegion(Bounds()); _full=new BRegion(Frame());
_invalid=new BRegion(Bounds()); _invalid=new BRegion(Frame());
_serverwin=win; _serverwin=win;

View File

@ -337,11 +337,13 @@ void ServerApp::_DispatchMessage(int32 code, int8 *buffer)
// Attached data: // Attached data:
// 1) port_id reply port // 1) port_id reply port
// 2) BRect window frame // 2) BRect window frame
// 3) uint32 window flags // 3) uint32 window look
// 4) port_id window's message port // 4) uint32 window feel
// 5) uint32 workspace index // 5) uint32 window flags
// 6) int32 BHandler token of the window // 6) port_id window's message port
// 7) const char * title // 7) uint32 workspace index
// 8) int32 BHandler token of the window
// 9) const char * title
// Find the necessary data // Find the necessary data
port_id reply_port=*((port_id*)index); index+=sizeof(port_id); port_id reply_port=*((port_id*)index); index+=sizeof(port_id);
@ -483,33 +485,33 @@ void ServerApp::_DispatchMessage(int32 code, int8 *buffer)
case AS_CREATE_PICTURE: case AS_CREATE_PICTURE:
{ {
// TODO: Implement // TODO: Implement
#ifdef DEBUG_SERVERAPP #ifdef DEBUG_SERVERAPP
printf("ServerApp %s: Create Picture unimplemented\n",_signature.String()); printf("ServerApp %s: Create Picture unimplemented\n",_signature.String());
#endif #endif
break; break;
} }
case AS_DELETE_PICTURE: case AS_DELETE_PICTURE:
{ {
// TODO: Implement // TODO: Implement
#ifdef DEBUG_SERVERAPP #ifdef DEBUG_SERVERAPP
printf("ServerApp %s: Delete Picture unimplemented\n",_signature.String()); printf("ServerApp %s: Delete Picture unimplemented\n",_signature.String());
#endif #endif
break; break;
} }
case AS_CLONE_PICTURE: case AS_CLONE_PICTURE:
{ {
// TODO: Implement // TODO: Implement
#ifdef DEBUG_SERVERAPP #ifdef DEBUG_SERVERAPP
printf("ServerApp %s: Clone Picture unimplemented\n",_signature.String()); printf("ServerApp %s: Clone Picture unimplemented\n",_signature.String());
#endif #endif
break; break;
} }
case AS_DOWNLOAD_PICTURE: case AS_DOWNLOAD_PICTURE:
{ {
// TODO; Implement // TODO; Implement
#ifdef DEBUG_SERVERAPP #ifdef DEBUG_SERVERAPP
printf("ServerApp %s: Download Picture unimplemented\n",_signature.String()); printf("ServerApp %s: Download Picture unimplemented\n",_signature.String());
#endif #endif
break; break;
} }
case AS_SET_SCREEN_MODE: case AS_SET_SCREEN_MODE:
@ -669,7 +671,7 @@ printf("ServerApp %s: Download Picture unimplemented\n",_signature.String());
default: default:
{ {
#ifdef DEBUG_SERVERAPP #ifdef DEBUG_SERVERAPP
printf("ServerApp %s received unhandled message code %lx\n",_signature.String(),code); printf("ServerApp %s received unhandled message code offset %lx\n",_signature.String(),MsgCodeToString(code));
#endif #endif
break; break;
} }

View File

@ -223,6 +223,7 @@ void ServerWindow::Show(void)
if(_winborder) if(_winborder)
{ {
_winborder->Show(); _winborder->Show();
_winborder->SetFocus(true);
_winborder->UpdateRegions(true); _winborder->UpdateRegions(true);
} }
} }
@ -261,6 +262,7 @@ void ServerWindow::SetFocus(bool value)
if(_active!=value) if(_active!=value)
{ {
_active=value; _active=value;
_winborder->SetFocus(value);
_winborder->RequestDraw(); _winborder->RequestDraw();
} }
} }
@ -627,7 +629,7 @@ void ServerWindow::DispatchMessage(PortMessage *msg)
} }
default: default:
{ {
printf("ServerWindow %s received unexpected code %s\n",_title->String(),MsgCodeToString(msg->Code())); printf("ServerWindow %s received unexpected code - message offset %lx\n",_title->String(),msg->Code()-SERVER_TRUE);
break; break;
} }
} }

View File

@ -1040,9 +1040,43 @@ void ViewDriver::StrokeLine(BPoint start, BPoint end, LayerData *d, int8 *pat)
void ViewDriver::StrokeLineArray(BPoint *pts, int32 numlines, RGBColor *colors, LayerData *d) void ViewDriver::StrokeLineArray(BPoint *pts, int32 numlines, RGBColor *colors, LayerData *d)
{ {
#ifdef DEBUG_DRIVER_MODULE if(!d || numlines==0 || !pts || !colors)
printf("ViewDriver:: StrokeLineArray unimplemented\n"); return;
#endif
screenwin->Lock();
framebuffer->Lock();
SetLayerData(d);
// Do LineArray stuff here.
// drawview->Sync();
// screenwin->view->Invalidate();
// for now, just print the data and hope we don't crash
printf("ViewDriver::StrokeLineArray(): \n");
BPoint *ptindex=pts;
for(int32 i=0; i<numlines; i++)
{
BPoint pt1=*ptindex;
ptindex+=sizeof(BPoint);
BPoint pt2=*ptindex;
ptindex+=sizeof(BPoint);
rgb_color col=colors[i].GetColor32();
drawview->SetHighColor(col);
drawview->StrokeLine(pt1,pt2,B_SOLID_HIGH);
printf("\tLine (%.1f,%.1f)-(%.1f,%.1f) in color (%d,%d,%d)\n",pt1.x,pt1.y,pt2.x,pt2.y,
col.red,col.green,col.blue);
}
drawview->Sync();
screenwin->view->Invalidate();
framebuffer->Unlock();
screenwin->Unlock();
} }
void ViewDriver::StrokePolygon(BPoint *ptlist, int32 numpts, BRect rect, LayerData *d, int8 *pat, bool is_closed) void ViewDriver::StrokePolygon(BPoint *ptlist, int32 numpts, BRect rect, LayerData *d, int8 *pat, bool is_closed)

View File

@ -37,6 +37,8 @@
#include "WinBorder.h" #include "WinBorder.h"
#include "AppServer.h" // for new_decorator() #include "AppServer.h" // for new_decorator()
// TODO: Document this file completely
//#define DEBUG_WINBORDER //#define DEBUG_WINBORDER
//#define DEBUG_WINBORDER_MOUSE //#define DEBUG_WINBORDER_MOUSE
//#define DEBUG_WINBORDER_CLICK //#define DEBUG_WINBORDER_CLICK
@ -72,9 +74,13 @@ void set_is_sliding_tab(bool state) { winborder_private::is_sliding_tab=state; }
WinBorder * get_active_winborder(void) { return winborder_private::active_winborder; } WinBorder * get_active_winborder(void) { return winborder_private::active_winborder; }
void set_active_winborder(WinBorder *win) { winborder_private::active_winborder=win; } void set_active_winborder(WinBorder *win) { winborder_private::active_winborder=win; }
WinBorder::WinBorder(BRect r, const char *name, int32 look, int32 feel, int32 flags, ServerWindow *win) WinBorder::WinBorder(const BRect &r, const char *name, const int32 look, const int32 feel,
const int32 flags, ServerWindow *win)
: Layer(r,name,B_FOLLOW_NONE,flags,win) : Layer(r,name,B_FOLLOW_NONE,flags,win)
{ {
// unlike BViews, windows start off as hidden, so we need to tweak the hidecount
// assignment made by Layer().
_hidecount=1;
_mbuttons=0; _mbuttons=0;
_kmodifiers=0; _kmodifiers=0;
_win=win; _win=win;
@ -153,7 +159,7 @@ printf("Click: MoveToFront\n");
printf("Click: Close\n"); printf("Click: Close\n");
#endif #endif
_decorator->SetClose(true); _decorator->SetClose(true);
_decorator->Draw(); _decorator->DrawClose();
break; break;
} }
case CLICK_ZOOM: case CLICK_ZOOM:
@ -162,7 +168,7 @@ printf("Click: Close\n");
printf("Click: Zoom\n"); printf("Click: Zoom\n");
#endif #endif
_decorator->SetZoom(true); _decorator->SetZoom(true);
_decorator->Draw(); _decorator->DrawZoom();
break; break;
} }
case CLICK_MINIMIZE: case CLICK_MINIMIZE:
@ -171,7 +177,7 @@ printf("Click: Zoom\n");
printf("Click: Minimize\n"); printf("Click: Minimize\n");
#endif #endif
_decorator->SetMinimize(true); _decorator->SetMinimize(true);
_decorator->Draw(); _decorator->DrawMinimize();
break; break;
} }
case CLICK_DRAG: case CLICK_DRAG:
@ -357,7 +363,7 @@ void WinBorder::MouseUp(int8 *buffer)
BPoint pt(x,y); BPoint pt(x,y);
#ifdef DEBUG_WINBORDER_MOUSE #ifdef DEBUG_WINBORDER_MOUSE
printf("WinBorder %s: MouseUp unimplmented\n",_title->String()); printf("WinBorder %s: MouseUp unimplemented\n",_title->String());
#endif #endif
_mbuttons=0; _mbuttons=0;
@ -374,7 +380,7 @@ printf("WinBorder %s: MouseUp unimplmented\n",_title->String());
case CLICK_CLOSE: case CLICK_CLOSE:
{ {
_decorator->SetClose(false); _decorator->SetClose(false);
_decorator->Draw(); _decorator->DrawClose();
// call close window stuff here // call close window stuff here
@ -383,7 +389,7 @@ printf("WinBorder %s: MouseUp unimplmented\n",_title->String());
case CLICK_ZOOM: case CLICK_ZOOM:
{ {
_decorator->SetZoom(false); _decorator->SetZoom(false);
_decorator->Draw(); _decorator->DrawZoom();
// call zoom stuff here // call zoom stuff here
@ -392,7 +398,7 @@ printf("WinBorder %s: MouseUp unimplmented\n",_title->String());
case CLICK_MINIMIZE: case CLICK_MINIMIZE:
{ {
_decorator->SetMinimize(false); _decorator->SetMinimize(false);
_decorator->Draw(); _decorator->DrawMinimize();
// call minimize stuff here // call minimize stuff here
@ -404,6 +410,16 @@ printf("WinBorder %s: MouseUp unimplmented\n",_title->String());
} }
} }
/*!
\brief Function to pass focus value on to decorator
\param active Focus flag
*/
void WinBorder::SetFocus(const bool &active)
{
if(_decorator)
_decorator->SetFocus(active);
}
void WinBorder::RequestDraw(const BRect &r) void WinBorder::RequestDraw(const BRect &r)
{ {
#ifdef DEBUG_WINBORDER #ifdef DEBUG_WINBORDER

View File

@ -38,7 +38,8 @@ class DisplayDriver;
class WinBorder : public Layer class WinBorder : public Layer
{ {
public: public:
WinBorder(BRect r, const char *name, int32 look, int32 feel, int32 flags, ServerWindow *win); WinBorder(const BRect &r, const char *name, const int32 look, const int32 feel,
const int32 flags, ServerWindow *win);
~WinBorder(void); ~WinBorder(void);
void RequestDraw(void); void RequestDraw(void);
void RequestDraw(const BRect &r); void RequestDraw(const BRect &r);
@ -53,8 +54,8 @@ public:
void UpdateDecorator(void); void UpdateDecorator(void);
void UpdateFont(void); void UpdateFont(void);
void UpdateScreen(void); void UpdateScreen(void);
void RebuildRegions(bool recursive=true); void RebuildRegions(const bool &recursive=true);
void Activate(bool active=false); void SetFocus(const bool &active=false);
ServerWindow *Window(void) { return _win; } ServerWindow *Window(void) { return _win; }
Decorator *GetDecorator(void) { return _decorator; } Decorator *GetDecorator(void) { return _decorator; }
protected: protected: