Exemple #1
0
void
PLAYBOOK_PumpEvents(_THIS)
{
	while (1)
	{
		int rc = screen_get_event(this->hidden->screenContext, this->hidden->screenEvent, 0 /*timeout*/);
		if (rc)
			break;

		int type;
		rc = screen_get_event_property_iv(this->hidden->screenEvent, SCREEN_PROPERTY_TYPE, &type);
		if (rc || type == SCREEN_EVENT_NONE)
			break;

		screen_window_t window;
		screen_get_event_property_pv(this->hidden->screenEvent, SCREEN_PROPERTY_WINDOW, (void **)&window);
		if (!window && type != SCREEN_EVENT_KEYBOARD)
			break;

		switch (type)
		{
		case SCREEN_EVENT_CLOSE:
			SDL_PrivateQuit(); // We can't stop it from closing anyway
			break;
		case SCREEN_EVENT_PROPERTY:
			{
				int val;
				screen_get_event_property_iv(this->hidden->screenEvent, SCREEN_PROPERTY_NAME, &val);

				//fprintf(stderr, "Property change (property val=%d)\n", val);
			}
			break;
		case SCREEN_EVENT_POINTER:
			handlePointerEvent(this->hidden->screenEvent, window);
			break;
		case SCREEN_EVENT_KEYBOARD:
			handleKeyboardEvent(this->hidden->screenEvent);
			break;
		case SCREEN_EVENT_MTOUCH_TOUCH:
		case SCREEN_EVENT_MTOUCH_MOVE:
		case SCREEN_EVENT_MTOUCH_RELEASE:
			handleMtouchEvent(this->hidden->screenEvent, window, type);
			break;
		}
	}

#ifdef TOUCHPAD_SIMULATE
	if (state.pending[0] || state.pending[1]) {
		SDL_PrivateMouseMotion(state.mask, 1, state.pending[0], state.pending[1]);
		state.pending[0] = 0;
		state.pending[1] = 0;
	}
#endif
	if (moveEvent.pending) {
		SDL_PrivateMouseMotion((moveEvent.touching?SDL_BUTTON_LEFT:0), 0, moveEvent.pos[0], moveEvent.pos[1]);
		moveEvent.pending = 0;
	}
}
Exemple #2
0
void QBBScreenEventThread::run()
{
    screen_event_t event;

    // create screen event
    errno = 0;
    int result = screen_create_event(&event);
    if (result)
        qFatal("QBB: failed to create screen event, errno=%d", errno);

#if defined(QBBSCREENEVENTTHREAD_DEBUG)
    qDebug() << "QBB: screen event thread started";
#endif

    // loop indefinitely
    while (!mQuit) {

        // block until screen event is available
        errno = 0;
        result = screen_get_event(mContext, event, -1);
        if (result)
            qFatal("QBB: failed to get screen event, errno=%d", errno);

        // process received event
        errno = 0;
        int qnxType;
        int result = screen_get_event_property_iv(event, SCREEN_PROPERTY_TYPE, &qnxType);
        if (result)
            qFatal("QBB: failed to query screen event type, errno=%d", errno);

        if (qnxType == SCREEN_EVENT_USER) {
            // treat all screen user events as shutdown requests
            #if defined(QBBSCREENEVENTTHREAD_DEBUG)
            qDebug() << "QBB: QNX screen user event";
            #endif
            mQuit = true;
        } else {
            mEventHandler->handleEvent(event, qnxType);
        }
    }

#if defined(QBBSCREENEVENTTHREAD_DEBUG)
    qDebug() << "QBB: screen event thread stopped";
#endif

    // cleanup
    screen_destroy_event(event);
}
Exemple #3
0
void QBBEventThread::run()
{
    screen_event_t event;

    // create screen event
    errno = 0;
    int result = screen_create_event(&event);
    if (result) {
        qFatal("QBB: failed to create event, errno=%d", errno);
    }

#if defined(QBBEVENTTHREAD_DEBUG)
    qDebug() << "QBB: event loop started";
#endif

    // loop indefinitely
    while (!mQuit) {

        // block until screen event is available
        errno = 0;
        result = screen_get_event(mContext, event, -1);
        if (result) {
            qFatal("QBB: failed to get event, errno=%d", errno);
        }

        // process received event
        dispatchEvent(event);
    }

#if defined(QBBEVENTTHREAD_DEBUG)
    qDebug() << "QBB: event loop stopped";
#endif

    // cleanup
    screen_destroy_event(event);
}
Exemple #4
0
static void HandleEvents(void)
{
	int t = 0;
	int rc = 0;
	int freeze = 0;
	int prop;
	int size[2];

	int x, y, val, tid, key, keyflags;
	mtouch_event_t mtouch_event;
	static int retainMovX = 0, retainMovY = 0;
	static int lookX = 0, lookY = 0;
	static camThrottle = 0;
	static int moveTouchId = -1;
	static int lookTouchId = -1;
	static qboolean touchIds[3] = { false, false, false };
	qboolean dowarp = qfalse;
	int jmping = 0;

#if 0
	while(1) {
		while (!screen_get_event(screen_ctx, screen_ev, freeze ? ~0 : 0)) {
			rc = screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_TYPE, &val);
			if (rc || val == SCREEN_EVENT_NONE) {
				break;
			}
			switch (val) {
			case SCREEN_EVENT_PROPERTY:
				screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_NAME, &prop);
				if (prop == SCREEN_PROPERTY_VISIBLE) {
					screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_VISIBLE, &prop);
					if (prop) {
						freeze = 0;
					} else {
						freeze = 1;
					}
				}
			}
		}
		if (!freeze) {
			break;
		}
	}

	screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_SIZE, size);
	if ((size[0] <= 374) && (size[1] <= 219)) {
		screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_SOURCE_SIZE, size);
		if ((size[0] != 374) && (size[1] != 219)) {
			glConfig.vidWidth = 374;
			glConfig.vidHeight = 219 * 600 / 768;
			min = 1;
		}
	} else {
		screen_get_window_property_iv(screen_win, SCREEN_PROPERTY_SOURCE_SIZE, size);
		if ((size[0] != bz[0]) && (size[1] != bz[1])) {
			glConfig.vidWidth = bz[0];
			glConfig.vidHeight = bz[1];
			max = 1;
		}
	}

