Hi,

I've had a similar problem when trying to give focus to a widget
within the embedded window (from socket application). It seems that
this is not really possible at the present moment. I've created an
example with the plug-socket example code [0]. Here [1] is also a
patch for a gtk_socket_focus_forward () method that could give focus
to the next widget within the embedded window, but I have not yet
received any response on this approach. An example of how this could
be used (using the plug-socket example) can also be found in the
focus_forward branch [2].

The bug report has some more information, also I sent an email to this
list a while ago:
https://mail.gnome.org/archives/gtk-app-devel-list/2014-May/msg00002.html

[0] https://github.com/gauteh/plug-socket-grab-focus
[1] https://bugzilla.gnome.org/show_bug.cgi?id=729248
[2] https://github.com/gauteh/plug-socket-grab-focus/tree/focus_forward

Cheers, Gaute

On Tue, Aug 26, 2014 at 10:24 PM, Benjamin Schnitzler
<benjaminschnitz...@googlemail.com> wrote:
> Dear list members,
>
> I'm trying to create an unmanaged Gtk window containing one or more embedded
> windows (for example terminals). I'm having Problems focussing and sending 
> input
> to these embedded windows. I already tried to embed an xterm and a urxvt 
> window.
> At least the urxvt works correctly, if no other elements are in the window.
> However putting a button into the window leads to the terminal loosing its 
> focus
> with no apparent way to let it regain it. It is however possible to send an
> XEMBED_FOCUS_IN message to the urxvt window. Whe the urxvt recieves the 
> message,
> it will at least change the cursor correctly, but yet, no input is send to it.
> Using an xterm doesn't work, even with normal toplevel windows. Can You help 
> me
> in solving this problem? Here is a gist containing a more or less minimal
> example (I'm using the gtkmm C++ interface):
> https://gist.github.com/anonymous/f179ff891f7c8029faf8
> or clone it via:
> git clone https://gist.github.com/f179ff891f7c8029faf8.git
>
>   Benjamin
>
> For reference, here is the code from the gist:
>
> Makefile:
> sockfoc: sockfoc.cc window_ext.h
>   g++ -ggdb sockfoc.cc -o sockfoc `pkg-config gtkmm-3.0 --cflags --libs` -lX11
>
> sockfoc.cc
> #include <gtkmm.h>
> #include <gtkmm/socket.h>
>
> #include "window_ext.h"
>
> #define XEMBED_FOCUS_IN 4
> #define XEMBED_FOCUS_CURRENT 0
>
> class TheWindow : public WindowExt
> {
>   Gtk::Box* box;
>   Gtk::Socket* socket;
>   Gtk::Button* button_close;
>
>   public:
>     TheWindow() : WindowExt(Gtk::WINDOW_POPUP)
>     {
>       signal_realize().connect( sigc::mem_fun(*this,&TheWindow::add_term) );
>
>       button_close = Gtk::manage( new Gtk::Button("Close Window.") );
>       box = Gtk::manage( new Gtk::Box(Gtk::ORIENTATION_VERTICAL) );
>       box->pack_start( *button_close );
>       add(*box);
>
>       button_close->signal_clicked().connect(
>         sigc::mem_fun(*this,&Window::hide)
>       );
>
>       show_all();
>       grab_keyboard(this->get_window());
>     }
>
>     void add_term()
>     {
>       socket = Gtk::manage( new Gtk::Socket );
>       box->pack_start( *socket );
>       int xid = socket->get_id();
>       char buffer[50];
>       //sprintf(buffer, "xterm -into %d &", xid);
>       sprintf(buffer, "urxvt -embed %d &", xid);
>       system(buffer);
>       box->show_all();
>
>       socket->signal_plug_added().connect(
>           sigc::mem_fun(*this, &TheWindow::send_focus_in)
>       );
>
>       socket->signal_plug_removed().connect(
>           sigc::mem_fun(*this, &TheWindow::on_plug_removed)
>       );
>
>     }
>
>     bool on_plug_removed()
>     {
>       hide();
>       return false;
>     }
>
>     void send_focus_in()
>     {
>       GdkWindow* plug = socket->get_plug_window()->gobj();
>       GdkDisplay *display = gdk_window_get_display(plug);
>
>       XClientMessageEvent xclient;
>       memset(&xclient, 0, sizeof (xclient));
>
>       xclient.window = GDK_WINDOW_XID(plug);
>       xclient.type = ClientMessage;
>       xclient.message_type =
>           gdk_x11_get_xatom_by_name_for_display(display, "_XEMBED");
>       xclient.format = 32;
>       xclient.data.l[0] = gtk_get_current_event_time();
>       xclient.data.l[1] = XEMBED_FOCUS_IN;
>       xclient.data.l[2] = XEMBED_FOCUS_CURRENT;
>       xclient.data.l[3] = 0;
>       xclient.data.l[4] = 0;
>
>       XSendEvent(
>           GDK_WINDOW_XDISPLAY(plug),
>           GDK_WINDOW_XID(plug), False, NoEventMask, (XEvent *)&xclient
>       );
>     }
> };
>
> int main(int argc, char** argv)
> {
>   Glib::RefPtr<Gtk::Application> app;
>   app = Gtk::Application::create(argc, argv, "socket.focustest");
>
>   TheWindow win;
>   return app->run(win);
> }
>
> window_ext.h:
> #ifndef WINDOW_EXT_H
> #define WINDOW_EXT_H
>
> #include <gtkmm.h>
> #include <iostream>
>
> class Overlay;
>
> class WindowExt : public Gtk::Window
> {
>   private:
>     Cairo::RefPtr<Cairo::Region> shape;
>
>   public:
>     void grab_keyboard(Glib::RefPtr<Gdk::Window> dest)
>     {
>       Glib::RefPtr<Gdk::Display> display = get_display();
>       Glib::RefPtr<Gdk::DeviceManager> deviceM = 
> display->get_device_manager();
>
>       std::vector< Glib::RefPtr<Gdk::Device> >devices =
>         deviceM->list_devices( Gdk::DEVICE_TYPE_MASTER );
>
>       std::vector< Glib::RefPtr<Gdk::Device> >::iterator it;
>
>       for(it = devices.begin(); it != devices.end(); ++it)
>       {
>         for(int grab = Gdk::GRAB_NOT_VIEWABLE; grab == 
> Gdk::GRAB_NOT_VIEWABLE;)
>         {
>           grab = (*it)->grab(
>             dest, Gdk::OWNERSHIP_NONE, true,
>             Gdk::ALL_EVENTS_MASK, GDK_CURRENT_TIME
>           );
>         }
>       }
>     }
>
>     WindowExt(Gtk::WindowType type=Gtk::WINDOW_TOPLEVEL) : Window(type) {}
>
>     virtual ~WindowExt(){}
> };
>
> #endif
> _______________________________________________
> gtk-app-devel-list mailing list
> gtk-app-devel-list@gnome.org
> https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list
_______________________________________________
gtk-app-devel-list mailing list
gtk-app-devel-list@gnome.org
https://mail.gnome.org/mailman/listinfo/gtk-app-devel-list

Reply via email to