int main(int argc, char * argv[]) { IOReturn err; CGDirectDisplayID dspy = CGMainDisplayID(); io_service_t framebuffer; CGRect bounds; vm_address_t buffer; vm_size_t size, rowBytes; framebuffer = CGDisplayIOServicePort(dspy); assert (framebuffer != MACH_PORT_NULL); dspy = CGMainDisplayID(); bounds = CGDisplayBounds(dspy); rowBytes = CGDisplayBytesPerRow(dspy); err = IOAccelReadFramebuffer(framebuffer, bounds.size.width, bounds.size.height, rowBytes, &buffer, &size); if (kIOReturnSuccess == err) { fprintf(stderr, "writing 0x%x bytes from 0x%x\n", size, buffer); write(STDOUT_FILENO, (const void *) buffer, size); vm_deallocate(mach_task_self(), buffer, size); } return (0); }
static void setup_screen(void) { CGDirectDisplayID targetDisplay = kCGDirectMainDisplay; CGDisplayCapture(targetDisplay); /* crucial for being permitted to write on it */ screen.base = (uint32_t *) CGDisplayBaseAddress(targetDisplay); screen.stride = CGDisplayBytesPerRow(targetDisplay) / sizeof(uint32_t); screen.width = CGDisplayPixelsWide(targetDisplay); screen.height = CGDisplayPixelsHigh(targetDisplay); }