diff options
Diffstat (limited to 'libxcb/src')
-rwxr-xr-x[-rw-r--r--] | libxcb/src/.gitignore | 91 | ||||
-rw-r--r-- | libxcb/src/c_client.py | 3 | ||||
-rw-r--r-- | libxcb/src/config.h | 80 | ||||
-rw-r--r-- | libxcb/src/dummyin6.h | 168 | ||||
-rw-r--r-- | libxcb/src/libxcb.def | 58 | ||||
-rw-r--r-- | libxcb/src/makefile | 30 | ||||
-rwxr-xr-x | libxcb/src/makefile.srcs | 21 | ||||
-rw-r--r-- | libxcb/src/man/.gitignore | 1 | ||||
-rw-r--r-- | libxcb/src/xcb.h | 5 | ||||
-rw-r--r-- | libxcb/src/xcb_auth.c | 7 | ||||
-rw-r--r-- | libxcb/src/xcb_conn.c | 48 | ||||
-rw-r--r-- | libxcb/src/xcb_ext.c | 2 | ||||
-rw-r--r-- | libxcb/src/xcb_in.c | 1 | ||||
-rw-r--r-- | libxcb/src/xcb_out.c | 7 | ||||
-rw-r--r-- | libxcb/src/xcb_util.c | 31 | ||||
-rw-r--r-- | libxcb/src/xcb_windefs.h | 21 | ||||
-rw-r--r-- | libxcb/src/xcb_xid.c | 2 |
17 files changed, 523 insertions, 53 deletions
diff --git a/libxcb/src/.gitignore b/libxcb/src/.gitignore index a2a901006..e948124ad 100644..100755 --- a/libxcb/src/.gitignore +++ b/libxcb/src/.gitignore @@ -1,31 +1,60 @@ -bigreq.* -composite.* -damage.* -dpms.* -dri2.* -dri3.* -glx.* -present.* -randr.* -record.* -render.* -res.* -screensaver.* -shape.* -shm.* -sync.* -xc_misc.* -xevie.* -xf86dri.* -xfixes.* -xinerama.* -xinput.* -xkb.* -xprint.* -xselinux.* -xtest.* -xv.* -xvmc.* -xproto.* -xcb_des.c -X11 +dri3.c
+dri3.h
+present.c
+present.h
+bigreq.c
+bigreq.h
+composite.c
+composite.h
+damage.c
+damage.h
+dpms.c
+dpms.h
+dri2.c
+dri2.h
+ge.c
+ge.h
+glx.c
+glx.h
+randr.c
+randr.h
+record.c
+record.h
+render.c
+render.h
+res.c
+res.h
+screensaver.c
+screensaver.h
+shape.c
+shape.h
+shm.c
+shm.h
+sync.c
+sync.h
+xc_misc.c
+xc_misc.h
+xevie.c
+xevie.h
+xf86dri.c
+xf86dri.h
+xf86vidmode.c
+xf86vidmode.h
+xfixes.c
+xfixes.h
+xinerama.c
+xinerama.h
+xinput.c
+xinput.h
+xprint.c
+xprint.h
+xproto.c
+xproto.h
+xselinux.c
+xselinux.h
+xtest.c
+xtest.h
+xv.c
+xv.h
+xvmc.c
+xvmc.h
diff --git a/libxcb/src/c_client.py b/libxcb/src/c_client.py index aaaab2e4a..9430c005a 100644 --- a/libxcb/src/c_client.py +++ b/libxcb/src/c_client.py @@ -185,6 +185,7 @@ def c_open(self): _c('#include <stddef.h> /* for offsetof() */') _c('#include "xcbext.h"') _c('#include "%s.h"', _ns.header) + _c('#include <X11/Xtrans/Xtrans.h>') _c('') _c('#define ALIGNOF(type) offsetof(struct { char dummy; type member; }, member)') @@ -203,7 +204,7 @@ def c_open(self): _h('#define XCB_%s_MAJOR_VERSION %s', _ns.ext_name.upper(), _ns.major_version) _h('#define XCB_%s_MINOR_VERSION %s', _ns.ext_name.upper(), _ns.minor_version) _h(' ') #XXX - _h('extern xcb_extension_t %s;', _ns.c_ext_global_name) + _h('XCB_EXTERN xcb_extension_t %s;', _ns.c_ext_global_name) _c('') _c('xcb_extension_t %s = { "%s", 0 };', _ns.c_ext_global_name, _ns.ext_xname) diff --git a/libxcb/src/config.h b/libxcb/src/config.h new file mode 100644 index 000000000..6c701936c --- /dev/null +++ b/libxcb/src/config.h @@ -0,0 +1,80 @@ +/* src/config.h.in. Generated from configure.ac by autoheader. */ + +/* Defined if GCC supports the visibility feature */ +#undef GCC_HAS_VISIBILITY + +/* Has Wraphelp.c needed for XDM AUTH protocols */ +#undef HASXDMAUTH + +/* Define if your platform supports abstract sockets */ +#undef HAVE_ABSTRACT_SOCKETS + +/* Define to 1 if you have the <dlfcn.h> header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if you have the <inttypes.h> header file. */ +#undef HAVE_INTTYPES_H + +/* launchd support available */ +#undef HAVE_LAUNCHD + +/* Define to 1 if you have the <memory.h> header file. */ +#undef HAVE_MEMORY_H + +/* Have the sockaddr_un.sun_len member. */ +#undef HAVE_SOCKADDR_SUN_LEN + +/* Define to 1 if you have the <stdint.h> header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the <stdlib.h> header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the <strings.h> header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the <string.h> header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the <sys/stat.h> header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the <sys/types.h> header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the <unistd.h> header file. */ +#define HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* poll() function is available */ +#undef USE_POLL + +/* Version number of package */ +#undef VERSION + +/* XCB buffer queue size */ +#define XCB_QUEUE_BUFFER_SIZE 4096 diff --git a/libxcb/src/dummyin6.h b/libxcb/src/dummyin6.h new file mode 100644 index 000000000..b86b250e4 --- /dev/null +++ b/libxcb/src/dummyin6.h @@ -0,0 +1,168 @@ +/* + * Copyright (c) 2001, 2003 Motoyuki Kasahara + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the project nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef DUMMYIN6_H +#define DUMMYIN6_H + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include <sys/types.h> + +#include <sys/socket.h> +#include <netinet/in.h> +#include <netdb.h> + +#ifndef AF_INET6 +#define AF_INET6 (AF_INET + 1) +#endif + +#ifndef PF_INET6 +#define PF_INET6 (PF_INET + 1) +#endif + +#ifndef AF_UNSPEC +#define AF_UNSPEC AF_INET +#endif + +#ifndef PF_UNSPEC +#define PF_UNSPEC PF_INET +#endif + +#ifndef INET6_ADDRSTRLEN +#define INET6_ADDRSTRLEN 46 +#endif + +#ifndef INET_ADDRSTRLEN +#define INET_ADDRSTRLEN 16 +#endif + +#ifndef HAVE_STRUCT_IN6_ADDR +struct in6_addr { + unsigned char s6_addr[16]; +}; +#endif + +#ifndef HAVE_STRUCT_SOCKADDR_IN6 +struct sockaddr_in6 { + sa_family_t sin6_family; + in_port_t sin6_port; + unsigned long sin6_flowinfo; + struct in6_addr sin6_addr; + unsigned long sin6_scope_id; +}; +#endif + +#if !defined(HAVE_STRUCT_SOCKADDR_STORAGE) && !defined(sockaddr_storage) +#define sockaddr_storage sockaddr_in +#endif + +#ifndef IN6ADDR_ANY_DECLARED +extern const struct in6_addr in6addr_any; +#endif + +#ifndef IN6ADDR_LOOPBACK_DECLARED +extern const struct in6_addr in6addr_loopback; +#endif + +#ifndef IN6ADDR_ANY_INIT +#define IN6ADDR_ANY_INIT \ + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}} +#endif + +#ifndef IN6ADDR_LOOPBACK_INIT +#define IN6ADDR_LOOPBACK_INIT \ + {{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, \ + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01}} +#endif + +#ifndef IN6_IS_ADDR_UNSPECIFIED +#define IN6_IS_ADDR_UNSPECIFIED(a) \ + ( (a)->s6_addr[ 0] == 0 && (a)->s6_addr[ 1] == 0 \ + && (a)->s6_addr[ 2] == 0 && (a)->s6_addr[ 3] == 0 \ + && (a)->s6_addr[ 4] == 0 && (a)->s6_addr[ 5] == 0 \ + && (a)->s6_addr[ 6] == 0 && (a)->s6_addr[ 7] == 0 \ + && (a)->s6_addr[ 8] == 0 && (a)->s6_addr[ 9] == 0 \ + && (a)->s6_addr[10] == 0 && (a)->s6_addr[11] == 0 \ + && (a)->s6_addr[12] == 0 && (a)->s6_addr[13] == 0 \ + && (a)->s6_addr[14] == 0 && (a)->s6_addr[15] == 0) +#endif + +#ifndef IN6_IS_ADDR_LOOPBACK +#define IN6_IS_ADDR_LOOPBACK(a) \ + ( (a)->s6_addr[ 0] == 0 && (a)->s6_addr[ 1] == 0 \ + && (a)->s6_addr[ 2] == 0 && (a)->s6_addr[ 3] == 0 \ + && (a)->s6_addr[ 4] == 0 && (a)->s6_addr[ 5] == 0 \ + && (a)->s6_addr[ 6] == 0 && (a)->s6_addr[ 7] == 0 \ + && (a)->s6_addr[ 8] == 0 && (a)->s6_addr[ 9] == 0 \ + && (a)->s6_addr[10] == 0 && (a)->s6_addr[11] == 0 \ + && (a)->s6_addr[12] == 0 && (a)->s6_addr[13] == 0 \ + && (a)->s6_addr[14] == 0 && (a)->s6_addr[15] == 1) +#endif + +#ifndef IN6_IS_ADDR_MULTICAST +#define IN6_IS_ADDR_MULTICAST(a) \ + ((a)->s6_addr[0] == 0xff) +#endif + +#ifndef IN6_IS_ADDR_LINKLOCAL +#define IN6_IS_ADDR_LINKLOCAL(a) \ + (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0x80)) +#endif + +#ifndef IN6_IS_ADDR_SITELOCAL +#define IN6_IS_ADDR_SITELOCAL(a) \ + (((a)->s6_addr[0] == 0xfe) && (((a)->s6_addr[1] & 0xc0) == 0xc0)) +#endif + +#ifndef IN6_IS_ADDR_V4MAPPED +#define IN6_IS_ADDR_V4MAPPED(a) \ + ( (a)->s6_addr[ 0] == 0 && (a)->s6_addr[ 1] == 0 \ + && (a)->s6_addr[ 2] == 0 && (a)->s6_addr[ 3] == 0 \ + && (a)->s6_addr[ 4] == 0 && (a)->s6_addr[ 5] == 0 \ + && (a)->s6_addr[ 6] == 0 && (a)->s6_addr[ 7] == 0 \ + && (a)->s6_addr[ 8] == 0 && (a)->s6_addr[ 9] == 0 \ + && (a)->s6_addr[10] == 0xff && (a)->s6_addr[11] == 0xff) +#endif + +#ifndef IN6_IS_ADDR_V4COMPAT +#define IN6_IS_ADDR_V4COMPAT(a) \ + ( (a)->s6_addr[ 0] == 0 && (a)->s6_addr[ 1] == 0 \ + && (a)->s6_addr[ 2] == 0 && (a)->s6_addr[ 3] == 0 \ + && (a)->s6_addr[ 4] == 0 && (a)->s6_addr[ 5] == 0 \ + && (a)->s6_addr[ 6] == 0 && (a)->s6_addr[ 7] == 0 \ + && (a)->s6_addr[ 8] == 0 && (a)->s6_addr[ 9] == 0 \ + && (a)->s6_addr[10] == 0 && (a)->s6_addr[11] == 0 \ + && ((a)->s6_addr[12] != 0 || (a)->s6_addr[13] != 0 \ + || (a)->s6_addr[14] != 0 \ + || ((a)->s6_addr[15] != 0 && (a)->s6_addr[15] != 1))) +#endif + +#endif /* not DUMMYIN6_H */ diff --git a/libxcb/src/libxcb.def b/libxcb/src/libxcb.def new file mode 100644 index 000000000..1d9e1bbef --- /dev/null +++ b/libxcb/src/libxcb.def @@ -0,0 +1,58 @@ +LIBRARY libxcb
+EXPORTS
+ InitWSA
+ xcb_allow_events
+ xcb_connect
+ xcb_connect_to_display_with_auth_info
+ xcb_connection_has_error
+ xcb_create_glyph_cursor
+ xcb_depth_next
+ xcb_depth_visuals_iterator
+ xcb_discard_reply
+ xcb_disconnect
+ xcb_flush
+ xcb_generate_id
+ xcb_get_atom_name
+ xcb_get_atom_name_name
+ xcb_get_atom_name_name_length
+ xcb_get_atom_name_reply
+ xcb_get_extension_data
+ xcb_get_file_descriptor
+ xcb_get_geometry
+ xcb_get_geometry_reply
+ xcb_get_maximum_request_length
+ xcb_get_property
+ xcb_get_property_reply
+ xcb_get_property_value
+ xcb_get_property_value_length
+ xcb_get_setup
+ xcb_get_window_attributes
+ xcb_get_window_attributes_reply
+ xcb_grab_pointer
+ xcb_grab_pointer_reply
+ xcb_intern_atom
+ xcb_intern_atom_reply
+ xcb_open_font
+ xcb_parse_display
+ xcb_poll_for_event
+ xcb_poll_for_reply
+ xcb_query_pointer
+ xcb_query_pointer_reply
+ xcb_query_tree
+ xcb_query_tree_children
+ xcb_query_tree_children_length
+ xcb_query_tree_reply
+ xcb_screen_allowed_depths_iterator
+ xcb_screen_next
+ xcb_setup_roots_iterator
+ xcb_setup_roots_length
+ xcb_shape_query_extents
+ xcb_shape_query_extents_reply
+ xcb_take_socket
+ xcb_translate_coordinates
+ xcb_translate_coordinates_reply
+ xcb_ungrab_pointer
+ xcb_visualtype_next
+ xcb_wait_for_event
+ xcb_wait_for_reply
+ xcb_writev
diff --git a/libxcb/src/makefile b/libxcb/src/makefile new file mode 100644 index 000000000..d76306138 --- /dev/null +++ b/libxcb/src/makefile @@ -0,0 +1,30 @@ +SHAREDLIB=libxcb + +CSRCS = \ + xcb_conn.c xcb_out.c xcb_in.c xcb_ext.c xcb_xid.c \ + xcb_list.c xcb_util.c xcb_auth.c + +DEFINES += PTW32_STATIC_LIB HAVE_GETADDRINFO LIBXCB_DLL + +INCLUDELIBFILES = \ + $(MHMAKECONF)\libXau\$(OBJDIR)\libXau.lib + +LIBDIRS=$(dir $(INCLUDELIBFILES)) + +load_makefile $(LIBDIRS:%$(OBJDIR)\=%makefile MAKESERVER=0 DEBUG=$(DEBUG);) + +LINKLIBS += $(PTHREADLIB) + +XCBPROTO_XCBINCLUDEDIR = ..\xcb-proto\src + +XMLFILES := $(notdir $(wildcard $(XCBPROTO_XCBINCLUDEDIR)\*.xml)) +XMLFILES := $(filter-out xkb.xml, $(XMLFILES)) + +EXTSOURCES := $(XMLFILES:%.xml=%.c) +CSRCS += $(EXTSOURCES) + +EXTHEADERS = $(XMLFILES:%.xml=%.h) + +$(EXTHEADERS) $(EXTSOURCES): c_client.py + +load_makefile NORELDBG=1 makefile.srcs diff --git a/libxcb/src/makefile.srcs b/libxcb/src/makefile.srcs new file mode 100755 index 000000000..37dd181b8 --- /dev/null +++ b/libxcb/src/makefile.srcs @@ -0,0 +1,21 @@ +ifneq ($(NORELDBG),1) +$(error NORELDBG should have been set to 1) +endif + +PACKAGE_STRING=libxcb +XORG_MAN_PAGE=libxcb +LIB_MAN_SUFFIX=xcb + +XCBPROTO_XCBPYTHONDIR = ../xcb-proto +XCBPROTO_XCBINCLUDEDIR = ../xcb-proto/src + +%.h: $(XCBPROTO_XCBINCLUDEDIR)\%.xml + python c_client.py -c "$(PACKAGE_STRING)" -l "$(XORG_MAN_PAGE)" \ + -s "$(LIB_MAN_SUFFIX)" -p $(XCBPROTO_XCBPYTHONDIR) $(subst $/,/,$<) + +%.c: $(XCBPROTO_XCBINCLUDEDIR)\%.xml + python c_client.py -c "$(PACKAGE_STRING)" -l "$(XORG_MAN_PAGE)" \ + -s "$(LIB_MAN_SUFFIX)" -p $(XCBPROTO_XCBPYTHONDIR) $(subst $/,/,$<) + +CLEANRULEPOSTFIX=noobjs + diff --git a/libxcb/src/man/.gitignore b/libxcb/src/man/.gitignore index f000a81f7..a73d43068 100644 --- a/libxcb/src/man/.gitignore +++ b/libxcb/src/man/.gitignore @@ -1,2 +1,3 @@ *.[0-9] *.[0-9]x +*.xcb diff --git a/libxcb/src/xcb.h b/libxcb/src/xcb.h index c17a2ef79..ec5cd3301 100644 --- a/libxcb/src/xcb.h +++ b/libxcb/src/xcb.h @@ -37,6 +37,7 @@ #ifndef _WIN32 #include <sys/uio.h> +#define XCB_EXTERN extern #else #include "xcb_windefs.h" #endif @@ -51,7 +52,11 @@ extern "C" { * @file xcb.h */ +#ifdef _MSC_VER +#define XCB_PACKED +#else #define XCB_PACKED __attribute__((__packed__)) +#endif /** * @defgroup XCB_Core_API XCB Core API diff --git a/libxcb/src/xcb_auth.c b/libxcb/src/xcb_auth.c index 29e2b6f84..de628a6e4 100644 --- a/libxcb/src/xcb_auth.c +++ b/libxcb/src/xcb_auth.c @@ -265,13 +265,14 @@ static int compute_auth(xcb_auth_info_t *info, Xauth *authptr, struct sockaddr * /* `sockaddr_un.sun_path' typical size usually ranges between 92 and 108 */ #define INITIAL_SOCKNAME_SLACK 108 +#ifndef WIN32 +typedef int (*LPFN_GETPEERNAME)(int,struct sockaddr *,socklen_t *); +#endif /* Return a dynamically allocated socket address structure according to the value returned by either getpeername() or getsockname() (according to POSIX, applications should not assume a particular length for `sockaddr_un.sun_path') */ -static struct sockaddr *get_peer_sock_name(int (*socket_func)(int, - struct sockaddr *, - socklen_t *), +static struct sockaddr *get_peer_sock_name(LPFN_GETPEERNAME socket_func, int fd) { socklen_t socknamelen = sizeof(struct sockaddr) + INITIAL_SOCKNAME_SLACK; diff --git a/libxcb/src/xcb_conn.c b/libxcb/src/xcb_conn.c index fa5098586..e9ab62a0d 100644 --- a/libxcb/src/xcb_conn.c +++ b/libxcb/src/xcb_conn.c @@ -53,6 +53,12 @@ #include <netinet/in.h> #endif /* _WIN32 */ +#include <X11/Xtrans/Xtrans.h> + +#ifdef _MSC_VER +#define _close(fd) closesocket(fd) +#endif + /* SHUT_RDWR is fairly recent and is not available on all platforms */ #if !defined(SHUT_RDWR) #define SHUT_RDWR 2 @@ -84,7 +90,7 @@ static int set_fd_flags(const int fd) #ifdef _WIN32 u_long iMode = 1; /* non-zero puts it in non-blocking mode, 0 in blocking mode */ - int ret = 0; + int ret; ret = ioctlsocket(fd, FIONBIO, &iMode); if(ret != 0) @@ -124,7 +130,7 @@ static int write_setup(xcb_connection_t *c, xcb_auth_info_t *auth_info) out.authorization_protocol_name_len = 0; out.authorization_protocol_data_len = 0; parts[count].iov_len = sizeof(xcb_setup_request_t); - parts[count++].iov_base = &out; + parts[count++].iov_base = (caddr_t) &out; parts[count].iov_len = XCB_PAD(sizeof(xcb_setup_request_t)); parts[count++].iov_base = (char *) pad; @@ -192,33 +198,48 @@ static int read_setup(xcb_connection_t *c) static int write_vec(xcb_connection_t *c, struct iovec **vector, int *count) { int n; - assert(!c->out.queue_len); #ifdef _WIN32 int i = 0; - int ret = 0,err = 0; + int cnt=*count; struct iovec *vec; n = 0; + assert(!c->out.queue_len); /* Could use the WSASend win32 function for scatter/gather i/o but setting up the WSABUF struct from an iovec would require more work and I'm not sure of the benefit....works for now */ vec = *vector; - while(i < *count) + while(i < cnt) { - ret = send(c->fd,vec->iov_base,vec->iov_len,0); + char *p= vec->iov_base; + size_t l= vec->iov_len; + while (l > 0) + { + int ret = send(c->fd, p, l, 0); if(ret == SOCKET_ERROR) { - err = WSAGetLastError(); + int err = WSAGetLastError(); if(err == WSAEWOULDBLOCK) { - return 1; + if (n) + { + /* already return the data */ + i=cnt; + break; + } + else + return 1; } } + p += ret; + l -= ret; n += ret; - *vec++; - i++; + } + vec++; + i++; } #else + assert(!c->out.queue_len); n = *count; if (n > IOV_MAX) n = IOV_MAX; @@ -466,6 +487,13 @@ int _xcb_conn_wait(xcb_connection_t *c, pthread_cond_t *cond, struct iovec **vec } #else ret = select(c->fd + 1, &rfds, &wfds, 0, 0); + if (ret==SOCKET_ERROR) + { + ret=-1; + errno = WSAGetLastError(); + if (errno == WSAEINTR) + errno=EINTR; + } #endif } while (ret == -1 && errno == EINTR); if(ret < 0) diff --git a/libxcb/src/xcb_ext.c b/libxcb/src/xcb_ext.c index 831f28381..990c67a96 100644 --- a/libxcb/src/xcb_ext.c +++ b/libxcb/src/xcb_ext.c @@ -123,6 +123,8 @@ int _xcb_ext_init(xcb_connection_t *c) void _xcb_ext_destroy(xcb_connection_t *c) { + if (!c->ext.lock) + return; /* mutex is not initialised */ pthread_mutex_destroy(&c->ext.lock); while(c->ext.extensions_size-- > 0) if(c->ext.extensions[c->ext.extensions_size].tag == LAZY_FORCED) diff --git a/libxcb/src/xcb_in.c b/libxcb/src/xcb_in.c index 14b67aec2..559a6e3ea 100644 --- a/libxcb/src/xcb_in.c +++ b/libxcb/src/xcb_in.c @@ -55,6 +55,7 @@ #define XCB_REPLY 1 #define XCB_XGE_EVENT 35 + struct event_list { xcb_generic_event_t *event; struct event_list *next; diff --git a/libxcb/src/xcb_out.c b/libxcb/src/xcb_out.c index 18bb5f912..f11e2966f 100644 --- a/libxcb/src/xcb_out.c +++ b/libxcb/src/xcb_out.c @@ -33,13 +33,14 @@ #include <stdlib.h> #include <unistd.h> #include <string.h> +#include <X11/Xtrans/Xtrans.h> #include "xcb.h" #include "xcbext.h" #include "xcbint.h" #include "bigreq.h" -static inline void send_request(xcb_connection_t *c, int isvoid, enum workarounds workaround, int flags, struct iovec *vector, int count) +static __inline void send_request(xcb_connection_t *c, int isvoid, enum workarounds workaround, int flags, struct iovec *vector, int count) { if(c->has_error) return; @@ -217,10 +218,10 @@ unsigned int xcb_send_request(xcb_connection_t *c, int flags, struct iovec *vect { prefix[0] = ((uint32_t *) vector[0].iov_base)[0]; prefix[1] = ++longlen; - vector[0].iov_base = (uint32_t *) vector[0].iov_base + 1; + vector[0].iov_base = (caddr_t)((uint32_t *) vector[0].iov_base + 1); vector[0].iov_len -= sizeof(uint32_t); --vector, ++veclen; - vector[0].iov_base = prefix; + vector[0].iov_base = (caddr_t)prefix; vector[0].iov_len = sizeof(prefix); } } diff --git a/libxcb/src/xcb_util.c b/libxcb/src/xcb_util.c index 1625742b1..3cf752644 100644 --- a/libxcb/src/xcb_util.c +++ b/libxcb/src/xcb_util.c @@ -60,6 +60,13 @@ # include <sys/stat.h> #endif +#ifdef _MSC_VER +#ifdef close +#undef close +#endif +#define close(fd) closesocket(fd) +#endif + int xcb_popcount(uint32_t mask) { uint32_t y; @@ -272,7 +279,7 @@ static int _xcb_socket(int family, int type, int proto) static int _xcb_do_connect(int fd, const struct sockaddr* addr, int addrlen) { - int on = 1; + char on = 1; if(fd < 0) return -1; @@ -283,6 +290,23 @@ static int _xcb_do_connect(int fd, const struct sockaddr* addr, int addrlen) { return connect(fd, addr, addrlen); } +#ifdef WIN32 +int InitWSA(void) +{ + static WSADATA wsadata; + + if (!wsadata.wVersion) + { + ptw32_processInitialize(); + if (WSAStartup(0x0202, &wsadata)) + return -1; + } + return 0; +} +#else +#define InitWSA() +#endif + static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short port) { int fd = -1; @@ -322,6 +346,11 @@ static int _xcb_open_tcp(const char *host, char *protocol, const unsigned short } #endif +#ifdef WIN32 + if (InitWSA()<0) + return -1; +#endif + snprintf(service, sizeof(service), "%hu", port); if(getaddrinfo(host, service, &hints, &results)) /* FIXME: use gai_strerror, and fill in error connection */ diff --git a/libxcb/src/xcb_windefs.h b/libxcb/src/xcb_windefs.h index df6026da3..dd92b7257 100644 --- a/libxcb/src/xcb_windefs.h +++ b/libxcb/src/xcb_windefs.h @@ -31,15 +31,28 @@ #define WINVER 0x0501 /* required for getaddrinfo/freeaddrinfo defined only for WinXP and above */ #endif +#define INCL_WINSOCK_API_TYPEDEFS 1 /* Needed for LPFN_GETPEERNAME */ + +#define FD_SETSIZE 1024 + +#include <X11/Xwinsock.h> #include <winsock2.h> #include <ws2tcpip.h> #include <windef.h> -struct iovec { - void *iov_base; /* Pointer to data. */ - int iov_len; /* Length of data. */ -}; +typedef unsigned char BYTE; typedef unsigned int in_addr_t; +#define HANDLE void * +typedef int pid_t; + +#define STDERR_FILENO 2 + +#ifdef LIBXCB_DLL +#define XCB_EXTERN __declspec(dllexport) extern +#else +#define XCB_EXTERN __declspec(dllimport) extern +#endif + #endif /* xcb_windefs.h */ diff --git a/libxcb/src/xcb_xid.c b/libxcb/src/xcb_xid.c index 79a9a27de..7d9fc621b 100644 --- a/libxcb/src/xcb_xid.c +++ b/libxcb/src/xcb_xid.c @@ -97,5 +97,7 @@ int _xcb_xid_init(xcb_connection_t *c) void _xcb_xid_destroy(xcb_connection_t *c) { + if (!c->xid.lock) + return; /* mutex was not initialised yet */ pthread_mutex_destroy(&c->xid.lock); } |