]> git.saurik.com Git - wxWidgets.git/blob - src/x11/gsockx11.c
use wxEventLoop in wxApp under wxMSW; factored out common code from wxX11/wxMotif...
[wxWidgets.git] / src / x11 / gsockx11.c
1 /* -------------------------------------------------------------------------
2 * Project: GSocket (Generic Socket) for WX
3 * Name: gsockmot.c
4 * Purpose: GSocket: X11 part
5 * Licence: The wxWindows licence
6 * CVSID: $Id$
7 * ------------------------------------------------------------------------- */
8
9 #include "wx/setup.h"
10
11 #if wxUSE_SOCKETS
12
13 #include <stdlib.h>
14 #include "wx/gsocket.h"
15 #include "wx/unix/gsockunx.h"
16
17 /*
18 * FIXME: have these in a common header instead of being repeated
19 * in evtloop.cpp and gsockx11.c
20 */
21
22 typedef void (*wxSocketCallback) (int fd, void* data);
23
24 typedef enum
25 { wxSocketTableInput, wxSocketTableOutput } wxSocketTableType ;
26
27 void wxRegisterSocketCallback(int fd, wxSocketTableType socketType, wxSocketCallback cback, void* data);
28 void wxUnregisterSocketCallback(int fd, wxSocketTableType socketType);
29
30
31 static void _GSocket_X11_Input(int *fid, void* data)
32 {
33 GSocket *socket = (GSocket *)data;
34
35 socket->m_functions->Detected_Read(socket);
36 }
37
38 static void _GSocket_X11_Output(int *fid, void* data)
39 {
40 GSocket *socket = (GSocket *)data;
41
42 socket->m_functions->Detected_Write(socket);
43 }
44
45 int _GSocket_GUI_Init(void)
46 {
47 return 1;
48 }
49
50 void _GSocket_GUI_Cleanup(void)
51 {
52 }
53
54 int _GSocket_GUI_Init_Socket(GSocket *socket)
55 {
56 int *m_id;
57
58 socket->m_gui_dependent = (char *)malloc(sizeof(int)*2);
59 m_id = (int *)(socket->m_gui_dependent);
60
61 m_id[0] = -1;
62 m_id[1] = -1;
63
64 return TRUE;
65 }
66
67 void _GSocket_GUI_Destroy_Socket(GSocket *socket)
68 {
69 free(socket->m_gui_dependent);
70 }
71
72 void _GSocket_Install_Callback(GSocket *socket, GSocketEvent event)
73 {
74 int *m_id = (int *)(socket->m_gui_dependent);
75 int c;
76
77 if (socket->m_fd == -1)
78 return;
79
80 switch (event)
81 {
82 case GSOCK_LOST: /* fall-through */
83 case GSOCK_INPUT: c = 0; break;
84 case GSOCK_OUTPUT: c = 1; break;
85 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break;
86 default: return;
87 }
88
89 #if 0
90 if (m_id[c] != -1)
91 XtRemoveInput(m_id[c]);
92 #endif /* 0 */
93
94 if (c == 0)
95 {
96 m_id[0] = socket->m_fd;
97
98 wxRegisterSocketCallback(socket->m_fd, wxSocketTableInput,
99 (wxSocketCallback) _GSocket_X11_Input, (void*) socket);
100 }
101 else
102 {
103 m_id[1] = socket->m_fd;
104
105 wxRegisterSocketCallback(socket->m_fd, wxSocketTableOutput,
106 (wxSocketCallback) _GSocket_X11_Output, (void*) socket);
107 }
108 }
109
110 void _GSocket_Uninstall_Callback(GSocket *socket, GSocketEvent event)
111 {
112 int *m_id = (int *)(socket->m_gui_dependent);
113 int c;
114
115 switch (event)
116 {
117 case GSOCK_LOST: /* fall-through */
118 case GSOCK_INPUT: c = 0; break;
119 case GSOCK_OUTPUT: c = 1; break;
120 case GSOCK_CONNECTION: c = ((socket->m_server) ? 0 : 1); break;
121 default: return;
122 }
123
124 if (m_id[c] != -1)
125 {
126 if (c == 0)
127 wxUnregisterSocketCallback(m_id[c], wxSocketTableInput);
128 else
129 wxUnregisterSocketCallback(m_id[c], wxSocketTableOutput);
130 }
131
132 m_id[c] = -1;
133 }
134
135 void _GSocket_Enable_Events(GSocket *socket)
136 {
137 _GSocket_Install_Callback(socket, GSOCK_INPUT);
138 _GSocket_Install_Callback(socket, GSOCK_OUTPUT);
139 }
140
141 void _GSocket_Disable_Events(GSocket *socket)
142 {
143 _GSocket_Uninstall_Callback(socket, GSOCK_INPUT);
144 _GSocket_Uninstall_Callback(socket, GSOCK_OUTPUT);
145 }
146
147 #else /* !wxUSE_SOCKETS */
148
149 /* some compilers don't like having empty source files */
150 static int wxDummyGsockVar = 0;
151
152 #endif /* wxUSE_SOCKETS/!wxUSE_SOCKETS */