diff --git a/src/servers/app/server/AppServer.cpp b/src/servers/app/server/AppServer.cpp index 772ecd4b4d..0eaaf46915 100644 --- a/src/servers/app/server/AppServer.cpp +++ b/src/servers/app/server/AppServer.cpp @@ -618,6 +618,11 @@ void AppServer::DispatchMessage(int32 code, int8 *buffer) _exit_poller=true; break; } + case AS_SET_SYSCURSOR_DEFAULTS: + { + cursormanager->SetDefaults(); + break; + } default: // we should never get here. 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); gui_colorset.Lock(); + dec->SetDriver(ddriver); dec->SetColors(gui_colorset); + dec->SetFont(fontserver->GetSystemPlain()); + dec->SetTitle(title); gui_colorset.Unlock(); return dec; diff --git a/src/servers/app/server/CursorManager.cpp b/src/servers/app/server/CursorManager.cpp index a22d776c3c..4f50cfe132 100644 --- a/src/servers/app/server/CursorManager.cpp +++ b/src/servers/app/server/CursorManager.cpp @@ -29,7 +29,10 @@ #include "CursorManager.h" #include "ServerCursor.h" #include "CursorData.h" +#include "ServerConfig.h" #include +#include +#include #include //! The global cursor manager object. Allocated and freed by AppServer class @@ -39,7 +42,6 @@ CursorManager *cursormanager; CursorManager::CursorManager(void) { _cursorlist=new BList(0); - _lock=create_sem(1,"cursor_manager_sem"); // Error code for AddCursor _tokenizer.ExcludeValue(B_ERROR); @@ -53,21 +55,21 @@ CursorManager::CursorManager(void) AddCursor(ctext); _textcsr=ctext; - ServerCursor *cdrag=new ServerCursor(default_drag_data); - AddCursor(cdrag); - _dragcsr=cdrag; - ServerCursor *cmove=new ServerCursor(default_move_data); AddCursor(cmove); _movecsr=cmove; + ServerCursor *cdrag=new ServerCursor(default_drag_data); + AddCursor(cdrag); + _dragcsr=cdrag; + ServerCursor *cresize=new ServerCursor(default_resize_data); AddCursor(cresize); _resizecsr=cresize; - ServerCursor *cresizeew=new ServerCursor(default_resize_ew_data); - AddCursor(cresizeew); - _resize_ew_csr=cresizeew; + ServerCursor *cresizenwse=new ServerCursor(default_resize_nwse_data); + AddCursor(cresizenwse); + _resize_nwse_csr=cresizenwse; ServerCursor *cresizenesw=new ServerCursor(default_resize_nesw_data); AddCursor(cresizenesw); @@ -77,9 +79,10 @@ CursorManager::CursorManager(void) AddCursor(cresizens); _resize_ns_csr=cresizens; - ServerCursor *cresizenwse=new ServerCursor(default_resize_nwse_data); - AddCursor(cresizenwse); - _resize_nwse_csr=cresizenwse; + ServerCursor *cresizeew=new ServerCursor(default_resize_ew_data); + AddCursor(cresizeew); + _resize_ew_csr=cresizeew; + } //! Does all the teardown @@ -95,8 +98,6 @@ CursorManager::~CursorManager(void) _cursorlist->MakeEmpty(); delete _cursorlist; - delete_sem(_lock); - // 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 @@ -114,11 +115,11 @@ int32 CursorManager::AddCursor(ServerCursor *sc) if(!sc) return B_ERROR; - acquire_sem(_lock); + Lock(); _cursorlist->AddItem(sc); int32 value=_tokenizer.GetToken(); sc->_token=value; - release_sem(_lock); + Unlock(); return value; } @@ -131,7 +132,7 @@ int32 CursorManager::AddCursor(ServerCursor *sc) */ void CursorManager::DeleteCursor(int32 token) { - acquire_sem(_lock); + Lock(); ServerCursor *temp; for(int32 i=0; i<_cursorlist->CountItems();i++) @@ -144,7 +145,7 @@ void CursorManager::DeleteCursor(int32 token) 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 // the road to replace the ServerCursor's app signature with a // pointer to its application and compare ServerApp pointers instead. - acquire_sem(_lock); + Lock(); ServerCursor *temp; for(int32 i=0; i<_cursorlist->CountItems();i++) @@ -170,37 +171,37 @@ void CursorManager::RemoveAppCursors(const char *signature) break; } } - release_sem(_lock); + Unlock(); } //! Wrapper around the DisplayDriver ShowCursor call void CursorManager::ShowCursor(void) { - acquire_sem(_lock); + Lock(); DisplayDriver *driver=GetGfxDriver(ActiveScreen()); driver->ShowCursor(); - release_sem(_lock); + Unlock(); } //! Wrapper around the DisplayDriver HideCursor call void CursorManager::HideCursor(void) { - acquire_sem(_lock); + Lock(); DisplayDriver *driver=GetGfxDriver(ActiveScreen()); driver->HideCursor(); - release_sem(_lock); + Unlock(); } //! Wrapper around the DisplayDriver ObscureCursor call void CursorManager::ObscureCursor(void) { - acquire_sem(_lock); + Lock(); DisplayDriver *driver=GetGfxDriver(ActiveScreen()); driver->ObscureCursor(); - release_sem(_lock); + Unlock(); } /*! @@ -209,7 +210,7 @@ void CursorManager::ObscureCursor(void) */ void CursorManager::SetCursor(int32 token) { - acquire_sem(_lock); + Lock(); ServerCursor *c=_FindCursor(token); if(c) { @@ -217,12 +218,12 @@ void CursorManager::SetCursor(int32 token) driver->SetCursor(c); _current_which=B_CURSOR_OTHER; } - release_sem(_lock); + Unlock(); } void CursorManager::SetCursor(cursor_which which) { - acquire_sem(_lock); + Lock(); DisplayDriver *driver=GetGfxDriver(ActiveScreen()); switch(which) @@ -285,7 +286,90 @@ void CursorManager::SetCursor(cursor_which which) 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; - acquire_sem(_lock); + Lock(); switch(which) { @@ -351,7 +435,7 @@ ServerCursor *CursorManager::GetCursor(cursor_which which) break; } - release_sem(_lock); + Unlock(); return temp; } @@ -363,9 +447,9 @@ cursor_which CursorManager::GetCursorWhich(void) { cursor_which temp; - acquire_sem(_lock); + Lock(); temp=_current_which; - release_sem(_lock); + Unlock(); return temp; } @@ -380,7 +464,7 @@ cursor_which CursorManager::GetCursorWhich(void) */ void CursorManager::ChangeCursor(cursor_which which, int32 token) { - acquire_sem(_lock); + Lock(); // Find the cursor, based on the 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? if(!cursor) { - release_sem(_lock); + Unlock(); return; } @@ -407,6 +491,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_TEXT: @@ -421,6 +506,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_MOVE: @@ -435,6 +521,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_DRAG: @@ -449,6 +536,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_RESIZE: @@ -463,6 +551,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_RESIZE_NWSE: @@ -477,6 +566,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_RESIZE_NESW: @@ -491,6 +581,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_RESIZE_NS: @@ -505,6 +596,7 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } case B_CURSOR_RESIZE_EW: @@ -519,13 +611,14 @@ void CursorManager::ChangeCursor(cursor_which which, int32 token) delete cursor->_app_signature; cursor->_app_signature=NULL; } + _cursorlist->RemoveItem(cursor); break; } default: break; } - release_sem(_lock); + Unlock(); } /*! @@ -544,3 +637,31 @@ ServerCursor *CursorManager::_FindCursor(int32 token) } 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(); +} + diff --git a/src/servers/app/server/CursorManager.h b/src/servers/app/server/CursorManager.h index e73f93adb9..3072d9a09b 100644 --- a/src/servers/app/server/CursorManager.h +++ b/src/servers/app/server/CursorManager.h @@ -30,6 +30,7 @@ #include #include #include +#include #include "TokenHandler.h" class ServerCursor; @@ -42,7 +43,7 @@ class ServerCursor; any BeOS platform. It also provides tokens for BCursors and frees all of an application's cursors whenever an application closes. */ -class CursorManager +class CursorManager : public BLocker { public: CursorManager(void); @@ -55,16 +56,16 @@ public: void ObscureCursor(void); void SetCursor(int32 token); void SetCursor(cursor_which which); + void SetCursorSet(const char *path); ServerCursor *GetCursor(cursor_which which); cursor_which GetCursorWhich(void); void ChangeCursor(cursor_which which, int32 token); - + void SetDefaults(void); private: ServerCursor *_FindCursor(int32 token); BList *_cursorlist; TokenHandler _tokenizer; - sem_id _lock; // System cursor members ServerCursor *_defaultcsr, diff --git a/src/servers/app/server/Decorator.cpp b/src/servers/app/server/Decorator.cpp index 2c47579938..134df22592 100644 --- a/src/servers/app/server/Decorator.cpp +++ b/src/servers/app/server/Decorator.cpp @@ -160,6 +160,21 @@ void Decorator::SetFeel(int32 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 \param wflags New value for the look diff --git a/src/servers/app/server/DefaultDecorator.cpp b/src/servers/app/server/DefaultDecorator.cpp index 0b39e5e73d..81f8821e3d 100644 --- a/src/servers/app/server/DefaultDecorator.cpp +++ b/src/servers/app/server/DefaultDecorator.cpp @@ -31,9 +31,8 @@ #include "ColorUtils.h" #include "DefaultDecorator.h" #include "RGBColor.h" - -//#define DEBUG_DECORATOR - +#include "RectUtils.h" +#include #define USE_VIEW_FILL_HACK @@ -44,22 +43,19 @@ DefaultDecorator::DefaultDecorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags) : Decorator(rect,wlook,wfeel,wflags) { + taboffset=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(); - // 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(); // This flag is used to determine whether or not we're moving the tab @@ -81,6 +77,7 @@ DefaultDecorator::~DefaultDecorator(void) #ifdef DEBUG_DECORATOR printf("DefaultDecorator: ~DefaultDecorator()\n"); #endif + delete [] framecolors; } click_type DefaultDecorator::Clicked(BPoint pt, int32 buttons, int32 modifiers) @@ -183,6 +180,21 @@ printf("DefaultDecorator: Do Layout\n"); _resizerect=_frame; _borderrect=_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; @@ -190,8 +202,22 @@ printf("DefaultDecorator: Do Layout\n"); _closerect.top+=(_look==B_FLOATING_WINDOW_LOOK)?6:4; _closerect.right=_closerect.left+10; _closerect.bottom=_closerect.top+10; - + + _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.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; if(_borderrect.Intersects(update)) - _driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh); + _driver->FillRect(_borderrect & update,&_layerdata,(int8*)&solidhigh); _DrawFrame(update); } @@ -318,9 +344,9 @@ void DefaultDecorator::Draw(void) // things // 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(); DrawTab(); @@ -354,7 +380,7 @@ void DefaultDecorator::_DrawTab(BRect r) _layerdata.highcolor=(GetFocus())?_colors->window_tab:_colors->inactive_window_tab; _driver->FillRect(_tabrect,&_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowcol; + _layerdata.highcolor=framecolors[3]; _driver->StrokeLine(_tabrect.LeftBottom(),_tabrect.RightBottom(),&_layerdata,(int8*)&solidhigh); _DrawTitle(_tabrect); @@ -423,69 +449,154 @@ void DefaultDecorator::DrawBlendedRect(BRect r, bool down) // _layerdata.highcolor=startcol; // _driver->FillRect(r,&_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowcol; + _layerdata.highcolor=framecolors[3]; _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 -_driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh); -#endif - - if(_look==B_NO_BORDER_WINDOW_LOOK) + if(!borderwidth) 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; iStrokeLineArray(points,numlines,colors,&_layerdata); + +/* BRect r=_borderrect; + + _layerdata.highcolor=framecolors[2]; _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.right-1,r.top), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowcol; + _layerdata.highcolor=framecolors[3]; _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowercol; + _layerdata.highcolor=framecolors[4]; _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowercol; + _layerdata.highcolor=framecolors[4]; _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), &_layerdata,(int8*)&solidhigh); 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), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_highercol; + _layerdata.highcolor=framecolors[0]; _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_midcol; + _layerdata.highcolor=framecolors[2]; _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_midcol; + _layerdata.highcolor=framecolors[2]; _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), &_layerdata,(int8*)&solidhigh); r.InsetBy(1,1); - _layerdata.highcolor=frame_highcol; + _layerdata.highcolor=framecolors[1]; _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); 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), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_lowercol; + _layerdata.highcolor=framecolors[4]; _driver->StrokeLine(BPoint(r.left,r.top),BPoint(r.left,r.bottom), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_highercol; + _layerdata.highcolor=framecolors[0]; _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.right,r.top), &_layerdata,(int8*)&solidhigh); - _layerdata.highcolor=frame_highercol; + _layerdata.highcolor=framecolors[0]; _driver->StrokeLine(BPoint(r.right,r.bottom),BPoint(r.left,r.bottom), &_layerdata,(int8*)&solidhigh); _driver->StrokeRect(_borderrect,&_layerdata,(int8*)&solidhigh); - + + // Draw the resize thumb if we're supposed to if(!(_flags & B_NOT_RESIZABLE)) { @@ -501,10 +612,10 @@ _driver->FillRect(_borderrect,&_layerdata,(int8*)&solidhigh); int steps=(wFillRect(_borderrect,&_layerdata,(int8*)&solidhigh); _driver->StrokeLine(BPoint(r.left+steps,r.top+i), BPoint(r.left+i,r.top+steps),&_layerdata,(int8*)&solidhigh); } - _layerdata.highcolor=frame_lowercol; + _layerdata.highcolor=framecolors[4]; _driver->StrokeRect(r,&_layerdata,(int8*)&solidhigh); } else { - _layerdata.highcolor=frame_lowercol; + _layerdata.highcolor=framecolors[4]; _driver->StrokeLine(BPoint(r.right,r.top),BPoint(r.right-3,r.top), &_layerdata,(int8*)&solidhigh); _driver->StrokeLine(BPoint(r.left,r.bottom),BPoint(r.left,r.bottom-3), &_layerdata,(int8*)&solidhigh); } } +*/ + } diff --git a/src/servers/app/server/DefaultDecorator.h b/src/servers/app/server/DefaultDecorator.h index b3edc7f3c7..d310702560 100644 --- a/src/servers/app/server/DefaultDecorator.h +++ b/src/servers/app/server/DefaultDecorator.h @@ -59,7 +59,14 @@ protected: RGBColor frame_highcol, frame_midcol, frame_lowcol, frame_highercol, frame_lowercol; RGBColor textcol; + + RGBColor *framecolors; + + // Individual rects for handling window frame rendering the proper way + BRect rightborder,leftborder,topborder,bottomborder; uint64 solidhigh, solidlow; + + int32 borderwidth; bool slidetab; int textoffset; diff --git a/src/servers/app/server/FontFamily.cpp b/src/servers/app/server/FontFamily.cpp index c1e671ec02..5ccae1b32d 100644 --- a/src/servers/app/server/FontFamily.cpp +++ b/src/servers/app/server/FontFamily.cpp @@ -28,8 +28,7 @@ #include "ServerFont.h" #include FT_CACHE_H -FTC_Manager ftmanager; -FT_Library ftlib; +FTC_Manager ftmanager; /*! \brief Constructor diff --git a/src/servers/app/server/FontServer.cpp b/src/servers/app/server/FontServer.cpp index 6ae638eced..928e351bb9 100644 --- a/src/servers/app/server/FontServer.cpp +++ b/src/servers/app/server/FontServer.cpp @@ -37,6 +37,8 @@ #include "ServerFont.h" #include "ServerConfig.h" +extern FTC_Manager ftmanager; +FT_Library ftlib; FontServer *fontserver; /*! diff --git a/src/servers/app/server/Jamfile b/src/servers/app/server/Jamfile index ce4744b7d8..a7bc6cd1f4 100644 --- a/src/servers/app/server/Jamfile +++ b/src/servers/app/server/Jamfile @@ -7,6 +7,9 @@ UsePrivateHeaders app interface [ FDirName servers app ] ; UseFreeTypeHeaders ; SharedLibrary appserver : + areafunc.c + bget.c + BitmapManager.cpp ColorSet.cpp Decorator.cpp DisplayDriver.cpp @@ -17,7 +20,9 @@ SharedLibrary appserver : ServerBitmap.cpp ServerCursor.cpp ServerFont.cpp + SysCursor.cpp SystemPalette.cpp + TokenHandler.cpp ; LinkSharedOSLibs libappserver.so : root be @@ -26,11 +31,8 @@ LinkSharedOSLibs libappserver.so : root be Server app_server : # Misc. Sources - areafunc.c Angle.cpp - bget.c CursorData.cpp - TokenHandler.cpp PicturePlayer.cpp PNGDump.cpp @@ -39,7 +41,6 @@ Server app_server : # Manager Classes AppServer.cpp BitmapDriver.cpp - BitmapManager.cpp CursorManager.cpp Desktop.cpp ServerApp.cpp diff --git a/src/servers/app/server/Layer.cpp b/src/servers/app/server/Layer.cpp index 64e4c139b2..cd84ac6b5e 100644 --- a/src/servers/app/server/Layer.cpp +++ b/src/servers/app/server/Layer.cpp @@ -36,7 +36,7 @@ #include "RectUtils.h" //#define DEBUG_LAYER -#define DEBUG_REGIONS +//#define DEBUG_REGIONS #ifdef DEBUG_REGIONS #include "Desktop.h" @@ -71,9 +71,9 @@ Layer::Layer(BRect frame, const char *name, int32 resize, int32 flags,ServerWind _topchild=NULL; _bottomchild=NULL; - _visible=new BRegion(Bounds()); - _full=new BRegion(Bounds()); - _invalid=new BRegion(Bounds()); + _visible=new BRegion(Frame()); + _full=new BRegion(Frame()); + _invalid=new BRegion(Frame()); _serverwin=win; diff --git a/src/servers/app/server/ServerApp.cpp b/src/servers/app/server/ServerApp.cpp index f867013861..cef8e49bfa 100644 --- a/src/servers/app/server/ServerApp.cpp +++ b/src/servers/app/server/ServerApp.cpp @@ -337,11 +337,13 @@ void ServerApp::_DispatchMessage(int32 code, int8 *buffer) // Attached data: // 1) port_id reply port // 2) BRect window frame - // 3) uint32 window flags - // 4) port_id window's message port - // 5) uint32 workspace index - // 6) int32 BHandler token of the window - // 7) const char * title + // 3) uint32 window look + // 4) uint32 window feel + // 5) uint32 window flags + // 6) port_id window's message port + // 7) uint32 workspace index + // 8) int32 BHandler token of the window + // 9) const char * title // Find the necessary data 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: { // TODO: Implement -#ifdef DEBUG_SERVERAPP -printf("ServerApp %s: Create Picture unimplemented\n",_signature.String()); -#endif + #ifdef DEBUG_SERVERAPP + printf("ServerApp %s: Create Picture unimplemented\n",_signature.String()); + #endif break; } case AS_DELETE_PICTURE: { // TODO: Implement -#ifdef DEBUG_SERVERAPP -printf("ServerApp %s: Delete Picture unimplemented\n",_signature.String()); -#endif + #ifdef DEBUG_SERVERAPP + printf("ServerApp %s: Delete Picture unimplemented\n",_signature.String()); + #endif break; } case AS_CLONE_PICTURE: { // TODO: Implement -#ifdef DEBUG_SERVERAPP -printf("ServerApp %s: Clone Picture unimplemented\n",_signature.String()); -#endif + #ifdef DEBUG_SERVERAPP + printf("ServerApp %s: Clone Picture unimplemented\n",_signature.String()); + #endif break; } case AS_DOWNLOAD_PICTURE: { // TODO; Implement -#ifdef DEBUG_SERVERAPP -printf("ServerApp %s: Download Picture unimplemented\n",_signature.String()); -#endif + #ifdef DEBUG_SERVERAPP + printf("ServerApp %s: Download Picture unimplemented\n",_signature.String()); + #endif break; } case AS_SET_SCREEN_MODE: @@ -669,7 +671,7 @@ printf("ServerApp %s: Download Picture unimplemented\n",_signature.String()); default: { #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 break; } diff --git a/src/servers/app/server/ServerWindow.cpp b/src/servers/app/server/ServerWindow.cpp index ec0cabf179..6a1d116a02 100644 --- a/src/servers/app/server/ServerWindow.cpp +++ b/src/servers/app/server/ServerWindow.cpp @@ -223,6 +223,7 @@ void ServerWindow::Show(void) if(_winborder) { _winborder->Show(); + _winborder->SetFocus(true); _winborder->UpdateRegions(true); } } @@ -261,6 +262,7 @@ void ServerWindow::SetFocus(bool value) if(_active!=value) { _active=value; + _winborder->SetFocus(value); _winborder->RequestDraw(); } } @@ -627,7 +629,7 @@ void ServerWindow::DispatchMessage(PortMessage *msg) } 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; } } diff --git a/src/servers/app/server/ViewDriver.cpp b/src/servers/app/server/ViewDriver.cpp index b92a92a6f0..9b30a48aa6 100644 --- a/src/servers/app/server/ViewDriver.cpp +++ b/src/servers/app/server/ViewDriver.cpp @@ -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) { -#ifdef DEBUG_DRIVER_MODULE -printf("ViewDriver:: StrokeLineArray unimplemented\n"); -#endif + if(!d || numlines==0 || !pts || !colors) + return; + + 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; iSetHighColor(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) diff --git a/src/servers/app/server/WinBorder.cpp b/src/servers/app/server/WinBorder.cpp index 93731a11e6..8b609a3b86 100644 --- a/src/servers/app/server/WinBorder.cpp +++ b/src/servers/app/server/WinBorder.cpp @@ -37,6 +37,8 @@ #include "WinBorder.h" #include "AppServer.h" // for new_decorator() +// TODO: Document this file completely + //#define DEBUG_WINBORDER //#define DEBUG_WINBORDER_MOUSE //#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; } 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) { + // unlike BViews, windows start off as hidden, so we need to tweak the hidecount + // assignment made by Layer(). + _hidecount=1; _mbuttons=0; _kmodifiers=0; _win=win; @@ -153,7 +159,7 @@ printf("Click: MoveToFront\n"); printf("Click: Close\n"); #endif _decorator->SetClose(true); - _decorator->Draw(); + _decorator->DrawClose(); break; } case CLICK_ZOOM: @@ -162,7 +168,7 @@ printf("Click: Close\n"); printf("Click: Zoom\n"); #endif _decorator->SetZoom(true); - _decorator->Draw(); + _decorator->DrawZoom(); break; } case CLICK_MINIMIZE: @@ -171,7 +177,7 @@ printf("Click: Zoom\n"); printf("Click: Minimize\n"); #endif _decorator->SetMinimize(true); - _decorator->Draw(); + _decorator->DrawMinimize(); break; } case CLICK_DRAG: @@ -357,7 +363,7 @@ void WinBorder::MouseUp(int8 *buffer) BPoint pt(x,y); #ifdef DEBUG_WINBORDER_MOUSE -printf("WinBorder %s: MouseUp unimplmented\n",_title->String()); +printf("WinBorder %s: MouseUp unimplemented\n",_title->String()); #endif _mbuttons=0; @@ -374,7 +380,7 @@ printf("WinBorder %s: MouseUp unimplmented\n",_title->String()); case CLICK_CLOSE: { _decorator->SetClose(false); - _decorator->Draw(); + _decorator->DrawClose(); // call close window stuff here @@ -383,7 +389,7 @@ printf("WinBorder %s: MouseUp unimplmented\n",_title->String()); case CLICK_ZOOM: { _decorator->SetZoom(false); - _decorator->Draw(); + _decorator->DrawZoom(); // call zoom stuff here @@ -392,7 +398,7 @@ printf("WinBorder %s: MouseUp unimplmented\n",_title->String()); case CLICK_MINIMIZE: { _decorator->SetMinimize(false); - _decorator->Draw(); + _decorator->DrawMinimize(); // 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) { #ifdef DEBUG_WINBORDER diff --git a/src/servers/app/server/WinBorder.h b/src/servers/app/server/WinBorder.h index 9e4a4a9664..5843c52c3b 100644 --- a/src/servers/app/server/WinBorder.h +++ b/src/servers/app/server/WinBorder.h @@ -38,7 +38,8 @@ class DisplayDriver; class WinBorder : public Layer { 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); void RequestDraw(void); void RequestDraw(const BRect &r); @@ -53,8 +54,8 @@ public: void UpdateDecorator(void); void UpdateFont(void); void UpdateScreen(void); - void RebuildRegions(bool recursive=true); - void Activate(bool active=false); + void RebuildRegions(const bool &recursive=true); + void SetFocus(const bool &active=false); ServerWindow *Window(void) { return _win; } Decorator *GetDecorator(void) { return _decorator; } protected: