int main(int argc, char **argv) { struct xs_handle *xsh; xs_transaction_t xth = XBT_NULL; int ret = 0, socket = 0; int prefix = 0; int tidy = 0; int upto = 0; int recurse = 0; int nr_watches = -1; int transaction; struct winsize ws; enum mode mode; const char *_command = strrchr(argv[0], '/'); const char *command = _command ? &_command[1] : argv[0]; int switch_argv = -1; /* which element of argv did we switch on */ if (strncmp(command, "xenstore-", strlen("xenstore-")) == 0) { switch_argv = 0; command = command + strlen("xenstore-"); } else if (argc < 2) usage(MODE_unknown, 0, argv[0]); else { command = argv[1]; switch_argv = 1; } mode = lookup_mode(command); while (1) { int c, index = 0; static struct option long_options[] = { {"help", 0, 0, 'h'}, {"flat", 0, 0, 'f'}, /* MODE_ls */ {"socket", 0, 0, 's'}, {"prefix", 0, 0, 'p'}, /* MODE_read || MODE_list || MODE_ls */ {"tidy", 0, 0, 't'}, /* MODE_rm */ {"upto", 0, 0, 'u'}, /* MODE_chmod */ {"recurse", 0, 0, 'r'}, /* MODE_chmod */ {"number", 1, 0, 'n'}, /* MODE_watch */ {0, 0, 0, 0} }; c = getopt_long(argc - switch_argv, argv + switch_argv, "hfspturn:", long_options, &index); if (c == -1) break; switch (c) { case 'h': usage(mode, switch_argv, argv[0]); /* NOTREACHED */ case 'f': if ( mode == MODE_ls ) { max_width = INT_MAX/2; desired_width = 0; show_whole_path = 1; } else { usage(mode, switch_argv, argv[0]); } break; case 's': socket = 1; break; case 'p': if ( mode == MODE_read || mode == MODE_list || mode == MODE_ls ) prefix = 1; else usage(mode, switch_argv, argv[0]); break; case 't': if ( mode == MODE_rm ) tidy = 1; else usage(mode, switch_argv, argv[0]); break; case 'u': if ( mode == MODE_chmod ) upto = 1; else usage(mode, switch_argv, argv[0]); break; case 'r': if ( mode == MODE_chmod ) recurse = 1; else usage(mode, switch_argv, argv[0]); break; case 'n': if ( mode == MODE_watch ) nr_watches = atoi(optarg); else usage(mode, switch_argv, argv[0]); break; } } switch (mode) { case MODE_ls: break; case MODE_write: if ((argc - switch_argv - optind) % 2 == 1) { usage(mode, switch_argv, argv[0]); /* NOTREACHED */ } /* DROP-THRU */ default: if (optind == argc - switch_argv) { usage(mode, switch_argv, argv[0]); /* NOTREACHED */ } } switch (mode) { case MODE_read: transaction = (argc - switch_argv - optind) > 1; break; case MODE_write: transaction = (argc - switch_argv - optind) > 2; break; case MODE_ls: case MODE_watch: transaction = 0; break; default: transaction = 1; break; } if ( mode == MODE_ls ) { memset(&ws, 0, sizeof(ws)); ret = ioctl(STDOUT_FILENO, TIOCGWINSZ, &ws); if (!ret) max_width = ws.ws_col - 2; } xsh = xs_open(socket ? XS_OPEN_SOCKETONLY : 0); if (xsh == NULL) err(1, "xs_open"); again: if (transaction) { xth = xs_transaction_start(xsh); if (xth == XBT_NULL) errx(1, "couldn't start transaction"); } ret = perform(mode, optind, argc - switch_argv, argv + switch_argv, xsh, xth, prefix, tidy, upto, recurse, nr_watches); if (transaction && !xs_transaction_end(xsh, xth, ret)) { if (ret == 0 && errno == EAGAIN) { output_pos = 0; goto again; } errx(1, "couldn't end transaction"); } if (output_pos) printf("%s", output_buf); return ret; }
int main(void) { Display *dpy; int i, j, fd; unsigned int attachments[] = { DRI2BufferBackLeft, DRI2BufferFrontLeft, }; XRRScreenResources *res; dpy = XOpenDisplay(NULL); if (dpy == NULL) return 77; if (!XRRQueryVersion(dpy, &i, &j)) return 77; fd = dri2_open(dpy); if (fd < 0) return 1; res = _XRRGetScreenResourcesCurrent(dpy, DefaultRootWindow(dpy)); if (res == NULL) return 1; printf("noutput=%d, ncrtc=%d\n", res->noutput, res->ncrtc); for (i = 0; i < res->ncrtc; i++) XRRSetCrtcConfig(dpy, res, res->crtcs[i], CurrentTime, 0, 0, None, RR_Rotate_0, NULL, 0); XSync(dpy, True); for (i = 0; i < res->noutput; i++) { XRROutputInfo *output; XRRModeInfo *mode; output = XRRGetOutputInfo(dpy, res, res->outputs[i]); if (output == NULL) continue; mode = NULL; if (res->nmode) mode = lookup_mode(res, output->modes[0]); for (j = 0; mode && j < output->ncrtc; j++) { printf("[%d, %d] -- OUTPUT:%ld, CRTC:%ld\n", i, j, (long)res->outputs[i], (long)output->crtcs[j]); XRRSetCrtcConfig(dpy, res, output->crtcs[j], CurrentTime, 0, 0, output->modes[0], RR_Rotate_0, &res->outputs[i], 1); XSync(dpy, True); run(dpy, mode->width, mode->height, attachments, 1, "fullscreen"); run(dpy, mode->width, mode->height, attachments, 2, "fullscreen (with front)"); run(dpy, mode->width/2, mode->height/2, attachments, 1, "windowed"); run(dpy, mode->width/2, mode->height/2, attachments, 2, "windowed (with front)"); XRRSetCrtcConfig(dpy, res, output->crtcs[j], CurrentTime, 0, 0, None, RR_Rotate_0, NULL, 0); XSync(dpy, True); } XRRFreeOutputInfo(output); } return 0; }