Den första datormusen Douglas Englebart, 1968. programmering i GLUT Gustav Taxén CID gustavt@nada.kth.se In- och utenheter Alla datorsystem har in- och utenheter som behandlar information. Data skickas mellan in- och utenheter och program som körs i datorsystemet. Tre metoder för datautbyte: sampling/polling interrupt-baserad interaktion händelsebaserad interaktion Sampling / polling Direkt förfrågan till in/ut-enheten. Läs/skriv data och fortsätt exekveringen. Leder ofta till loopar i programkoden om enheten måste hanteras kontinuerligt. Interrupt-baserad interaktion Programmet prenumererar på förändringar i enhetens status genom att tillhandahålla en subrutin. Operativsystemet anropar subrutinen direkt då enhetens status ändras. Avbrottet kan ske när som helst. Kan ge upphov till komplicerad kod som hanterar asynkroniteten i avbrotten. interaktion Operativsystem eller ramsystem tar hand om förändringar i status hos enheter. För varje statusförändring genereras ett händelseobjekt som innehåller information om förändringen. Programmet prenumererar på händelser genom att tillhandahålla en callback-subrutin. interaktion (forts.) Callback-subrutinen anropas vid särskilda tillfällen. Programmet sägs då fånga händelsen. Mellan rapporteringarna lagras händelseobjekt i en händelsekö. Programmet kan generera händelser genom att anropa ramsystemets egna callback-subrutiner. 1
Händelsebaserat system Inenhet Interrupt-subrutin Händelsebaserat system (forts.) Utenhet Utdata-subrutin Program Händelsekö Callback-lista Callbacksubrutin Callbacksubrutin Dispatcher Dispatcher Händelsekö Fönstersystem Fönstersystemets delar Kan integreras i operativsystemet (Windows) eller köras under ett operativsystem (X Window System) Utöver händelser för in- och utenheter tillkommer händelser för Indelas ofta i en delsystemhierarki. Händelsehanterare Hanterar händelser, ofta både för fysiska enheter och för Grafiktoolkit Funktioner för att rita grafiska primitiver i ett Interaktionstoolkit Funktioner för att hantera användargränssnitt (menyer, scrollbars, textareor, etc.). Fönstersystemets delar (forts.) Applikation Interaktionstoolkit Händelsehanterare och grafiktoolkit Operativsystem Hårdvara OpenGL Grafikbibliotek för att styra grafikhårdvara. Specifikationen är oberoende av operativsystem. Funktionaliteten måste koordineras med operativ- och fönstersystem. Koordinationen är inte systemoberoende. 2
GLUT Gömmer systemberoende delar av OpenGL. Ger möjlighet att köra exakt samma OpenGL-program på olika system. Enkelt fönstersystem som innehåller den minsta gemensamma nämnaren för alla fönstersystem. GLUT-system Applikation GLUT Interaktionstoolkit OpenGL Händelsehanterare och grafiktoolkit Operativsystem Hårdvara Funktionalitet i GLUT Initiering av OpenGL Fönsterhantering Händelsehantering (inenheter och annat) Menyer Extra grafiska primitiver för OpenGL Exempel: initiera GLUT #include <GL/glut.h> void display(void) { /* Rita om fönster med OpenGL */ glutinit(&argc, argv); glutcreatewindow( My window ); glutdisplayfunc(display); glutmainloop(); return 0; Fönster i GLUT Händelser i GLUT Varje fönster har en identitet (ett heltal). Aktivt Fönsterfunktioner påverkar det aktiva fönstret. Innan GLUT anropar en callback-subrutin sätts det aktiva fönstret till relevant Fönster-ID kan hämtas. Aktivt fönster kan sättas explicit. Händelser kan indelas i tre typer: Fönsterhändelser Menyhändelser Globala händelser Callback-registrering för fönster- och menyhändelser gäller aktuellt Globala händelser kan ha högst en callback. 3
Några GLUT-händelser Redisplay (måste fångas av alla fönster) Reshape Keypress Mouse button Passsive mouse movement Active mouse movement Entry Exempel: callbackregistrering void display(void) { void reshape(int width, int height) { glutcreatewindow( Window 1 ); glutdisplayfunc(display); glutreshapefunc(reshape); Menyer i GLUT Hierarkiska pop-up-menyer. För varje fönster gäller att en meny kan kopplas till varje musknapp. Varje meny äger en lista med menyrubriker och en meny-callback. Varje menyrubrik som inte är en undermeny har en identitet (ett heltal). Menyer i GLUT (forts.) Aktiv meny. Då en menyrubrik registreras läggs den sist i den aktiva menyn. Meny-ID kan hämtas. Aktiv meny kan sättas explicit. Menyorganisation Exempel: menyregistrering Fönsterlista Menylista Meny-callback #define ITEM_1 10 Rubriker Callback void menucallback(int itemid) { if (itemid == ITEM_1) { Rubriker Callback Meny-callback glutcreatewindow( My window ); glutcreatemenu(menucallback); glutaddmenuentry( Item 1, ITEM_1); glutattachmenu(glut_left_button); 4
Globala händelser Är inte associerade med något speciellt En callback för varje global händelsetyp. Exempel: idle-händelse, timer. 5