changes submitted by Christopher ML Zumwalt May

git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2357 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
beveloper
2003-01-06 02:19:29 +00:00
parent 835140c89a
commit de613a80e7
2 changed files with 574 additions and 463 deletions
+94 -100
View File
@@ -1,23 +1,46 @@
/******************************************************************************* //------------------------------------------------------------------------------
// Copyright (c) 2001-2002, OpenBeOS
// //
// File: DirectWindow.h // Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
// //
// Description: Client window class for direct screen access. // The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
// //
// Copyright 1998, Be Incorporated, All Rights Reserved. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
// //
*******************************************************************************/ // File Name: DirectWindow.h
// Author: Christopher ML Zumwalt May ([email protected])
// Description: BFileGameSound allow the developer to directly draw to the
// app_server's frame buffer.
//------------------------------------------------------------------------------
#ifndef _DIRECTWINDOW_H
#define _DIRECTWINDOW_H
#ifndef _DIRECT_WINDOW_H // Standard Includes -----------------------------------------------------------
#define _DIRECT_WINDOW_H
// System Includes -------------------------------------------------------------
#include <Region.h> #include <Region.h>
#include <Window.h> #include <Window.h>
class BDirectDriver; // Project Includes ------------------------------------------------------------
/* State of the direct access when called back through DirectConnected */ // Local Includes --------------------------------------------------------------
// Local Defines ---------------------------------------------------------------
// Globals ---------------------------------------------------------------------
enum direct_buffer_state { enum direct_buffer_state {
B_DIRECT_MODE_MASK = 15, B_DIRECT_MODE_MASK = 15,
@@ -31,16 +54,11 @@ enum direct_buffer_state {
B_BUFFER_RESET = 128 B_BUFFER_RESET = 128
}; };
/* State of the direct driver and its hooks functions */
enum direct_driver_state { enum direct_driver_state {
B_DRIVER_CHANGED = 0x0001, B_DRIVER_CHANGED = 0x0001,
B_MODE_CHANGED = 0x0002 B_MODE_CHANGED = 0x0002
}; };
/* Integer rect used to define a cliping rectangle. All bounds are included */
/* Moved to Region.h */
/* Frame buffer access descriptor */
typedef struct { typedef struct {
direct_buffer_state buffer_state; direct_buffer_state buffer_state;
direct_driver_state driver_state; direct_driver_state driver_state;
@@ -60,114 +78,90 @@ typedef struct {
clipping_rect clip_list[1]; clipping_rect clip_list[1];
} direct_buffer_info; } direct_buffer_info;
/* BDirectWindow class */ // PushGameSound ---------------------------------------------------------------
class BDirectWindow : public BWindow { class BDirectWindow : public BWindow
{
public: public:
BDirectWindow( BRect frame, BDirectWindow(BRect frame,
const char *title, const char *title,
window_type type, window_type type,
uint32 flags, uint32 flags,
uint32 workspace = B_CURRENT_WORKSPACE); uint32 workspace = B_CURRENT_WORKSPACE);
BDirectWindow( BRect frame, BDirectWindow(BRect frame,
const char *title, const char *title,
window_look look, window_look look,
window_feel feel, window_feel feel,
uint32 flags, uint32 flags,
uint32 workspace = B_CURRENT_WORKSPACE); uint32 workspace = B_CURRENT_WORKSPACE);
virtual ~BDirectWindow(); virtual ~BDirectWindow();
static BArchivable *Instantiate(BMessage *data);
virtual status_t Archive(BMessage *data, bool deep = true) const;
/* defined for future extension (fragile base class). Identical to BWindow */ static BArchivable *Instantiate(BMessage *data);
virtual void Quit(void); virtual status_t Archive(BMessage *data, bool deep = true) const;
virtual void DispatchMessage(BMessage *message, BHandler *handler); virtual void Quit(void);
virtual void MessageReceived(BMessage *message); virtual void DispatchMessage(BMessage *message, BHandler *handler);
virtual void FrameMoved(BPoint new_position); virtual void MessageReceived(BMessage *message);
virtual void WorkspacesChanged(uint32 old_ws, uint32 new_ws); virtual void FrameMoved(BPoint new_position);
virtual void WorkspaceActivated(int32 ws, bool state); virtual void WorkspacesChanged(uint32 old_ws, uint32 new_ws);
virtual void FrameResized(float new_width, float new_height); virtual void WorkspaceActivated(int32 ws, bool state);
virtual void Minimize(bool minimize); virtual void FrameResized(float new_width, float new_height);
virtual void Zoom( BPoint rec_position, virtual void Minimize(bool minimize);
virtual void Zoom(BPoint rec_position,
float rec_width, float rec_width,
float rec_height); float rec_height);
virtual void ScreenChanged(BRect screen_size, color_space depth); virtual void ScreenChanged(BRect screen_size, color_space depth);
virtual void MenusBeginning(); virtual void MenusBeginning();
virtual void MenusEnded(); virtual void MenusEnded();
virtual void WindowActivated(bool state); virtual void WindowActivated(bool state);
virtual void Show(); virtual void Show();
virtual void Hide(); virtual void Hide();
virtual BHandler *ResolveSpecifier(BMessage *msg, virtual BHandler *ResolveSpecifier(BMessage *msg,
int32 index, int32 index,
BMessage *specifier, BMessage *specifier,
int32 form, int32 form,
const char *property); const char *property);
virtual status_t GetSupportedSuites(BMessage *data); virtual status_t GetSupportedSuites(BMessage *data);
virtual status_t Perform(perform_code d, void *arg); virtual status_t Perform(perform_code d, void *arg);
private: private:
virtual void task_looper(); virtual void _ReservedDirectWindow1();
virtual BMessage *ConvertToMessage(void *raw, int32 code); virtual void _ReservedDirectWindow2();
/* new APIs */
public: public:
virtual void DirectConnected(direct_buffer_info *info); // BDirectWindow API
status_t GetClippingRegion(BRegion *region, BPoint *origin = NULL) const; virtual void DirectConnected(direct_buffer_info *info);
status_t SetFullScreen(bool enable); status_t GetClippingRegion(BRegion *region, BPoint *origin = NULL) const;
bool IsFullScreen() const; status_t SetFullScreen(bool enable);
bool IsFullScreen() const;
static bool SupportsWindowMode(screen_id = B_MAIN_SCREEN_ID); static bool SupportsWindowMode(screen_id = B_MAIN_SCREEN_ID);
/* private */
private: private:
typedef BWindow inherited; typedef BWindow inherited;
virtual void _ReservedDirectWindow1(); virtual void _ReservedDirectWindow3();
virtual void _ReservedDirectWindow2(); virtual void _ReservedDirectWindow4();
virtual void _ReservedDirectWindow3(); virtual void _ReservedDirectWindow5();
virtual void _ReservedDirectWindow4(); virtual void _ReservedDirectWindow6();
BDirectWindow();
BDirectWindow(BDirectWindow &);
BDirectWindow &operator=(BDirectWindow &);
BDirectWindow(); void InitData(BRect frame);
BDirectWindow(BDirectWindow &);
BDirectWindow &operator=(BDirectWindow &);
bool deamon_killer; void DoDirectConnected();
bool connection_enable; void Connect();
bool full_screen_enable; void Disconnect();
bool direct_driver_ready;
bool in_direct_connect;
int32 direct_lock;
sem_id direct_sem;
uint32 direct_lock_count;
thread_id direct_lock_owner;
char *direct_lock_stack;
sem_id disable_sem;
sem_id disable_sem_ack;
uint32 dw_init_status;
uint32 info_area_size;
uint32 direct_driver_type;
uint32 direct_driver_token;
area_id cloned_clipping_area;
area_id source_clipping_area;
thread_id direct_deamon_id;
direct_buffer_info *buffer_desc;
BDirectDriver *direct_driver;
struct priv_ext *extension;
uint32 _reserved_[15];
static int32 DirectDeamonFunc(void *arg); void CreateClippingList();
bool LockDirect() const; void GetFrameBuffer();
void UnlockDirect() const;
void InitData(); bool fIsFullScreen;
void DisposeData(); bool fIsConnected;
status_t DriverSetup() const; direct_buffer_info *fBufferInfo;
uint32 _reserved_[31];
}; };
#endif #endif
+158 -41
View File
@@ -1,17 +1,44 @@
/* //------------------------------------------------------------------------------
* Copyright 2002, Marcus Overhagen. All rights reserved. // Copyright (c) 2001-2002, OpenBeOS
* Distributed under the terms of the MIT License. //
*/ // Permission is hereby granted, free of charge, to any person obtaining a
// copy of this software and associated documentation files (the "Software"),
// to deal in the Software without restriction, including without limitation
// the rights to use, copy, modify, merge, publish, distribute, sublicense,
// and/or sell copies of the Software, and to permit persons to whom the
// Software is furnished to do so, subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
// DEALINGS IN THE SOFTWARE.
//
// File Name: DirectWindow.cpp
// Author: Christopher ML Zumwalt May ([email protected])
// Description: BFileGameSound allow the developer to directly draw to the
// app_server's frame buffer.
//------------------------------------------------------------------------------
#include <DirectWindow.h> #include <memory.h>
#include "DirectWindow.h"
BDirectWindow::BDirectWindow(BRect frame, BDirectWindow::BDirectWindow(BRect frame,
const char *title, const char *title,
window_type type, window_type type,
uint32 flags, uint32 flags,
uint32 workspace) uint32 workspace)
: BWindow(frame, title, type, flags, workspace) : BWindow(frame, title, type, flags, workspace),
fIsFullScreen(false),
fIsConnected(false)
{ {
InitData(frame);
} }
@@ -21,15 +48,24 @@ BDirectWindow::BDirectWindow(BRect frame,
window_feel feel, window_feel feel,
uint32 flags, uint32 flags,
uint32 workspace) uint32 workspace)
: BWindow(frame, title, look, feel, flags, workspace) : BWindow(frame, title, look, feel, flags, workspace),
fIsFullScreen(false),
fIsConnected(false)
{ {
InitData(frame);
} }
BDirectWindow::~BDirectWindow() BDirectWindow::~BDirectWindow()
{ {
} if (fIsConnected)
{
fBufferInfo->buffer_state = B_DIRECT_STOP;
DoDirectConnected();
}
delete fBufferInfo;
}
BArchivable * BArchivable *
BDirectWindow::Instantiate(BMessage *data) BDirectWindow::Instantiate(BMessage *data)
@@ -49,6 +85,9 @@ BDirectWindow::Archive(BMessage *data,
void void
BDirectWindow::Quit(void) BDirectWindow::Quit(void)
{ {
if (fIsConnected) Disconnect();
BWindow::Quit();
} }
@@ -56,18 +95,32 @@ void
BDirectWindow::DispatchMessage(BMessage *message, BDirectWindow::DispatchMessage(BMessage *message,
BHandler *handler) BHandler *handler)
{ {
BWindow::DispatchMessage(message, handler);
} }
void void
BDirectWindow::MessageReceived(BMessage *message) BDirectWindow::MessageReceived(BMessage *message)
{ {
BWindow::MessageReceived(message);
} }
void void
BDirectWindow::FrameMoved(BPoint new_position) BDirectWindow::FrameMoved(BPoint new_position)
{ {
clipping_rect * bounds = &fBufferInfo->window_bounds;
int32 dx = int32(new_position.x - bounds->left);
int32 dy = int32(new_position.y - bounds->top);
bounds->top += dy;
bounds->left += dx;
bounds->right += dx;
bounds->bottom += dy;
fBufferInfo->buffer_state = direct_buffer_state(B_DIRECT_MODIFY | B_BUFFER_MOVED);
DoDirectConnected();
} }
@@ -82,6 +135,10 @@ void
BDirectWindow::WorkspaceActivated(int32 ws, BDirectWindow::WorkspaceActivated(int32 ws,
bool state) bool state)
{ {
if (state)
Connect();
else
Disconnect();
} }
@@ -89,12 +146,29 @@ void
BDirectWindow::FrameResized(float new_width, BDirectWindow::FrameResized(float new_width,
float new_height) float new_height)
{ {
clipping_rect * bounds = &fBufferInfo->window_bounds;
bounds->right = int32(bounds->left + new_width);
bounds->bottom = int32(bounds->top + new_height);
fBufferInfo->buffer_state = direct_buffer_state(B_DIRECT_MODIFY | B_BUFFER_RESIZED);
DoDirectConnected();
} }
void void
BDirectWindow::Minimize(bool minimize) BDirectWindow::Minimize(bool minimize)
{ {
if (minimize)
{
Disconnect();
BWindow::Minimize(false);
}
else
{
BWindow::Minimize(true);
Connect();
}
} }
@@ -103,6 +177,7 @@ BDirectWindow::Zoom(BPoint rec_position,
float rec_width, float rec_width,
float rec_height) float rec_height)
{ {
BWindow::Zoom(rec_position, rec_width, rec_height);
} }
@@ -110,6 +185,18 @@ void
BDirectWindow::ScreenChanged(BRect screen_size, BDirectWindow::ScreenChanged(BRect screen_size,
color_space depth) color_space depth)
{ {
direct_buffer_state state = B_DIRECT_MODIFY;
if (fIsConnected && fIsFullScreen)
{
ResizeTo(screen_size.right, screen_size.bottom);
state = direct_buffer_state(state | B_BUFFER_RESIZED);
}
GetFrameBuffer();
fBufferInfo->buffer_state = direct_buffer_state(state | B_BUFFER_RESET);
DoDirectConnected();
} }
@@ -128,18 +215,25 @@ BDirectWindow::MenusEnded()
void void
BDirectWindow::WindowActivated(bool state) BDirectWindow::WindowActivated(bool state)
{ {
CreateClippingList();
} }
void void
BDirectWindow::Show() BDirectWindow::Show()
{ {
BWindow::Show();
Connect();
} }
void void
BDirectWindow::Hide() BDirectWindow::Hide()
{ {
Disconnect();
BWindow::Hide();
} }
@@ -169,18 +263,12 @@ BDirectWindow::Perform(perform_code d,
} }
void //BMessage *
BDirectWindow::task_looper() //BDirectWindow::ConvertToMessage(void *raw,
{ // int32 code)
} //{
// return NULL;
//}
BMessage *
BDirectWindow::ConvertToMessage(void *raw,
int32 code)
{
return NULL;
}
void void
@@ -207,14 +295,14 @@ BDirectWindow::SetFullScreen(bool enable)
bool bool
BDirectWindow::IsFullScreen() const BDirectWindow::IsFullScreen() const
{ {
return false; return fIsFullScreen;
} }
bool bool
BDirectWindow::SupportsWindowMode(screen_id) BDirectWindow::SupportsWindowMode(screen_id)
{ {
return false; return true;
} }
@@ -242,6 +330,18 @@ BDirectWindow::_ReservedDirectWindow4()
} }
void
BDirectWindow::_ReservedDirectWindow5()
{
}
void
BDirectWindow::_ReservedDirectWindow6()
{
}
/* unimplemented for protection of the user: /* unimplemented for protection of the user:
* *
* BDirectWindow::BDirectWindow() * BDirectWindow::BDirectWindow()
@@ -249,42 +349,59 @@ BDirectWindow::_ReservedDirectWindow4()
* BDirectWindow &BDirectWindow::operator=(BDirectWindow &) * BDirectWindow &BDirectWindow::operator=(BDirectWindow &)
*/ */
int32
BDirectWindow::DirectDeamonFunc(void *arg)
{
return 0;
}
void
bool BDirectWindow::InitData(BRect frame)
BDirectWindow::LockDirect() const
{ {
return false; fBufferInfo = new direct_buffer_info;
memset(fBufferInfo, 0, sizeof(direct_buffer_info));
fBufferInfo->window_bounds.top = int32(frame.top);
fBufferInfo->window_bounds.left = int32(frame.left);
fBufferInfo->window_bounds.right = int32(frame.right);
fBufferInfo->window_bounds.bottom = int32(frame.bottom);
GetFrameBuffer();
} }
void void
BDirectWindow::UnlockDirect() const BDirectWindow::DoDirectConnected()
{ {
} if (fIsConnected)
{
direct_buffer_info * info = new direct_buffer_info;
memcpy(info, fBufferInfo, sizeof(direct_buffer_info));
DirectConnected(info);
delete info;
}
}
void void
BDirectWindow::InitData() BDirectWindow::Connect()
{ {
fIsConnected = true;
fBufferInfo->buffer_state = B_DIRECT_START;
DoDirectConnected();
} }
void void
BDirectWindow::DisposeData() BDirectWindow::Disconnect()
{
fBufferInfo->buffer_state = B_DIRECT_STOP;
DoDirectConnected();
fIsConnected = false;
}
void
BDirectWindow::CreateClippingList()
{ {
} }
void
status_t BDirectWindow::GetFrameBuffer()
BDirectWindow::DriverSetup() const
{ {
return B_ERROR;
} }