#else
	t = Sys_Milliseconds();

	if (jmping)
	{
		Sys_QueEvent( t, SE_KEY, K_SPACE, qfalse, 0, NULL );
	}

	while (!screen_get_event(screen_ctx, screen_ev, 1))
	{
		rc = screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_TYPE, &val);
		if (rc || val == SCREEN_EVENT_NONE)
			break;

		switch (val)
		{
			case SCREEN_EVENT_CLOSE:
				Com_Printf("SCREEN CLOSE EVENT!\n");
				break;
			case SCREEN_EVENT_MTOUCH_RELEASE:
				screen_get_mtouch_event(screen_ev, &mtouch_event, 0);
				tid = mtouch_event.contact_id;

				if (touchIds[tid]) {
					if (moveTouchId == tid) {
						moveTouchId = -1;
						touchIds[tid] = false;
						movX = movY = 0;
						retainMovX = retainMovY = 0;
					} else if (lookTouchId == tid) {
						lookTouchId = -1;
						touchIds[tid] = false;
						lookX = lookY = 0;
					}
				}

				Sys_QueEvent(t, SE_KEY, K_MOUSE1, qfalse, 0, NULL);
				Sys_QueEvent( t, SE_KEY, K_SPACE, qfalse, 0, NULL );
				Sys_QueEvent( t, SE_KEY, 's', qfalse, 0, NULL );
				Sys_QueEvent( t, SE_KEY, 'w', qfalse, 0, NULL );
				Sys_QueEvent( t, SE_KEY, 'd', qfalse, 0, NULL );
				Sys_QueEvent( t, SE_KEY, 'a', qfalse, 0, NULL );
				Sys_QueEvent( t, SE_KEY, 'n', qfalse, 0, NULL );

				break;

			case SCREEN_EVENT_POINTER:
			case SCREEN_EVENT_MTOUCH_TOUCH:
			case SCREEN_EVENT_MTOUCH_MOVE:
				screen_get_mtouch_event(screen_ev, &mtouch_event, 0);

				if (mouse_active && tid < 3)
				{
					if (cls.state == CA_ACTIVE && !uis.activemenu)
					{
						x = mtouch_event.x;
						y = mtouch_event.y;
						tid = mtouch_event.contact_id;

						if (val == SCREEN_EVENT_MTOUCH_TOUCH)
						{
							// check for new input type
							if (moveTouchId == -1 && (((movBoundX - x) * (movBoundX - x) + (movBoundY - y)*(movBoundY - y)) < r1square ))
							{
								// move
								moveTouchId = tid;
								touchIds[tid] = true;
							}
							else
							{
								// look
								lookTouchId = tid;
								touchIds[tid] = true;
								lookX = x;
								lookY = y;

								// allow looking while firing/jumping
								if (((fireBoundX - x) * (fireBoundX - x) + (fireBoundY - y)*(fireBoundY - y)) < r2square)
								{
									// fire
									Sys_QueEvent(t, SE_KEY, K_MOUSE1, qtrue, 0, NULL);
								}
								else if (((jmpBoundX - x) * (jmpBoundX - x) + (jmpBoundY - y)*(jmpBoundY - y)) < r2square )
								{
									// jump
									Sys_QueEvent( t, SE_KEY, K_SPACE, qtrue, 0, NULL );
								}
								else if (((weaponNextX - x) * (weaponNextX - x) + (weaponNextY - y)*(weaponNextY - y)) < r2square )
								{
									// weapon prev
									Sys_QueEvent( t, SE_KEY, 'n', qtrue, 0, NULL );
								}
							}
						}

						if (moveTouchId == tid)
						{
							// process moving
							x = (x - movBoundX);
							y = (y - movBoundY);
							retainMovX = x;
							retainMovY = y;
							movX = x * 640 / 786;
							movY = y;
							if (x * x + y * y > r1square)
							{
								movX = movY = -1; // hide
							}
						}
						else if (lookTouchId == tid)
						{
							// process looking
							Sys_QueEvent(t, SE_MOUSE, (x - lookX) * 2, (y - lookY) * 2, 0, NULL);
							lookX = x;
							lookY = y;
						}
					}
					else if (cls.state == CA_CINEMATIC)
					{
						x = mtouch_event.x;
						y = mtouch_event.y;

						if (val == SCREEN_EVENT_MTOUCH_TOUCH)
						{
							Sys_QueEvent(t, SE_KEY, K_MOUSE1, qtrue, 0, NULL);
						}
						else if (val == SCREEN_EVENT_MTOUCH_RELEASE)
						{
							Sys_QueEvent(t, SE_KEY, K_MOUSE1, qfalse, 0, NULL);
						}
					}
					else if ((cls.state == CA_ACTIVE && uis.activemenu) ||
							 (cls.state != CA_ACTIVE && cls.state != CA_CINEMATIC))
					{
						x = (mtouch_event.x * 640) / 1024;
						y = (mtouch_event.y * 480 ) / 768;

						if (x == glConfig.vidWidth/2 &&
							y == glConfig.vidHeight/2)
						{
							x = y = 0;
							break;
						}

						dowarp = qtrue;

						x =  x - prevX;
						y =  y - prevY;

						Sys_QueEvent(t, SE_MOUSE, x, y, 0, NULL);

						prevX = (mtouch_event.x * 640) / 1024;
						prevY = (mtouch_event.y * 480 ) / 768;

						if (val == SCREEN_EVENT_MTOUCH_TOUCH)
						{
							Sys_QueEvent(t, SE_KEY, K_MOUSE1, qtrue, 0, NULL);
						}
						else if (val == SCREEN_EVENT_MTOUCH_RELEASE)
						{
							Sys_QueEvent(t, SE_KEY, K_MOUSE1, qfalse, 0, NULL);
						}
					}

				}

				if (retainMovX > movBoundRad / 2)
				{
					Sys_QueEvent( t, SE_KEY, 'd', qtrue, 0, NULL );
				}
				else if (retainMovX < -movBoundRad / 2 )
				{
					Sys_QueEvent( t, SE_KEY, 'a', qtrue, 0, NULL );
				}
				else
				{
					Sys_QueEvent( t, SE_KEY, 'd', qfalse, 0, NULL );
					Sys_QueEvent( t, SE_KEY, 'a', qfalse, 0, NULL );
				}

				if (retainMovY > movBoundRad / 2)
				{
					Sys_QueEvent( t, SE_KEY, 's', qtrue, 0, NULL );
				}
				else if (retainMovY < -movBoundRad / 2)
				{
					Sys_QueEvent( t, SE_KEY, 'w', qtrue, 0, NULL );
				}
				else
				{
					Sys_QueEvent( t, SE_KEY, 's', qfalse, 0, NULL );
					Sys_QueEvent( t, SE_KEY, 'w', qfalse, 0, NULL );
				}
				break;

			case SCREEN_EVENT_KEYBOARD:
				screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_KEY_SYM, &key);
				screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_KEY_FLAGS, &keyflags);
				if (keyflags & KEY_DOWN)
				{
					if (key >= ' ' && key < '~')
					{
						Sys_QueEvent( t, SE_CHAR, key, qfalse, 0, NULL );
					}
					else
					{
						key = key - 0xf000;
						switch (key)
						{
						case 8: // backspace
							Sys_QueEvent( t, SE_CHAR, '\b', qfalse, 0, NULL );
							return;
						default:
							break;
						}

						Sys_QueEvent( t, SE_KEY, key, qtrue, 0, NULL );
						Sys_QueEvent( t, SE_KEY, key, qfalse, 0, NULL );
					}
				}
				break;
		}
	}
