TweetFollow Us on Twitter

Date FKEY
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.

ASSEMBLE THE EVENT

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.

REMOVE THOSE MODIFIERS

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.

TESTING and DEBUGGING

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.

USING THE FKEY

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!

BUT WAIT, THERE’S MORE!

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.

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

interface

 procedure main;

implementation

 procedure main;

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

 function SendAString (theStr: str255): OSErr;

 const
 { keyMap is a subset of the }
 { KCHR System resource.     }
 keyMap = 
 'ASDFHGZXCV*BQWERYT123465=97*80*OU*IP*LJ*K**,*NM';
 space = char(32);

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

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

 if theStr <> '' then
 begin
 FlushEvents(keyDown, 0);
 for i := 1 to length(theStr) do
 begin
 { 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
 else
 keyCode := pos(theChar, keyMap) - 1;
 if keyCode = -1 then
 keyCode := 0;

 { Assemble the message.   }
 message := BitShift(keyCode, 8) +
 ord(theStr[i]);

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

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

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

 var
 dateStr: str255;
 tempLong: longint;

 begin
 { The queue can only hold 20 characters, }
 { so we strip off the day of the week.   }
 GetDateTime(tempLong);
 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
 SysBeep(10);
 end;

end.

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

program DateFKEYtest;

 uses
 DateFKEY;

 var
 myStr: str255;

begin
 main;  { Call our FKEY }
 { Make an active input window    }
 { to receive the keyDown events. }
 ShowText;
 read(myStr);
 writeLn;
 writeLn(myStr);
end.

{ =========== 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

Geekbench 4.1.1 - Measure processor and...
Geekbench provides a comprehensive set of benchmarks engineered to quickly and accurately measure processor and memory performance. Designed to make benchmarks easy to run and easy to understand,... Read more
iMazing 2.3.3 - Complete iOS device mana...
iMazing (was DiskAid) is the ultimate iOS device manager with capabilities far beyond what iTunes offers. With iMazing and your iOS device (iPhone, iPad, or iPod), you can: Copy music to and from... Read more
TeamViewer 12.0.81279 - Establish remote...
TeamViewer gives you remote control of any computer or Mac over the Internet within seconds, or can be used for online meetings. Find out why more than 200 million users trust TeamViewer! Free for... Read more
Safari Technology Preview 11.0 - The new...
Safari Technology Preview contains the most recent additions and improvements to WebKit and the latest advances in Safari web technologies. And once installed, you will receive notifications of... Read more
PDFpen 9.1 - $74.95
PDFpen allows users to easily edit PDF's. Add text, images and signatures. Fill out PDF forms. Merge or split PDF documents. Reorder and delete pages. Even correct text and edit graphics! Features... Read more
GraphicConverter 10.4.3 - $39.95
GraphicConverter is an all-purpose image-editing program that can import 200 different graphic-based formats, edit the image, and export it to any of 80 available file formats. The high-end editing... Read more
Fission 2.3.2 - Streamlined audio editor...
Fission can crop and trim audio, paste in or join files, or just rapidly split one long file into many. It's streamlined for fast editing. Plus, it works without the quality loss caused by other... Read more
EarthDesk 7.2 - Striking real-time anima...
EarthDesk replaces your static desktop picture with a rendered image of Earth showing correct sun, moon, and city illumination. With an Internet connection, EarthDesk displays near-real-time global... Read more
Things 3.1.1 - Elegant personal task man...
Things is a task management solution that helps to organize your tasks in an elegant and intuitive way. Things combines powerful features with simplicity through the use of tags and its intelligent... Read more
iDefrag 5.2.0 - Disk defragmentation and...
iDefrag helps defragment and optimize your disk for improved performance. iDefrag Features Supports HFS and HFS+ (Mac OS Extended). Supports case sensitive and journaled filesystems. Supports... Read more

Latest Forum Discussions

See All

Big changes are coming to Fire Emblem He...
Nintendo just revealed what players can expect from Fire Emblem Heroes in the coming weeks, with a good deal of fresh goodies arriving just in time for the game's six-month anniversary. The announcements arrived in a 15-minute FEH Channel stream... | Read more »
Aero Effect (Games)
Aero Effect 1.0.1 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0.1 (iTunes) Description: Race an aerodynamic thingy through a maze of animated, geometric peril and plunge into a mysterious grid of pixels, all while... | Read more »
Linelight (Games)
Linelight 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Linelight is an elegant, minimalist puzzle game set in a universe of lines. Its puzzles will awake your mind as the music flows... | Read more »
Fighting Fantasy Legends (Games)
Fighting Fantasy Legends 1.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0 (iTunes) Description: Create your own adventures in a dangerous land of monsters, treasures and traps. From renowned authors Steve Jackson... | Read more »
Knight Fever is a new take on the classi...
Knight Fever lands on the Google Play, and you won’t want to miss it if you’re a devoted RPG fan. Developed by indie creatives Buff Studios, the game looks like a retro RPG with some exciting new twists. | Read more »
Steam Panic (Games)
Steam Panic 1.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: Steampunk puzzle in which you spin the playfield to put yourself back together. Dear Reader,Enclosed is a copy of my bizarre 1935... | Read more »
Time Crash (Games)
Time Crash 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: Time is about to Crash! It’s up to you to save the city! Time Crash is a 3D first person runner which lets you play as a powerful... | Read more »
Galaxy of Pen & Paper (Games)
Galaxy of Pen & Paper 1.0.0 Device: iOS Universal Category: Games Price: $4.99, Version: 1.0.0 (iTunes) Description: *** NO IN-APP PURCHASES! ****** PREMIUM FOREVER *** THE ULTIMATE ROLE-PLAYING SIMULATION GOES TO SPACE! | Read more »
Niantic reveals more Pokémon GO legendar...
Oof. Pokémon GO Fest Chicago was pretty much a fiasco, huh? Niantic is feeling the heat from fans for their first big event that ultimately ended in failure. So much so that they've released a much longer apology that gives a full run down of... | Read more »
The 5 best life-saving apps for dog owne...
While it's true that dogs are man's best friend, they're also a pretty big responsibility. We want to give our dogs the best lives, but with busy schedules that's not always easy. Luckily, though, there are a bunch of quality apps out there that... | Read more »

Price Scanner via MacPrices.net

27-inch 3.5GHz iMac on sale for $100 off MSRP...
Adorama has the new 27″ 3.5GHz iMac (MNEA2LL/A) on sale for $1899 including free shipping. Their price is $100 off MSRP. Adorama charges sales tax for purchases in NY & NJ only. Read more
Seven Cities, One Phone: OtterBox Sends iPhon...
Plenty of people have trekked around the world, but what about a globe-trotting iPhone? OtterBox is sending an iPhone around the world to capture the adventures of a diverse set of global ambassadors... Read more
L-Card Pro App May Spell End For Paper Busine...
OrangeTreeApps, LLC has announced the release of L-Card Pro 1.1, an update to their business app for iOS and Android devices that introduces eco-friendly, affordable, electronic business cards on the... Read more
Clearance previous generation iMacs, Apple re...
Apple has previous-generation Certified Refurbished 2015 21″ & 27″ iMacs available starting at $849. Apple’s one-year warranty is standard, and shipping is free. The following models are... Read more
27-inch 3.4GHz iMac on sale for $1699, save $...
MacMall has the new 2017 27″ 3.4GHz iMac (MNE92LL/A) in stock and on sale for $1699 including free shipping. Their price is $100 off MSRP. Read more
Photographer Explains Choosing Dell Laptop Ov...
Last week photographer and video blogger Manny Ortiz posted a video explaining the five most important reasons he settled on a Dell XPS 15 laptop instead of a MacBook Pro for his latest portable... Read more
Sale! 10-inch iPad Pros for $50 off MSRP, no...
B&H Photo has 64GB and 256GB 10.5″ iPad Pros in stock today and on sale for $50 off MSRP. Each iPad includes free shipping, and B&H charges sales tax in NY & NJ only: – 10.5″ 64GB iPad... Read more
WaterField Designs Upgrades TSA-friendly Zip...
San Francisco based designer and manufacturer Waterfield Designs has unveiled an upgraded and refined Zip Brief. Ideal for the minimalist professional, the ultra-slim Zip laptop bag actually holds a... Read more
USB 3.0 Promoter Group Announces USB 3.2 Upda...
The USB 3.0 Promoter Group has announced the pending release of the USB 3.2 specification, an incremental update that defines multi-lane operation for new USB 3.2 hosts and devices. USB Developer... Read more
Save on MacBook Pros with Apple Refurbished 2...
Apple recently dropped prices on Certified Refurbished 2016 15″ and 13″ MacBook Pros with models now as much as $590 off original MSRP. An Apple one-year warranty is included with each model, and... Read more

Jobs Board

*Apple* Solutions Consultant - Apple Inc. (U...
Job Summary As an Apple Solutions Consultant, you'll be the link between our future customers and our products. You'll showcase your entrepreneurial spirit as you Read more
Senior Software Engineer, *Apple* Online St...
Job Summary The Apple Online Store is looking for an experienced, self-driven, detail-oriented software engineer who can join our team to help build highly scalable Read more
Frameworks Engineering Manager, *Apple* Wat...
Frameworks Engineering Manager, Apple Watch Job Number: 41632321 Santa Clara Valley, California, United States Posted: Jun. 15, 2017 Weekly Hours: 40.00 Job Summary Read more
Senior Software Engineer, *Apple* Online St...
Changing the world is all in a day's work at Apple . If you love innovation, here's your chance to make a career of it. You'll work hard. But the job comes with more Read more
Frameworks Engineering Manager, *Apple* Wat...
Frameworks Engineering Manager, Apple Watch Job Number: 41632321 Santa Clara Valley, California, United States Posted: Jun. 15, 2017 Weekly Hours: 40.00 Job Summary Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.