static int ephyrGLXGetStringReal (__GLXclientState *a_cl, GLbyte *a_pc, Bool a_do_swap) { ClientPtr client=NULL ; int context_tag=0, name=0, res=BadImplementation, length=0 ; char *string=NULL; __GLX_DECLARE_SWAP_VARIABLES; EPHYR_RETURN_VAL_IF_FAIL (a_cl && a_pc, BadValue) ; EPHYR_LOG ("enter\n") ; client = a_cl->client ; if (a_do_swap) { __GLX_SWAP_INT (a_pc + 4); __GLX_SWAP_INT (a_pc + __GLX_SINGLE_HDR_SIZE); } context_tag = __GLX_GET_SINGLE_CONTEXT_TAG (a_pc) ; a_pc += __GLX_SINGLE_HDR_SIZE; name = *(GLenum*)(a_pc + 0); EPHYR_LOG ("context_tag:%d, name:%d\n", context_tag, name) ; if (!ephyrHostGLXGetStringFromServer (context_tag, name, EPHYR_HOST_GLX_GetString, &string)) { EPHYR_LOG_ERROR ("failed to get string from server\n") ; goto out ; } if (string) { length = strlen (string) + 1; EPHYR_LOG ("got string:'%s', size:%d\n", string, length) ; } else { EPHYR_LOG ("got string: string (null)\n") ; } __GLX_BEGIN_REPLY (length); __GLX_PUT_SIZE (length); __GLX_SEND_HEADER (); if (a_do_swap) { __GLX_SWAP_REPLY_SIZE (); __GLX_SWAP_REPLY_HEADER (); } WriteToClient (client, length, (char *)string); res = Success ; out: EPHYR_LOG ("leave\n") ; return res ; }
int ephyrGLXQueryServerString(__GLXclientState * a_cl, GLbyte * a_pc) { int res = BadImplementation; ClientPtr client = a_cl->client; xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) a_pc; xGLXQueryServerStringReply reply; char *server_string = NULL; int length = 0; EPHYR_LOG("enter\n"); if (!ephyrHostGLXGetStringFromServer(req->screen, req->name, EPHYR_HOST_GLX_QueryServerString, &server_string)) { EPHYR_LOG_ERROR("failed to query string from host\n"); goto out; } EPHYR_LOG("string: %s\n", server_string); length = strlen(server_string) + 1; reply = (xGLXQueryServerStringReply) { .type = X_Reply, .sequenceNumber = client->sequence, .length = __GLX_PAD(length) >> 2, .n = length }; WriteToClient(client, sz_xGLXQueryServerStringReply, &reply); WriteToClient(client, (int) (reply.length << 2), server_string); res = Success; out: EPHYR_LOG("leave\n"); free(server_string); server_string = NULL; return res; } int ephyrGLXQueryServerStringSwap(__GLXclientState * a_cl, GLbyte * a_pc) { EPHYR_LOG_ERROR("not yet implemented\n"); return BadImplementation; }
int ephyrGLXQueryServerString(__GLXclientState *a_cl, GLbyte *a_pc) { int res = BadImplementation ; ClientPtr client = a_cl->client; xGLXQueryServerStringReq *req = (xGLXQueryServerStringReq *) a_pc; xGLXQueryServerStringReply reply; char *server_string=NULL, *buf=NULL; int length=0 ; EPHYR_LOG ("enter\n") ; if (!ephyrHostGLXGetStringFromServer (req->screen, req->name, EPHYR_HOST_GLX_QueryServerString, &server_string)) { EPHYR_LOG_ERROR ("failed to query string from host\n") ; goto out ; } EPHYR_LOG ("string: %s\n", server_string) ; length= strlen (server_string) + 1; reply.type = X_Reply ; reply.sequenceNumber = client->sequence ; reply.length = __GLX_PAD (length) >> 2 ; reply.n = length ; buf = calloc(reply.length << 2, 1); if (!buf) { EPHYR_LOG_ERROR ("failed to allocate string\n;"); return BadAlloc; } memcpy (buf, server_string, length); WriteToClient(client, sz_xGLXQueryServerStringReply, (char*)&reply); WriteToClient(client, (int)(reply.length << 2), server_string); res = Success ; out: EPHYR_LOG ("leave\n") ; free(server_string) ; server_string = NULL; free(buf); buf = NULL; return res ; }
static int ephyrGLXMakeCurrentReal(__GLXclientState * a_cl, GLbyte * a_pc, Bool a_do_swap) { int res = BadImplementation; xGLXMakeCurrentReq *req = (xGLXMakeCurrentReq *) a_pc; xGLXMakeCurrentReply reply; DrawablePtr drawable = NULL; GLXContextTag contextTag = 0; int rc = 0; EPHYR_LOG("enter\n"); rc = dixLookupDrawable(&drawable, req->drawable, a_cl->client, 0, DixReadAccess); EPHYR_RETURN_VAL_IF_FAIL(drawable, BadValue); EPHYR_RETURN_VAL_IF_FAIL(drawable->pScreen, BadValue); EPHYR_LOG("screen nummber requested:%d\n", drawable->pScreen->myNum); if (!ephyrHostGLXMakeCurrent(hostx_get_window(drawable->pScreen->myNum), req->context, req->oldContextTag, (int *) &contextTag)) { EPHYR_LOG_ERROR("ephyrHostGLXMakeCurrent() failed\n"); goto out; } reply = (xGLXMakeCurrentReply) { .type = X_Reply, .sequenceNumber = a_cl->client->sequence, .length = 0, .contextTag = contextTag }; if (a_do_swap) { __GLX_DECLARE_SWAP_VARIABLES; __GLX_SWAP_SHORT(&reply.sequenceNumber); __GLX_SWAP_INT(&reply.length); __GLX_SWAP_INT(&reply.contextTag); } WriteToClient(a_cl->client, sz_xGLXMakeCurrentReply, &reply); res = Success; out: EPHYR_LOG("leave\n"); return res; } int ephyrGLXMakeCurrent(__GLXclientState * a_cl, GLbyte * a_pc) { return ephyrGLXMakeCurrentReal(a_cl, a_pc, FALSE); } int ephyrGLXMakeCurrentSwap(__GLXclientState * a_cl, GLbyte * a_pc) { return ephyrGLXMakeCurrentReal(a_cl, a_pc, TRUE); } static int ephyrGLXGetStringReal(__GLXclientState * a_cl, GLbyte * a_pc, Bool a_do_swap) { ClientPtr client = NULL; int context_tag = 0, name = 0, res = BadImplementation, length = 0; char *string = NULL; __GLX_DECLARE_SWAP_VARIABLES; EPHYR_RETURN_VAL_IF_FAIL(a_cl && a_pc, BadValue); EPHYR_LOG("enter\n"); client = a_cl->client; if (a_do_swap) { __GLX_SWAP_INT(a_pc + 4); __GLX_SWAP_INT(a_pc + __GLX_SINGLE_HDR_SIZE); } context_tag = __GLX_GET_SINGLE_CONTEXT_TAG(a_pc); a_pc += __GLX_SINGLE_HDR_SIZE; name = *(GLenum *) (a_pc + 0); EPHYR_LOG("context_tag:%d, name:%d\n", context_tag, name); if (!ephyrHostGLXGetStringFromServer(context_tag, name, EPHYR_HOST_GLX_GetString, &string)) { EPHYR_LOG_ERROR("failed to get string from server\n"); goto out; } if (string) { length = strlen(string) + 1; EPHYR_LOG("got string:'%s', size:%d\n", string, length); } else { EPHYR_LOG("got string: string (null)\n"); } __GLX_BEGIN_REPLY(length); __GLX_PUT_SIZE(length); __GLX_SEND_HEADER(); if (a_do_swap) { __GLX_SWAP_REPLY_SIZE(); __GLX_SWAP_REPLY_HEADER(); } WriteToClient(client, length, string); res = Success; out: EPHYR_LOG("leave\n"); return res; }