TweetFollow Us on Twitter

Window Barrier
Volume Number:4
Issue Number:1
Column Tag:ABC's of C

Breaking the Four Window Barrier

By William Rausch, Kennewick, WA

It seems that every good Macintosh example program (of a text editor, graphics program, or whatever) is hung up on the idea of four windows. Of course, those that aren’t such good example programs only use one window! This limit always seems to be a result of the unnecessary use of global data structures.

Most multi-window Macintosh example programs contain some lines that look like:

WindowPtr some_windows[how_many];
data_structure some_data[how_many];

where how_many is defined to be four. The programmer will claim that it is easy to change this number to be as large as necessary, and the application can be easily recompiled. That is fine for the programmer, but what about the end user. He is stuck with whatever number the programmer happens to choose. If the programmer happens to choose a number of windows and data structures that perfectly fits a 512K Macintosh, then the user is probably not able to take advantage of the extra memory of a Macintosh Plus, much less a Macintosh with even more memory.

In actuality, it is not necessary to predefine any number of windows, or the data structures that are associated with them. Since the Macintosh has an operating system that knows all about windows and how to keep track of them, it makes little sense for the application programmer to duplicate this effort.

The window data structure contains a 32-bit field called refCon which Inside Macintosh describes as “the window’s reference value field, which the application may store into and access for any purpose”. One such purpose, which is mentioned but not demonstrated in many books on Macintosh programming, is to store a handle to some application specific data structure which contains the information that is pertinent to that window.

Since every event given to an application by the Event Manager will contain a pointer to the window concerned, there is no need for the application to keep an array of WindowPtrs; and since each window contains a refCon field, there is no need to keep an array of data structures. Instead, allocate the necessary space for the data structure at the time the new window is created, and put its handle in the refCon field of the window’s data structure. Then, whenever an event is processed, just pass the WindowPtr along to the functions which are going to process the event. These functions then can get access to the data structure when they need it.

The code fragments which follow demonstrate the concepts described:

enum window_type
  {
  type_a,
  type_b,
  type_c
  };

typedef union
  {
  struct
    {
    ...         /* type_a window data */
    } a;
  struct
    {
    ...         /* type_b window data */
    } b;
  struct
    {
    ...         /* type_c window data */
    } c;
  } content,*content_ptr,**content_hndl;

typedef struct 
  {
  enum window_type xxx;   /* optional, appl. specific */
  content_hndl yyy;   /* could include union directly */
  ...
  } window_data, *data_ptr, **data_hndl;

...

make_window(type)
enum window_type type;
  {
  WindowRecord *a_window;
  data_hndl a_data;
  content_hndl a_content;
  ...

  a_window = 
    (WindowRecord *)NewWindow(...);
  a_data = 
    (data_hndl)NewHandle(sizeof(w_data));
  a_content = (content_hndl)NewHandle
                       (sizeof(content));
  (**a_data).xxx = type;
  (**a_data).yyy = a_content;
  a_window->refCon = (long)a_data;
  ...
  }

...

event_loop()
  {
  EventRecord the_event;
  WindowPtr which_window;
  int window_code;
  ...

  while (TRUE)
    {
    if (GetNextEvent(everyEvent, 
                     &the_event))
      {
      switch (the_event.what)
        {
        case mouseDown:
        window_code = FindWindow
                      (the_event.where, 
                       &which_window);
        switch (window_code)
          {
          case inSysWindow:
          SystemClick(&the_event,
                      which_window);
          break;
          
          case inContent:
          process_window(which_window);
          break;

          ...
          }
        break;

        ...
        }
      }
    else
      {
      }
    }
  }

...

process_window(the_window)
WindowRecord *the_window;
  {
  data_hndl the_data;
  ...

  the_data = 
      (data_hndl)(the_window->refCon);
  switch ((**the_data).xxx)
    {
    case type_a:
    process_a_window(the_window);
    break;

    case type_b:
    process_b_window(the_window);
    break;

    case type_c:
    process_c_window(the_window);
    break;
    }
  ...
  }

This general technique may, in some very particular cases, slow things down a little. Generally, this won’t be the case because most applications spend a majority of their time processing NULL events. If you wanted to speed things up a little bit and still maintain the dynamic allocation capabilities of this programming approach, use just one globally declared WindowPtr and one data_handle and just update them to always point at the window/data_structure that the current event refers to. Then you wouldn’t have to pass the event’s WindowPtr to the called function(s).

