TweetFollow Us on Twitter

Structures, Event Loop
Volume Number:2
Issue Number:6
Column Tag:The ABC's of C

Structures And The Event Loop

By Bob Gordon, Apropos Publications, Minneapolis, MN

Beginning this month, we will start following the chapters in the Using the Macintosh Toolbox with C book. This means we're will be learning about C and the Macintosh at the same time. While this is probably not the optimum way to learn a language, it means we can explore features of the language and the Mac and have a lot of time to play around and make mistakes. As you will see from this month's effort, I am not afraid to make lots of mistakes.

We are going to start right away with a program that demonstrates a bit about the Event Manager. Events are a critical component to the way Macintosh software functions. They are not visible like windows or pull-down menus, but they occupy a central location in most applications nonetheless.

From the point of view of the Event Manager, Macintosh program spend most of their time sitting around waiting for events. Events can come from the keyboard, the mouse, disk drives, the Window Manager, et cetera, as well as your application.

Structures

For the moment, we won't worry too much about how the Event Manager gives you an event. Instead, we'll use the event to examine an important C data construct called a structure. A structure is a collection of variables usually of different types organized under a single name (loosely paraphrased from K&R). An event from a software point of view is a structure:

 struct ER
 {short what;  /* kind of event */
  long  message; /* event info */
  long  when;  /* time of event */
  Point where; /* mouse location */
  short modifiers; /* other info */
 };

The variables collected together in the structure are members.

A structure declaration (as we have above) does not reserve any memory. We still need to define a variable:

 struct ER    event;

defines the variable, event, to be of type ER. Now, when the Event Manager gives us an event, we can examine its members to determine what to do. To access the members of a structure, use a period between the variable name and the member name:

 event.what

At this point, let us look more closely at the where member. It is obviously not one of the standard C types. It is in fact another structure:

 struct pt
 {short  v; /* vertical location */
  short  h; /* horizontal location */
 };

So structures may be nested in other structures (you can also have arrays of structures).

You noticed that I defined the structure "pt" not "Point." When we defined the event variable, above, we wrote struct ER event. C requires that you let it know each time you are dealing with a structure. Writing struct all over your programs can be a drag as well as making them less readable. C has a couple of ways to deal with this problem. One is the typedef, which is way of providing a new name for a type. Point then becomes:

 typdef struct pt   Point;

The other technique is to use the preprocessor define feature:

 #define EventRecord   struct ER

Both of these techniques will increase the clarity of our code. The typedef is preferred because it is actually a part of the compiler and can deal with certain situations that can confuse the lexical substitutions of the preprocessor. Some micro C compilers do not include typedefs, however.

Now that we have defined the EventRecord, we can get an event from the Event Manager and see what to do with it.

Switch Statement

The first thing to do is decide what kind of event it is (from the what member), and then take appropriate action. The clearest way to do this in C is with the switch or case statement (C calls it switch, but many C programmers call it a case statement). The switch is a multi-way branch:

 switch (integer expression)
 {
 case constant1 : code;
                                      break;
   case constant2 : more code;
                                      break;
 default                   : code;
                                      break;
 }

The break statements are needed to keep the code from falling through the cases. Without the break, if the expression matched constant2, it would continue execution with the default code. The break forces execution to continue after the closing }. The default is chosen if none of the other cases match. By the way, you can have several constants that match one section of code. Each is preceded by case and followed by a colon. In effect, they fall through to the first code to execute.

A Program that Demonstrates the Event Manager

/* Event Manager Demonstrator */
#include"stdio.h"
#include"MacCDefs.h"
#include"Events.h"

main()  /* This may look silly, but in      */
 { /* subsequent programs we will have */
 /* initialization routines up here. */
 mainloop();
 }
 
mainloop()
 {
 EventRecordevent; 
 while (True)
 {
 if (GetNextEvent(everyEvent,&event))
 switch (event.what)
 {
 case mouseDown:  printf("\nmouse down");
 break;
 case mouseUp:  printf("\nmouse up");
 break;
 case keyDown:   printf("\nkey down");
 break;
 case keyUp: printf("\nkey up");
 break;
 case autoKey:   printf("\nautokey");
 return;
  break;
 case updateEvt: break;
 case diskEvt:   printf("\ndisk event");
  break;
 case activateEvt: break;
 case networkEvt:  break;
 case driverEvt  : break;
 case nullEvent: break;
 }
 }
 }

GetNextEvent() is the Event Manager routine that returns the next event record each time its called. If there are no events to return, it returns the Null Event.

All the constants (nullEvent, mouseUp, et cetera) and the EventRecord structure are defined in Events.h. I recommend you take a look at the copy that comes with your compiler.

The program exits on an autokey event. To stop the program, simply hold a key down.

The first parameter to GetNextEvent() is the event mask. With it, you can select the events to which you wish to respond. It's a bit mapped mask; you can combine events by adding the constants defined in events.h together. EveryEvent is all 1 bits (-1 decimal).

You will probably not see the key up event. It is generated when you release a key. It took me awhile to find out why I wasn't seeing it, but I finally took a look at Inside Macintosh.

