TweetFollow Us on Twitter

Volume Number:9
Issue Number:2
Column Tag:Pascal/FKEY

Related Info: Event Manager

A Date-Typing FKEY

A one hour project

By Rob Spencer, East Lyme, Connecticut

This is a one-hour project with two goals: first, to provide a minor but useful tidbit for everyday use, and second, to present a short example of an FKEY that posts and modifies its own events.

For newcomers, an FKEY is a small routine that’s invoked when the user types a command-shift-number sequence, such as the command-shift-3 FKEY that captures the screen to a MacPaint document (under System 6) or Teach Text PICT document (System 7). An FKEY consists of stand-alone code with no global variables and usually little or no user interface; see Roy Lovejoy’s recent article (“FKEYs in THINK Pascal, Easy...”, MacTutor, June 1992, p. 53-55) for more discussion.

This FKEY does something simple and useful for those of us who type letters and memos every day: when the user types command-shift-6 (or whatever number from 0 to 9 you choose), the FKEY types the current date into the current document or edit field. It does this by getting the date from the Toolbox and sending it to the event queue as a sequence of keyDown events. The text appears in your document exactly as if you had typed it.


The heart of the FKEY is the SendAString routine that posts each character of its input string as a keyDown event for the current application to catch. All that’s necessary is to assemble the appropriate message (a longint) for each character.

The low byte of message is charCode, which is just ord(theStr[i]). The next byte is the keyCode, which specifies which key was pressed. For most uses keyCode can be zero, since most keyDown dispatch routines ignore the keyCode and look only at charCode, like this:

with myEvent do begin
 myChar := CHR(BitAnd(message, charCodeMask));
 if BitAnd(modifiers, cmdKey) <> 0 then...

However, my testing with keyCode = 0 showed that some applications didn’t receive the proper string, so to be safe I had to do a little more work to fill in the correct keyCode byte.

Key codes are defined in the System’s KCHR resource, but rather than retrieve and parse that, we use a small bit of it in a fixed look-up table string (called keyMap in the listing). This contains the correct keyCode values for all letters, numbers, and the comma. The space character is handled separately, rather than make keyMap too long. Finally, keyCode is shifted to the second byte and added to charCode to produce the correct message.


In the first version of the FKEY I simply used PostEvent and got unexpected results: since the user must have the command and shift keys down to invoke the FKEY, the keyDown events that it posts come with the cmdKey and shiftKey modifier bits set. Thus if the month is September, the first keyDown that the application sees will be command-S, and it will promptly save the current document! What we want is the FKEY to send the keyDowns without any modifiers; the solution is to use PPostEvent and then clear the appropriate bits from the new event, as shown in the listing.


As both Roy Lovejoy and the THINK Pascal demo FKEY “BlockComment” point out, debugging an FKEY is simple. Just build a tiny program that includes the FKEY unit and then call the obligatory FKEY entry point called main. In my program I then use THINK’s Text window to receive the keyDown events, so we can see what day it is.


Use ResEdit to paste the FKEY resource into the word processing application of your choice, or, if you want the FKEY universally available, paste it into the System file. That’s it!


Though FKEY’s are as old as the Mac, they aren’t widely appreciated. Perhaps this is partly because of what I just wrote above: “Use ResEdit...”. I decided to provide an easier way, though for the sake of brevity I’ll only mention it here: on the code disk for this month is a HyperCard stack which does a one-button installation of the FKEY to your System file.

Figure 1: bonus installation stack

This stack does this job with an original XFCN and XCMD. The XFCN, SystemResources, returns a list of System resources of a given type (to see if the FKEY already exists), while the XCMD, InstallFKEY, does the actual installation. The stack also includes the THINK Pascal source code for these externals.

