* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-/* $Id: miniglx_events.c,v 1.2 2004/03/11 20:35:38 jonsmirl Exp $ */
#include <assert.h>
#include <linux/kd.h>
#include <linux/vt.h>
+#include "xf86drm.h"
#include "miniglxP.h"
-#include "xf86drm.h"
-#include "dri_util.h"
#define MINIGLX_FIFO_NAME "/tmp/miniglx.fifo"
-/** Character messages. */
-enum msgs {
- _CanIHaveFocus,
- _IDontWantFocus,
- _YouveGotFocus,
- _YouveLostFocus,
- _RepaintPlease,
-};
-
/**
* \brief Allocate an XEvent structure on the event queue.
*
er->xdestroywindow.serial = 0;
er->xdestroywindow.send_event = 0;
er->xdestroywindow.display = dpy;
- er->xdestroywindow.window = (Window)i;
+ er->xdestroywindow.window = (Window)i;
+
+ drmGetLock(dpy->driverContext.drmFD, 1, 0);
+ drmUnlock(dpy->driverContext.drmFD, 1);
}
}
* This will be actually sent to that file descriptor from
* __miniglx_Select().
*/
-static int send_msg( Display *dpy, int i,
+int send_msg( Display *dpy, int i,
const void *msg, size_t sz )
{
int cnt = dpy->fd[i].writebuf_count;
* \internal
* Use send_msg() to send a one-byte message to a socket.
*/
-static int send_char_msg( Display *dpy, int i, char msg )
+int send_char_msg( Display *dpy, int i, char msg )
{
return send_msg( dpy, i, &msg, sizeof(char));
}
*
* Only called from welcome_message_part().
*/
-static int blocking_read( Display *dpy, int connection,
+int blocking_read( Display *dpy, int connection,
char *msg, size_t msg_size )
{
int i, r;
if (!*msg) *msg = malloc(sz);
if (!*msg) return False;
if (!blocking_read( dpy, i, *msg, sz )) return False;
+ return sz;
}
else {
if (!send_msg( dpy, i, &sz, sizeof(sz))) return False;
{
void *tmp = &dpy->driverContext.shared;
int *clientid = dpy->IsClient ? &dpy->clientID : &i;
-
+ int size;
+
if (!welcome_message_part( dpy, i, (void **)&clientid, sizeof(*clientid)))
return False;
if (!welcome_message_part( dpy, i, &tmp, sizeof(dpy->driverContext.shared)))
return False;
- if (!welcome_message_part( dpy, i,
+ size=welcome_message_part( dpy, i,
(void **)&dpy->driverContext.driverClientMsg,
- dpy->driverContext.driverClientMsgSize ))
+ dpy->driverContext.driverClientMsgSize );
+
+ if (!size)
return False;
+ if (dpy->IsClient) {
+ dpy->driverContext.driverClientMsgSize = size;
+ }
return True;
}
static int
handle_fifo_read( Display *dpy, int i )
{
+ drm_magic_t magic;
+ int err;
+
while (dpy->fd[i].readbuf_count) {
char id = dpy->fd[i].readbuf[0];
XEvent *er;
if (dpy->driver->notifyFocus)
dpy->driver->notifyFocus( 0 );
break;
+
+ case _Authorize:
+ dpy->authorized = True;
+ break;
default:
fprintf(stderr, "Client received unhandled message type %d\n", id);
er->xunmap.window = (Window)i;
er->xunmap.from_configure = False;
break;
+
+ case _Authorize:
+ /* is full message here yet? */
+ if (dpy->fd[i].readbuf_count < count + sizeof(magic)) {
+ count = 0;
+ break;
+ }
+ memcpy(&magic, dpy->fd[i].readbuf + count, sizeof(magic));
+ fprintf(stderr, "Authorize - magic %d\n", magic);
+
+ err = drmAuthMagic(dpy->driverContext.drmFD, magic);
+ count += sizeof(magic);
+
+ send_char_msg( dpy, i, _Authorize );
+ break;
default:
fprintf(stderr, "Server received unhandled message type %d\n", id);
* \internal
* This function is the select() main loop.
*/
-static int handle_fd_events( Display *dpy, int nonblock )
+int handle_fd_events( Display *dpy, int nonblock )
{
while (1) {
struct timeval tv = {0, 0};