Of course, most applications need to be able to find all of their windows at times, e.g., when Quitting the application so that changes can be saved, or when updating the windows. At those times, it is still possible to avoid using a global array merely by calling FrontWindow() and following the linked list of pointers stored in the nextWindow field of the window’s data structure.

This approach to creating windows in an application, which I call “fire and forget” (and which could be considered as a small first step towards object oriented programming), will allow your application to create as many new windows (and their associated data structures) as the user desires. It is also a convenient way of manipulating different types of windows in a single application. (It is very easy, for example, to imagine MacDraw and MacWrite in a single application!) Of course, your application has to check available memory each time it tries to create a new window/data structure to make sure there is enough available, but that is a small price to pay for the increased utility the user can get from having a program that “grows” with his hardware.

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Firefox 52.0.2 - Fast, safe Web browser.
Firefox offers a fast, safe Web browsing experience. Browse quickly, securely, and effortlessly. With its industry-leading features, Firefox is the choice of Web development professionals and casual... Read more
Google Chrome 57.0.2987.133 - Modern and...
Google Chrome is a Web browser by Google, created to be a modern platform for Web pages and applications. It utilizes very fast loading of Web pages and has a V8 engine, which is a custom built... Read more
RapidWeaver 7.3.3 - Create template-base...
RapidWeaver is a next-generation Web design application to help you easily create professional-looking Web sites in minutes. No knowledge of complex code is required, RapidWeaver will take care of... Read more
Chromium 57.0.2987.133 - Fast and stable...
Chromium is an open-source browser project that aims to build a safer, faster, and more stable way for all Internet users to experience the web. Version 27.0.2987.133: Note: This update has no Flash... Read more
Lyn 1.8.8 - Lightweight image browser an...
Lyn is a fast, lightweight image browser and viewer designed for photographers, graphic artists, and Web designers. Featuring an extremely versatile and aesthetically pleasing interface, it delivers... Read more
Adobe Animate CC 2017 16.2.0 - Advanced...
Animate CC 2017 is available as part of Adobe Creative Cloud for as little as $19.99/month (or $9.99/month if you're a previous Flash Professional customer). Animate CC 2017 (was Flash CC) lets you... Read more
Tunnelblick 3.7.0 - GUI for OpenVPN.
Tunnelblick is a free, open source graphic user interface for OpenVPN on OS X. It provides easy control of OpenVPN client and/or server connections. It comes as a ready-to-use application with all... Read more
DEVONthink Pro 2.9.11 - Knowledge base,...
DEVONthink Pro is your essential assistant for today's world, where almost everything is digital. From shopping receipts to important research papers, your life often fills your hard drive in the... Read more
DiskCatalogMaker 6.8.1 - Catalog your di...
DiskCatalogMaker is a simple disk management tool which catalogs disks. Simple, light-weight, and fast Finder-like intuitive look and feel Super-fast search algorithm Can compress catalog data for... Read more
OmniGraffle 7.3 - Create diagrams, flow...
OmniGraffle helps you draw beautiful diagrams, family trees, flow charts, org charts, layouts, and (mathematically speaking) any other directed or non-directed graphs. We've had people use Graffle to... Read more

Dynasty Blades new update introduces a n...
Sharpen your weapons -- Dynasty Blades is back with new and improved hack n’ slash stylings. The Romance of the Three Kingdoms-inspired action MMORPG introduces a bunch of fun new features in its latest update. For the uninitiated, Dynasty Blades... | Read more »
Meganoid(2017) (Games)
Meganoid(2017) 1.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: LAUNCH DISCOUNT 20% UNTIL APRIL 2nd! Support, tip and tricks: http://www.orangepixel.net/forum/ Subscribe to our newsletter... | Read more »
Telltale's Guardians of the Galaxy...
Telltale will be releasing their rendition of Guardians of the Galaxy later this month. The first episode, Tangled Up in Blue, features familiar faces including Star-Lord, Groot, Rocket, Gamora, and Drax. If the first episode's title is any... | Read more »
Royal Dungeon (Games)
Royal Dungeon 1.0 Device: iOS Universal Category: Games Price: $2.99, Version: 1.0 (iTunes) Description: The king and his queen are trapped in their castle which suddenly turned out as a very dangerous place. The goal is to escape... | Read more »
Tom Clancy's ShadowBreak is a real-...
Ubisoft is treating Tom Clancy fans to the series' very first mobile-exclusive game in ShadowBreak, a real-time, multiplayer shooter in which players snipe at enemies in fast-paced tactics-driven combat. [Read more] | Read more »
Power Rangers: Legacy Wars beginner...
Rita Repulsa is back, but this time she's invading your mobile phone in Power Rangers: Legacy Wars. What looks to be a straightforward beat 'em up is actually a tough-as-nails multiplayer strategy game that requires some deft tactical maneuvering.... | Read more »
Hearthstone celebrates the upcoming Jour...
Hearthstone gets a new expansion, Journey to Un'Goro, in a little over a week, and they'll be welcoming the Year of the Mammoth, the next season, at the same time. There's a lot to be excited about, so Blizzard is celebrating in kind. Players will... | Read more »
4 smart and stylish puzzle games like Ty...
TypeShift launched a little over a week ago, offering some puzzling new challenges for word nerds equipped with an iOS device. Created by Zach Gage, the mind behind Spelltower, TypeShift boasts, like its predecessor, a sleak design and some very... | Read more »
The best deals on the App Store this wee...
Deals, deals, deals. We're all about a good bargain here on 148Apps, and luckily this was another fine week in App Store discounts. There's a big board game sale happening right now, and a few fine indies are still discounted through the weekend.... | Read more »
The best new games we played this week
It's been quite the week, but now that all of that business is out of the way, it's time to hunker down with some of the excellent games that were released over the past few days. There's a fair few to help you relax in your down time or if you're... | Read more »

Price Scanner via MacPrices.net

1.4GHz Mac mini on sale for $399, $100 off MS...
B&H Photo has the 1.4GHz Mac mini on sale for $100 off MSRP including free shipping plus NY sales tax only: - 1.4GHz Mac mini: $399 $100 off MSRP Sale ends on March 31st. Read more
13-inch 128GB MacBook Air on sale for $849, s...
B&H Photo has lowered their price on the 13″ 1.6GHz/128GB MacBook Air to $849, or $150 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 13″ 1.6GHz/128GB MacBook Air (MMGF2LL/A... Read more
Is Apple Planning An iPhone Based Modular Doc...
Today’s more powerful and larger-screened smartphones and phablets are becoming the default anchor computing device for more and more users computing devices, but even a five or six inch panel is not... Read more
Razer Launches New Razer Blade Pro World’s Fi...
Razer, the gaming and high performance hardware specialists, have announced the new Razer Blade Pro laptop — the first laptop to be qualified for THX Mobile Certification, an accreditation reserved... Read more
Gro CRM’s Apple Small Business Mac And iOS CR...
Gro Software, developers of the Mac CRM software for small business and enterprise, are included in FinancesOnline 2017 CRM Rising Stars and Great User Experience lists by business software review... Read more
Deal alert! 15-inch and 13-inch MacBook Pros...
B&H Photo has the new 2016 15″ and 13″ Apple MacBook Pros in stock today and on sale for up to $200 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 15″ 2.7GHz Touch Bar... Read more
Save up to $420 on a new MacBook Pro with App...
Apple is offering Certified Refurbished 2016 15″ and 13″ MacBook Pros, including some Touch Bar models, for up to $420 off original MSRP. An Apple one-year warranty is included with each model, and... Read more
12-inch 1.2GHz Retina MacBooks on sale for $1...
B&H has 12″ 1.2GHz Retina MacBooks on sale for up to $200 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 12″ 1.2GHz Space Gray Retina MacBook: $1449 $150 off MSRP - 12″ 1.... Read more
Is A New 10.5-inch iPad Still Coming In April...
There was no sign or mention of a long-rumored and much anticipated 10.5-inch iPad Pro in Apple’s product announcements last week. The exciting iPad news was release of an upgraded iPad Air with a... Read more
T-Mobile’s Premium Device Protection Now Incl...
Good news for T-Mobile customers who love their iPhones and iPads. The “Un-carrier” has become the first national wireless company to give customers AppleCare Services at zero additional cost as part... Read more

Jobs Board

Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
Desktop Analyst - *Apple* Products - Montef...
…technology to improve patient care. JOB RESPONSIBILITIES: Provide day-to-day support for Apple Hardware and Software in the environment based on the team's support Read more
*Apple* Mobile Master - Best Buy (United Sta...
**493168BR** **Job Title:** Apple Mobile Master **Location Number:** 000827-Denton-Store **Job Description:** **What does a Best Buy Apple Mobile Master do?** At Read more
Fulltime aan de slag als shopmanager in een h...
Ben jij helemaal gek van Apple -producten en vind je het helemaal super om fulltime shopmanager te zijn in een jonge en hippe elektronicazaak? Wil jij werken in Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.