[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]
[Vala] [OT] Vala XChat Plugins Bindings
- From: Andrea Del Signore <sejerpz tin it>
- To: Vala ML <vala-list gnome org>
- Subject: [Vala] [OT] Vala XChat Plugins Bindings
- Date: Sun, 09 Mar 2008 13:10:26 +0100
Hi all,
since yesterday I wrote an HelloWorld xchat plugin just because I was
bored, I thought that sharing the vapi could be useful to someone else.
Some comments on the vapi follows:
1) in the init & get_info functions I use pointers to pointer because if
not vala try to free an invalid pointer.
2) The vapi can be better if it try to use virtual methods for the init,
deinit & get_info functions, but first I must investigate on how vala
support virtual methods in classes that don't derive from GLib.Object
Despite that the plugin works.
Have a nice day,
Andrea
VALAC=valac
CFLAGS=`pkg-config --cflags glib-2.0` -I./ -g -Wl,--export-dynamic -Wall -O1 -shared -fPIC `pkg-config --libs glib-2.0`
CC=gcc
xchat-helloworld: xchat-helloworld.c
$(CC) $(CFLAGS) xchat-helloworld.c -o xchat-helloworld.so
xchat-helloworld.c: xchat-helloworld.vala xchat-plugin.vapi
$(VALAC) --vapidir ./ xchat-helloworld.vala --pkg xchat-plugin
clean:
rm -rf xchat-helloworld.c xchat-helloworld.h *.so *.o
/* xchat-helloworld.vala
*
* Copyright (C) 2008 Andrea Del Signore
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Author:
* Andrea Del Signore <sejerpz tin it>
*/
using GLib;
using XChat;
public HelloWorld hw = null;
private const string name = "Vala Helloworld Plugin";
private const string desc = "Vala Helloworld Gnome XChat Plugin";
private const string ver = "0.1";
public static void xchat_plugin_get_info (string **plugin_name, string **plugin_desc, string **plugin_version, string **reserved)
{
*plugin_name = name;
*plugin_desc = desc;
*plugin_version = ver;
if (reserved != null)
*reserved = null;
}
public static bool xchat_plugin_init (Plugin plugin, string **plugin_name, string **plugin_desc, string **plugin_version, string arg)
{
xchat_plugin_get_info (plugin_name, plugin_desc, plugin_version, null);
hw = new HelloWorld (plugin);
return true;
}
public static bool xchat_plugin_deinit ()
{
hw = null;
return true;
}
public class HelloWorld : Object
{
private weak Plugin _plugin = null;
public HelloWorld (construct Plugin plugin) { }
public weak Plugin plugin { get { return _plugin; } construct { _plugin = value; } }
construct
{
_plugin.hook_command ("HELLO_WORLD", XChat.Priorities.NORM, this.on_xchat_command, "Type /HELLO_WORLD for a response");
}
public int on_xchat_command (string[] word, string[] word_eol)
{
_plugin.print ("Helloworld from Vala :)\n");
return EatTypes.ALL;
}
}
/* You can distribute this header with your plugins for easy compilation */
#ifndef XCHAT_PLUGIN_H
#define XCHAT_PLUGIN_H
#include <time.h>
#define XCHAT_IFACE_MAJOR 1
#define XCHAT_IFACE_MINOR 9
#define XCHAT_IFACE_MICRO 11
#define XCHAT_IFACE_VERSION ((XCHAT_IFACE_MAJOR * 10000) + \
(XCHAT_IFACE_MINOR * 100) + \
(XCHAT_IFACE_MICRO))
#define XCHAT_PRI_HIGHEST 127
#define XCHAT_PRI_HIGH 64
#define XCHAT_PRI_NORM 0
#define XCHAT_PRI_LOW (-64)
#define XCHAT_PRI_LOWEST (-128)
#define XCHAT_FD_READ 1
#define XCHAT_FD_WRITE 2
#define XCHAT_FD_EXCEPTION 4
#define XCHAT_FD_NOTSOCKET 8
#define XCHAT_EAT_NONE 0 /* pass it on through! */
#define XCHAT_EAT_XCHAT 1 /* don't let xchat see this event */
#define XCHAT_EAT_PLUGIN 2 /* don't let other plugins see this event */
#define XCHAT_EAT_ALL (XCHAT_EAT_XCHAT|XCHAT_EAT_PLUGIN) /* don't let anything see this event */
#ifdef __cplusplus
extern "C" {
#endif
typedef struct _xchat_plugin xchat_plugin;
typedef struct _xchat_list xchat_list;
typedef struct _xchat_hook xchat_hook;
#ifndef PLUGIN_C
typedef struct _xchat_context xchat_context;
#endif
#ifndef PLUGIN_C
struct _xchat_plugin
{
/* these are only used on win32 */
xchat_hook *(*xchat_hook_command) (xchat_plugin *ph,
const char *name,
int pri,
int (*callback) (char *word[], char *word_eol[], void *user_data),
const char *help_text,
void *userdata);
xchat_hook *(*xchat_hook_server) (xchat_plugin *ph,
const char *name,
int pri,
int (*callback) (char *word[], char *word_eol[], void *user_data),
void *userdata);
xchat_hook *(*xchat_hook_print) (xchat_plugin *ph,
const char *name,
int pri,
int (*callback) (char *word[], void *user_data),
void *userdata);
xchat_hook *(*xchat_hook_timer) (xchat_plugin *ph,
int timeout,
int (*callback) (void *user_data),
void *userdata);
xchat_hook *(*xchat_hook_fd) (xchat_plugin *ph,
int fd,
int flags,
int (*callback) (int fd, int flags, void *user_data),
void *userdata);
void *(*xchat_unhook) (xchat_plugin *ph,
xchat_hook *hook);
void (*xchat_print) (xchat_plugin *ph,
const char *text);
void (*xchat_printf) (xchat_plugin *ph,
const char *format, ...);
void (*xchat_command) (xchat_plugin *ph,
const char *command);
void (*xchat_commandf) (xchat_plugin *ph,
const char *format, ...);
int (*xchat_nickcmp) (xchat_plugin *ph,
const char *s1,
const char *s2);
int (*xchat_set_context) (xchat_plugin *ph,
xchat_context *ctx);
xchat_context *(*xchat_find_context) (xchat_plugin *ph,
const char *servname,
const char *channel);
xchat_context *(*xchat_get_context) (xchat_plugin *ph);
const char *(*xchat_get_info) (xchat_plugin *ph,
const char *id);
int (*xchat_get_prefs) (xchat_plugin *ph,
const char *name,
const char **string,
int *integer);
xchat_list * (*xchat_list_get) (xchat_plugin *ph,
const char *name);
void (*xchat_list_free) (xchat_plugin *ph,
xchat_list *xlist);
const char * const * (*xchat_list_fields) (xchat_plugin *ph,
const char *name);
int (*xchat_list_next) (xchat_plugin *ph,
xchat_list *xlist);
const char * (*xchat_list_str) (xchat_plugin *ph,
xchat_list *xlist,
const char *name);
int (*xchat_list_int) (xchat_plugin *ph,
xchat_list *xlist,
const char *name);
void * (*xchat_plugingui_add) (xchat_plugin *ph,
const char *filename,
const char *name,
const char *desc,
const char *version,
char *reserved);
void (*xchat_plugingui_remove) (xchat_plugin *ph,
void *handle);
int (*xchat_emit_print) (xchat_plugin *ph,
const char *event_name, ...);
int (*xchat_read_fd) (xchat_plugin *ph,
void *src,
char *buf,
int *len);
time_t (*xchat_list_time) (xchat_plugin *ph,
xchat_list *xlist,
const char *name);
char *(*xchat_gettext) (xchat_plugin *ph,
const char *msgid);
void (*xchat_send_modes) (xchat_plugin *ph,
const char **targets,
int ntargets,
int modes_per_line,
char sign,
char mode);
char *(*xchat_strip) (xchat_plugin *ph,
const char *str,
int len,
int flags);
void (*xchat_free) (xchat_plugin *ph,
void *ptr);
};
#endif
xchat_hook *
xchat_hook_command (xchat_plugin *ph,
const char *name,
int pri,
int (*callback) (char *word[], char *word_eol[], void *user_data),
const char *help_text,
void *userdata);
xchat_hook *
xchat_hook_server (xchat_plugin *ph,
const char *name,
int pri,
int (*callback) (char *word[], char *word_eol[], void *user_data),
void *userdata);
xchat_hook *
xchat_hook_print (xchat_plugin *ph,
const char *name,
int pri,
int (*callback) (char *word[], void *user_data),
void *userdata);
xchat_hook *
xchat_hook_timer (xchat_plugin *ph,
int timeout,
int (*callback) (void *user_data),
void *userdata);
xchat_hook *
xchat_hook_fd (xchat_plugin *ph,
int fd,
int flags,
int (*callback) (int fd, int flags, void *user_data),
void *userdata);
void *
xchat_unhook (xchat_plugin *ph,
xchat_hook *hook);
void
xchat_print (xchat_plugin *ph,
const char *text);
void
xchat_printf (xchat_plugin *ph,
const char *format, ...);
void
xchat_command (xchat_plugin *ph,
const char *command);
void
xchat_commandf (xchat_plugin *ph,
const char *format, ...);
int
xchat_nickcmp (xchat_plugin *ph,
const char *s1,
const char *s2);
int
xchat_set_context (xchat_plugin *ph,
xchat_context *ctx);
xchat_context *
xchat_find_context (xchat_plugin *ph,
const char *servname,
const char *channel);
xchat_context *
xchat_get_context (xchat_plugin *ph);
const char *
xchat_get_info (xchat_plugin *ph,
const char *id);
int
xchat_get_prefs (xchat_plugin *ph,
const char *name,
const char **string,
int *integer);
xchat_list *
xchat_list_get (xchat_plugin *ph,
const char *name);
void
xchat_list_free (xchat_plugin *ph,
xchat_list *xlist);
const char * const *
xchat_list_fields (xchat_plugin *ph,
const char *name);
int
xchat_list_next (xchat_plugin *ph,
xchat_list *xlist);
const char *
xchat_list_str (xchat_plugin *ph,
xchat_list *xlist,
const char *name);
int
xchat_list_int (xchat_plugin *ph,
xchat_list *xlist,
const char *name);
time_t
xchat_list_time (xchat_plugin *ph,
xchat_list *xlist,
const char *name);
void *
xchat_plugingui_add (xchat_plugin *ph,
const char *filename,
const char *name,
const char *desc,
const char *version,
char *reserved);
void
xchat_plugingui_remove (xchat_plugin *ph,
void *handle);
int
xchat_emit_print (xchat_plugin *ph,
const char *event_name, ...);
char *
xchat_gettext (xchat_plugin *ph,
const char *msgid);
void
xchat_send_modes (xchat_plugin *ph,
const char **targets,
int ntargets,
int modes_per_line,
char sign,
char mode);
char *
xchat_strip (xchat_plugin *ph,
const char *str,
int len,
int flags);
void
xchat_free (xchat_plugin *ph,
void *ptr);
#if !defined(PLUGIN_C) && defined(WIN32)
#ifndef XCHAT_PLUGIN_HANDLE
#define XCHAT_PLUGIN_HANDLE (ph)
#endif
#define xchat_hook_command ((XCHAT_PLUGIN_HANDLE)->xchat_hook_command)
#define xchat_hook_server ((XCHAT_PLUGIN_HANDLE)->xchat_hook_server)
#define xchat_hook_print ((XCHAT_PLUGIN_HANDLE)->xchat_hook_print)
#define xchat_hook_timer ((XCHAT_PLUGIN_HANDLE)->xchat_hook_timer)
#define xchat_hook_fd ((XCHAT_PLUGIN_HANDLE)->xchat_hook_fd)
#define xchat_unhook ((XCHAT_PLUGIN_HANDLE)->xchat_unhook)
#define xchat_print ((XCHAT_PLUGIN_HANDLE)->xchat_print)
#define xchat_printf ((XCHAT_PLUGIN_HANDLE)->xchat_printf)
#define xchat_command ((XCHAT_PLUGIN_HANDLE)->xchat_command)
#define xchat_commandf ((XCHAT_PLUGIN_HANDLE)->xchat_commandf)
#define xchat_nickcmp ((XCHAT_PLUGIN_HANDLE)->xchat_nickcmp)
#define xchat_set_context ((XCHAT_PLUGIN_HANDLE)->xchat_set_context)
#define xchat_find_context ((XCHAT_PLUGIN_HANDLE)->xchat_find_context)
#define xchat_get_context ((XCHAT_PLUGIN_HANDLE)->xchat_get_context)
#define xchat_get_info ((XCHAT_PLUGIN_HANDLE)->xchat_get_info)
#define xchat_get_prefs ((XCHAT_PLUGIN_HANDLE)->xchat_get_prefs)
#define xchat_list_get ((XCHAT_PLUGIN_HANDLE)->xchat_list_get)
#define xchat_list_free ((XCHAT_PLUGIN_HANDLE)->xchat_list_free)
#define xchat_list_fields ((XCHAT_PLUGIN_HANDLE)->xchat_list_fields)
#define xchat_list_str ((XCHAT_PLUGIN_HANDLE)->xchat_list_str)
#define xchat_list_int ((XCHAT_PLUGIN_HANDLE)->xchat_list_int)
#define xchat_list_time ((XCHAT_PLUGIN_HANDLE)->xchat_list_time)
#define xchat_list_next ((XCHAT_PLUGIN_HANDLE)->xchat_list_next)
#define xchat_plugingui_add ((XCHAT_PLUGIN_HANDLE)->xchat_plugingui_add)
#define xchat_plugingui_remove ((XCHAT_PLUGIN_HANDLE)->xchat_plugingui_remove)
#define xchat_emit_print ((XCHAT_PLUGIN_HANDLE)->xchat_emit_print)
#define xchat_gettext ((XCHAT_PLUGIN_HANDLE)->xchat_gettext)
#define xchat_send_modes ((XCHAT_PLUGIN_HANDLE)->xchat_send_modes)
#define xchat_strip ((XCHAT_PLUGIN_HANDLE)->xchat_strip)
#define xchat_free ((XCHAT_PLUGIN_HANDLE)->xchat_free)
#endif
#ifdef __cplusplus
}
#endif
#endif
/* xchat-plugin.vapi
*
* Copyright (C) 2008 Andrea Del Signore
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Author:
* Andrea Del Signore <sejerpz tin it>
*/
[CCode (cheader_filename="xchat-plugin.h")]
namespace XChat
{
[CCode (cprefix="XCHAT_EAT_")]
public enum EatTypes
{
NONE = 0, /* pass it on through! */
XCHAT = 1, /* don't let xchat see this event */
PLUGIN = 2, /* don't let other plugins see this event */
ALL = (XChat.EatTypes.XCHAT | XChat.EatTypes.PLUGIN) /* don't let anything see this event */
}
[CCode (cprefix="XCHAT_PRI_")]
public enum Priorities
{
HIGHEST = 127,
HIGH = 64,
NORM = 0,
LOW = (-64),
LOWEST = (-128)
}
[CCode (cprefix="XCHAT_FD_")]
public enum FdFlags
{
READ = 1,
WRITE = 2,
EXCEPTION = 4,
NOTSOCKET = 8
}
[CCode (cname="xchat_hook")]
public class Hook
{
}
[CCode (cname="xchat_context")]
public class Context
{
}
[CCode (cname="xchat_plugin")]
public class Plugin
{
[CCode (cname="xchat_hook_command")]
public weak Hook hook_command (string name, int pri, [CCode (delegate_target_pos = -1)] command_cb callb, string help_text);
[CCode (cname="xchat_hook_print")]
public weak Hook hook_print (string name, int pri, print_cb callb);
[CCode (cname="xchat_hook_server")]
public weak Hook hook_server (string name, int pri, serv_cb callb);
[CCode (cname="xchat_hook_fd")]
public weak Hook hook_fd (int fd, int flags, fd_cb callb);
public weak Hook hook_timer (int timeout, timeout_cb callb);
[CCode (cname="xchat_unhook")]
public void unhook (weak Hook hook);
[CCode (cname = "xchat_cmd_cb"), NoArrayLength()]
public delegate int command_cb (string[] word, string[] word_eol);
[CCode (cname = "xchat_print_cb"), NoArrayLength()]
public delegate int print_cb (string[] word);
[CCode (cname = "xchat_serv_cb"), NoArrayLength()]
public delegate int serv_cb (string[] word, string[] word_eol);
[CCode (cname = "xchat_fd_cb")]
public delegate int fd_cb (int fd, int flags);
[CCode (cname = "xchat_timeout_cb")]
public delegate int timeout_cb ();
[CCode (cname = "xchat_command")]
public void command (string command);
[CCode (cname = "xchat_commandf")]
public void commandf (string format, ...);
[CCode (cname = "xchat_print")]
public void print (string text);
[CCode (cname = "xchat_printf")]
public void printf (string format, ...);
[CCode (cname = "xchat_emit_print")]
public int emit_print (string event_name, ...);
[CCode (cname = "xchat_send_modes")]
public void send_modes (string[] targets, int modes_per_line, char sign, char mode);
[CCode (cname = "xchat_context")]
public Context find_context (string servname, string channel);
[CCode (cname = "xchat_get_context")]
public Context get_context ();
[CCode (cname = "xchat_get_info")]
public weak string get_info (string id);
[CCode (cname = "xchat_get_prefs")]
public int get_prefs (string name, out string string_data, out int integer_data);
[CCode (cname = "xchat_set_context")]
public int set_context (Context ctx);
[CCode (cname = "xchat_nickcmp")]
public int nickcmp (string s1, string s2);
[CCode (cname = "xchat_strip")]
public weak string strip (string str, int len, int flags);
[CCode (cname = "xchat_free")]
public void free (void *ptr);
}
}
[Date Prev][Date Next] [Thread Prev][Thread Next]
[Thread Index]
[Date Index]
[Author Index]