VBoxConsoleView.h revision c7a97a05c12bda5a9a857d5d4d910d929fe9709e
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/** @file
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * VBox frontends: Qt GUI ("VirtualBox"):
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * VBoxConsoleView class declaration
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri/*
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * Copyright (C) 2006 InnoTek Systemberatung GmbH
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * This file is part of VirtualBox Open Source Edition (OSE), as
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * available from http://www.virtualbox.org. This file is free software;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * you can redistribute it and/or modify it under the terms of the GNU
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * General Public License as published by the Free Software Foundation,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * in version 2 as it comes in the "COPYING" file of the VirtualBox OSE
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * distribution. VirtualBox OSE is distributed in the hope that it will
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * be useful, but WITHOUT ANY WARRANTY of any kind.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri *
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * If you received this file as part of a commercial VirtualBox
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * distribution, then only the terms of your commercial VirtualBox
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri * license agreement apply instead of the previous paragraph.
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri */
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#ifndef __VBoxConsoleView_h__
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#define __VBoxConsoleView_h__
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include "COMDefs.h"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include "VBoxDefs.h"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include "VMGlobalSettings.h"
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <qdatetime.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <qscrollview.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <qpixmap.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <qimage.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#include <qkeysequence.h>
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriclass VBoxConsoleWnd;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriclass MousePointerChangeEvent;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriclass VBoxFrameBuffer;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriclass QPainter;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriclass QLabel;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriclass QMenuData;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriclass VBoxConsoleView : public QScrollView
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri{
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri Q_OBJECT
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiripublic:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri enum {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MouseCaptured = 0x01,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MouseAbsolute = 0x02,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MouseAbsoluteDisabled = 0x04,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri MouseNeedsHostCursor = 0x08,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri KeyboardCaptured = 0x01,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri HostKeyPressed = 0x02,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri };
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri VBoxConsoleView (VBoxConsoleWnd *mainWnd,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri const CConsole &console,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri VBoxDefs::RenderMode rm,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri QWidget *parent = 0, const char *name = 0, WFlags f = 0);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ~VBoxConsoleView();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri QSize sizeHint() const;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void attach();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void detach();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void refresh() { doRefresh(); }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void normalizeGeometry (bool adjustPosition = false);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri CConsole &console() { return cconsole; }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool pause (bool on);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void setMouseIntegrationEnabled (bool enabled);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool isMouseAbsolute() const { return mouse_absolute; }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void setAutoresizeGuest (bool on);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void onFullscreenChange (bool on);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void FixModifierState (LONG *codes, uint *count);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagirisignals:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void keyboardStateChanged (int state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void mouseStateChanged (int state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void machineStateChanged (CEnums::MachineState state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriprotected:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri // events
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool event( QEvent *e );
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool eventFilter( QObject *watched, QEvent *e );
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#if defined(Q_WS_WIN32)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool winLowKeyboardEvent (UINT msg, const KBDLLHOOKSTRUCT &event);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool winEvent (MSG *msg);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#elif defined(Q_WS_X11)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool x11Event (XEvent *event );
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriprivate:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri // flags for keyEvent()
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri enum {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri KeyExtended = 0x01,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri KeyPressed = 0x02,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri KeyPause = 0x04,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri KeyPrint = 0x08,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri };
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void focusEvent (bool focus);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool keyEvent (int key, uint8_t scan, int flags);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool mouseEvent (int aType, const QPoint &aPos, const QPoint &aGlobalPos,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ButtonState aButton,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri ButtonState aState, ButtonState aStateAfter,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int aWheelDelta, Orientation aWheelDir);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void emitKeyboardStateChanged() {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri emit keyboardStateChanged (
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (kbd_captured ? KeyboardCaptured : 0) |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (hostkey_pressed ? HostKeyPressed : 0));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void emitMouseStateChanged() {
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri emit mouseStateChanged ((mouse_captured ? MouseCaptured : 0) |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (mouse_absolute ? MouseAbsolute : 0) |
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri (!mouse_integration ? MouseAbsoluteDisabled : 0));
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri // IConsoleCallback event handlers
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void onStateChange (CEnums::MachineState state);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void doRefresh();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void viewportPaintEvent( QPaintEvent * );
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#ifdef VBOX_GUI_USE_REFRESH_TIMER
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void timerEvent( QTimerEvent * );
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void captureKbd (bool capture, bool emit_signal = true);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void captureMouse (bool capture, bool emit_signal = true);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool processHotKey (const QKeySequence &key, QMenuData *data);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void updateModifiers (bool fNumLock, bool fCapsLock, bool fScrollLock);
c1f8b08e52d9b30bd55daeac694e3a7f50d3cd21agiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void releaseAllKeysPressed (bool release_hostkey = true);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void saveKeyStates();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void sendChangedKeyStates();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void updateMouseClipping();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void setPointerShape (MousePointerChangeEvent *me);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool isPaused() { return last_state == CEnums::Paused; }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool isRunning() { return last_state == CEnums::Running; }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri static void dimImage (QImage &img);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriprivate slots:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void doResizeHint();
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri void normalizeGeo() { normalizeGeometry(); }
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiriprivate:
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri VBoxConsoleWnd *mainwnd;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri CConsole cconsole;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri const VMGlobalSettings &gs;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala CEnums::MachineState last_state;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala bool attached : 1;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala bool kbd_captured : 1;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala bool mouse_captured : 1;
00a3eaf3896a33935e11fd5c5fb5c1714225c067Ramaswamy Tummala bool mouse_absolute : 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool mouse_integration : 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri QPoint last_pos;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri QPoint captured_pos;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri enum { IsKeyPressed = 0x01, IsExtKeyPressed = 0x02, IsKbdCaptured = 0x80 };
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint8_t keys_pressed[128];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri uint8_t keys_pressed_copy[128];
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool hostkey_pressed : 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool hostkey_alone : 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri /** kbd_captured value during the the last host key press or release */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool hostkey_in_capture : 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool ignore_mainwnd_resize : 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool autoresize_guest : 1;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool mfNumLock;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool mfScrollLock;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri bool mfCapsLock;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri long muNumLockAdaptionCnt;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri long muCapsLockAdaptionCnt;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri QTimer *resize_hint_timer;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri VBoxDefs::RenderMode mode;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#if defined (VBOX_GUI_USE_REFRESH_TIMER)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri QPixmap pm;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri int tid; /**< Timer id */
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri VBoxFrameBuffer *fb;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri CConsoleCallback callback;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri friend class VBoxConsoleCallback;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#if defined (Q_WS_WIN32)
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri static LRESULT CALLBACK lowLevelKeyboardProc (int nCode,
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri WPARAM wParam, LPARAM lParam);
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri QPixmap mPausedShot;
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri};
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri#endif // __VBoxConsoleView_h__
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri
b86efd96f8acd85ddaa930a2f0c1d664237e4aafagiri