c8ecbefa7f
[GB.QT4] * BUG: Fix focus management so that the focus order is always the stacking order. [GB.QT5] * BUG: Fix focus management so that the focus order is always the stacking order. * BUG: Remove some compilation warnings.
288 lines
6.2 KiB
C++
288 lines
6.2 KiB
C++
/***************************************************************************
|
|
|
|
CWindow.h
|
|
|
|
(c) 2000-2017 Benoît Minisini <g4mba5@gmail.com>
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
GNU General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston,
|
|
MA 02110-1301, USA.
|
|
|
|
***************************************************************************/
|
|
|
|
#ifndef __CWINDOW_H
|
|
#define __CWINDOW_H
|
|
|
|
#include <QMoveEvent>
|
|
#include <QCloseEvent>
|
|
#include <QShowEvent>
|
|
#include <QResizeEvent>
|
|
#include <QKeyEvent>
|
|
#include <QMainWindow>
|
|
#include <QHash>
|
|
#include <QList>
|
|
#include <QMenuBar>
|
|
#include <QEvent>
|
|
#include <QPushButton>
|
|
#include <QSizeGrip>
|
|
#include <QPoint>
|
|
#include <QPointer>
|
|
|
|
#include "gambas.h"
|
|
#include "CContainer.h"
|
|
#include "CMenu.h"
|
|
#include "CPicture.h"
|
|
|
|
//#define DEBUG_WINDOW 1
|
|
|
|
typedef
|
|
struct CWINDOW {
|
|
CWIDGET widget;
|
|
MyContainer *container;
|
|
CARRANGEMENT arrangement;
|
|
QMenuBar *menuBar;
|
|
CPICTURE *icon;
|
|
CPICTURE *picture;
|
|
CWIDGET *focus;
|
|
QPushButton *defaultButton;
|
|
QPushButton *cancelButton;
|
|
int ret;
|
|
int loopLevel;
|
|
|
|
int x;
|
|
int y;
|
|
int w;
|
|
int h;
|
|
int minw;
|
|
int minh;
|
|
int default_minw;
|
|
int default_minh;
|
|
int last_resize_w;
|
|
int last_resize_h;
|
|
|
|
unsigned toplevel : 1;
|
|
unsigned persistent : 1;
|
|
unsigned closed : 1;
|
|
unsigned embedded : 1;
|
|
unsigned xembed : 1;
|
|
unsigned stacking : 2;
|
|
unsigned skipTaskbar : 1;
|
|
|
|
unsigned masked : 1;
|
|
unsigned reallyMasked : 1;
|
|
unsigned opened : 1;
|
|
unsigned hidden : 1;
|
|
unsigned toolbar : 1;
|
|
unsigned minsize : 1;
|
|
unsigned title : 1;
|
|
unsigned stateChange : 1;
|
|
|
|
unsigned closing : 1;
|
|
unsigned hideMenuBar : 1;
|
|
unsigned showMenuBar : 1;
|
|
unsigned sticky : 1;
|
|
unsigned noTakeFocus : 1;
|
|
unsigned moved : 1;
|
|
unsigned resized : 1;
|
|
unsigned popup : 1;
|
|
|
|
unsigned modal : 1;
|
|
}
|
|
CWINDOW;
|
|
|
|
typedef
|
|
struct {
|
|
CWINDOW window;
|
|
}
|
|
CFORM;
|
|
|
|
|
|
#ifndef __CWINDOW_CPP
|
|
|
|
extern GB_DESC CWindowDesc[];
|
|
extern GB_DESC CWindowMenusDesc[];
|
|
extern GB_DESC CWindowControlsDesc[];
|
|
//extern GB_DESC CWindowTypeDesc[];
|
|
extern GB_DESC CWindowsDesc[];
|
|
extern GB_DESC CFormDesc[];
|
|
|
|
extern CWINDOW *CWINDOW_Main;
|
|
extern int CWINDOW_MainDesktop;
|
|
extern CWINDOW *CWINDOW_Current;
|
|
extern CWINDOW *CWINDOW_Active;
|
|
extern CWINDOW *CWINDOW_LastActive;
|
|
#ifndef QT5
|
|
extern int CWINDOW_Embedder;
|
|
extern bool CWINDOW_Embedded;
|
|
#endif
|
|
|
|
#else
|
|
|
|
#define THIS ((CWINDOW *)_object)
|
|
#define WIDGET ((QWidget *)(((CWIDGET *)_object)->widget))
|
|
#define WINDOW ((MyMainWindow *)WIDGET)
|
|
|
|
#ifndef QT5
|
|
#define XEMBED ((QX11EmbedWidget *)(WIDGET->parent()))
|
|
#endif
|
|
|
|
#endif
|
|
|
|
class CWindow : public QObject
|
|
{
|
|
Q_OBJECT
|
|
|
|
public:
|
|
|
|
static QList<CWINDOW *> list;
|
|
|
|
static CWindow manager;
|
|
static int count;
|
|
|
|
static void insertTopLevel(CWINDOW *_object);
|
|
static void removeTopLevel(CWINDOW *_object);
|
|
static CMENU *findMenu(CWINDOW *_object, const char *name);
|
|
|
|
protected:
|
|
|
|
bool eventFilter(QObject *, QEvent *);
|
|
|
|
public slots:
|
|
|
|
void error(void);
|
|
void embedded(void);
|
|
void closed(void);
|
|
void destroy(void);
|
|
};
|
|
|
|
class MyMainWindow;
|
|
|
|
typedef
|
|
struct {
|
|
QPointer<MyMainWindow> that;
|
|
Qt::WindowFlags flags;
|
|
QEventLoop *old;
|
|
CWINDOW *save;
|
|
void *save_popup;
|
|
}
|
|
MODAL_INFO;
|
|
|
|
#ifndef QT5
|
|
enum { PROP_ALL = -1, PROP_STACKING = 1, PROP_SKIP_TASKBAR = 2, PROP_BORDER = 4, PROP_STICKY = 8 };
|
|
#endif
|
|
|
|
class MyMainWindow : public QWidget
|
|
{
|
|
Q_OBJECT
|
|
|
|
private:
|
|
|
|
QSizeGrip *sg;
|
|
QMenuBar *mb;
|
|
bool _activate;
|
|
bool _border;
|
|
bool _resizable;
|
|
bool _deleted;
|
|
bool _enterLoop;
|
|
bool _utility;
|
|
//int _type;
|
|
Qt::WindowStates _state;
|
|
int _screen;
|
|
|
|
void doShowModal(bool popup, const QPoint *pos = NULL);
|
|
|
|
protected:
|
|
|
|
virtual void showEvent(QShowEvent *);
|
|
virtual void resizeEvent(QResizeEvent *);
|
|
virtual void moveEvent(QMoveEvent *);
|
|
virtual void keyPressEvent(QKeyEvent *);
|
|
virtual void closeEvent(QCloseEvent *);
|
|
virtual void changeEvent(QEvent *);
|
|
|
|
//bool eventFilter(QObject *, QEvent *);
|
|
|
|
public:
|
|
|
|
enum { BorderNone = 0, BorderFixed = 1, BorderResizable = 2 };
|
|
QHash<QString, CWIDGET *> names;
|
|
void *_object;
|
|
|
|
MyMainWindow(QWidget *parent, const char *name, bool embedded = false);
|
|
~MyMainWindow();
|
|
|
|
virtual void setVisible(bool visible);
|
|
|
|
void initProperties(int which);
|
|
void present(QWidget *parent = 0);
|
|
void showActivate(QWidget *parent = 0);
|
|
//void activateLater() { _activate = true; }
|
|
void showModal() { doShowModal(false); }
|
|
void showPopup(QPoint &pos) { doShowModal(true, &pos); }
|
|
void setEventLoop();
|
|
//bool isModal() { return testWFlags(WShowModal); }
|
|
void doReparent(QWidget *w, const QPoint &p);
|
|
|
|
bool hasBorder(void) const { return _border; }
|
|
void setBorder(bool);
|
|
|
|
bool isResizable(void) const { return _resizable; }
|
|
void setResizable(bool);
|
|
|
|
void activate(void);
|
|
|
|
bool isUtility(void) const { return _utility; }
|
|
void setUtility(bool b);
|
|
|
|
void setSizeGrip(bool);
|
|
void moveSizeGrip();
|
|
|
|
bool isPersistent(void);
|
|
void setPersistent(bool);
|
|
|
|
void center();
|
|
void configure();
|
|
|
|
void setName(const char *, CWIDGET *);
|
|
|
|
void setState(Qt::WindowStates state);
|
|
Qt::WindowStates getState() const;
|
|
|
|
void setBetterMask(QPixmap &bg);
|
|
|
|
int currentScreen() const;
|
|
|
|
virtual void resize(int w, int h);
|
|
virtual void setGeometry(int x, int y, int w, int h);
|
|
|
|
void setGeometryHints();
|
|
|
|
friend void on_error_show_modal(MODAL_INFO *info);
|
|
|
|
virtual bool focusNextPrevChild(bool next);
|
|
};
|
|
|
|
|
|
//void CWINDOW_set_top_only(QWidget *w, bool top);
|
|
void CWINDOW_activate(CWIDGET *ob);
|
|
void CWINDOW_set_default_button(CWINDOW *win, QPushButton *button, bool on);
|
|
void CWINDOW_set_cancel_button(CWINDOW *win, QPushButton *button, bool on);
|
|
void CWINDOW_define_mask(CWINDOW *_object);
|
|
void CWINDOW_ensure_active_window();
|
|
bool CWINDOW_must_quit();
|
|
bool CWINDOW_close_all(bool main);
|
|
void CWINDOW_delete_all(bool main);
|
|
void CWINDOW_move_resize(void *_object, int x, int y, int w, int h);
|
|
|
|
#endif
|