There is a second event mask that controls which events get entered into the event queue. Since GetNextEvent() gets events from the queue, if an event is masked out, GetNextEvent() will never be able to return it. This event mask is initialized to:

 everyEvent - keyUpMask

so it will not even post key up events. There is a function, SetEventMask(), that will set this, but it is apparently not included in Mac C.

Some Things to do

This program is very brief, but you can easily add a few lines to get a better feel of how the Event Manager works and how to use some C functions. Try examining the where field on each event. Remember this is a Point structure. The message and modifier fields provide essential information for some events, especially key events. Print these out as well.

There are a number of other functions in the Event Manager. They allow reading the mouse, keyboard, and time without waiting for an event. There is also a function to read the event queue that leaves the event in the queue.

We will not do any more with the Event Manager at this time, but we will use it in probably every program we write.

Finally, if anyone is reading along, I would appreciate hearing from you. Let me know if this is useful or if you have an idea for a short program we can do in the column.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Pinegrow 6.23 - Mockup and design web pa...
Pinegrow (was Pinegrow Web Designer) is desktop app that lets you mockup and design webpages faster with multi-page editing, CSS and LESS styling, and smart components for Bootstrap, Foundation,... Read more
WhatsApp 2.2149.4 - Desktop client for W...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
Microsoft Remote Desktop 10.7.4 - Connec...
Microsoft Remote Desktop for Mac is an application that allows connecting to virtual apps or another PC remotely. Discover the power of Windows with Remote Desktop designed to help you manage your... Read more
ffWorks 2.6.7 - Convert multimedia files...
ffWorks, focused on simplicity, brings a fresh approach to the use of FFmpeg, allowing you to create ultra-high-quality movies without the need to write a single line of code on the command-line.... Read more
Opera 82.0.4227.58 - High-performance We...
Opera is a fast and secure browser trusted by millions of users. With the intuitive interface, Speed Dial and visual bookmarks for organizing favorite sites, news feature with fresh, relevant content... Read more
Day One 6.15 - Maintain a daily journal.
Day One is an easy, great-looking way to use a journal / diary / text-logging application. Day One is well designed and extremely focused to encourage you to write more through quick Menu Bar entry,... Read more
Default Folder X 5.6.3 - Enhances Open a...
Default Folder X attaches a toolbar to the right side of the Open and Save dialogs in any OS X-native application. The toolbar gives you fast access to various folders and commands. You just click on... Read more
OmniOutliner Pro 5.9.2 - Pro version of...
OmniOutliner Pro is a flexible program for creating, collecting, and organizing information. Give your creativity a kick start by using an application that's actually designed to help you think. It's... Read more
OmniOutliner Essentials 5.9.2 - Organize...
OmniOutliner Essentials (was OmniOutliner) is a flexible program for creating, collecting, and organizing information. Give your creativity a kick start by using an application that's actually... Read more
QuickBooks 19.0.11.984 - Financial manag...
QuickBooks helps you manage your business easily and efficiently. Organize your finances all in one place, track money going in and out of your business, and spot areas where you can save. Built for... Read more

Latest Forum Discussions

See All

The Best Wordle Clone in Town – The Touc...
In this week’s episode of The TouchArcade Show we dig into the drama of the moment which is the cloning and subsequent gloating about the cloning of the lovely little free word game Wordle. This leads into some additional drama about how PUGB Mobile... | Read more »
TouchArcade Game of the Week: ‘Cards Inf...
There’s nothing I love more than a perfect mobile game. What do I mean by that? Well, no game is actually perfect, but there’s something special about a game you know you can just whip out at a moment’s notice and dive into, and you know it will... | Read more »
‘Micro RPG’ Bringing Streamlined RPG Goo...
Originally announced on our forums more than 3 years ago, Micro RPG is an upcoming mobile game from a two-person studio that goes by the name JoliYeti Games and, as the title implies, it looks to offer all the fun of an RPG but in a more condensed... | Read more »
SwitchArcade Round-Up: ‘Kensei: The Seco...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for January 14th, 2022. Yesterday was a big day, but today shows that we’re still warming up the engines for this year. There are a handful of new releases, but nothing nearly as... | Read more »
Mobile MMORPG Shooter ‘Avatar: Reckoning...
Archosaur Games, Tencent, Lightstorm Entertainment, and Disney have just revealed a mobile MMORPG shooter Avatar: Reckoning. Avatar: Reckoning will be published by Level Infinite when it hits iOS and Android. It is an official Avatar game developed... | Read more »
‘Crashlands+’ Is Out Now on Apple Arcade...
The brilliant Crashlands from Butterscotch Shenanigans was confirmed to arrive on Apple Arcade as an App Store Great in the form of Crashlands+ () a little while ago and it has just released worldwide. If it isn’t live yet, it should roll out in... | Read more »
SwitchArcade Round-Up: ‘Eschatos’, ‘To B...
Hello gentle readers, and welcome to the SwitchArcade Round-Up for January 13th, 2022. It’s a Thursday, and we’ve got a pretty hefty bag of new releases to dig into. There are always some fun surprises, and this week that came in the form of SNK Vs... | Read more »
‘Crush the Castle Legacy Collection’ Lau...
Ever since Angry Birds broke into the mainstream and became a household name more than a decade ago, there’s always been a small niche of people on the sidelines who would pipe up to remind everybody that “Crush the Castle did it first!" Indeed, the... | Read more »
Non-Violent Stealth Game ‘El Hijo – A Wi...
Over a year ago, Handy Games brought the non-violent stealth game El Hijo – A Wild West Tale to Switch, PS4, Xbox, PC, and Stadia. El Hijo – A Wild West Tale has been developed by Honig Studios and Quantumfrog. You play as El Hijo, a six year old,... | Read more »
‘ZED BLADE’ from SNK and Hamster Is Out...
After a bit of a break likely due to the holiday season, we’ve gotten a new title in the ACA NeoGeo series on iOS and Android. SNK and Hamster originally brought the series to mobile with Samurai Shodown IV, Alpha Mission II, and Metal Slug 5.... | Read more »

