Added handler code for AppServer::PollerThread to handle messages to get/set UI colors and decorators

Added a color_which lookup to ColorSet - will be necessary to look up system colors via ui_color()


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@4981 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
DarkWyrm 2003-10-08 23:18:30 +00:00
parent e2367e8fcb
commit a93fbc5951
5 changed files with 244 additions and 17 deletions

View File

@ -27,6 +27,7 @@
#include <AppDefs.h> #include <AppDefs.h>
#include <PortMessage.h> #include <PortMessage.h>
#include <Entry.h> #include <Entry.h>
#include <Path.h>
#include <Directory.h> #include <Directory.h>
#include <PortMessage.h> #include <PortMessage.h>
#include <PortLink.h> #include <PortLink.h>
@ -155,6 +156,7 @@ AppServer::AppServer(void)
_active_app=-1; _active_app=-1;
_p_active_app=NULL; _p_active_app=NULL;
decorator_name="Default";
} }
/*! /*!
@ -382,13 +384,24 @@ void AppServer::MainLoop(void)
\param path Path to the decorator to load \param path Path to the decorator to load
\return True if successful, false if not. \return True if successful, false if not.
If the server cannot load the specified decorator, nothing changes. If the server cannot load the specified decorator, nothing changes. Passing a
NULL string to this function sets the decorator to the internal one.
*/ */
bool AppServer::LoadDecorator(const char *path) bool AppServer::LoadDecorator(const char *path)
{ {
// Loads a window decorator based on the supplied path and forces a decorator update. // Loads a window decorator based on the supplied path and forces a decorator update.
// If it cannot load the specified decorator, it will retain the current one and // If it cannot load the specified decorator, it will retain the current one and
// return false. // return false. Note that passing a NULL string to this function sets the decorator
// to the internal one.
// passing the string "Default" will set the window decorator to the app_server's
// internal one
if(!path)
{
make_decorator=NULL;
return true;
}
create_decorator *pcreatefunc=NULL; create_decorator *pcreatefunc=NULL;
status_t stat; status_t stat;
image_id addon; image_id addon;
@ -410,6 +423,9 @@ bool AppServer::LoadDecorator(const char *path)
return false; return false;
} }
BPath temppath(path);
decorator_name=temppath.Leaf();
acquire_sem(_decor_lock); acquire_sem(_decor_lock);
make_decorator=pcreatefunc; make_decorator=pcreatefunc;
_decorator_id=addon; _decorator_id=addon;
@ -596,33 +612,88 @@ void AppServer::DispatchMessage(PortMessage *msg)
} }
case AS_SET_UI_COLORS: case AS_SET_UI_COLORS:
{ {
// TODO: Unpack the colors and set the color set to such // Client application is asking to set all the system colors at once
printf("AppServer::AS_SET_UI_COLORS unimplemented\n"); // using a ColorSet object
break;
} // Attached data:
case AS_GET_UI_COLOR: // 1) ColorSet new colors to use
{
// TODO: get a partiular UI color and return it to the sender gui_colorset.Lock();
printf("AppServer::AS_GET_UI_COLOR unimplemented\n"); msg->Read<ColorSet>(&gui_colorset);
gui_colorset.Unlock();
Broadcast(AS_UPDATE_COLORS);
break; break;
} }
case AS_SET_DECORATOR: case AS_SET_DECORATOR:
{ {
// TODO: set up window decorator notification stuff here // Received from an application when the user wants to set the window
printf("AppServer::AS_SET_DECORATOR unimplemented\n"); // decorator to a new one
// Attached Data:
// char * name of the decorator in the decorators path to use
char *decname;
msg->ReadString(&decname);
if(decname)
{
if(strcmp(decname,"Default")!=0)
{
BString decpath;
decpath.SetTo(DECORATORS_DIR);
decpath+=decname;
if(LoadDecorator(decpath.String()))
Broadcast(AS_UPDATE_DECORATOR);
}
else
{
LoadDecorator(NULL);
Broadcast(AS_UPDATE_DECORATOR);
}
}
delete decname;
break; break;
} }
case AS_GET_DECORATOR: case AS_GET_DECORATOR:
{ {
// TODO: get window decorator and return it to the sender // TODO: get window decorator's name and return it to the sender
printf("AppServer::AS_GET_DECORATOR unimplemented\n"); // Attached Data:
// 1) port_id reply port
port_id replyport;
msg->Read<port_id>(&replyport);
PortLink replylink(replyport);
replylink.SetOpCode(AS_GET_DECORATOR);
replylink.AttachString(decorator_name.String());
replylink.Flush();
break; break;
} }
case AS_R5_SET_DECORATOR: case AS_R5_SET_DECORATOR:
{ {
// TODO: Implement. This will translate the codes to names of the // Sort of supports Tracker's nifty Easter Egg. It was easy to do and
// decorators and perform the same actions as AS_SET_DECORATOR // it's kind of neat, so why not?
// Attached Data:
// char * name of the decorator in the decorators path to use
printf("AppServer::AS_R5_SET_DECORATOR unimplemented\n"); printf("AppServer::AS_R5_SET_DECORATOR unimplemented\n");
int32 decindex;
msg->Read<int32>(&decindex);
BString decpath;
decpath.SetTo(DECORATORS_DIR);
switch(decindex)
{
case 0: decpath+="BeOS"; break;
case 1: decpath+="AmigaOS"; break;
case 2: decpath+="Windows"; break;
case 3: decpath+="MacOS"; break;
default:
break;
}
if(LoadDecorator(decpath.String()))
Broadcast(AS_UPDATE_DECORATOR);
break; break;
} }
case AS_GET_SCREEN_MODE: case AS_GET_SCREEN_MODE:

