无法将gnuplot x11窗口嵌入Gtk3套接字

无法将gnuplot x11窗口嵌入Gtk3套接字,gnuplot,x11,gtk3,gtkmm,gtkmm3,Gnuplot,X11,Gtk3,Gtkmm,Gtkmm3,我正在Gtk3(实际上是gtkmm)应用程序中创建Gtk::Socket,并尝试将gnuplot的窗口嵌入其中。但它不起作用:套接字仍然保持为黑色矩形,而gnuplot窗口在其他地方看起来是独立的 同时,Gtk::将插头完美地插入该插座。在Gtk2中,使用gnuplot的这个技巧也很有效 这里是socket.cpp #include <iostream> #include <fstream> #include <gtkmm.h> #include <gt

我正在Gtk3(实际上是gtkmm)应用程序中创建Gtk::Socket,并尝试将gnuplot的窗口嵌入其中。但它不起作用:套接字仍然保持为黑色矩形,而gnuplot窗口在其他地方看起来是独立的

同时,Gtk::将插头完美地插入该插座。在Gtk2中,使用gnuplot的这个技巧也很有效

这里是socket.cpp

#include <iostream>
#include <fstream>
#include <gtkmm.h>
#include <gtkmm/socket.h>

using namespace std;

void plug_added(){
  cout << "A plug was added" << endl;
}

bool plug_removed(){
  cout << "A Plug was removed" << endl;
  return true;
}

class MySocketWindow : public Gtk::Window
{
  public:
    MySocketWindow()
    {
        auto socket = Gtk::manage(new Gtk::Socket());
        add(*socket);
        socket->signal_plug_added().connect(sigc::ptr_fun(plug_added));
        socket->signal_plug_removed().connect(sigc::ptr_fun(plug_removed));
        cout << "Socket id is: " << hex << socket->get_id() << endl;
        show_all();
    }
};

int main(int argc, char** argv)
{
  auto app =
    Gtk::Application::create(argc, argv, "org.gtkmm.example.socket");
  MySocketWindow win;
  app->run(win);
  return 0;
}
启动gnuplot:

gnuplot> set term x11 window "2c00007"
Terminal type set to 'x11'
Options are 'XID 0x2C00007 nopersist enhanced'
gnuplot> plot sin(x)
那么,Gtk3插座与Gtk2插座之间是否存在阻止gnuplot连接的差异

Ubuntu Xenial 16.04.1 x64、gnuplot-4.6.6、libgtkmm-3.0-dev 3.18.0、g++5.4.0不起作用

Ubuntu Trusty 14.04.4 x86、gnuplot-4.6.4、libgtkmm-3.0-dev 3.10.1、g++4.8.4有效

UPD:

深入挖掘gnuplot源代码可以发现,gnuplot为其窗口创建了“X11可视”结构,这与socket的窗口不同。要解决此问题,请更改行:

    plot->window = XCreateWindow(dpy, plot->external_container, plot->x, plot->y, plot->width,
                 plot->height, 0, dep, InputOutput, vis, 0, NULL);


(gplt_x11.c(版本5.5.2)的第6339行)

最近的更新似乎允许通过#define来修复此问题。拉取gnuplot(5.2.5是我所拥有的)并在本地构建,在构建之前在
config.hin
文件中更改以下内容:

#未定义外部_X11_窗口
#定义外部_X11_窗口


然后按照提供的说明进行安装,您应该设置

在Debian Jessie的Gnuplot 4.6.6、libgtkmm-3.0-dev 3.14.0-1和g++v4.9.2(带有标志-std=c++11)上,它可以工作。谢谢,@maij。我会在不同的平台上试用,并在这里发布结果。@Dimalivinov在这个网站上,你可以回答你自己的问题。如果您的“UPD”部分解决了问题,您应该将其作为答案发布并接受。@Ivan谢谢,但是-对于完整的解决方案,应该存在来自套接字端(而不是gnuplot端)的修复程序。不要更改生成的文件,而是使用相应的命令行参数
/configure--disable-x11-external
    plot->window = XCreateWindow(dpy, plot->external_container, plot->x, plot->y, plot->width,
                 plot->height, 0, dep, InputOutput, vis, 0, NULL);
    plot->window = XCreateWindow(dpy, plot->external_container, plot->x, plot->y, plot->width,
                 plot->height, 0, dep, InputOutput, gattr.visual, 0, NULL);