@@ -46,3 +46,65 @@ void SetX11WindowTitle(CefRefPtr<CefBrowser> browser, char* title) {
4646 ::Display* xdisplay = cef_get_xdisplay ();
4747 XStoreName (xdisplay, xwindow, title);
4848}
49+
50+ GtkWindow* CefBrowser_GetGtkWindow (CefRefPtr<CefBrowser> browser) {
51+ // -- REWRITTEN FOR CEF PYTHON USE CASE --
52+ // X11 window handle
53+ ::Window xwindow = browser->GetHost ()->GetWindowHandle ();
54+ // X11 display
55+ ::Display* xdisplay = cef_get_xdisplay ();
56+ // GDK display
57+ GdkDisplay* gdk_display = NULL ;
58+ if (xdisplay) {
59+ // See if we can find GDK display using X11 display
60+ gdk_display = gdk_x11_lookup_xdisplay (xdisplay);
61+ }
62+ if (!gdk_display) {
63+ // If not then get the default display
64+ gdk_display = gdk_display_get_default ();
65+ }
66+ if (!gdk_display) {
67+ // The tkinter_.py and hello_world.py examples do not use GTK
68+ // internally, so GTK wasn't yet initialized and must do it
69+ // now, so that display is available. Also must install X11
70+ // error handlers to avoid 'BadWindow' errors.
71+ LOG (INFO) << " [Browser process] Initialize GTK" ;
72+ gtk_init (0 , NULL );
73+ InstallX11ErrorHandlers ();
74+ // Now the display is available
75+ gdk_display = gdk_display_get_default ();
76+ }
77+ // In kivy_.py example getting error message:
78+ // > Can't create GtkPlug as child of non-GtkSocket
79+ // However dialog handler works just fine.
80+ GtkWidget* widget = gtk_plug_new_for_display (gdk_display, xwindow);
81+ // Getting top level widget doesn't seem to be required.
82+ // OFF: GtkWidget* toplevel = gtk_widget_get_toplevel(widget);
83+ GtkWindow* window = GTK_WINDOW (widget);
84+ if (!window) {
85+ LOG (ERROR) << " No GtkWindow for browser" ;
86+ }
87+ return window;
88+ }
89+
90+ XImage* CefBrowser_GetImage (CefRefPtr<CefBrowser> browser) {
91+ ::Display* display = cef_get_xdisplay ();
92+ if (!display) {
93+ LOG (ERROR) << " XOpenDisplay failed in CefBrowser_GetImage" ;
94+ return NULL ;
95+ }
96+ ::Window browser_window = browser->GetHost ()->GetWindowHandle ();
97+ XWindowAttributes attrs;
98+ if (!XGetWindowAttributes (display, browser_window, &attrs)) {
99+ LOG (ERROR) << " XGetWindowAttributes failed in CefBrowser_GetImage" ;
100+ return NULL ;
101+ }
102+ XImage* image = XGetImage (display, browser_window,
103+ 0 , 0 , attrs.width , attrs.height ,
104+ AllPlanes, ZPixmap);
105+ if (!image) {
106+ LOG (ERROR) << " XGetImage failed in CefBrowser_GetImage" ;
107+ return NULL ;
108+ }
109+ return image;
110+ }
0 commit comments