View File

@ -7,6 +7,7 @@
#include <Application.h> #include <Application.h>
#include <Window.h> #include <Window.h>
#include <PortQueue.h> #include <PortQueue.h>
#include <String.h>
#include "Decorator.h" #include "Decorator.h"
#include "ServerConfig.h" #include "ServerConfig.h"
@ -53,6 +54,7 @@ private:
port_id _messageport,_mouseport; port_id _messageport,_mouseport;
image_id _decorator_id; image_id _decorator_id;
BString decorator_name;
bool _quitting_server; bool _quitting_server;
BList *_applist; BList *_applist;
int32 _active_app; int32 _active_app;

View File

@ -26,6 +26,7 @@
// //
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------
#include <stdio.h> #include <stdio.h>
#include <InterfaceDefs.h>
#include <Message.h> #include <Message.h>
#include <File.h> #include <File.h>
#include <Entry.h> #include <Entry.h>
@ -412,6 +413,148 @@ RGBColor *ColorSet::StringToMember(const char *string)
} }
RGBColor ColorSet::AttributeToColor(int32 which)
{
switch(which)
{
case B_PANEL_BACKGROUND_COLOR:
{
return panel_background;
break;
}
case B_PANEL_TEXT_COLOR:
{
return panel_text;
break;
}
case B_DOCUMENT_BACKGROUND_COLOR:
{
return document_background;
break;
}
case B_DOCUMENT_TEXT_COLOR:
{
return document_text;
break;
}
case B_CONTROL_BACKGROUND_COLOR:
{
return control_background;
break;
}
case B_CONTROL_TEXT_COLOR:
{
return control_text;
break;
}
case B_CONTROL_BORDER_COLOR:
{
return control_highlight;
break;
}
case B_CONTROL_HIGHLIGHT_COLOR:
{
return control_border;
break;
}
case B_NAVIGATION_BASE_COLOR:
{
return keyboard_navigation_base;
break;
}
case B_NAVIGATION_PULSE_COLOR:
{
return keyboard_navigation_pulse;
break;
}
case B_SHINE_COLOR:
{
return shine;
break;
}
case B_SHADOW_COLOR:
{
return shadow;
break;
}
case B_MENU_BACKGROUND_COLOR:
{
return menu_background;
break;
}
case B_MENU_SELECTED_BACKGROUND_COLOR:
{
return menu_selected_background;
break;
}
case B_MENU_ITEM_TEXT_COLOR:
{
return menu_text;
break;
}
case B_MENU_SELECTED_ITEM_TEXT_COLOR:
{
return menu_selected_text;
break;
}
case B_MENU_SELECTED_BORDER_COLOR:
{
return menu_selected_border;
break;
}
case B_TOOLTIP_BACKGROUND_COLOR:
{
return tooltip_background;
break;
}
case B_TOOLTIP_TEXT_COLOR:
{
return tooltip_text;
break;
}
case B_SUCCESS_COLOR:
{
return success;
break;
}
case B_FAILURE_COLOR:
{
return failure;
break;
}
case B_WINDOW_TAB_COLOR:
{
return window_tab;
break;
}
// DANGER! DANGER, WILL ROBINSON!!
// These are magic numbers to work around compatibility difficulties while still keeping
// functionality. This __will__ break following R1
case 22:
{
return window_tab_text;
break;
}
case 23:
{
return inactive_window_tab;
break;
}
case 24:
{
return inactive_window_tab_text;
break;
}
default:
{
return RGBColor(0,0,0,0);
break;
}
}
}
/*! /*!
\brief Loads the saved system colors into a ColorSet \brief Loads the saved system colors into a ColorSet
\param set the set to receive the system colors \param set the set to receive the system colors
@ -465,3 +608,4 @@ void SaveGUIColors(const ColorSet &set)
msg.Flatten(&file); msg.Flatten(&file);
} }

View File

@ -743,6 +743,12 @@ void ServerApp::_DispatchMessage(PortMessage *msg)
replysession.Sync(); replysession.Sync();
break; break;
} }
case AS_GET_UI_COLOR:
{
// TODO: get a partiular UI color and return it to the sender
printf("ServerApp::AS_GET_UI_COLOR unimplemented\n");
break;
}
default: default:
{ {
STRACE(("ServerApp %s received unhandled message code offset %s\n",_signature.String(),MsgCodeToString(msg->Code()))); STRACE(("ServerApp %s received unhandled message code offset %s\n",_signature.String(),MsgCodeToString(msg->Code())));

View File

@ -48,6 +48,10 @@ class Workspace;
class BSession; class BSession;
class Layer; class Layer;
#define AS_UPDATE_DECORATOR 'asud'
#define AS_UPDATE_COLORS 'asuc'
#define AS_UPDATE_FONTS 'asuf'
/*! /*!
\class ServerWindow ServerWindow.h \class ServerWindow ServerWindow.h
\brief Shadow BWindow class \brief Shadow BWindow class