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

Apple Safari 11.0 - Apple's Web bro...
Note: The direct download link is currently unavailable. It is available in the OS X 10.12.6 release, as well as in the Apple Security Updates. Apple Safari is Apple's web browser that comes with... Read more
Xcode 9.0 - Integrated development envir...
Xcode includes everything developers need to create great applications for Mac, iPhone, iPad, and Apple Watch. Xcode provides developers a unified workflow for user interface design, coding, testing... Read more
BetterTouchTool 2.302 - Customize Multi-...
BetterTouchTool adds many new, fully customizable gestures to the Magic Mouse, Multi-Touch MacBook trackpad, and Magic Trackpad. These gestures are customizable: Magic Mouse: Pinch in / out (zoom... Read more
Apple iOS 11 - The latest version of App...
iOS 11 sets a new standard for what is already the world’s most advanced mobile operating system. It makes iPhone better than before. It makes iPad more capable than ever. And now it opens up both to... Read more
NTFS 15.0.911 - $19.95
NTFS breaks down the barriers between Windows and macOS. Paragon NTFS effectively solves the communication problems between the Mac system and NTFS. Write, edit, copy, move, delete files on NTFS... Read more
Airfoil 5.6.3 - Send audio from any app...
Airfoil allows you to send any audio to AirPort Express units, Apple TVs, and even other Macs and PCs, all in sync! It's your audio - everywhere. With Airfoil you can take audio from any... Read more
ExpanDrive 6.0.16 - Access cloud storage...
ExpanDrive builds cloud storage in every application, acts just like a USB drive plugged into your Mac. With ExpanDrive, you can securely access any remote file server directly from the Finder or... Read more
Smultron 9.4.2 - Easy-to-use, powerful t...
Smultron 9 is an elegant and powerful text editor that is easy to use. Use it to create or edit any text document. Everything from a web page, a note or a script to any single piece of text or code.... Read more
Typinator 7.3 - Speedy and reliable text...
Typinator turbo-charges your typing productivity. Type a little. Typinator does the rest. We've all faced projects that require repetitive typing tasks. With Typinator, you can store commonly used... Read more
coconutBattery 3.6.4 - Displays info abo...
With coconutBattery you're always aware of your current battery health. It shows you live information about your battery such as how often it was charged and how is the current maximum capacity in... Read more

The best games to play while you wait fo...
SteamWorld Dig 2 is out this week on PC and Switch, and people are understandably excited. This clever series by Image and Form combines our favorite metroidvania mechanics with an esquisite universe, excellent storytelling, and true wit. While... | Read more »
Drag'n'Boom beginner's gu...
Have you ever wanted to burn and pillage a village as a bloodthirsty dragon? If you answered yes to that question, Drag'n'Boom offers you the perfect chance to do so, casting you as an adorable little dragon that wants to set humankind aflame. It... | Read more »
Thimbleweed Park (Games)
Thimbleweed Park 1.0.0 Device: iOS Universal Category: Games Price: $9.99, Version: 1.0.0 (iTunes) Description: A brand new adventure game from Ron Gilbert and Gary Winnick, creators of the classics Monkey Island and Maniac Mansion!... | Read more »
The best simulation games on mobile
There's nothing like a good sim -- from the seemingly ridiculous to the incredibly mundane, you can be there's a simulation game out there for your every whim. [Read more] | Read more »
INKS guide - how to create works of pinb...
INKS puts a clever new spin on everyone's favorite classic arcade game, pinball. The core mechanics are the same -- keep a little ball pinging around the board for as long as possible without letting it fall into the precarious holes in the board.... | Read more »
Warbands: Bushido (Games)
Warbands: Bushido 1.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: Warbands:Bushido is a miniatures board game with cards, miniatures, dice and beautiful terrains to fight on, with both... | Read more »
The best mobile games like Divinity: Ori...
Divinity: Original Sin 2 launched this week to the excitement of RPG fans everywhere. The game, which derives a lot of of its story and mechanics from old-school isometric RPGs and Dungeons & Dragons, has unseated PlayerUnknown's... | Read more »
Iron Marines guide - beginner tips and t...
Iron Marines is a brilliant RTS title that feels a bit like Starcraft. It's got a sci-fi setting and some of the most spectacular strategy mechanics we've seen in mobile games to date. With that said, the RTS genre can be a bit tricky to break... | Read more »
The best new games we played this week -...
The work week can be tough, but on the bright side, it's almost overandthere are bunches of brand new games to try out this weekend. This week definitely makes up for last week's sleepiness ten-fold. We've got one of the finest RTS game on mobile... | Read more »
Through the Ages (Games)
Through the Ages 1.0.60 Device: iOS Universal Category: Games Price: $9.99, Version: 1.0.60 (iTunes) Description: The offical adaptation of Vlaada Chvátil’s strategy classic, the second best board game ever by Board Game Geek website... | Read more »

Price Scanner via MacPrices.net

Apple Refurbished 3TB Time Capsule for $279,...
Apple has Certified Refurbished 3TB Time Capsules available for $279 including free shipping plus Apple’s standard one-year warranty. Their price is $120 off MSRP. Read more
19% off Smart Battery Cases for iPhone 7
Amazon has both Black and White Smart Battery Cases for iPhone 7s available for $80.41 including free shipping. Their price is $18.59, or 19%, off MSRP. Read more
Back on sale: 10.5-inch 64GB iPad Pros for $5...
MacMall has 10.5″ 64GB Apple iPad Pros on sale again for $599 including free shipping. That’s $50 off MSRP and the lowest price available for this model from any reseller. Read more
Verizon offers Certified Preowned 16GB iPhone...
Verizon has the 16GB iPhone 6, Certified Preowned, available for $259.99 or $10.83 per month for 24 months. Service plan required. According to Verizon, “All CPO devices have been reconditioned to... Read more
Preorder new iPhone 8 at US Cellular, and tak...
Preorder the new iPhone 8 or iPhone 8 Plus at US Cellular, and take $50 off the prepaid price: – 64GB iPhone 8: $649.99 – 128GB iPhone 8: $799.99 – 64GB iPhone 8 Plus: $749.99 – 128GB iPhone 8 Plus... Read more
12-inch and 9-inch Apple iPad Pros, Certified...
Apple has Certified Refurbished 2016 12″ WiFi iPad Pros available starting at $589. An Apple one-year warranty is included with each model, and shipping is free: – 32GB 12″ iPad Pro WiFi: $589... Read more
QuickerTek Announces Solar PV Chargers for US...
Wichita, Kansas based QuickerTek has announced its new 30 Watt and 60 Watt USB Type-C Solar Juicz Chargers. These solar panels are the only products of their kind, featuring the USB 3.1 adapter cable... Read more
Apple refurbished 128GB iPhone 6s and 6s Plus...
Apple has Certified Refurbished 128GB iPhone 6s and 6s Plus’ available for up to $100 off the price of new models. Space Gray, Silver, Gold, and Rose Gold models are available. Each phone comes... Read more
13-inch 2.3GHz Silver MacBook Pros on sale fo...
B&H Photo has 2017 13″ 2.3GHz Silver MacBook Pros in stock today and on sale for $100 off MSRP, each including free shipping plus NY & NJ sales tax only: – 13-inch 2.3GHz/128GB Silver... Read more
12-inch 64GB iPad Pros available for $749, $5...
MacMall has 12″ 64GB iPad Pros on sale for $749 including free shipping. Their price is $50 off MSRP. Read more

Jobs Board

*Apple* Solutions Consultant - Apple Inc. (U...
…about helping others on a team while also delighting customers? As an Apple Solutions Consultant (ASC), you will discover customers needs and help connect them Read more
Software/Data Engineer, *Apple* Media Produ...
Job Summary Apple Media Products is the team behind the App Store, Apple Music, iTunes, and many other high profile products on iPhone, Mac and AppleTV. Our Data Read more
SW Engineer , *Apple* Media - Apple Inc. (U...
Job Summary Our team is responsible for exposing Apple Media content and services to the world, and building the infrastructure for next generation internal and Read more
*Apple* Data Center Site Selection and Strat...
Job Summary As Apple 's products and services scale the globe, the Data Center Affairs team works behind the scenes to secure infrastructure for Apple 's data Read more
*Apple* Professional Learning Specialist - A...
Job Summary The Apple Professional Learning Specialist is a full-time position for one year with Apple in the Yuma, AZ area. This position requires a high Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.