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