1/*****************************************************************************/ 2// Haiku InputServer 3// 4// This is the InputServerMethod implementation 5// 6// This application and all source files used in its construction, except 7// where noted, are licensed under the MIT License, and have been written 8// and are: 9// 10// Copyright (c) 2002-2004 Haiku Project 11// 12// Permission is hereby granted, free of charge, to any person obtaining a 13// copy of this software and associated documentation files (the "Software"), 14// to deal in the Software without restriction, including without limitation 15// the rights to use, copy, modify, merge, publish, distribute, sublicense, 16// and/or sell copies of the Software, and to permit persons to whom the 17// Software is furnished to do so, subject to the following conditions: 18// 19// The above copyright notice and this permission notice shall be included 20// in all copies or substantial portions of the Software. 21// 22// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 23// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 24// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 25// THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 26// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 27// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 28// DEALINGS IN THE SOFTWARE. 29/*****************************************************************************/ 30 31#include <InputServerMethod.h> 32#include <Menu.h> 33#include <Messenger.h> 34#include "InputServer.h" 35#include "InputServerTypes.h" 36#include "remote_icon.h" 37/** 38 * Method: BInputServerMethod::BInputServerMethod() 39 * Descr: 40 */ 41BInputServerMethod::BInputServerMethod(const char *name, 42 const uchar *icon) 43{ 44 CALLED(); 45 fOwner = new _BMethodAddOn_(this, name, icon); 46} 47 48 49/** 50 * Method: BInputServerMethod::~BInputServerMethod() 51 * Descr: 52 */ 53BInputServerMethod::~BInputServerMethod() 54{ 55 CALLED(); 56 delete fOwner; 57} 58 59 60/** 61 * Method: BInputServerMethod::MethodActivated() 62 * Descr: 63 */ 64status_t 65BInputServerMethod::MethodActivated(bool active) 66{ 67 return B_OK; 68} 69 70 71/** 72 * Method: BInputServerMethod::EnqueueMessage() 73 * Descr: 74 */ 75status_t 76BInputServerMethod::EnqueueMessage(BMessage *message) 77{ 78 return ((InputServer*)be_app)->EnqueueMethodMessage(message); 79} 80 81 82/** 83 * Method: BInputServerMethod::SetName() 84 * Descr: 85 */ 86status_t 87BInputServerMethod::SetName(const char *name) 88{ 89 return fOwner->SetName(name); 90} 91 92 93/** 94 * Method: BInputServerMethod::SetIcon() 95 * Descr: 96 */ 97status_t 98BInputServerMethod::SetIcon(const uchar *icon) 99{ 100 return fOwner->SetIcon(icon); 101} 102 103 104/** 105 * Method: BInputServerMethod::SetMenu() 106 * Descr: 107 */ 108status_t 109BInputServerMethod::SetMenu(const BMenu *menu, 110 const BMessenger target) 111{ 112 return fOwner->SetMenu(menu, target); 113} 114 115 116/** 117 * Method: BInputServerMethod::_ReservedInputServerMethod1() 118 * Descr: 119 */ 120void 121BInputServerMethod::_ReservedInputServerMethod1() 122{ 123} 124 125 126/** 127 * Method: BInputServerMethod::_ReservedInputServerMethod2() 128 * Descr: 129 */ 130void 131BInputServerMethod::_ReservedInputServerMethod2() 132{ 133} 134 135 136/** 137 * Method: BInputServerMethod::_ReservedInputServerMethod3() 138 * Descr: 139 */ 140void 141BInputServerMethod::_ReservedInputServerMethod3() 142{ 143} 144 145 146/** 147 * Method: BInputServerMethod::_ReservedInputServerMethod4() 148 * Descr: 149 */ 150void 151BInputServerMethod::_ReservedInputServerMethod4() 152{ 153} 154 155 156static int32 sNextMethodCookie = 1; 157 158 159_BMethodAddOn_::_BMethodAddOn_(BInputServerMethod *method, const char *name, 160 const uchar *icon) 161 : fMethod(method), 162 fMenu(NULL), 163 fCookie(sNextMethodCookie++) 164{ 165 fName = strdup(name); 166 if (icon != NULL) 167 memcpy(fIcon, icon, 16*16*1); 168 else 169 memset(fIcon, 0x1d, 16*16*1); 170} 171 172 173_BMethodAddOn_::~_BMethodAddOn_() 174{ 175 free(fName); 176 delete fMenu; 177} 178 179 180status_t 181_BMethodAddOn_::SetName(const char* name) 182{ 183 CALLED(); 184 if (fName) 185 free(fName); 186 if (name) 187 fName = strdup(name); 188 189 BMessage msg(IS_UPDATE_NAME); 190 msg.AddInt32("cookie", fCookie); 191 msg.AddString("name", name); 192 if (((InputServer*)be_app)->MethodReplicant()) 193 return ((InputServer*)be_app)->MethodReplicant()->SendMessage(&msg); 194 else 195 return B_ERROR; 196} 197 198 199status_t 200_BMethodAddOn_::SetIcon(const uchar* icon) 201{ 202 CALLED(); 203 204 if (icon != NULL) 205 memcpy(fIcon, icon, 16*16*1); 206 else 207 memset(fIcon, 0x1d, 16*16*1); 208 209 BMessage msg(IS_UPDATE_ICON); 210 msg.AddInt32("cookie", fCookie); 211 msg.AddData("icon", B_RAW_TYPE, icon, 16*16*1); 212 if (((InputServer*)be_app)->MethodReplicant()) 213 return ((InputServer*)be_app)->MethodReplicant()->SendMessage(&msg); 214 else 215 return B_ERROR; 216} 217 218 219status_t 220_BMethodAddOn_::SetMenu(const BMenu *menu, const BMessenger &messenger) 221{ 222 CALLED(); 223 fMenu = menu; 224 fMessenger = messenger; 225 226 BMessage msg(IS_UPDATE_MENU); 227 msg.AddInt32("cookie", fCookie); 228 BMessage menuMsg; 229 if (menu) 230 menu->Archive(&menuMsg); 231 msg.AddMessage("menu", &menuMsg); 232 msg.AddMessenger("target", messenger); 233 if (((InputServer*)be_app)->MethodReplicant()) 234 return ((InputServer*)be_app)->MethodReplicant()->SendMessage(&msg); 235 else 236 return B_ERROR; 237} 238 239 240status_t 241_BMethodAddOn_::MethodActivated(bool activate) 242{ 243 CALLED(); 244 if (fMethod) { 245 PRINT(("%s cookie %" B_PRId32 "\n", __PRETTY_FUNCTION__, fCookie)); 246 if (activate && ((InputServer*)be_app)->MethodReplicant()) { 247 BMessage msg(IS_UPDATE_METHOD); 248 msg.AddInt32("cookie", fCookie); 249 ((InputServer*)be_app)->MethodReplicant()->SendMessage(&msg); 250 } 251 return fMethod->MethodActivated(activate); 252 } 253 return B_ERROR; 254} 255 256 257status_t 258_BMethodAddOn_::AddMethod() 259{ 260 PRINT(("%s cookie %" B_PRId32 "\n", __PRETTY_FUNCTION__, fCookie)); 261 BMessage msg(IS_ADD_METHOD); 262 msg.AddInt32("cookie", fCookie); 263 msg.AddString("name", fName); 264 msg.AddData("icon", B_RAW_TYPE, fIcon, 16*16*1); 265 BMessage menuMsg; 266 if (fMenu != NULL) 267 fMenu->Archive(&menuMsg); 268 msg.AddMessage("menu", &menuMsg); 269 msg.AddMessenger("target", fMessenger); 270 if (((InputServer*)be_app)->MethodReplicant()) 271 return ((InputServer*)be_app)->MethodReplicant()->SendMessage(&msg); 272 else 273 return B_ERROR; 274} 275 276 277KeymapMethod::KeymapMethod() 278 : BInputServerMethod("Roman", kRemoteBits) 279{ 280 281} 282 283 284KeymapMethod::~KeymapMethod() 285{ 286 287} 288 289