Price Scanner via MacPrices.net

Get an Apple Watch Series 7 for $50 off MSRP,...
Amazon has Apple Watch Series 7 models on sale for $50 off MSRP including free shipping. Their prices are the lowest available for Apple Watch Series 7 models today: – 41mm Apple Watch Series 7 GPS... Read more
Here are the details of Apple’s 2022 Educatio...
Need a new Apple Mac or iPad for school? Whether you’re a student, teacher, or staff member, you can use your .edu email address when ordering at Apple Education to take up to $400 off the price of a... Read more
Amazon is blowing out 2020 21″ iMacs for only...
Amazon has clearance 2020 21″ iMacs (2.3GHz Dual-Core i5, 8GB RAM, 256GB SSD) on sale right now for $599.99 including free shipping. Original MSRP for this model was $1099. Amazon expects delivery in... Read more
Find the best deal on an Apple MacBook using...
In the market for a new 13″ MacBook Air, 13″ MacBook Pro, 14″ MacBook Pro, or 16″ MacBook Pro with M1, M1 Pro, or M1 Max Apple Silicon? Use our Apple award-winning and exclusive price trackers to... Read more
Red Pocket Mobile is offering the Apple iPhon...
Switch to Red Pocket Mobile and get an Apple iPhone 13 Pro for $50 off MSRP, plus get free 6 months of Unlimited nationwide 5G service with the purchase of any iPhone 13. Red Pocket Mobile is a... Read more
24″ M1 iMacs on sale for $1249, $50 off Apple...
Amazon has base 24″ M1 iMacs (8-Core CPU/7-Core GPU/8GB RAM/256GB SSD) on sale today for $1249 shipped. Their price is $50 off Apple’s MSRP, and it’s the lowest price available for a new 24″ M1 iMac... Read more
Open-Box 16″ M1 Pro MacBook Pros available fo...
QuickShip Electronics has open-box return 16″ M1 Pro MacBook Pros in stock and on sale for $200-$300 off MSRP on their eBay store right now with free express delivery. According to QuickShip, “The... Read more
Stock Alert! Order a new 16″ M1 Pro MacBook P...
New 16″ MacBook Pros with Apple’s M1 Pro and M1 Max CPUs have been very hard to find, largely due to current global supply constraints. However, B&H Photo is reporting stock of Space Gray... Read more
Apple has maxed-out 13″ M1 MacBook Airs (16GB...
Save $250 on maxed-out 13″ M1 MacBook Airs today at Apple (16GB RAM/1TB SSD) with Certified Refurbished models available for $1399 in Space Gray and Gold colors. Regular price for this configuration... Read more
New promo at Xfinity Mobile: $400 off any App...
Xfinity Mobile is offering any new Apple iPhone for $400 off MSRP for new customers. This includes the iPhone 13. Price for the phone, including the discount, is spread monthly over a 24 month term... Read more

Jobs Board

Registered Nurse (RN) Employee Health PSJH -...
…is calling for a Registered Nurse (RN) Employee Health PSJH to our location in Apple Valley, CA.** We are seeking a Registered Nurse (RN) Employee Health PSJH to be Read more
Systems Administrator - Pearson (United State...
…and troubleshoot Windows operating systems (workstation and server), laptop computers, Apple iPads, Chromebooks and printers** + **Administer and troubleshoot all Read more
IT Assistant Level 1- IT Desktop Support Anal...
…providing tier-1 or better IT help desk support in a large Windows and Apple environment * Experience using IT Service Desk Management Software * Knowledge of IT Read more
Human Resources Business Partner PSJH - Provi...
…**is calling a** **Human Resources Business Partner, PSJH** **to our location in Apple Valley, CA.** **Applicants that meet qualifications will receive a text with Read more
Manager Community Health Investment Programs...
…is calling a Manager Community Health Investment Programs PSJH to our location in Apple Valley, CA.** **Qualified candidates will be invited to do a self-paced video Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.