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

Posted

技术标签:

【中文标题】无法将 gnuplot x11 窗口嵌入 Gtk3 套接字【英文标题】:Cannot embed gnuplot x11 window into Gtk3 socket 【发布时间】:2016-12-18 14:17:36 【问题描述】:

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

同时,Gtk::Plug 完美地插入这个插座。在 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;

编译运行:

$ g++ --std=c++0x socket.cpp -o socket `pkg-config gtkmm-3.0 --cflags --libs`
$ ./socket &
[1] 22832
$ Socket id is: 2c00007

启动 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 为其窗口创建了与 socket 不同的“X11 Visual”结构。要解决此问题,请更改以下行:

    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);

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

【问题讨论】:

在 Debian Jessie 上使用 Gnuplot 4.6.6、libgtkmm-3.0-dev 3.14.0-1 和 g++ V 4.9.2(带有标志 -std=c++11)它可以工作。 谢谢,@maij。我将在不同的平台上尝试并在此处发布结果。 @DimaLitvinov 在这个网站上你可以回答你自己的问题。如果您的“UPD”部分解决了问题,您应该将其作为答案发布并接受。 @Ivan 谢谢,但是 - 对于完整的解决方案,应该存在来自套接字端(而不是 gnuplot 端)的修复。 【参考方案1】:

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

#undef EXTERNAL_X11_WINDOW#define EXTERNAL_X11_WINDOW

然后按照提供的说明进行安装,您应该已经设置好了!

【讨论】:

不要更改生成的文件,而是使用各自的命令行参数./configure --disable-x11-external

以上是关于无法将 gnuplot x11 窗口嵌入 Gtk3 套接字的主要内容,如果未能解决你的问题,请参考以下文章

找不到带有 CATALINA 的 qt 或 x11 终端 gnuplot

如何将 GTK2 像素图移植到 GTK3_

GTK3 - 如何将窗口发送到后台

将一个应用程序嵌入Qt应用程序时,如何获取mouseMoveEvent和嵌入窗口大小

Perl/Gtk3,给窗口添加背景图片

Octave + Gnuplot 倒置渲染图像