0
我想为我自己使用的xcb创建一个基本的ruby模块。 我尝试了基本的测试,我裹头文件与痛饮: 这里是我的xcb_ruby.iswig xcb lib和ruby
%module ruxcby
%{
#include <xcb/xcb.h>
#include <xcb/xcb_util.h>
#include <xcb/xcb_aux.h
#include <xcb/xcb_atom.h>
#include <xcb/xcb_event.h>
%}
%include "/usr/include/xcb/xproto.h"
%include "/usr/include/xcb/xcb.h"
%include "/usr/include/xcb/xcb_atom.h"
%include "/usr/include/xcb/xcb_aux.h"
%include "/usr/include/xcb/xcb_event.h"
当我尝试在IRB,我能够连接到初始化连接,从这个方面获得的信息,但ruby界面就像C语言一样。我想要一个更加面向对象的界面。
例如在xcb.h有:
typedef struct xcb_connection_t xcb_connection_t;
xcb_connection_t * xcb_connect(const char *displayname, int *screenp);
int xcb_flush(xcb_connection_t *);
uint32_t xcb_generate_id(xcb_connection_t *);
void xcb_disconnect(xcb_connection_t *);
我想有新的/连接(),同花顺(),generate_id()方法和断开连接(连接类) 这里是我的新xcb_ruby.i:
%module ruxcby
%{
#include <xcb/xcb.h>
#include <xcb/xproto.h>
%}
%import "/usr/include/xcb/xproto.h"
typedef struct xcb_connection_t {
} Connection;
%extend Connection
{
Connection(const char *displayname, int *screenp)
{
Connection * c;
c = xcb_connect(displayname, screenp);
return c;
}
int flush()
{
return xcb_flush($self);
}
xcb_generic_event_t *wait_for_event()
{
return xcb_wait_for_event($self);
}
void disconnect()
{
return xcb_disconnect($self);
}
uint32_t generate_id()
{
return xcb_generate_id($self);
}
};
如果我尝试编译我所生成的C文件后,我有一个错误: ERREUR:未知类型名“连接”
有人能告诉我我错在哪里吗?
感谢
编辑
我已经做了一些修改,现在我可以编译它,但我仍然得到一些错误:
%module ruxcby
%{
#include <xcb/xcb.h>
#include <xcb/xproto.h>
typedef struct {
xcb_connection_t * ptr;
} Connection;
%}
%import "/usr/include/xcb/xproto.h"
%feature("autodoc" , "1");
typedef struct {
xcb_connection_t * ptr;
} Connection;
%extend Connection {
Connection(const char *displayname, int *screenp)
{
Connection * c ;
c->ptr = xcb_connect(displayname, screenp);
return c;
}
int flush()
{
return xcb_flush($self->ptr);
}
xcb_generic_event_t *wait_for_event()
{
return xcb_wait_for_event($self->ptr);
}
int connection_has_error()
{
return xcb_connection_has_error($self->ptr);
}
void disconnect()
{
return xcb_disconnect($self->ptr);
}
uint32_t generate_id()
{
return xcb_generate_id($self->ptr);
}
};
现在我可以编译我的模块,并使用它:
require './ruxcby'
=> true
conn=Connection.new(nil, nil)
=> #<Ruxcby::Connection:0x0000000223dfc8>
但是当我尝试另一种方法,我有一个错误:
conn.connection_has_error
ObjectPreviouslyDeleted: Expected argument 0 of type Connection *, but got Ruxcby::Connection #<Ruxcby::
看来这个方法存在但仍有传递参数的方法时的问题。
任何想法??