summaryrefslogtreecommitdiff
path: root/glib
diff options
context:
space:
mode:
authorTor Lillqvist <tml@iki.fi>2000-08-27 10:53:36 +0000
committerTor Lillqvist <tml@src.gnome.org>2000-08-27 10:53:36 +0000
commit3d0a1b3b221d32a53557a3512ab6eeadbf816352 (patch)
treed2ca82c09d07caa083af5cc359fd33c1769e94bd /glib
parenta435aaff030e440c910d76f354f0e2157545b33e (diff)
downloadglib-3d0a1b3b221d32a53557a3512ab6eeadbf816352.tar.gz
New function, otherwise like g_io_channel_win32_wait_for_condition(), but
2000-08-27 Tor Lillqvist <tml@iki.fi> * giowin32.c (g_io_channel_win32_poll): New function, otherwise like g_io_channel_win32_wait_for_condition(), but accept several GIOChannels. (g_io_channel_win32_wait_for_condition): Call g_io_channel_win32_poll(). * glib.h: Declare g_io_channel_win32_poll(). * gwin32.c (g_win32_error_message): Don't believe return value from FormatMessage.
Diffstat (limited to 'glib')
-rw-r--r--glib/giowin32.c59
-rw-r--r--glib/glib.def1
-rw-r--r--glib/glib.h19
-rw-r--r--glib/gwin32.c12
4 files changed, 64 insertions, 27 deletions
diff --git a/glib/giowin32.c b/glib/giowin32.c
index 68fee3b4a..db5e9ca4d 100644
--- a/glib/giowin32.c
+++ b/glib/giowin32.c
@@ -872,29 +872,62 @@ g_io_channel_win32_set_debug (GIOChannel *channel,
}
gint
-g_io_channel_win32_wait_for_condition (GIOChannel *channel,
- GIOCondition condition,
- gint timeout)
+g_io_channel_win32_poll (GIOChannel **channels,
+ gint n_channels,
+ GIOCondition condition,
+ gint timeout)
{
- GPollFD pollfd;
- GIOWin32Channel *win32_channel = (GIOWin32Channel *) channel;
+ GPollFD *pollfd;
+ GIOWin32Channel *win32_channel;
+ int i;
int result;
+ gboolean debug = FALSE;
- pollfd.fd = (gint) win32_channel->data_avail_event;
- pollfd.events = condition;
+ g_return_val_if_fail (n_channels >= 0, 0);
- if (win32_channel->debug)
- g_print ("g_io_channel_win32_wait_for_condition: fd:%d event:%#x timeout:%d\n",
- win32_channel->fd, pollfd.fd, timeout);
+ pollfd = g_new (GPollFD, n_channels);
- result = (*g_main_win32_get_poll_func ()) (&pollfd, 1, timeout);
+ for (i = 0; i < n_channels; i++)
+ {
+ win32_channel = (GIOWin32Channel *) channels[i];
+ debug |= win32_channel->debug;
+ pollfd[i].fd = (gint) win32_channel->data_avail_event;
+ pollfd[i].events = condition;
+ }
- if (win32_channel->debug)
- g_print ("g_io_channel_win32_wait_for_condition: done:%d\n", result);
+ if (debug)
+ {
+ g_print ("g_io_channel_win32_poll: ");
+ for (i = 0; i < n_channels; i++)
+ {
+ win32_channel = (GIOWin32Channel *) channels[i];
+ g_print ("fd:%d event:%#x ", win32_channel->fd, pollfd[i].fd);
+ }
+ g_print ("condition:%s%s%s%s timeout:%d\n",
+ (condition & G_IO_ERR) ? " ERR" : "",
+ (condition & G_IO_HUP) ? " HUP" : "",
+ (condition & G_IO_IN) ? " IN" : "",
+ (condition & G_IO_PRI) ? " PRI" : "",
+ timeout);
+ }
+
+ result = (*g_main_win32_get_poll_func ()) (pollfd, n_channels, timeout);
+
+ if (debug)
+ g_print ("g_io_channel_win32_poll: done:%d\n", result);
+
+ g_free (pollfd);
return result;
}
+gint
+g_io_channel_win32_wait_for_condition (GIOChannel *channel,
+ GIOCondition condition,
+ gint timeout)
+{
+ return g_io_channel_win32_poll (&channel, 1, condition, timeout);
+}
/* This variable and the functions below are present just to be
* binary compatible with old clients... But note that in GIMP, the
diff --git a/glib/glib.def b/glib/glib.def
index 2781cb487..0843575bf 100644
--- a/glib/glib.def
+++ b/glib/glib.def
@@ -166,6 +166,7 @@ EXPORTS
g_io_channel_win32_new_stream_socket
g_io_channel_win32_pipe_readable
g_io_channel_win32_pipe_request_wakeups
+ g_io_channel_win32_poll
g_io_channel_win32_set_debug
g_io_channel_win32_wait_for_condition
g_io_channel_write
diff --git a/glib/glib.h b/glib/glib.h
index 6b684088a..31805ddea 100644
--- a/glib/glib.h
+++ b/glib/glib.h
@@ -2921,20 +2921,21 @@ gint g_io_channel_unix_get_fd (GIOChannel *channel);
#define G_WIN32_MSG_HANDLE 19981206
-/* This can be used to wait until a channel is readable. On Unix you
- * would do a select() on the fd of the channel. This should probably
- * be replaced by something for all platforms?
+/* This can be used to wait a until at least one of the channels is readable.
+ * On Unix you would do a select() on the file descriptors of the channels.
+ * This should probably be available for all platforms?
*/
-gint g_io_channel_win32_wait_for_condition (GIOChannel *channel,
- GIOCondition condition,
- gint timeout);
+gint g_io_channel_win32_poll (GIOChannel **channels,
+ gint n_channels,
+ GIOCondition condition,
+ gint timeout);
/* This is used to add polling for Windows messages. GDK (GTk+) programs
* should *not* use this.
*/
-void g_main_poll_win32_msg_add(gint priority,
- GPollFD *fd,
- guint hwnd);
+void g_main_poll_win32_msg_add (gint priority,
+ GPollFD *fd,
+ guint hwnd);
/* An IO channel for Windows messages for window handle hwnd. */
GIOChannel *g_io_channel_win32_new_messages (guint hwnd);
diff --git a/glib/gwin32.c b/glib/gwin32.c
index adc8a2393..256fe021a 100644
--- a/glib/gwin32.c
+++ b/glib/gwin32.c
@@ -806,11 +806,13 @@ g_win32_error_message (gint error)
gchar *retval;
int nbytes;
- nbytes = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER
- |FORMAT_MESSAGE_IGNORE_INSERTS
- |FORMAT_MESSAGE_FROM_SYSTEM,
- NULL, error, 0,
- (LPTSTR) &msg, 0, NULL);
+ FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER
+ |FORMAT_MESSAGE_IGNORE_INSERTS
+ |FORMAT_MESSAGE_FROM_SYSTEM,
+ NULL, error, 0,
+ (LPTSTR) &msg, 0, NULL);
+ nbytes = strlen (msg);
+
if (nbytes > 2 && msg[nbytes-1] == '\n' && msg[nbytes-2] == '\r')
msg[nbytes-2] = '\0';