cell: comments, etc.
[mesa.git] / src / glx / mini / miniglx_events.c
index 319fc530fa177bb0222d7c2460c379946e591fa6..a20d5847b3c121a0a68bf086ececd30cebc3fd7a 100644 (file)
@@ -38,7 +38,6 @@
  * 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.
  *
@@ -165,7 +154,10 @@ static void shut_fd( Display *dpy, int i )
       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);
    }
 }
 
@@ -182,7 +174,7 @@ static void shut_fd( Display *dpy, int i )
  * 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;
@@ -206,7 +198,7 @@ static int send_msg( Display *dpy, int i,
  * \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));
 }
@@ -226,7 +218,7 @@ static int send_char_msg( Display *dpy, int i, char msg )
  *
  * 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;
@@ -268,6 +260,7 @@ static int welcome_message_part( Display *dpy, int i, void **msg, int sz )
       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;
@@ -293,18 +286,24 @@ static int welcome_message( Display *dpy, int i )
 {
    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;
 }
 
@@ -388,6 +387,9 @@ static int handle_new_client( Display *dpy )
 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;
@@ -450,6 +452,10 @@ handle_fifo_read( Display *dpy, int i )
            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);
@@ -490,6 +496,21 @@ handle_fifo_read( Display *dpy, int i )
            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);
@@ -715,7 +736,7 @@ __miniglx_Select( Display *dpy, int n, fd_set *rfds, fd_set *wfds, fd_set *xfds,
  * \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};