Complete server update.
Fix for garbage text in window titles Updates to decorator and API git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2066 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
2b99433ef9
commit
f0577aea09
@ -59,8 +59,8 @@ printf("Server input port: %ld\n",mouseport);
|
||||
// fontserver->ScanDirectory("/boot/home/config/fonts/psfonts/");
|
||||
fontserver->SaveList();
|
||||
|
||||
if(!fontserver->SetSystemPlain("Dutch801 Rm BT","Roman",12))
|
||||
printf("Couldn't set plain to Dutch801 Rm BT, Roman 12 pt\n");
|
||||
if(!fontserver->SetSystemPlain("Swis721 BT","Roman",12))
|
||||
printf("Couldn't set plain to Swis721 BT, Roman 12 pt\n");
|
||||
if(!fontserver->SetSystemBold("Dutch801 Rm BT","Bold",12))
|
||||
printf("Couldn't set bold to Dutch801 Rm BT, Bold 12 pt\n");
|
||||
if(!fontserver->SetSystemFixed("Courier10 BT","Roman",12))
|
||||
@ -236,9 +236,18 @@ printf("AppServer: Create App\n");
|
||||
|
||||
// Find the necessary data
|
||||
port_id reply_port=*((port_id*)index); index+=sizeof(port_id);
|
||||
#ifdef DEBUG_APPSERVER_THREAD
|
||||
printf("\tCreate App: reply port is %lu\n",reply_port);
|
||||
#endif
|
||||
port_id app_port=*((port_id*)index); index+=sizeof(port_id);
|
||||
#ifdef DEBUG_APPSERVER_THREAD
|
||||
printf("\tCreate App: ServerApp port is %lu\n", app_port);
|
||||
#endif
|
||||
|
||||
char *app_signature=(char *)index;
|
||||
#ifdef DEBUG_APPSERVER_THREAD
|
||||
printf("\tCreate App: Signature received is %s\n", app_signature);
|
||||
#endif
|
||||
|
||||
// Create the ServerApp subthread for this app
|
||||
applist_lock->Lock();
|
||||
@ -463,7 +472,8 @@ void AppServer::LoadDefaultDecorator(void)
|
||||
|
||||
}
|
||||
|
||||
Decorator *instantiate_decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags)
|
||||
Decorator *instantiate_decorator(BRect rect, const char *title, int32 wlook, int32 wfeel, int32 wflags,
|
||||
DisplayDriver *ddriver)
|
||||
{
|
||||
Decorator *decor=NULL;
|
||||
|
||||
@ -471,11 +481,8 @@ Decorator *instantiate_decorator(BRect rect, int32 wlook, int32 wfeel, int32 wfl
|
||||
if(app_server->make_decorator!=NULL)
|
||||
decor=app_server->make_decorator(rect,wlook,wfeel,wflags);
|
||||
else
|
||||
{
|
||||
decor=new BeDecorator(rect,wlook,wfeel,wflags);
|
||||
// decor=new WinDecorator(lay, dflags, wlook);
|
||||
// decor=new YMakDecorator(lay, dflags, wlook);
|
||||
}
|
||||
decor=new BeDecorator(rect,title,wlook,wfeel,wflags,ddriver);
|
||||
|
||||
decor->SetDriver(get_gfxdriver());
|
||||
app_server->UnlockDecorator();
|
||||
return decor;
|
||||
@ -508,6 +515,7 @@ void AppServer::Poller(void)
|
||||
#ifdef DEBUG_POLLER_THREAD
|
||||
printf("Poller: MouseDown() - Empty buffer\n");
|
||||
#endif
|
||||
ServerWindow::HandleMouseEvent(msgcode,msgbuffer);
|
||||
break;
|
||||
}
|
||||
case B_MOUSE_UP:
|
||||
|
@ -27,7 +27,7 @@ public:
|
||||
void UnlockDecorator(void) { if(decor_lock) decor_lock->Unlock(); }
|
||||
create_decorator *make_decorator; // global function pointer
|
||||
private:
|
||||
friend Decorator *instantiate_decorator(Layer *lay, uint32 dflags, uint32 wlook);
|
||||
friend Decorator *instantiate_decorator(Layer *lay, const char *title, uint32 dflags, uint32 wlook);
|
||||
|
||||
void DispatchMessage(int32 code, int8 *buffer);
|
||||
static int32 PollerThread(void *data);
|
||||
@ -47,5 +47,6 @@ private:
|
||||
DisplayDriver *driver;
|
||||
};
|
||||
|
||||
Decorator *instantiate_decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags);
|
||||
Decorator *instantiate_decorator(BRect rect, const char *title, int32 wlook, int32 wfeel,
|
||||
int32 wflags, DisplayDriver *ddriver);
|
||||
#endif
|
@ -13,8 +13,9 @@
|
||||
#include <stdio.h>
|
||||
#endif
|
||||
|
||||
BeDecorator::BeDecorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags)
|
||||
: Decorator(rect,wlook,wfeel,wflags)
|
||||
BeDecorator::BeDecorator(BRect rect, const char *title, int32 wlook, int32 wfeel, int32 wflags,
|
||||
DisplayDriver *ddriver)
|
||||
: Decorator(rect,title,wlook,wfeel,wflags,ddriver)
|
||||
{
|
||||
#ifdef DEBUG_DECOR
|
||||
printf("BeDecorator()\n");
|
||||
@ -147,16 +148,14 @@ printf("BeDecorator()::_DoLayout()"); rect.PrintToStream();
|
||||
resizerect.left=resizerect.right-18;
|
||||
|
||||
tabrect.bottom=tabrect.top+18;
|
||||
/* if(GetTitle())
|
||||
if(titlewidth>0)
|
||||
{
|
||||
float titlewidth=closerect.right
|
||||
+driver->StringWidth(layer->name->String(),
|
||||
layer->name->Length())
|
||||
+35;
|
||||
tabrect.right=(titlewidth<frame.right -1)?titlewidth:frame.right;
|
||||
tabrect.right=closerect.right+textoffset+titlewidth+15;
|
||||
if(tabrect.right>frame.right)
|
||||
tabrect.right=frame.right;
|
||||
}
|
||||
else
|
||||
*/ tabrect.right=tabrect.left+tabrect.Width()/2;
|
||||
tabrect.right=tabrect.left+tabrect.Width()/2;
|
||||
|
||||
if(look==WLOOK_FLOATING)
|
||||
tabrect.top+=4;
|
||||
@ -169,6 +168,17 @@ printf("BeDecorator()::_DoLayout()"); rect.PrintToStream();
|
||||
zoomrect.bottom=zoomrect.top+10;
|
||||
|
||||
textoffset=(look==WLOOK_FLOATING)?5:7;
|
||||
// titlechars=_ClipTitle(zoomrect.left-(closerect.right+textoffset));
|
||||
titlechars=_ClipTitle(zoomrect.left-closerect.right);
|
||||
}
|
||||
|
||||
void BeDecorator::SetTitle(const char *string)
|
||||
{
|
||||
Decorator::SetTitle(string);
|
||||
if(string && driver)
|
||||
titlewidth=driver->StringWidth(GetTitle(),strlen(GetTitle()),&layerdata);
|
||||
else
|
||||
titlewidth=0;
|
||||
}
|
||||
|
||||
void BeDecorator::MoveBy(float x, float y)
|
||||
@ -214,14 +224,12 @@ void BeDecorator::_DrawTitle(BRect r)
|
||||
{
|
||||
// Designed simply to redraw the title when it has changed on
|
||||
// the client side.
|
||||
/* driver->SetDrawingMode(B_OP_OVER);
|
||||
rgb_color tmpcol=driver->HighColor();
|
||||
driver->SetHighColor(textcol.red,textcol.green,textcol.blue);
|
||||
driver->DrawString((char *)string,strlen(string),
|
||||
BPoint(closerect.right+textoffset,closerect.bottom-1));
|
||||
driver->SetHighColor(tmpcol.red,tmpcol.green,tmpcol.blue);
|
||||
driver->SetDrawingMode(B_OP_COPY);
|
||||
*/
|
||||
layerdata.draw_mode=B_OP_OVER;
|
||||
layerdata.highcolor=colors->window_tab_text;
|
||||
driver->DrawString(GetTitle(),titlechars,
|
||||
BPoint(closerect.right+textoffset,closerect.bottom),&layerdata);
|
||||
layerdata.draw_mode=B_OP_COPY;
|
||||
|
||||
}
|
||||
|
||||
void BeDecorator::_SetFocus(void)
|
||||
@ -313,8 +321,6 @@ void BeDecorator::_DrawTab(BRect r)
|
||||
layerdata.highcolor=frame_lowcol;
|
||||
driver->StrokeRect(tabrect,&layerdata,(int8*)&solidhigh);
|
||||
|
||||
// UpdateTitle(layer->name->String());
|
||||
|
||||
layerdata.highcolor=colors->window_tab;
|
||||
driver->FillRect(tabrect.InsetByCopy(1,1),&layerdata,(int8*)&solidhigh);
|
||||
|
||||
@ -494,7 +500,8 @@ extern "C" float get_decorator_version(void)
|
||||
return 1.00;
|
||||
}
|
||||
|
||||
extern "C" Decorator *instantiate_decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags)
|
||||
extern "C" Decorator *instantiate_decorator(BRect rect, const char *title,
|
||||
int32 wlook, int32 wfeel, int32 wflags,DisplayDriver *ddriver)
|
||||
{
|
||||
return new BeDecorator(rect,wlook,wfeel,wflags);
|
||||
return new BeDecorator(rect,title, wlook,wfeel,wflags,ddriver);
|
||||
}
|
@ -7,9 +7,11 @@
|
||||
class BeDecorator: public Decorator
|
||||
{
|
||||
public:
|
||||
BeDecorator(BRect frame, int32 wlook, int32 wfeel, int32 wflags);
|
||||
BeDecorator(BRect frame, const char *title, int32 wlook, int32 wfeel, int32 wflags,
|
||||
DisplayDriver *ddriver);
|
||||
~BeDecorator(void);
|
||||
|
||||
void SetTitle(const char *string);
|
||||
void MoveBy(float x, float y);
|
||||
void MoveBy(BPoint pt);
|
||||
void ResizeBy(float x, float y);
|
||||
@ -36,9 +38,10 @@ protected:
|
||||
frame_lowercol;
|
||||
RGBColor textcol;
|
||||
uint64 solidhigh, solidlow;
|
||||
float titlewidth;
|
||||
|
||||
bool slidetab;
|
||||
int textoffset;
|
||||
int textoffset, titlechars;
|
||||
};
|
||||
|
||||
#endif
|
@ -1,13 +1,14 @@
|
||||
#include "Decorator.h"
|
||||
#include <string.h>
|
||||
#include "DisplayDriver.h"
|
||||
|
||||
Decorator::Decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags)
|
||||
Decorator::Decorator(BRect rect, const char *title, int32 wlook, int32 wfeel, int32 wflags,
|
||||
DisplayDriver *ddriver)
|
||||
{
|
||||
close_state=false;
|
||||
minimize_state=false;
|
||||
zoom_state=false;
|
||||
title_string=NULL;
|
||||
driver=NULL;
|
||||
title_string=new BString(title);
|
||||
driver=ddriver;
|
||||
|
||||
closerect.Set(0,0,1,1);
|
||||
zoomrect.Set(0,0,1,1);
|
||||
@ -41,7 +42,10 @@ void Decorator::SetColors(ColorSet cset)
|
||||
|
||||
void Decorator::SetDriver(DisplayDriver *d)
|
||||
{
|
||||
// lots of subclasses will depend on the driver for text support, so call
|
||||
// _DoLayout() after this
|
||||
driver=d;
|
||||
_DoLayout();
|
||||
}
|
||||
|
||||
void Decorator::SetClose(bool is_down)
|
||||
@ -106,25 +110,12 @@ int32 Decorator::GetFlags(void)
|
||||
|
||||
void Decorator::SetTitle(const char *string)
|
||||
{
|
||||
if(string)
|
||||
{
|
||||
size_t size=strlen(string);
|
||||
if(!(size>0))
|
||||
return;
|
||||
delete title_string;
|
||||
title_string=new char[size];
|
||||
strcpy(title_string,string);
|
||||
}
|
||||
else
|
||||
{
|
||||
delete title_string;
|
||||
title_string=NULL;
|
||||
}
|
||||
title_string->SetTo(string);
|
||||
}
|
||||
|
||||
const char *Decorator::GetTitle(void)
|
||||
{
|
||||
return title_string;
|
||||
return title_string->String();
|
||||
}
|
||||
|
||||
void Decorator::SetFocus(bool is_active)
|
||||
@ -138,8 +129,24 @@ void Decorator::SetFont(SFont *sf)
|
||||
{
|
||||
}
|
||||
*/
|
||||
void Decorator::_ClipTitle(void)
|
||||
int32 Decorator::_ClipTitle(float width)
|
||||
{
|
||||
if(driver)
|
||||
{
|
||||
int32 strlength=title_string->CountChars();
|
||||
float pixwidth=driver->StringWidth(title_string->String(),strlength,&layerdata);
|
||||
|
||||
while(strlength>=0)
|
||||
{
|
||||
if(pixwidth<width)
|
||||
break;
|
||||
strlength--;
|
||||
pixwidth=driver->StringWidth(title_string->String(),strlength,&layerdata);
|
||||
}
|
||||
|
||||
return strlength;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
//-------------------------------------------------------------------------
|
||||
@ -230,6 +237,7 @@ void Decorator::_DrawTitle(BRect r)
|
||||
void Decorator::_DrawZoom(BRect r)
|
||||
{
|
||||
}
|
||||
|
||||
/*
|
||||
SRegion Decorator::GetFootprint(void)
|
||||
{
|
||||
|
@ -3,6 +3,7 @@
|
||||
|
||||
#include <SupportDefs.h>
|
||||
#include <Rect.h>
|
||||
#include <String.h>
|
||||
#include "ColorSet.h"
|
||||
#include "LayerData.h"
|
||||
|
||||
@ -55,7 +56,8 @@ typedef enum { CLICK_NONE=0, CLICK_ZOOM, CLICK_CLOSE, CLICK_MINIMIZE,
|
||||
class Decorator
|
||||
{
|
||||
public:
|
||||
Decorator(BRect rect, int32 wlook, int32 wfeel, int32 wflags);
|
||||
Decorator(BRect rect, const char *title, int32 wlook, int32 wfeel, int32 wflags,
|
||||
DisplayDriver *ddriver);
|
||||
virtual ~Decorator(void);
|
||||
void SetColors(ColorSet cset);
|
||||
void SetDriver(DisplayDriver *d);
|
||||
@ -71,12 +73,11 @@ public:
|
||||
int32 GetLook(void);
|
||||
int32 GetFeel(void);
|
||||
int32 GetFlags(void);
|
||||
void SetTitle(const char *string);
|
||||
virtual void SetTitle(const char *string);
|
||||
void SetFocus(bool is_active);
|
||||
bool GetFocus(void) { return has_focus; };
|
||||
const char *GetTitle(void);
|
||||
// void SetFont(SFont *sf);
|
||||
void _ClipTitle(void);
|
||||
ColorSet GetColors(void) { if(colors) return *colors; else return ColorSet(); }
|
||||
|
||||
virtual void MoveBy(float x, float y);
|
||||
@ -95,6 +96,8 @@ public:
|
||||
virtual click_type Clicked(BPoint pt, int32 buttons, int32 modifiers);
|
||||
|
||||
protected:
|
||||
int32 _ClipTitle(float width);
|
||||
int32 TitleWidth(void) { return (title_string)?title_string->CountChars():0; }
|
||||
virtual void _DrawClose(BRect r);
|
||||
virtual void _DrawFrame(BRect r);
|
||||
virtual void _DrawMinimize(BRect r);
|
||||
@ -112,7 +115,7 @@ protected:
|
||||
private:
|
||||
bool close_state, zoom_state, minimize_state;
|
||||
bool has_focus;
|
||||
char *title_string;
|
||||
BString *title_string;
|
||||
};
|
||||
|
||||
typedef float get_version(void);
|
||||
|
@ -41,7 +41,7 @@
|
||||
|
||||
// Define this if you want to use the spacebar to launch the server prototype's
|
||||
// test application
|
||||
//#define LAUNCH_TESTAPP
|
||||
#define LAUNCH_TESTAPP
|
||||
|
||||
#ifdef LAUNCH_TESTAPP
|
||||
#include <Roster.h>
|
||||
@ -1348,7 +1348,7 @@ void ScreenDriver::SetCursor(ServerBitmap *csr, const BPoint &spot)
|
||||
#ifdef DEBUG_DRIVER
|
||||
printf("ScreenDriver::SetCursor\n");
|
||||
#endif
|
||||
if(!csr)
|
||||
/* if(!csr)
|
||||
return;
|
||||
|
||||
Lock();
|
||||
@ -1380,6 +1380,7 @@ printf("ScreenDriver::SetCursor\n");
|
||||
BlitBitmap(cursor,cursor->Bounds(),cursorframe);
|
||||
|
||||
Unlock();
|
||||
*/
|
||||
}
|
||||
|
||||
void ScreenDriver::HLine(int32 x1, int32 x2, int32 y, RGBColor color)
|
||||
|
@ -6,7 +6,6 @@
|
||||
class BMessage;
|
||||
class PortLink;
|
||||
class BList;
|
||||
class ServerCursor;
|
||||
class DisplayDriver;
|
||||
|
||||
class ServerApp
|
||||
|
@ -36,7 +36,7 @@ ServerWindow::ServerWindow(BRect rect, const char *string, uint32 wlook,
|
||||
else
|
||||
title->SetTo("Window");
|
||||
#ifdef DEBUG_SERVERWIN
|
||||
printf("ServerWindow() %s\n",title->String());
|
||||
printf("ServerWindow(%s)\n",title->String());
|
||||
#endif
|
||||
|
||||
// This must happen before the WindowBorder object - it needs this object's frame
|
||||
@ -53,14 +53,14 @@ printf("ServerWindow() %s\n",title->String());
|
||||
|
||||
// hard code this for now - window look also needs to be attached and sent to
|
||||
// server by BWindow constructor
|
||||
decorator=instantiate_decorator(frame,winlook,winfeel,winflags);
|
||||
decorator=instantiate_decorator(frame,title->String(),winlook,winfeel,winflags,get_gfxdriver());
|
||||
#ifdef DEBUG_SERVERWIN
|
||||
if(decorator==NULL)
|
||||
printf("ServerWindow() %s: NULL decorator returned\n",title->String());
|
||||
printf("\tNULL decorator returned\n");
|
||||
#endif
|
||||
winborder->SetDecorator(decorator);
|
||||
#ifdef DEBUG_SERVERWIN
|
||||
printf("ServerWindow() %s: decorator set\n",title->String());
|
||||
printf("\tdecorator set\n");
|
||||
#endif
|
||||
|
||||
// sender is the monitored app's event port
|
||||
@ -72,7 +72,7 @@ printf("ServerWindow() %s: decorator set\n",title->String());
|
||||
else
|
||||
applink=NULL;
|
||||
#ifdef DEBUG_SERVERWIN
|
||||
printf("ServerWindow() %s: PortLink established\n",title->String());
|
||||
printf("\tPortLink established\n");
|
||||
#endif
|
||||
|
||||
// receiver is the port to which the app sends messages for the server
|
||||
@ -86,14 +86,14 @@ printf("ServerWindow() %s: PortLink established\n",title->String());
|
||||
if(thread!=B_NO_MORE_THREADS && thread!=B_NO_MEMORY)
|
||||
resume_thread(thread);
|
||||
#ifdef DEBUG_SERVERWIN
|
||||
printf("ServerWindow() %s: MonitorThread spawned\n",title->String());
|
||||
printf("\tMonitorThread spawned\n");
|
||||
#endif
|
||||
|
||||
workspace=index;
|
||||
|
||||
AddWindowToDesktop(this,index);
|
||||
#ifdef DEBUG_SERVERWIN
|
||||
printf("ServerWindow() %s: Added to Desktop\n",title->String());
|
||||
printf("\tAdded to Desktop\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -504,6 +504,7 @@ printf("ViewDriver:: CopyBits()\n"); src.PrintToStream(); dest.PrintToStream();
|
||||
framebuffer->Lock();
|
||||
drawview->CopyBits(src,dest);
|
||||
drawview->Sync();
|
||||
screenwin->view->Invalidate(src);
|
||||
screenwin->view->Invalidate(dest);
|
||||
framebuffer->Unlock();
|
||||
screenwin->Unlock();
|
||||
|
@ -4,11 +4,12 @@
|
||||
#include <Debug.h>
|
||||
#include "View.h" // for mouse button defines
|
||||
#include "ServerWindow.h"
|
||||
#include "WindowBorder.h"
|
||||
#include "Decorator.h"
|
||||
#include "DisplayDriver.h"
|
||||
#include "Desktop.h"
|
||||
#include "WindowBorder.h"
|
||||
|
||||
#define DEBUG_WINBORDER
|
||||
//#define DEBUG_WINBORDER
|
||||
|
||||
#ifdef DEBUG_WINBORDER
|
||||
#include <stdio.h>
|
||||
@ -23,7 +24,7 @@ WindowBorder::WindowBorder(ServerWindow *win, const char *bordertitle)
|
||||
(win==NULL)?NULL:win->title->String())
|
||||
{
|
||||
#ifdef DEBUG_WINBORDER
|
||||
printf("WindowBorder()\n");
|
||||
printf("WindowBorder(%s)\n",bordertitle);
|
||||
#endif
|
||||
mbuttons=0;
|
||||
swin=win;
|
||||
@ -33,7 +34,6 @@ printf("WindowBorder()\n");
|
||||
title=new BString(bordertitle);
|
||||
hresizewin=false;
|
||||
vresizewin=false;
|
||||
|
||||
}
|
||||
|
||||
WindowBorder::~WindowBorder(void)
|
||||
@ -276,6 +276,8 @@ printf("WindowBorder::SetDecorator(%p)\n",newdecor);
|
||||
if(newdecor)
|
||||
{
|
||||
decor=newdecor;
|
||||
decor->SetTitle(title->String());
|
||||
decor->ResizeBy(0,0);
|
||||
// if(visible)
|
||||
// delete visible;
|
||||
// visible=decor->GetFootprint();
|
||||
|
@ -7,6 +7,7 @@
|
||||
|
||||
class ServerWindow;
|
||||
class Decorator;
|
||||
class DisplayDriver;
|
||||
|
||||
class WindowBorder : public Layer
|
||||
{
|
||||
|
@ -38,7 +38,7 @@ printf("OBWindow(%s)\n",title);
|
||||
if(inport==B_BAD_VALUE || inport==B_NO_MORE_PORTS)
|
||||
printf("OBWindow: Couldn't create message port\n");
|
||||
|
||||
// Notify app that we exist
|
||||
// Notify BApplication that we exist
|
||||
OBWindow *win=this;
|
||||
PortLink *link=new PortLink(obe_app->messageport);
|
||||
link->SetOpCode(ADDWINDOW);
|
||||
@ -67,7 +67,10 @@ printf("OBWindow(%s)\n",title);
|
||||
serverlink->Attach((int32)wflags);
|
||||
serverlink->Attach(&inport,sizeof(port_id));
|
||||
serverlink->Attach((int32)wkspace);
|
||||
serverlink->Attach((char*)wtitle->String(),wtitle->Length());
|
||||
//We add one so that the string will end up NULL-terminated. Otherwise, when
|
||||
// we go to use the thing in the app_server, it will sometimes get junk
|
||||
// characters at the end.
|
||||
serverlink->Attach((char*)wtitle->String(),wtitle->CountChars()+1);
|
||||
|
||||
// Send and wait for ServerWindow port. Necessary here so we can respond to
|
||||
// messages as soon as Show() is called.
|
||||
|
Loading…
Reference in New Issue
Block a user