added a input device addon for app_server ViewDriver (R5 only, testing mode)
git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@12488 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
parent
609b465638
commit
2aec91b51e
@ -6,3 +6,4 @@ SubInclude OBOS_TOP src tests servers input msgspy ;
|
||||
SubInclude OBOS_TOP src tests servers input portspy ;
|
||||
SubInclude OBOS_TOP src tests servers input prefs ;
|
||||
SubInclude OBOS_TOP src tests servers input replicant ;
|
||||
SubInclude OBOS_TOP src tests servers input view_input_device ;
|
||||
|
6
src/tests/servers/input/view_input_device/Jamfile
Normal file
6
src/tests/servers/input/view_input_device/Jamfile
Normal file
@ -0,0 +1,6 @@
|
||||
SubDir OBOS_TOP src tests servers input view_input_device ;
|
||||
|
||||
Addon ViewInputDevice : input_server devices : ViewInputDevice.cpp ;
|
||||
LinkSharedOSLibs ViewInputDevice : be <nogrist>input_server <boot!home!config!lib>libopenbeos.so ;
|
||||
|
||||
MakeLocate ViewInputDevice : [ FDirName $(OBOS_TEST_DIR) servers input view_input_device input_server devices ] ;
|
126
src/tests/servers/input/view_input_device/ViewInputDevice.cpp
Normal file
126
src/tests/servers/input/view_input_device/ViewInputDevice.cpp
Normal file
@ -0,0 +1,126 @@
|
||||
//-------------------------------------------------------------------------
|
||||
// Handy InputDevice that queue all events from app_server's ViewHWInterface.
|
||||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Copyright 1999, Be Incorporated. All Rights Reserved.
|
||||
This file may be used under the terms of the Be Sample Code License.
|
||||
*/
|
||||
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
#include <Debug.h>
|
||||
#include <FindDirectory.h>
|
||||
#include <InterfaceDefs.h>
|
||||
#include <Message.h>
|
||||
#include <OS.h>
|
||||
#include <add-ons/input_server/InputServerDevice.h>
|
||||
#include <SupportDefs.h>
|
||||
|
||||
extern "C" _EXPORT BInputServerDevice* instantiate_input_device();
|
||||
|
||||
class ViewInputDevice;
|
||||
|
||||
class ViewInputDevice : public BInputServerDevice {
|
||||
public:
|
||||
ViewInputDevice();
|
||||
virtual ~ViewInputDevice();
|
||||
|
||||
virtual status_t Start(const char *device, void *cookie);
|
||||
virtual status_t Stop(const char *device, void *cookie);
|
||||
|
||||
private:
|
||||
thread_id _Thread;
|
||||
static int32 _StartWatchPort(void *arg);
|
||||
void _WatchPort();
|
||||
port_id _Port;
|
||||
};
|
||||
|
||||
|
||||
BInputServerDevice* instantiate_input_device()
|
||||
{
|
||||
return (new ViewInputDevice());
|
||||
}
|
||||
|
||||
|
||||
ViewInputDevice::ViewInputDevice()
|
||||
: BInputServerDevice()
|
||||
{
|
||||
input_device_ref *device[2];
|
||||
input_device_ref mover = {"ViewInputDevice", B_POINTING_DEVICE, NULL};
|
||||
device[0] = &mover;
|
||||
device[1] = NULL;
|
||||
_Port = -1;
|
||||
|
||||
RegisterDevices(device);
|
||||
}
|
||||
|
||||
|
||||
ViewInputDevice::~ViewInputDevice()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
status_t ViewInputDevice::Start(const char *device, void *cookie)
|
||||
{
|
||||
_Port = find_port("ViewInputDevice");
|
||||
if(_Port < 0) {
|
||||
_sPrintf("ViewInputDevice: find_port error: (0x%x) %s\n",_Port,strerror(_Port));
|
||||
return(_Port);
|
||||
}
|
||||
_Thread = spawn_thread(_StartWatchPort, device, B_REAL_TIME_DISPLAY_PRIORITY+4, this);
|
||||
resume_thread(_Thread);
|
||||
return (B_NO_ERROR);
|
||||
}
|
||||
|
||||
|
||||
status_t ViewInputDevice::Stop(const char *device, void *cookie)
|
||||
{
|
||||
kill_thread(_Thread);
|
||||
_Port = -1;
|
||||
return (B_NO_ERROR);
|
||||
}
|
||||
|
||||
int32 ViewInputDevice::_StartWatchPort(void *arg)
|
||||
{
|
||||
ViewInputDevice *self = (ViewInputDevice*)arg;
|
||||
self->_WatchPort();
|
||||
return (B_NO_ERROR);
|
||||
}
|
||||
|
||||
void ViewInputDevice::_WatchPort()
|
||||
{
|
||||
int32 code;
|
||||
ssize_t length;
|
||||
char *buffer;
|
||||
BMessage *event;
|
||||
status_t err;
|
||||
|
||||
while (true) {
|
||||
// Block until we find the size of the next message
|
||||
length = port_buffer_size(_Port);
|
||||
buffer = (char*)malloc(length);
|
||||
event = NULL;
|
||||
event = new BMessage();
|
||||
err = read_port(_Port, &code, buffer, length);
|
||||
if(err != length) {
|
||||
if(err >= 0) {
|
||||
_sPrintf("ViewInputDevice: failed to read full packet (read %u of %u)\n",err,length);
|
||||
} else {
|
||||
_sPrintf("ViewInputDevice: read_port error: (0x%x) %s\n",err,strerror(err));
|
||||
}
|
||||
} else if ((err = event->Unflatten(buffer)) < 0) {
|
||||
_sPrintf("ViewInputDevice: (0x%x) %s\n",err,strerror(err));
|
||||
} else {
|
||||
EnqueueMessage(event);
|
||||
event = NULL;
|
||||
}
|
||||
free( buffer);
|
||||
if(event!=NULL) {
|
||||
delete(event);
|
||||
event = NULL;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user