嵌入式gnuplot键盘焦点的GTK问题

嵌入式gnuplot键盘焦点的GTK问题,gtk,gnuplot,Gtk,Gnuplot,我对gnuplot键盘热键的焦点有问题,例如a或箭头gnuplot嵌入到gtk套接字中,并单击gtk小部件设置焦点设置为TRUE。但点击绘图不会激活热键。我对gtk和gnuplot都是新手,我在这里做错了什么 gtk_widget_grab_focus似乎(并非总是)在绘图上设置焦点。 在示例代码中,单击打印从绘图中获取焦点,然后单击焦点将焦点设置回绘图,热键起作用。但是如果我出于某种原因重新启动gnuplot(删除和星型按钮),这就不起作用了 有没有更好的方法嵌入带有键盘热键的gnuplot

我对
gnuplot
键盘热键的焦点有问题,例如
a
或箭头
gnuplot
嵌入到
gtk
套接字中,并单击
gtk小部件设置焦点设置为
TRUE
。但点击绘图不会激活热键。我对
gtk
gnuplot
都是新手,我在这里做错了什么

gtk_widget_grab_focus
似乎(并非总是)在绘图上设置焦点。 在示例代码中,单击打印从绘图中获取焦点,然后单击焦点将焦点设置回绘图,热键起作用。但是如果我出于某种原因重新启动
gnuplot
删除星型按钮),这就不起作用了

有没有更好的方法嵌入带有键盘热键的
gnuplot

我的系统是
ubuntu18.05
gnuplot5.4

//plot.c
#包括
#包括
GtkWidget*窗口;
GtkWidget*框;
GtkWidget*焦点;
GtkWidget*打印;
GtkWidget*删除;
GtkWidget*开始;
GtkWidget*图;
文件*gnuplot;
吉尼特id;
单击打印时无效(GTK按钮*);
单击焦点时无效(GTK按钮*);
单击删除时无效(GTK按钮*);
单击开始时无效(GTK按钮*);
int main(int argc,char*argv[]){
gtk_init(&argc,&argv);
窗口=gtk_窗口_新建(gtk_窗口_顶层);
gtk_窗口设置默认大小(gtk_窗口(窗口),512);
g_信号连接(窗口,“销毁”,g_回调(gtk_主退出),空);
长方体=gtk_长方体_新(gtk_方向_垂直,8);
gtk_容器添加(gtk_容器(窗口)、盒子);
打印=gtk_按钮_新_,带有标签((const gchar*)“打印”);
gtk_小部件_设置_大小_请求(打印,128,32);
gtk_容器添加(gtk_容器(盒),打印);
gtk_widget_set_can_focus(打印,真);
g_信号连接(打印,“点击”,g_回调(打印时点击),空);
focus=gtk_按钮_新_,带有_标签((const gchar*)“focus”);
gtk_widget_set_size_请求(焦点,128,32);
gtk_容器添加(gtk_容器(框),焦点);
gtk_widget_set_can_focus(焦点,真);
g_信号连接(焦点,“点击”,g_回调(焦点上点击),空);
删除=gtk_按钮_新建_,带有标签((const gchar*)“删除”);
gtk_widget_set_size_请求(删除,128,32);
gtk_容器添加(gtk_容器(框),删除);
gtk_widget_set_can_focus(删除,TRUE);
g_信号连接(删除,“单击”,g_回调(删除时单击),空);
start=gtk_按钮_新建_,带有_标签((const gchar*)“start”);
gtk_widget_set_size_请求(开始,128,32);
gtk_容器添加(gtk_容器(箱),开始);
gtk_widget_set_can_focus(开始,真);
g_信号连接(启动,“点击”,g_回调(启动时点击),空);
plot=gtk_socket_new();
gtk_小部件_设置_大小_请求(绘图,512);
gtk_widget_set_can_focus(绘图,真);
gtk_widget_设置_焦点_点击(绘图,真);
gtk_小部件_设置_工具提示_文本(绘图,“gnuplot”);
gtk_容器添加(gtk_容器(盒),绘图);
gtk_控件_抓取_焦点(绘图);
id=gtk_插座获取id(gtk_插座(绘图));
字符缓冲区[512];
sprintf(缓冲区,“gnuplot-ctrlq-e\”socket\u id='%\x'\“plot.gp”,id);
gnuplot=popen(缓冲区,“w”);
gtk_小部件_全部显示(窗口);
gtk_main();
fclose(gnuplot);
返回退出成功;
}
单击打印时无效(GTK按钮*按钮){
printf(“print\n”);
}
单击焦点时无效(GTK按钮*按钮){
if(gnuplot!=NULL){
gtk_控件_抓取_焦点(绘图);
}
}
单击删除时无效(GTK按钮*按钮){
if(gnuplot!=NULL){
fclose(gnuplot);
gnuplot=NULL;
gtk_容器移除(gtk_容器(盒),绘图);
}
}
单击开始时无效(GTK按钮*按钮){
if(gnuplot!=NULL){
fclose(gnuplot);
gnuplot=NULL;
gtk_容器移除(gtk_容器(盒),绘图);
}
plot=gtk_socket_new();
gtk_小部件_设置_大小_请求(绘图,512);
gtk_widget_set_can_focus(绘图,真);
gtk_widget_设置_焦点_点击(绘图,真);
gtk_小部件_设置_工具提示_文本(绘图,“新gnuplot”);
gtk_容器添加(gtk_容器(盒),绘图);
id=gtk_插座获取id(gtk_插座(绘图));
字符缓冲区[512];
sprintf(缓冲区,“gnuplot-ctrlq-e\”socket\u id='%\x'\“plot.gp”,id);
gnuplot=popen(缓冲区,“w”);
gtk_widget_show(绘图);
gtk_控件_抓取_焦点(绘图);
}
编辑: 单击“启动”时出现的
中的重新启动问题是由于子
gnuplot
进程在
gtk\u widget\u show
调用之前未运行。它可以通过等待来解决,例如
睡眠(1)
。但这不是一个稳健的解决方案

我还尝试使用
system()
调用带有
-persist
gnuplot
,但在这种情况下,热键不起作用

#plot.gp
set term x11 window socket_id
plot [-30:20] besj0(x)*0.12e1 with impulses, (x**besj0(x))-2.5 with lines
pause -1
gcc -std=c99 `pkg-config --cflags gtk+-3.0` -o plot plot.c -lm `pkg-config --libs gtk+-3.0` -lm -export-dynamic