Lines Matching refs:dpy

55 	Display *dpy = closure;
56 InternalLockDisplay(dpy, /* don't skip user locks */ 0);
57 _XSend(dpy, NULL, 0);
58 dpy->bufmax = dpy->buffer;
59 UnlockDisplay(dpy);
62 static Bool require_socket(Display *dpy)
64 if(dpy->bufmax == dpy->buffer)
70 if(dpy->xcb->event_owner != XlibOwnsEventQueue)
72 if(!xcb_take_socket(dpy->xcb->connection, return_socket, dpy,
74 _XIOError(dpy);
77 dpy->xcb->last_flushed = sent;
78 X_DPY_SET_REQUEST(dpy, sent);
79 dpy->bufmax = dpy->xcb->real_bufmax;
101 static Bool check_internal_connections(Display *dpy)
109 if(dpy->flags & XlibDisplayProcConni || !dpy->im_fd_info)
113 for(ilist = dpy->im_fd_info; ilist; ilist = ilist->next)
129 _XIOError(dpy);
136 for(ilist = dpy->im_fd_info; result && ilist; ilist = ilist->next)
139 _XProcessInternalConnection(dpy, ilist);
146 static PendingRequest *append_pending_request(Display *dpy, uint64_t sequence)
153 if(dpy->xcb->pending_requests_tail)
155 if (XLIB_SEQUENCE_COMPARE(dpy->xcb->pending_requests_tail->sequence,
160 if (dpy->xcb->pending_requests_tail->next != NULL)
164 dpy->xcb->pending_requests_tail->next = node;
167 dpy->xcb->pending_requests = node;
168 dpy->xcb->pending_requests_tail = node;
172 static void dequeue_pending_request(Display *dpy, PendingRequest *req)
174 if (req != dpy->xcb->pending_requests)
179 dpy->xcb->pending_requests = req->next;
180 if(!dpy->xcb->pending_requests)
182 if (req != dpy->xcb->pending_requests_tail)
186 dpy->xcb->pending_requests_tail = NULL;
189 dpy->xcb->pending_requests->sequence))
197 static int handle_error(Display *dpy, xError *err, Bool in_XReply)
208 for(ext = dpy->ext_procs; ext; ext = ext->next)
209 if(ext->error && (*ext->error)(dpy, err, &ext->codes, &ret_code))
211 _XError(dpy, err);
250 static xcb_generic_reply_t *poll_for_event(Display *dpy, Bool queued_only)
253 if (!require_socket(dpy))
257 assert(dpy->xcb->event_owner == XlibOwnsEventQueue && !dpy->xcb->event_waiter);
259 if(!dpy->xcb->next_event) {
261 dpy->xcb->next_event = xcb_poll_for_queued_event(dpy->xcb->connection);
263 dpy->xcb->next_event = xcb_poll_for_event(dpy->xcb->connection);
266 if(dpy->xcb->next_event)
268 PendingRequest *req = dpy->xcb->pending_requests;
269 xcb_generic_event_t *event = dpy->xcb->next_event;
270 uint64_t event_sequence = X_DPY_GET_LAST_REQUEST_READ(dpy);
275 uint64_t request = X_DPY_GET_REQUEST(dpy);
283 X_DPY_SET_LAST_REQUEST_READ(dpy, event_sequence);
284 dpy->xcb->next_event = NULL;
291 static xcb_generic_reply_t *poll_for_response(Display *dpy)
301 Bool poll_queued_only = dpy->xcb->next_response != NULL;
310 response = poll_for_event(dpy, poll_queued_only);
319 req = dpy->xcb->pending_requests;
328 if(dpy->xcb->next_response)
330 if (((xcb_generic_reply_t*)dpy->xcb->next_response)->response_type == X_Error)
332 error = dpy->xcb->next_response;
337 response = dpy->xcb->next_response;
340 dpy->xcb->next_response = NULL;
349 if(!xcb_poll_for_reply64(dpy->xcb->connection, req->sequence,
353 response = poll_for_event(dpy, True);
361 event = poll_for_event(dpy, True);
364 dpy->xcb->next_response = error ? error : response;
371 request = X_DPY_GET_REQUEST(dpy);
378 X_DPY_SET_LAST_REQUEST_READ(dpy, req->sequence);
381 dequeue_pending_request(dpy, req);
388 static void handle_response(Display *dpy, xcb_generic_reply_t *response, Bool in_XReply)
394 for(async = dpy->async_handlers; async; async = next)
397 if(async->handler(dpy, (xReply *) response, (char *) response, sizeof(xReply) + (response->length << 2), async->data))
403 handle_error(dpy, (xError *) response, in_XReply);
417 _XEnq(dpy, (xEvent *) response);
423 int _XEventsQueued(Display *dpy, int mode)
426 if(dpy->flags & XlibDisplayIOError)
428 if(dpy->xcb->event_owner != XlibOwnsEventQueue)
432 _XSend(dpy, NULL, 0);
433 else if (!check_internal_connections(dpy))
439 if(!dpy->xcb->event_waiter)
441 while((response = poll_for_response(dpy)))
442 handle_response(dpy, response, False);
443 if(xcb_connection_has_error(dpy->xcb->connection)) {
444 _XIOError(dpy);
448 return dpy->qlen;
454 void _XReadEvents(Display *dpy)
459 if(dpy->flags & XlibDisplayIOError)
461 _XSend(dpy, NULL, 0);
462 if(dpy->xcb->event_owner != XlibOwnsEventQueue)
464 if (!check_internal_connections(dpy))
467 serial = dpy->next_event_serial_num;
468 while(serial == dpy->next_event_serial_num || dpy->qlen == 0)
470 if(dpy->xcb->event_waiter)
472 ConditionWait(dpy, dpy->xcb->event_notify);
477 if(!dpy->xcb->next_event)
480 dpy->xcb->event_waiter = 1;
481 UnlockDisplay(dpy);
482 event = xcb_wait_for_event(dpy->xcb->connection);
491 InternalLockDisplay(dpy, /* ignore user locks */ 1);
492 dpy->xcb->event_waiter = 0;
493 ConditionBroadcast(dpy, dpy->xcb->event_notify);
496 _XIOError(dpy);
499 dpy->xcb->next_event = event;
508 response = poll_for_response(dpy);
510 handle_response(dpy, response, False);
511 else if(dpy->xcb->pending_requests->reply_waiter)
513 ConditionWait(dpy, dpy->xcb->reply_notify);
517 _XIOError(dpy);
526 if(!dpy->xcb->event_waiter)
527 while((response = poll_for_response(dpy)))
528 handle_response(dpy, response, False);
529 if(xcb_connection_has_error(dpy->xcb->connection))
530 _XIOError(dpy);
540 void _XSend(Display *dpy, const char *data, long size)
548 xcb_connection_t *c = dpy->xcb->connection;
549 if(dpy->flags & XlibDisplayIOError)
552 if(dpy->bufptr == dpy->buffer && !size)
555 /* append_pending_request does not alter the dpy request number
558 dpy_request = X_DPY_GET_REQUEST(dpy);
563 if(dpy->xcb->event_owner != XlibOwnsEventQueue || dpy->async_handlers)
566 for(sequence = dpy->xcb->last_flushed + 1; sequence <= dpy_request; ++sequence)
567 append_pending_request(dpy, sequence);
569 requests = dpy_request - dpy->xcb->last_flushed;
570 dpy->xcb->last_flushed = dpy_request;
572 vec[0].iov_base = dpy->buffer;
573 vec[0].iov_len = dpy->bufptr - dpy->buffer;
579 for(ext = dpy->flushes; ext; ext = ext->next_flush)
584 ext->before_flush(dpy, &ext->codes, vec[i].iov_base, vec[i].iov_len);
588 _XIOError(dpy);
591 dpy->bufptr = dpy->buffer;
592 dpy->last_req = (char *) &dummy_request;
594 if (!check_internal_connections(dpy))
597 _XSetSeqSyncFunction(dpy);
604 void _XFlush(Display *dpy)
606 if (!require_socket(dpy))
609 _XSend(dpy, NULL, 0);
611 _XEventsQueued(dpy, QueuedAfterReading);
616 void _XIDHandler(Display *dpy)
618 if (dpy->xcb->next_xid == inval_id)
619 _XAllocIDs(dpy, &dpy->xcb->next_xid, 1);
623 XID _XAllocID(Display *dpy)
625 XID ret = dpy->xcb->next_xid;
627 dpy->xcb->next_xid = inval_id;
628 _XSetPrivSyncFunction(dpy);
633 void _XAllocIDs(Display *dpy, XID *ids, int count)
637 if (dpy->lock)
638 (*dpy->lock->user_lock_display)(dpy);
639 UnlockDisplay(dpy);
642 ids[i] = xcb_generate_id(dpy->xcb->connection);
644 InternalLockDisplay(dpy, /* don't skip user locks */ 0);
645 if (dpy->lock)
646 (*dpy->lock->user_unlock_display)(dpy);
650 static void _XFreeReplyData(Display *dpy, Bool force)
652 if(!force && dpy->xcb->reply_consumed < dpy->xcb->reply_length)
654 free(dpy->xcb->reply_data);
655 dpy->xcb->reply_data = NULL;
664 Status _XReply(Display *dpy, xReply *rep, int extra, Bool discard)
667 xcb_connection_t *c = dpy->xcb->connection;
672 if (dpy->xcb->reply_data)
676 if(dpy->flags & XlibDisplayIOError)
679 _XSend(dpy, NULL, 0);
680 dpy_request = X_DPY_GET_REQUEST(dpy);
681 if(dpy->xcb->pending_requests_tail
682 && dpy->xcb->pending_requests_tail->sequence == dpy_request)
683 current = dpy->xcb->pending_requests_tail;
685 current = append_pending_request(dpy, dpy_request);
691 PendingRequest *req = dpy->xcb->pending_requests;
696 ConditionWait(dpy, dpy->xcb->reply_notify);
701 UnlockDisplay(dpy);
706 InternalLockDisplay(dpy, /* ignore user locks */ 1);
713 if(dpy->xcb->event_owner == XlibOwnsEventQueue)
719 if(!dpy->xcb->event_waiter)
721 while((event = poll_for_response(dpy)))
722 handle_response(dpy, event, True);
727 ConditionBroadcast(dpy, dpy->xcb->reply_notify);
728 dpy_request = X_DPY_GET_REQUEST(dpy);
734 X_DPY_SET_LAST_REQUEST_READ(dpy, req->sequence);
736 dequeue_pending_request(dpy, req);
745 handle_response(dpy, (xcb_generic_reply_t *) error, True);
747 handle_response(dpy, response, True);
749 if (!check_internal_connections(dpy))
752 if(dpy->xcb->next_event && dpy->xcb->next_event->response_type == X_Error)
754 xcb_generic_event_t *event = dpy->xcb->next_event;
755 uint64_t last_request_read = X_DPY_GET_LAST_REQUEST_READ(dpy);
761 dpy->xcb->next_event = NULL;
798 ret_code = handle_error(dpy, (xError *) error, True);
806 _XIOError(dpy);
811 dpy->xcb->reply_data = reply;
812 dpy->xcb->reply_consumed = sizeof(xReply) + (extra * 4);
813 dpy->xcb->reply_length = sizeof(xReply);
814 if(dpy->xcb->reply_data[0] == 1)
815 dpy->xcb->reply_length += (((xcb_generic_reply_t *) dpy->xcb->reply_data)->length * 4);
818 if(dpy->xcb->reply_length < dpy->xcb->reply_consumed)
819 dpy->xcb->reply_consumed = dpy->xcb->reply_length;
821 memcpy(rep, dpy->xcb->reply_data, dpy->xcb->reply_consumed);
822 _XFreeReplyData(dpy, discard);
826 int _XRead(Display *dpy, char *data, long size)
831 if(dpy->xcb->reply_data == NULL ||
832 dpy->xcb->reply_consumed + size > dpy->xcb->reply_length)
835 memcpy(data, dpy->xcb->reply_data + dpy->xcb->reply_consumed, size);
836 dpy->xcb->reply_consumed += size;
837 _XFreeReplyData(dpy, False);
846 void _XReadPad(Display *dpy, char *data, long size)
848 _XRead(dpy, data, size);
849 dpy->xcb->reply_consumed += -size & 3;
850 _XFreeReplyData(dpy, False);
854 void _XEatData(Display *dpy, unsigned long n)
856 dpy->xcb->reply_consumed += n;
857 _XFreeReplyData(dpy, False);
866 void _XEatDataWords(Display *dpy, unsigned long n)
868 if (n < ((INT_MAX - dpy->xcb->reply_consumed) >> 2))
869 dpy->xcb->reply_consumed += (n << 2);
872 dpy->xcb->reply_consumed = dpy->xcb->reply_length;
873 _XFreeReplyData(dpy, False);
877 _XNextRequest(Display *dpy)
879 /* This will update dpy->request. The assumption is that the next thing
883 require_socket(dpy);
884 return NextRequest(dpy);