1 //=========================================== 2 // Lumina-desktop source code 3 // Copyright (c) 2018, Ken Moore 4 // Available under the 3-clause BSD license 5 // See the LICENSE file for full details 6 //=========================================== 7 #ifndef _DESKTOP_WINDOW_EMBED_WIDGET_H 8 #define _DESKTOP_WINDOW_EMBED_WIDGET_H 9 10 #include <global-includes.h> 11 12 #define USE_QWINDOW_EMBED 1 13 14 class EmbedWidget : public QWidget { 15 Q_OBJECT 16 private: 17 NativeWindowObject *WIN; 18 19 public: EmbedWidget(NativeWindowObject * win,QWidget * parent)20 EmbedWidget(NativeWindowObject *win, QWidget* parent) : QWidget(parent){ 21 WIN = win; 22 } ~EmbedWidget()23 ~EmbedWidget(){} 24 25 public slots: submitNewGeom()26 void submitNewGeom(){ 27 QRect global_geom = QRect( this->mapToGlobal(QPoint(0,0)), this->size() ); 28 WIN->setGeometryNow(global_geom); 29 } 30 31 protected: resizeEvent(QResizeEvent * ev)32 void resizeEvent(QResizeEvent *ev){ 33 QWidget::resizeEvent(ev); 34 submitNewGeom(); 35 } 36 /*void moveEvent(QMoveEvent *ev){ 37 QWidget::moveEvent(ev); 38 submitNewGeom(); 39 }*/ hideEvent(QHideEvent * ev)40 void hideEvent(QHideEvent *ev){ 41 QWidget::hideEvent(ev); 42 qDebug() << "Hide Event"; 43 WIN->requestProperty(NativeWindowObject::Visible, false); 44 } showEvent(QShowEvent * ev)45 void showEvent(QShowEvent *ev){ 46 QWidget::showEvent(ev); 47 qDebug() << "ShowEvent"; 48 WIN->requestProperty(NativeWindowObject::Visible, true); 49 } enterEvent(QEvent * ev)50 void enterEvent(QEvent *ev){ 51 QWidget::enterEvent(ev); 52 qDebug() << "Enter event"; 53 } paintEvent(QPaintEvent *)54 void paintEvent(QPaintEvent *){ 55 //Never paint anything with this widget 56 } closeEvent(QCloseEvent * ev)57 void closeEvent(QCloseEvent *ev){ 58 qDebug() << "Embed Window Closed"; 59 WIN->emit WindowClosed(WIN->id()); 60 QWidget::closeEvent(ev); 61 } 62 63 }; 64 65 class NativeEmbedWidget : public QObject { 66 Q_OBJECT 67 private: 68 QWidget *embedW; 69 NativeWindowObject *WIN; 70 71 public: NativeEmbedWidget(QWidget * parent,NativeWindowObject * obj)72 NativeEmbedWidget(QWidget *parent, NativeWindowObject *obj) : QObject(parent){ 73 WIN = obj; 74 if(USE_QWINDOW_EMBED){ 75 QWindow* _window = QWindow::fromWinId(WIN->id()); 76 embedW = QWidget::createWindowContainer(_window, parent); 77 QList<WId> related; related << _window->winId(); 78 if(embedW->nativeParentWidget()!=0){ related << embedW->nativeParentWidget()->winId(); } 79 WIN->setProperty(NativeWindowObject::RelatedWindows, QVariant::fromValue< QList<WId> >(related) ); 80 //connect(_window, SIGNAL(destroyed(QObject*)), WIN, SLOT(announceClosed()) ); 81 }else{ 82 embedW = new EmbedWidget(WIN, parent); 83 } 84 } ~NativeEmbedWidget()85 ~NativeEmbedWidget(){} 86 widget()87 QWidget* widget(){ return embedW; } geometry()88 QRect geometry(){ return embedW->geometry(); } 89 90 public slots: activateWindow()91 void activateWindow(){ WIN->requestActivate(); } //QTimer::singleShot(0, WIN, SLOT(requestActivate())); } windowFrameMoved()92 void windowFrameMoved(){} 93 94 }; 95 96 #endif 97