2012-04-06 88 views
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:: 

看来这个方法存在但仍有传递参数的方法时的问题。

任何想法??

回答

0

我把这个解决方案也许能帮助别人: 当我伸出我没有为我的结构分配的内存Connection类:

%extend Connection { 
Connection(const char *displayname, int *screenp) 
{ 
    Connection * c ; 
    c = (Connection *) malloc(sizeof(Connection)); 
    c->ptr = xcb_connect(displayname, screenp); 
    return c; 
} 
~Connection() 
{ 
    free($self); 
}