#endif
}
gceSTATUS
gcoOS_GetEvent(
    IN HALNativeDisplayType Display,
    IN HALNativeWindowType Window,
    OUT halEvent * Event
    )
{
    screen_event_t screen_evt;
    int rc;
    gceSTATUS status = gcvSTATUS_NOT_FOUND;

    rc = screen_create_event(&screen_evt);

    while (screen_get_event(screen_ctx, screen_evt, 0L) == 0)
    {
        int type;

        screen_get_event_property_iv(screen_evt, SCREEN_PROPERTY_TYPE, &type);

        if (type ==  SCREEN_EVENT_CLOSE)
        {
            Event->type = HAL_CLOSE;

            status = gcvSTATUS_OK;
            break;
        }
        else if (type == SCREEN_EVENT_POINTER)
        {
            static int last_buttons;
            int buttons;
            int pointer[2];

            screen_get_event_property_iv(screen_evt, SCREEN_PROPERTY_BUTTONS, &buttons);
            screen_get_event_property_iv(screen_evt, SCREEN_PROPERTY_POSITION, pointer);

            if (buttons != last_buttons)
            {
                Event->type = HAL_BUTTON;
                Event->data.button.left   = (buttons & 0x0001);
                /* TODO
                Event->data.button.middle = (buttons & 0x????);
                Event->data.button.right  = (buttons & 0x????);
                */
                Event->data.button.x = pointer[0];
                Event->data.button.y = pointer[1];

                last_buttons =  buttons;
            }
            else
            {
                Event->type = HAL_POINTER;
                Event->data.pointer.x = pointer[0];
                Event->data.pointer.y = pointer[1];
            }

            status = gcvSTATUS_OK;
            break;
        }
        else if (type == SCREEN_EVENT_KEYBOARD)
        {
            int buffer;
            int scancode;
            static int prefix;

            screen_get_event_property_iv(screen_evt, SCREEN_PROPERTY_KEY_SCAN, &buffer);

            if ((buffer == 0xE0) || (buffer == 0xE1))
            {
                prefix = buffer;
                continue;
            }

            if (prefix)
            {
                scancode = keys[buffer & 0x7F].extended;
                prefix = 0;
            }
            else
            {
                scancode = keys[buffer & 0x7F].normal;
            }

            if (scancode == HAL_UNKNOWN)
            {
                continue;
            }

            Event->type                   = HAL_KEYBOARD;
            Event->data.keyboard.scancode = scancode;
            Event->data.keyboard.pressed  = buffer < 0x80;
            Event->data.keyboard.key      = (  (scancode < HAL_SPACE)
                || (scancode >= HAL_F1)
                )
                ? 0
                : (char) scancode;
            status = gcvSTATUS_OK;
            break;
        }
        else if (type == SCREEN_EVENT_NONE)
        {
            break;
        }
        else
        {
            break;
        }
    }

    screen_destroy_event(screen_evt);

    return status;
}
int main(int argc, char **argv)
{
	int pos[2] = {0, 0};
	int size[2];
	int vis = 1;
	int type;

	screen_create_context(&screen_ctx, SCREEN_APPLICATION_CONTEXT);

	int count = 0;
	screen_get_context_property_iv(screen_ctx, SCREEN_PROPERTY_DISPLAY_COUNT, &count);
	screen_display_t *screen_disps = calloc(count, sizeof(screen_display_t));
	screen_get_context_property_pv(screen_ctx, SCREEN_PROPERTY_DISPLAYS, (void **)screen_disps);

	screen_display_t screen_disp = screen_disps[0];
	free(screen_disps);

	int dims[2] = { 0, 0 };
	screen_get_display_property_iv(screen_disp, SCREEN_PROPERTY_SIZE, dims);

	char str[16];
	snprintf(str, sizeof(str), "%d", getpid());
	screen_bg_win = create_bg_window(str, dims);

	screen_bar_win = create_bar_window(str, bar_id_string, dims);
	screen_hg_win = create_hg_window(str, hg_id_string, dims);
	if ( create_gles_window(str, gles_id_string, dims) != EXIT_SUCCESS){
		fprintf(stderr, "Could not initialize OpenGL window. Exiting...\n");
		screen_destroy_context(screen_ctx);

		return EXIT_FAILURE;
	}

	screen_event_t screen_ev;
	screen_create_event(&screen_ev);

	// Now draw our OpenGL stuff, it does not change so we need to do it only once
	GLfloat vVertices[] = {0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f};
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
	glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, vVertices);
	glEnableVertexAttribArray(0);
	glDrawArrays(GL_TRIANGLES, 0, 3);
	int rc = eglSwapBuffers(egl_disp, egl_surf);
    if (rc != EGL_TRUE) {
        egl_perror("eglSwapBuffers");
    }

    while (1) {
		do {
			screen_get_event(screen_ctx, screen_ev, vis ? 0 : ~0);
			screen_get_event_property_iv(screen_ev, SCREEN_PROPERTY_TYPE, &type);

			if (type == SCREEN_EVENT_CLOSE) {

				screen_window_t screen_win;
				screen_get_event_property_pv(screen_ev, SCREEN_PROPERTY_WINDOW, (void **)&screen_win);


				if (screen_win == screen_bar_win) {
					screen_bar_win = NULL;
				} else if (screen_win == screen_hg_win) {
					screen_hg_win = NULL;
				} else if (screen_win == screen_gles_win) {
					screen_gles_win = NULL;
				}

				screen_destroy_window(screen_win);

				if (!screen_bar_win || !screen_hg_win || !screen_gles_win) {
					vis = 0;
				}
			}

			if (vis) {
				if (++pos[0] > dims[0] - barwidth) {
					pos[0] = 0;
				}
				screen_set_window_property_iv(screen_bar_win, SCREEN_PROPERTY_POSITION, pos);
				screen_flush_context(screen_ctx, SCREEN_WAIT_IDLE);
			}
		} while (type != SCREEN_EVENT_NONE);

    }


	screen_destroy_event(screen_ev);
	screen_destroy_context(screen_ctx);

	return EXIT_SUCCESS;
}