c7991a941ef55caeb81c491e8d43ccaa17e805e5
[freeglut] / src / blackberry / fg_state_blackberry.c
1 /*
2  * fg_state_blackberry.c
3  *
4  * BlackBerry-specific freeglut state query methods.
5  *
6  * Copyright (c) 2012 Stephen J. Baker. All Rights Reserved.
7  * Written by John F. Fay, <fayjf@sourceforge.net>
8  * Copyright (C) 2012  Sylvain Beucler
9  * Copyright (C) 2013  Vincent Simonetti
10  *
11  * Permission is hereby granted, free of charge, to any person obtaining a
12  * copy of this software and associated documentation files (the "Software"),
13  * to deal in the Software without restriction, including without limitation
14  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
15  * and/or sell copies of the Software, and to permit persons to whom the
16  * Software is furnished to do so, subject to the following conditions:
17  *
18  * The above copyright notice and this permission notice shall be included
19  * in all copies or substantial portions of the Software.
20  *
21  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
22  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
23  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
24  * PAWEL W. OLSZTA BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
25  * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
26  * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
27  */
28
29 #include <GL/freeglut.h>
30 #include <stdio.h>
31 #include <screen/screen.h>
32 #include "fg_internal.h"
33 #include "egl/fg_state_egl.h"
34
35 //From fg_state_android.c
36 int fgPlatformGlutDeviceGet ( GLenum eWhat )
37 {
38     int deviceCount, i, value;
39     screen_device_t* devices;
40
41     switch( eWhat )
42     {
43     case GLUT_HAS_KEYBOARD:
44         /* BlackBerry has a keyboard, though it may be virtual. */
45         return 1;
46
47     case GLUT_HAS_MOUSE:
48         /* BlackBerry has a touchscreen. Consider it as a mouse since we have no guarantee
49            that a mouse will be used (in which case it's a simulator). */
50         return 1 ;
51
52     case GLUT_NUM_MOUSE_BUTTONS:
53         /* BlackBerry has a touchscreen, which we can consider a 1-button mouse at min.
54            Otherwise check for an actual mouse, else get max touch points */
55         if(!screen_get_context_property_iv(fgDisplay.pDisplay.screenContext, SCREEN_PROPERTY_DEVICE_COUNT, &deviceCount)) {
56             devices = (screen_device_t*)calloc(deviceCount, sizeof(screen_device_t));
57             if(!screen_get_context_property_pv(fgDisplay.pDisplay.screenContext, SCREEN_PROPERTY_DEVICES, (void**)devices)) {
58                 /* Check for a pointer */
59                 for(i = 0; i < deviceCount; i++) {
60                     if(!screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_TYPE, &value) &&
61                             value == SCREEN_EVENT_POINTER &&
62                             !screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_BUTTON_COUNT, &value)) {
63                         return value;
64                     }
65                 }
66                 /* Check for mtouch */
67                 for(i = 0; i < deviceCount; i++) {
68                     if(!screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_TYPE, &value) &&
69                             value == SCREEN_EVENT_MTOUCH_TOUCH &&
70                             !screen_get_device_property_iv(devices[i], SCREEN_PROPERTY_MAXIMUM_TOUCH_ID, &value)) {
71                         return value;
72                     }
73                 }
74             }
75             free(devices);
76         }
77         /* Backup, pretend it's a 1-button mouse */
78         return 1;
79
80     default:
81         fgWarning( "glutDeviceGet(): missing enum handle %d", eWhat );
82         break;
83     }
84
85     /* And now -- the failure. */
86     return -1;
87 }
88
89 int fgPlatformGlutGet ( GLenum eWhat )
90 {
91     switch (eWhat) {
92     /* One full-screen window only */
93     case GLUT_WINDOW_X:
94     case GLUT_WINDOW_Y:
95     case GLUT_WINDOW_BORDER_WIDTH:
96     case GLUT_WINDOW_HEADER_HEIGHT:
97         return 0;
98
99     case GLUT_WINDOW_WIDTH:
100     case GLUT_WINDOW_HEIGHT:
101     {
102         if ( fgStructure.CurrentWindow == NULL )
103             return 0;
104         int size[2];
105         int orientation;
106         if ( screen_get_window_property_iv(fgStructure.CurrentWindow->Window.Handle, SCREEN_PROPERTY_BUFFER_SIZE, size) != 0 )
107             return 0;
108         if ( screen_get_window_property_iv(fgStructure.CurrentWindow->Window.Handle, SCREEN_PROPERTY_ROTATION, &orientation) != 0 )
109                         return 0;
110         int orientationDif = abs(orientation - fgStructure.CurrentWindow->State.pWState.originalRotation);
111         if (orientationDif == 90 || orientationDif == 270) {
112                 /* Swap dim. if screen is rotated */
113                 int tmp = size[0];
114                 size[0] = size[1];
115                 size[1] = tmp;
116         }
117         switch ( eWhat )
118         {
119         case GLUT_WINDOW_WIDTH:
120             return size[0];
121         case GLUT_WINDOW_HEIGHT:
122             return size[1];
123         }
124         break;
125     }
126
127     case GLUT_WINDOW_COLORMAP_SIZE:
128         /* 0 for RGBA/non-indexed mode */
129         /* Under BlackBerry and GLES more generally, no indexed-mode */
130         return 0;
131
132     default:
133         return fghPlatformGlutGetEGL(eWhat);
134     }
135     return -1;
136 }