summaryrefslogtreecommitdiffstats
path: root/progs/directfb/multi_window.c
diff options
context:
space:
mode:
Diffstat (limited to 'progs/directfb/multi_window.c')
-rw-r--r--progs/directfb/multi_window.c240
1 files changed, 240 insertions, 0 deletions
diff --git a/progs/directfb/multi_window.c b/progs/directfb/multi_window.c
new file mode 100644
index 00000000000..9bb0e4be8ef
--- /dev/null
+++ b/progs/directfb/multi_window.c
@@ -0,0 +1,240 @@
+/*
+ (c) Copyright 2001 convergence integrated media GmbH.
+ All rights reserved.
+
+ Written by Denis Oliver Kropp <[email protected]> and
+ Andreas Hundt <[email protected]>.
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the
+ Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ Boston, MA 02111-1307, USA.
+*/
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <math.h>
+
+#include <GL/gl.h>
+#include <GL/glu.h>
+
+#include <directfb.h>
+#include <directfbgl.h>
+
+
+typedef struct {
+ IDirectFBWindow *window;
+ IDirectFBSurface *surface;
+ IDirectFBGL *gl;
+
+ int width;
+ int height;
+
+ unsigned long last_time;
+ int frames;
+ float fps;
+} Context;
+
+static const GLfloat blue[4] = {0.2, 0.2, 1.0, 1.0};
+
+static IDirectFB *dfb;
+static IDirectFBDisplayLayer *layer;
+static IDirectFBFont *font;
+static IDirectFBEventBuffer *events = NULL;
+
+/* macro for a safe call to DirectFB functions */
+#define DFBCHECK(x...) \
+ do { \
+ ret = x; \
+ if (ret != DFB_OK) { \
+ fprintf( stderr, "%s <%d>:\n\t", __FILE__, __LINE__ ); \
+ DirectFBErrorFatal( #x, ret ); \
+ } \
+ } while (0)
+
+
+static inline unsigned long get_millis()
+{
+ struct timeval tv;
+
+ gettimeofday (&tv, NULL);
+ return (tv.tv_sec * 1000 + tv.tv_usec / 1000);
+}
+
+
+static void
+setup( Context *context )
+{
+ GLfloat pos[4] = {5.0, 5.0, 10.0, 0.0};
+
+ context->surface->GetSize( context->surface,
+ &context->width, &context->height );
+
+ context->gl->Lock( context->gl );
+
+ glLightfv(GL_LIGHT0, GL_POSITION, pos);
+ glEnable(GL_CULL_FACE);
+ glEnable(GL_LIGHTING);
+ glEnable(GL_LIGHT0);
+ glEnable(GL_DEPTH_TEST);
+
+ glViewport(0, 0, context->width, context->height);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity();
+ gluPerspective(70.0, context->width / (float) context->height, 1.0, 80.0);
+
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity();
+ glTranslatef(0.0, 0.0, -40.0);
+
+ context->gl->Unlock( context->gl );
+}
+
+static void
+update( Context *context )
+{
+ unsigned long t;
+ IDirectFBSurface *surface = context->surface;
+ static __u8 r = 0, g = 0, b = 0;
+
+
+ context->gl->Lock( context->gl );
+
+ glClearColor( r++/255.0, g++/255.0, b++/255.0, 1.0 );
+ glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
+
+ context->gl->Unlock( context->gl );
+
+ if (context->fps) {
+ char buf[16];
+
+ snprintf(buf, sizeof(buf), "%.1f FPS\n", context->fps);
+
+ surface->SetColor( surface, 0xff, 0x00, 0x00, 0xff );
+ surface->DrawString( surface, buf, -1,
+ context->width - 5, 5, DSTF_TOPRIGHT );
+ }
+
+ surface->Flip( surface, NULL, 0 );
+
+ context->frames++;
+
+ t = get_millis();
+ if (t - context->last_time >= 2000) {
+ float seconds = (t - context->last_time) / 1000.0f;
+
+ context->fps = context->frames / seconds;
+
+ context->last_time = t;
+ context->frames = 0;
+ }
+}
+
+int
+main( int argc, char *argv[] )
+{
+ DFBResult ret;
+ int i;
+ int quit = 0;
+ const int num = 2;
+ Context contexts[num];
+
+ DFBCHECK(DirectFBInit( &argc, &argv ));
+
+ /* create the super interface */
+ DFBCHECK(DirectFBCreate( &dfb ));
+
+ DFBCHECK(dfb->GetDisplayLayer( dfb, DLID_PRIMARY, &layer ));
+
+ /* create the default font */
+ DFBCHECK(dfb->CreateFont( dfb, NULL, NULL, &font ));
+
+ for (i=0; i<num; i++) {
+ IDirectFBWindow *window;
+ IDirectFBSurface *surface;
+ IDirectFBGL *gl;
+ DFBWindowDescription desc;
+
+ desc.flags = DWDESC_POSX | DWDESC_POSY |
+ DWDESC_WIDTH | DWDESC_HEIGHT;
+ desc.posx = (i%3) * 200 + 10;
+ desc.posy = (i/3) * 200 + 10;
+ desc.width = 180;
+ desc.height = 180;
+
+ DFBCHECK(layer->CreateWindow( layer, &desc, &window ));
+ DFBCHECK(window->GetSurface( window, &surface ));
+ DFBCHECK(surface->GetGL( surface, &gl ));
+
+ contexts[i].window = window;
+ contexts[i].surface = surface;
+ contexts[i].gl = gl;
+
+ contexts[i].last_time = get_millis();
+ contexts[i].frames = 0;
+ contexts[i].fps = 0;
+
+ setup( &contexts[i] );
+
+ if (events)
+ DFBCHECK(window->AttachEventBuffer( window, events ));
+ else
+ DFBCHECK(window->CreateEventBuffer( window, &events ));
+
+ DFBCHECK(surface->SetFont( surface, font ));
+
+ window->SetOpacity( window, 0xff );
+ }
+
+ while (!quit) {
+ DFBWindowEvent evt;
+
+ for (i=0; i<num; i++)
+ update( &contexts[i] );
+
+ while (events->GetEvent( events, DFB_EVENT(&evt) ) == DFB_OK) {
+ switch (evt.type) {
+ case DWET_KEYDOWN:
+ switch (evt.key_symbol) {
+ case DIKS_ESCAPE:
+ quit = 1;
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+ }
+
+ events->Release( events );
+
+ for (i=0; i<num; i++) {
+ contexts[i].gl->Release( contexts[i].gl );
+ contexts[i].surface->Release( contexts[i].surface );
+ contexts[i].window->Release( contexts[i].window );
+ }
+
+ font->Release( font );
+ layer->Release( layer );
+ dfb->Release( dfb );
+
+ return 0;
+}
+