Complete sample: Injecting a Screen event

This code sample uses a privileged context to inject a Screen event into a specified display.

/*
 * $QNXLicenseC:
 * Copyright 2011, QNX Software Systems Limited. All Rights Reserved.
 *
 * This software is QNX Confidential Information subject to 
 * confidentiality restrictions. DISCLOSURE OF THIS SOFTWARE 
 * IS PROHIBITED UNLESS AUTHORIZED BY QNX SOFTWARE SYSTEMS IN 
 * WRITING.
 *
 * You must obtain a written license from and pay applicable license 
 * fees to QNX Software Systems Limited before you may reproduce, modify
 * or distribute this software, or any work that includes all or part 
 * of this software. For more information visit 
 * http://licensing.qnx.com or email licensing@qnx.com.
 * 
 * This file may contain contributions from others.  Please review 
 * this entire file for other proprietary rights or license notices, 
 * as well as the QNX Development Suite License Guide at 
 * http://licensing.qnx.com/license-guide/ for other information.
 * $
 */

#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/keycodes.h>
#include <time.h>
#include <screen/screen.h>

int main(int argc, char **argv)
{
	screen_context_t screen_ctx;
	screen_display_t screen_disp;
	screen_display_t *screen_dlist;
	screen_event_t screen_ev;
    int ndisplays;
	int val;
	const char *display = "1";
	int rval = EXIT_FAILURE;
	int rc;
	int i, j;

	for (i = 1; i < argc; i++) {
		if (strncmp(argv[i], "-display=", strlen("-display=")) == 0) {
			display = argv[i] + strlen("-display=");
		} else {
			break;
		}
	}

	rc = screen_create_context(&screen_ctx, SCREEN_INPUT_PROVIDER_CONTEXT);
	if (rc) {
		perror("screen_context_create");
		goto fail1;
	}

	rc = screen_get_context_property_iv(screen_ctx, SCREEN_PROPERTY_DISPLAY_COUNT, &ndisplays);
	if (rc) {
		perror("screen_get_context_property_iv(SCREEN_PROPERTY_DISPLAY_COUNT)");
		goto fail2;
	}

	screen_dlist = calloc(ndisplays, sizeof(*screen_dlist));
	if (screen_dlist == NULL) {
		fprintf(stderr, "could not allocate memory for display list\n");
		goto fail2;
	}

	rc = screen_get_context_property_pv(screen_ctx, SCREEN_PROPERTY_DISPLAYS, (void **)screen_dlist);
	if (rc) {
		perror("screen_get_context_property_pv(SCREEN_PROPERTY_DISPLAYS)");
		free(screen_dlist);
		goto fail2;
	}

	if (isdigit(*display)) {
		j = atoi(display) - 1;
	} else {
		int type = -1;
		if (strcmp(display, "internal") == 0) {
			type = SCREEN_DISPLAY_TYPE_INTERNAL;
		} else if (strcmp(display, "composite") == 0) {
			type = SCREEN_DISPLAY_TYPE_COMPOSITE;
		} else if (strcmp(display, "svideo") == 0) {
			type = SCREEN_DISPLAY_TYPE_SVIDEO;
		} else if (strcmp(display, "YPbPr") == 0) {
			type = SCREEN_DISPLAY_TYPE_COMPONENT_YPbPr;
		} else if (strcmp(display, "rgb") == 0) {
			type = SCREEN_DISPLAY_TYPE_COMPONENT_RGB;
		} else if (strcmp(display, "rgbhv") == 0) {
			type = SCREEN_DISPLAY_TYPE_COMPONENT_RGBHV;
		} else if (strcmp(display, "dvi") == 0) {
			type = SCREEN_DISPLAY_TYPE_DVI;
		} else if (strcmp(display, "hdmi") == 0) {
			type = SCREEN_DISPLAY_TYPE_HDMI;
		} else if (strcmp(display, "other") == 0) {
			type = SCREEN_DISPLAY_TYPE_OTHER;
		} else {
			fprintf(stderr, "unknown display type %s\n", display);
			free(screen_dlist);
			goto fail2;
		}
		for (j = 0; j < ndisplays; j++) {
			screen_get_display_property_iv(screen_dlist[j], SCREEN_PROPERTY_TYPE, &val);
			if (val == type) {
				break;
			}
		}
	}

	if (j >= ndisplays) {
		fprintf(stderr, "couldn't find display %s\n", display);
		free(screen_dlist);
		goto fail2;
	}

	screen_disp = screen_dlist[j];
	free(screen_dlist);

	rc = screen_create_event(&screen_ev);
	if (rc) {
		perror("screen_create_event");
		goto fail2;
	}

	val = SCREEN_EVENT_KEYBOARD;
	rc = screen_set_event_property_iv(screen_ev, SCREEN_PROPERTY_TYPE, &val);
	if (rc) {
		perror("screen_set_event_property_iv(SCREEN_PROPERTY_TYPE)");
		goto fail3;
	}

	val = KEY_DOWN|KEY_SYM_VALID;
	rc = screen_set_event_property_iv(screen_ev, SCREEN_PROPERTY_KEY_FLAGS, &val);
	if (rc) {
		perror("screen_set_event_property_iv(SCREEN_PROPERTY_KEY_FLAGS)");
		goto fail3;
	}

	for (; i < argc; i++) {
		for (j = 0; argv[i][j]; j++) {
			val = argv[i][j];
			rc = screen_set_event_property_iv(screen_ev, SCREEN_PROPERTY_KEY_SYM, &val);
			if (rc) {
				perror("screen_set_event_property_iv(SCREEN_PROPERTY_KEY_SYM)");
				goto fail3;
			}

			rc = screen_inject_event(screen_disp, screen_ev);
			if (rc) {
				perror("screen_inject_event");
				goto fail3;
			}
		}
	}
	rval = EXIT_SUCCESS;

fail3:
	screen_destroy_event(screen_ev);
fail2:
	screen_destroy_context(screen_ctx);
fail1:
	return rval;
}