unit DateFKEY;
{ Types today’s date when the user types }
{ cmd-shift-6. In THINK Pascal 4.0 by    }  
{ Rob Spencer, August 1992.              }


 procedure main;


 procedure main;

 { ----------------------------- }

 function SendAString (theStr: str255): OSErr;

 { keyMap is a subset of the }
 { KCHR System resource.     }
 keyMap = 
 space = char(32);

 i, keyCode: integer;
 theChar: char;
 theErr: OSErr;
 message, modifiers, modifierMask: longint;
 myQPtr: EvQElPtr;

 theErr := noErr;
 modifierMask := BitNot(shiftKey + cmdKey);

 if theStr <> '' then
 FlushEvents(keyDown, 0);
 for i := 1 to length(theStr) do
 { Get the proper keyCode. }
 theChar := theStr[i];
 if theChar in ['a'..'z'] then
 { Make theChar uppercase for }
 { our look-up string.        }
 theChar := char(ord(theChar) - 32);
 if theChar = space then
 keyCode := $31
 keyCode := pos(theChar, keyMap) - 1;
 if keyCode = -1 then
 keyCode := 0;

 { Assemble the message.   }
 message := BitShift(keyCode, 8) +

 { Post the keyDown event. }
 theErr := PPostEvent(keyDown, message,
 if theErr <> noErr then

 { Now strip off the cmdKey }
 { and shiftKey modifiers.  }
 modifiers := BitAnd(myQPtr^.evtQModifiers, 
 myQPtr^.evtQModifiers := modifiers;
 SendAString := theErr;

 { ============== main ============== }

 dateStr: str255;
 tempLong: longint;

 { The queue can only hold 20 characters, }
 { so we strip off the day of the week.   }
 IUDateString(tempLong, LongDate, dateStr);
 if dateStr <> '' then
 if pos(char(32), dateStr) > 0 then
 Delete(dateStr, 1, pos(char(32), dateStr));
 if SendAString(dateStr) <> noErr then


{ ====== shell program for debugging ===== }

program DateFKEYtest;


 myStr: str255;

 main;  { Call our FKEY }
 { Make an active input window    }
 { to receive the keyDown events. }

{ =========== end of listings =========== }

Figure 2: the project window for debugging

Figure 3: the project window for the stand-alone FKEY

Figure 4: set up for FKEY #6.


Community Search:
MacTech Search:

Software Updates via MacUpdate

World of Tanks Generals guide - Tips and...
World of Tanks Generals is a brand new card game by the developer behind the World of Tanks shooter franchise. It plays like a cross between chess and your typical card game. You have to keep in consideration where you place your tanks on the board... | Read more »
TruckSimulation 16 guide: How to succeed...
Remember those strangely enjoyable truck missions in Grand Theft Auto V whereit was a disturbing amount of fun to deliver cargo? TruckSimulation 16 is reminiscent of that, and has you play the role of a truck driver who has to deliver various... | Read more »
The best GIF making apps
Animated GIFs have exploded in popularity recently which is likely thanks to a combination of Tumblr, our shorter attention spans, and the simple fact they’re a lot of fun. [Read more] | Read more »
The best remote desktop apps for iOS
We've been sifting through the App Store to find the best ways to do computer tasks on a tablet. That gave us a thought - what if we could just do computer tasks from our tablets? Here's a list of the best remote desktop apps to help you use your... | Read more »
Warhammer 40,000: Freeblade guide - How...
Warhammer 40,000: Freebladejust launched in the App Store and it lets you live your childhood dream of blowing up and slashing a bunch of enemies as a massive, hulking Space Marine. It's not easy being a Space Marine though - and particularly if... | Read more »
Gopogo guide - How to bounce like the be...
Nitrome just launched a new game and, as to be expected, it's a lot of addictive fun. It's called Gopogo, and it challenges you to hoparound a bunch of platforms, avoiding enemies and picking up shiny stuff. It's not easy though - just like the... | Read more »
Sago Mini Superhero (Education)
Sago Mini Superhero 1.0 Device: iOS Universal Category: Education Price: $2.99, Version: 1.0 (iTunes) Description: KAPOW! Jack the rabbit bursts into the sky as the Sago Mini Superhero! Fly with Jack as he lifts impossible weights,... | Read more »
Star Wars: Galaxy of Heroes guide - How...
Star Wars: Galaxy of Heroes is all about collecting heroes, powering them up, and using them together to defeat your foes. It's pretty straightforward stuff for the most part, but increasing your characters' stats can be a bit confusing because it... | Read more »
The best cooking apps (just in time for...
It’s that time of year again, where you’ll be gathering around the dinner table with your family and a huge feast in front of you. [Read more] | Read more »
Square Rave guide - How to grab those te...
Square Rave is an awesome little music-oriented puzzle game that smacks of games like Lumines, but with its own unique sense of gameplay. To help wrap your head around the game, keep the following tips and tricks in mind. [Read more] | Read more »

Price Scanner via

Sunday roundup of Holiday weekend Mac sales:...
Take up to $500 off MSRP on the price of a new Mac at B&H Photo today as part of their Black Friday/Holiday weekend sale. Shipping is free, and B&H charges NY tax only. These prices are... Read more
Holiday weekend: Apple Watch on sale for $50-...
B&H Photo has the Apple Watch on sale today for $50-$100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - Apple Watch Sport: $50 off - Apple Watch: $50-$100 off Read more
Holiday weekend: iPad Air 2s on sale for up t...
B&H Photo has iPad Air 2s on sale for up to $80 off MSRP including free shipping plus NY sales tax only: - 16GB iPad Air 2 WiFi: $459 $40 off - 64GB iPad Air 2 WiFi: $569 $30 off - 128GB iPad Air... Read more
Holiday weekend Mac sales roundup: B&H Ph...
B&H Photo continues to have all new Macs on sale for up to $500 off MSRP as part of their Black Friday/Holiday weekend sale. Shipping is free, and B&H charges NY tax only: - 15″ 2.2GHz Retina... Read more
iMobie Releases its Ace iOS Cleaner PhoneClea...
iMobie Inc. has announced the new update of PhoneClean 4, its iOS cleaner designed to reclaim wasted space on iPhone/iPad for use and keep the device fast. Alongside, iMobie hosts a 3-day giveaway of... Read more
U.S. Cellular Offering iPad Pro
U.S. Cellular today announced that it is offering the new iPad Pro with Wi-Fi + Cellular, featuring a 12.9-inch Retina display with 5.6 million pixels — the most ever in an iOS device. U.S. Cellular... Read more
Newegg Canada Unveils Black Friday Deals for...
Newegg Canada is offering more than 1,000 deep discounts to Canadian customers this Black Friday, available now through Cyber Monday, with new deals posted throughout the week. “Black Friday is... Read more
Black Friday: Macs on sale for up to $500 off...
BLACK FRIDAY B&H Photo has all new Macs on sale for up to $500 off MSRP as part of their early Black Friday sale including free shipping plus NY sales tax only: - 15″ 2.2GHz Retina MacBook Pro: $... Read more
Black Friday: Up to $125 off iPad Air 2s at B...
BLACK FRIDAY Walmart has the 16GB iPad Air 2 WiFi on sale for $100 off MSRP on their online store. Choose free shipping or free local store pickup (if available): - 16GB iPad Air 2 WiFi: $399, save $... Read more
Black Friday: iPad mini 4s on sale for $100 o...
BLACK FRIDAY Best Buy has iPad mini 4s on sale for $100 off MSRP on their online store for Black Friday. Choose free shipping or free local store pickup (if available): - 16GB iPad mini 4 WiFi: $299.... Read more

Jobs Board

Technical Program Manager, Strategic Merchant...
# Technical Program Manager, Strategic Merchants - Apple Pay Job Number: 44001177 Santa Clara Valley, Califo ia, United States Posted: Oct. 30, 2015 Weekly Hours: 40.00 Read more
Frameworks Engineer, *Apple* Watch - Apple...
# Frameworks Engineer, Apple Watch Job Number: 41403122 Santa Clara Valley, Califo ia, United States Posted: Jul. 1, 2015 Weekly Hours: 40.00 **Job Summary** Join the Read more
Software Engineer - *Apple* Pay - Apple (Un...
# Software Engineer - Apple Pay Job Number: 44003246 Santa Clara Valley, Califo ia, United States Posted: Nov. 16, 2015 Weekly Hours: 40.00 **Job Summary** Apple Pay Read more
Merchant Operations Manager: *Apple* Pay -...
# Merchant Operations Manager: Apple Pay Job Number: 43593822 Santa Clara Valley, Califo ia, United States Posted: Nov. 10, 2015 Weekly Hours: 40.00 **Job Summary** The Read more
Product Design Engineer - *Apple* Watch - A...
# Product Design Engineer - Apple Watch Job Number: 41727161 Santa Clara Valley, Califo ia, United States Posted: Jul. 22, 2015 Weekly Hours: 40.00 **Job Summary** Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.