我正在我的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为其窗口创建了“X11 Visual”结构,这与socket的不同。要解决此问题,请更改以下行:
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的第6339行(版本5.5.2))
答案 0 :(得分:1)
似乎最近的更新允许通过#define修复此问题。拉gnuplot(我拥有5.2.5),并在构建之前在config.hin
文件中进行以下更改,以本地方式构建:
#undef EXTERNAL_X11_WINDOW
至#define EXTERNAL_X11_WINDOW
然后按照提供的说明进行安装,您应该已经设置好!