From 12751e3fc02e45da1198b82dadf83fe861ebfd1e Mon Sep 17 00:00:00 2001 From: drouin Date: Wed, 1 Sep 2004 15:54:51 +0000 Subject: replaced the gtk mainloop with a glib one. added -Wall compile directive . fixed some warnings --- src/ivyglibloop.c | 127 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 src/ivyglibloop.c (limited to 'src/ivyglibloop.c') diff --git a/src/ivyglibloop.c b/src/ivyglibloop.c new file mode 100644 index 0000000..968824a --- /dev/null +++ b/src/ivyglibloop.c @@ -0,0 +1,127 @@ +/* + * Ivy, C interface + * + * Copyright (C) 1997-2000 + * Centre d'Études de la Navigation Aérienne + * + * Main loop based on the Gtk Toolkit + * + * Authors: François-Régis Colin + * + * $Id$ + * + * Please refer to file version.h for the + * copyright notice regarding this software + */ + +#ifdef WIN32 +#include +#include +#include +#include +#include +#include +#else +#include +#endif + +#include + +#include "ivyglibloop.h" + +struct _channel { + guint id_read; + guint id_delete; + gpointer data; + ChannelHandleDelete handle_delete; + ChannelHandleRead handle_read; + }; + +static int channel_initialized = 0; + +ChannelInit channel_init = IvyGlibChannelInit; +ChannelSetUp channel_setup = IvyGlibChannelSetUp; +ChannelClose channel_close = IvyGlibChannelClose; + +static gboolean IvyGlibHandleChannelRead(GIOChannel *source, + GIOCondition condition, + gpointer data); + +static gboolean IvyGlibHandleChannelDelete(GIOChannel *source, + GIOCondition condition, + gpointer data); + + +void IvyGlibChannelInit(void) { + if ( channel_initialized ) return; + /* fixes bug when another app coredumps */ +#ifndef WIN32 + signal( SIGPIPE, SIG_IGN); +#endif + channel_initialized = 1; +} + + + +Channel IvyGlibChannelSetUp(HANDLE fd, void *data, + ChannelHandleDelete handle_delete, + ChannelHandleRead handle_read + ) { + Channel channel; + channel = (Channel)g_new(struct _channel, 1); + + channel->handle_delete = handle_delete; + channel->handle_read = handle_read; + channel->data = data; + + { + GIOChannel* io_channel = g_io_channel_unix_new(fd); + + channel->id_read = g_io_add_watch( io_channel, G_IO_IN, + IvyGlibHandleChannelRead, channel); + channel->id_delete = g_io_add_watch( io_channel, G_IO_ERR | G_IO_HUP, + IvyGlibHandleChannelDelete, channel); + } + return channel; +} + + + + +void IvyGlibChannelClose( Channel channel ) { + if ( channel->handle_delete ) + (*channel->handle_delete)( channel->data ); + g_source_remove( channel->id_read ); + g_source_remove( channel->id_delete ); +} + + +static gboolean IvyGlibHandleChannelRead(GIOChannel *source, + GIOCondition condition, + gpointer data) { + Channel channel = (Channel)data; +#ifdef DEBUG + printf("Handle Channel read %d\n",source ); +#endif + (*channel->handle_read)(channel, g_io_channel_unix_get_fd(source), channel->data); + return TRUE; +} + +static gboolean IvyGlibHandleChannelDelete(GIOChannel *source, + GIOCondition condition, + gpointer data) { + Channel channel = (Channel)data; +#ifdef DEBUG + printf("Handle Channel delete %d\n",source ); +#endif + (*channel->handle_delete)(channel->data); + return TRUE; +} + + +void +IvyStop () +{ + /* To be implemented */ +} + -- cgit v1.1