ffi added by retroj on Mon Jun 5 00:33:34 2017

(define-record-type xinerama-screen-info
  (%make-xinerama-screen-info screen-number x-org y-org width height)
  xinerama-screen-info?
  (screen-number xinerama-screen-info-screen-number)
  (x-org xinerama-screen-info-x-org)
  (y-org xinerama-screen-info-y-org)
  (width xinerama-screen-info-width)
  (height xinerama-screen-info-height))

(define (make-xinerama-screen-info . _)
  (%make-xinerama-screen-info 0 0 0 0 0))



(define (xinerama-query-screens display)
  (let-location ((count int 0))
    (let* ((blob ((foreign-lambda c-pointer
                                  XineramaQueryScreens
                                  c-pointer (c-pointer int))
                  display (location count)))
           (result (list-tabulate count make-xinerama-screen-info)))
      ((foreign-lambda* void ((c-pointer blob) (int count) (scheme-object result))
         "XineramaScreenInfo* xsis = (XineramaScreenInfo*)blob;\n"
         "XineramaScreenInfo* xsi = xsis;\n"
         "int i;\n"
         "C_word rec;\n"
         "for (i = 0; i < count; ++i) {\n"
         "    rec = C_u_i_car(result);\n"
         "    C_i_setslot(rec, 1, C_fix(xsi->screen_number));"
         "    C_i_setslot(rec, 2, C_fix(xsi->x_org));"
         "    C_i_setslot(rec, 3, C_fix(xsi->y_org));"
         "    C_i_setslot(rec, 4, C_fix(xsi->width));"
         "    C_i_setslot(rec, 5, C_fix(xsi->height));"
         "    result = C_u_i_cdr(result);\n"
         "    xsi += 1;"
         "}\n")
       blob count result)
      result)))