qwindowsystem_qws.h
This is the verbatim text of the qwindowsystem_qws.h include file. It is provided only for illustration; the copyright remains with Trolltech.
/****************************************************************************
** $Id$
**
** Definition of Qt/FB central server classes
**
** Created : 991025
**
** Copyright (C) 1992-2000 Trolltech AS. All rights reserved.
**
** This file is part of the kernel module of the Qt GUI Toolkit.
**
** This file may be distributed and/or modified under the terms of the
** GNU General Public License version 2 as published by the Free Software
** Foundation and appearing in the file LICENSE.GPL included in the
** packaging of this file.
**
** Licensees holding valid Qt Enterprise Edition or Qt Professional Edition
** licenses for Qt/Embedded may use this file in accordance with the
** Qt Embedded Commercial License Agreement provided with the Software.
**
** This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
** WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
**
** See http://www.trolltech.com/pricing.html or email sales@trolltech.com for
** information about Qt Commercial License Agreements.
** See http://www.trolltech.com/gpl/ for GPL licensing information.
**
** Contact info@trolltech.com if any conditions of this licensing are
** not clear to you.
**
**********************************************************************/
#ifndef QTFB_H
#define QTFB_H
#ifndef QT_H
#include <qwssocket_qws.h>
#include <qmap.h>
#include <qdatetime.h>
#include <qptrlist.h>
#include <qimage.h>
#include "qwsproperty_qws.h"
#include "qwscommand_qws.h"
#include "qwsevent_qws.h"
#include "qkeyboard_qws.h"
#endif // QT_H
struct SWCursorData;
class QWSCursor;
class QWSClient;
class QWSRegionManager;
class QGfx;
class QWSServerData;
class QWSInternalWindowInfo
{
public:
int winid;
unsigned int clientid;
QString name; // Corresponds to QObject name of top-level widget
};
struct QWSWindowData;
class QWSScreenSaver
{
public:
virtual ~QWSScreenSaver();
virtual void restore()=0;
virtual bool save(int level)=0;
};
class QWSWindow
{
friend class QWSServer;
public:
QWSWindow(int i, QWSClient* client);
~QWSWindow();
int winId() const { return id; }
const QString &name() const { return rgnName; }
const QString &caption() const { return rgnCaption; }
QWSClient* client() const { return c; }
QRegion requested() const { return requested_region; }
QRegion allocation() const { return allocated_region; }
bool isVisible() const { return !requested_region.isEmpty(); }
bool isPartiallyObscured() const { return requested_region!=allocated_region; }
bool isFullyObscured() const { return allocated_region.isEmpty(); }
void raise();
void lower();
void show();
void hide();
void setActiveWindow();
private:
bool hidden() const { return requested_region.isEmpty(); }
bool forClient(const QWSClient* cl) const { return cl==c; }
void setName( const QString &n );
void setCaption( const QString &c );
void addAllocation( QWSRegionManager *, QRegion );
void removeAllocation( QWSRegionManager *, QRegion );
int allocationIndex() const { return alloc_region_idx; }
void setAllocationIndex( int i ) { alloc_region_idx = i; modified = TRUE; }
void updateAllocation();
void setNeedAck( bool n ) { needAck = n; }
void focus(bool get);
int focusPriority() const { return last_focus_time; }
void operation( QWSWindowOperationEvent::Operation o );
void shuttingDown() { last_focus_time=0; }
private:
int id;
QString rgnName;
QString rgnCaption;
int alloc_region_idx;
bool modified;
bool needAck;
bool onTop;
QWSClient* c;
QRegion requested_region;
QRegion allocated_region;
QRegion exposed;
int last_focus_time;
QWSWindowData *d;
};
#ifndef QT_NO_SOUND
class QWSSoundServer;
#ifdef QT_USE_OLD_QWS_SOUND
class QWSSoundServerData;
class QWSSoundServer : public QObject {
Q_OBJECT
public:
QWSSoundServer(QObject* parent);
~QWSSoundServer();
void playFile(const QString& filename);
private slots:
void feedDevice(int fd);
private:
QWSSoundServerData* d;
};
#endif
#endif
/*********************************************************************
*
* Class: QWSServer
*
*********************************************************************/
class QWSMouseHandler;
struct QWSCommandStruct;
#ifndef QT_NO_QWS_MULTIPROCESS
class QWSServer : public QWSServerSocket
#else
class QWSServer : public QObject
#endif
{
friend class QCopChannel;
friend class QWSMouseHandler;
friend class QWSWindow;
friend class QWSDisplay;
Q_OBJECT
public:
QWSServer( int flags = 0, QObject *parent=0, const char *name=0 );
~QWSServer();
enum ServerFlags { DisableKeyboard = 0x01,
DisableMouse = 0x02 };
enum GUIMode { NoGui = FALSE, NormalGUI = TRUE, Server };
static void sendKeyEvent(int unicode, int keycode, int modifiers, bool isPress,
bool autoRepeat);
static void processKeyEvent(int unicode, int keycode, int modifiers, bool isPress,
bool autoRepeat);
#ifndef QT_NO_QWS_KEYBOARD
typedef struct KeyMap {
ushort key_code;
ushort unicode;
ushort shift_unicode;
ushort ctrl_unicode;
};
static const KeyMap *keyMap();
class KeyboardFilter
{
public:
virtual bool filter(int unicode, int keycode, int modifiers, bool isPress,
bool autoRepeat)=0;
};
static void setKeyboardFilter( KeyboardFilter *f );
#endif
static void setDefaultMouse( const char * );
static void setDefaultKeyboard( const char * );
static void setMaxWindowRect(const QRect&);
static void sendMouseEvent(const QPoint& pos, int state);
static void setDesktopBackground( const QImage &img );
static void setDesktopBackground( const QColor & );
static QWSMouseHandler *mouseHandler();
static void setMouseHandler(QWSMouseHandler*);
#ifndef QT_NO_QWS_KEYBOARD
static QWSKeyboardHandler* keyboardHandler();
static void setKeyboardHandler(QWSKeyboardHandler* kh);
#endif
QWSWindow *windowAt( const QPoint& pos );
// For debugging only at this time
const QPtrList<QWSWindow> &clientWindows() { return windows; }
void openMouse();
void closeMouse();
#ifndef QT_NO_QWS_KEYBOARD
void openKeyboard();
void closeKeyboard();
#endif
static void setScreenSaver(QWSScreenSaver*);
static void setScreenSaverIntervals(int* ms);
static void setScreenSaverInterval(int);
static bool screenSaverActive();
static void screenSaverActivate(bool);
// the following are internal.
void refresh();
#ifndef QT_NO_QWS_REPEATER
void refresh(QRegion &);
#endif
void enablePainting(bool);
static void processEventQueue();
static QPtrList<QWSInternalWindowInfo> * windowList();
void sendPropertyNotifyEvent( int property, int state );
#ifndef QT_NO_QWS_PROPERTIES
QWSPropertyManager *manager() {
return &propertyManager;
}
#endif
static QPoint mousePosition;
static void startup( int flags );
static void closedown();
enum WindowEvent { Create=0x01, Destroy=0x02, Hide=0x04, Show=0x08,
Raise=0x10, Lower=0x20, Geometry=0x40 };
signals:
void windowEvent( QWSWindow *w, QWSServer::WindowEvent e );
#ifndef QT_NO_COP
void newChannel( const QString& );
#endif
private:
#ifndef QT_NO_COP
static void sendQCopEvent( QWSClient *c, const QCString &ch,
const QCString &msg, const QByteArray &data,
bool response = FALSE );
#endif
void move_region( const QWSRegionMoveCommand * );
void set_altitude( const QWSChangeAltitudeCommand * );
void request_focus( const QWSRequestFocusCommand * );
void request_region( int, QRegion );
void destroy_region( const QWSRegionDestroyCommand * );
void name_region( const QWSRegionNameCommand * );
static void emergency_cleanup();
static QColor *bgColor;
static QImage *bgImage;
void sendMaxWindowRectEvents();
#ifndef QT_NO_QWS_MULTIPROCESS
void newConnection( int socket );
#endif
void invokeIdentify( QWSIdentifyCommand *cmd, QWSClient *client );
void invokeCreate( QWSCreateCommand *cmd, QWSClient *client );
void invokeRegionName( const QWSRegionNameCommand *cmd, QWSClient *client );
void invokeRegion( QWSRegionCommand *cmd, QWSClient *client );
void invokeRegionMove( const QWSRegionMoveCommand *cmd, QWSClient *client );
void invokeRegionDestroy( const QWSRegionDestroyCommand *cmd, QWSClient *client );
void invokeSetAltitude( const QWSChangeAltitudeCommand *cmd, QWSClient *client );
#ifndef QT_NO_QWS_PROPERTIES
void invokeAddProperty( QWSAddPropertyCommand *cmd );
void invokeSetProperty( QWSSetPropertyCommand *cmd );
void invokeRemoveProperty( QWSRemovePropertyCommand *cmd );
void invokeGetProperty( QWSGetPropertyCommand *cmd, QWSClient *client );
#endif //QT_NO_QWS_PROPERTIES
void invokeSetSelectionOwner( QWSSetSelectionOwnerCommand *cmd );
void invokeConvertSelection( QWSConvertSelectionCommand *cmd );
void invokeSetFocus( const QWSRequestFocusCommand *cmd, QWSClient *client );
void initIO();
void setFocus( QWSWindow*, bool gain );
#ifndef QT_NO_QWS_CURSOR
void invokeDefineCursor( QWSDefineCursorCommand *cmd, QWSClient *client );
void invokeSelectCursor( QWSSelectCursorCommand *cmd, QWSClient *client );
#endif
void invokeGrabMouse( QWSGrabMouseCommand *cmd, QWSClient *client );
void invokeGrabKeyboard( QWSGrabKeyboardCommand *cmd, QWSClient *client );
#ifndef QT_NO_SOUND
void invokePlaySound( QWSPlaySoundCommand *cmd, QWSClient *client );
#endif
#ifndef QT_NO_COP
void invokeRegisterChannel( QWSQCopRegisterChannelCommand *cmd,
QWSClient *client );
void invokeQCopSend( QWSQCopSendCommand *cmd, QWSClient *client );
#endif
#ifndef QT_NO_QWS_REPEATER
void invokeRepaintRegion( QWSRepaintRegionCommand *cmd,
QWSClient *client );
#endif
QWSMouseHandler* newMouseHandler(const QString& spec);
#ifndef QT_NO_QWS_KEYBOARD
QWSKeyboardHandler* newKeyboardHandler(const QString& spec);
#endif
void openDisplay();
void closeDisplay();
void showCursor();
void hideCursor();
void initializeCursor();
void paintServerRegion();
void paintBackground( QRegion );
void clearRegion( const QRegion &r, const QColor &c );
void refreshBackground();
private slots:
#ifndef QT_NO_QWS_MULTIPROCESS
void clientClosed();
void doClient();
#endif
void screenSaverWake();
void screenSaverSleep();
void screenSaverTimeout();
private:
void screenSave(int level);
void doClient( QWSClient * );
typedef QMapIterator<int,QWSClient*> ClientIterator;
typedef QMap<int,QWSClient*> ClientMap;
void releaseMouse(QWSWindow* w);
void releaseKeyboard(QWSWindow* w);
uchar* sharedram;
int ramlen;
QGfx *gfx;
ClientMap client;
#ifndef QT_NO_QWS_PROPERTIES
QWSPropertyManager propertyManager;
#endif
struct SelectionOwner {
int windowid;
struct Time {
void set( int h, int m, int s, int s2 ) {
hour = h; minute = m; sec = s; ms = s2;
}
int hour, minute, sec, ms;
} time;
} selectionOwner;
QTime timer;
QWSServerData* d;
int* screensaverinterval;
QWSWindow *focusw;
QWSWindow *mouseGrabber;
bool mouseGrabbing;
int swidth, sheight, sdepth;
#ifndef QT_NO_QWS_CURSOR
bool cursorNeedsUpdate;
QWSCursor *cursor; // cursor currently shown
QWSCursor *nextCursor; // cursor to show once grabbing is off
#endif
QRegion screenRegion; // the entire display region
QRegion serverRegion;
QRegion dirtyBackground;
bool disablePainting;
QPtrList<QWSMouseHandler> mousehandlers;
#ifndef QT_NO_QWS_KEYBOARD
QPtrList<QWSKeyboardHandler> keyboardhandlers;
#endif
QPtrList<QWSCommandStruct> commandQueue;
QWSRegionManager *rgnMan;
// Window management
QPtrList<QWSWindow> windows; // first=topmost
QWSWindow* newWindow(int id, QWSClient* client);
QWSWindow* findWindow(int windowid, QWSClient* client);
void moveWindowRegion(QWSWindow*, int dx, int dy );
QRegion setWindowRegion(QWSWindow*, QRegion r );
void raiseWindow( QWSWindow *, int = 0);
void lowerWindow( QWSWindow *, int = -1);
void exposeRegion( QRegion , int index = 0 );
void notifyModified( QWSWindow *active = 0 );
void syncRegions( QWSWindow *active = 0 );
void setCursor(QWSCursor *curs);
// multimedia
#ifndef QT_NO_SOUND
QWSSoundServer *soundserver;
#endif
#ifndef QT_NO_COP
QMap<QString, QPtrList<QWSClient> > channels;
#endif
};
extern QWSServer *qwsServer; //there can be only one
/*********************************************************************
*
* Class: QWSClient
*
*********************************************************************/
struct QWSMouseEvent;
typedef QMap<int, QWSCursor*> QWSCursorMap;
class QWSClient : public QObject
{
Q_OBJECT
public:
QWSClient( QObject* parent, int socket );
~QWSClient();
int socket() const;
void setIdentity(const QString&);
QString identity() const { return id; }
void sendEvent( QWSEvent* event );
void sendConnectedEvent( const char *display_spec );
void sendMaxWindowRectEvent();
void sendRegionModifyEvent( int winid, QRegion exposed, bool ack );
void sendFocusEvent( int winid, bool get );
void sendPropertyNotifyEvent( int property, int state );
void sendPropertyReplyEvent( int property, int len, char *data );
void sendSelectionClearEvent( int windowid );
void sendSelectionRequestEvent( QWSConvertSelectionCommand *cmd, int windowid );
QWSCommand* readMoreCommand();
QWSCursorMap cursors; // cursors defined by this client
signals:
void connectionClosed();
void readyRead();
private slots:
void closeHandler();
void errorHandler( int );
private:
int s; // XXX csocket->d->socket->socket() is this value
#ifndef QT_NO_QWS_MULTIPROCESS
QWSSocket *csocket;
#endif
QWSCommand* command;
uint isClosed : 1;
QString id;
};
#endif