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

How to become the ultimate robot warrior...
Chrono Strike is a delightfully immersive beat ‘em up with a sense of humor (any game with a good Sims reference gets points in my book). [Read more] | Read more »
Tips and tricks to get a higher score in...
Snow Roll is a devilish endless runner very much in the vein of Flappy Bird. It revels in its dastardly level of difficulty, and doesn’t really care how angry you get at it as it knows you’ll keep coming back for more. [Read more] | Read more »
How to win big in Slots Deluxe
Cheating while gambling is illegal and morally wrong, and in some parts of the world it leads to men with names like Vinnie "Six Knuckles" Manchenzo beating you to a pulp in a dark alley. [Read more] | Read more »
How to take over the world in Dictator 2
Running a country isn't easy - especially when you're a dictator who wants to take over the world and crush everyone in your path while you do it. [Read more] | Read more »
Tips and tricks to get a higher score in...
Tank.iois - you guessed it! - another multiplayer arena battler likeAgar.io and Slither.io. It does differentiate itself by putting you in a tiny tank though, so it's not exactly the same. To help you get that all-important high score, we've got a... | Read more »
How to unlock characters in One Tap Tenn...
As the title suggests, One Tap Tennis requires only a single tap to play its particular brand of tennis, and rewards you with a ton of unlockable characters if you perform well. Fortunately for you, we at 148Apps have got a few tips and tricks to... | Read more »
Grab it now: Game Craft’s Legend of War...
The real time strategy game is now available for you to sink your teeth into, through the App Store and Google Play. Combining elements of skill, strategy and empire building, Legend of War is a real gamers’ game. [Read more] | Read more »
Skateboard Party 3 ft. Greg Lutzka (Gam...
Skateboard Party 3 ft. Greg Lutzka 1.0 Device: iOS Universal Category: Games Price: $1.99, Version: 1.0 (iTunes) Description: Skateboard Party is back! This third edition of the popular sports franchise features professional skater... | Read more »
Cubious (Games)
Cubious 1.0 Device: iOS Universal Category: Games Price: $.99, Version: 1.0 (iTunes) Description: Cubious – How smart are you? How high is your IQube? Solve the impossible puzzles to find out, and help a lost little cube find his... | Read more »
Goat Simulator Waste of Space (Games)
Goat Simulator Waste of Space 1.1 Device: iOS Universal Category: Games Price: $4.99, Version: 1.1 (iTunes) Description: ** IMPORTANT - SUPPORTED DEVICESiPhone 4S, iPad 2, iPod Touch 5 or better.** | Read more »

Price Scanner via MacPrices.net

12-inch 1.2GHz Space Gray Retina MacBook avai...
Amazon has the new 12″ 1.2GHz/512GB Space Gray Retina MacBook (Apple model #MLH82LL/A) available for $1549 including free shipping. Their price is $50 off MSRP. B&H has the 12″ 1.2GHz/512GB Space... Read more
Apple refurbished Mac Pros available for up t...
Apple has Certified Refurbished Mac Pros available for up to $600 off the cost of new models. An Apple one-year warranty is included with each Mac Pro, and shipping is free. The following... Read more
Enterprise Workers Pick Technology Over Perks...
New Adobe study shows surprising attitudes about office jobs and where the future of work is heading. Adobe has released survey findings revealing that a surprising 70 percent of U.S. office workers... Read more
Memorial Day Weekend Sale: $50-$100 off 11-in...
B&H Photo has 13″ and 11″ MacBook Airs with 256GB SSDs on sale for $50-$100 off MSRP. Shipping is free, and B&H charges NY sales tax only: - 11″ 1.6GHz/256GB MacBook Air: $999 $100 off MSRP... Read more
Memorial Day Weekend Sales: Apple MacBook Pro...
B&H Photo has 13″ and 15″ Retina MacBook Pros on sale for up to $210 off MSRP. Shipping is free, and B&H charges NY tax only: - 15″ 2.2GHz Retina MacBook Pro: $1799 $200 off MSRP - 15″ 2.5GHz... Read more
Memorial Day Weekend Sales: Apple iMacs and M...
Take up to $150 off the price of a new iMac or Mac mini at the following Apple resellers this Memorial Day weekend: iMacs: B&H Photo has 21″ and 27″ iMacs on sale for up to $150 off MSRP... Read more
Apple refurbished Retina MacBook Pros availab...
Apple has Certified Refurbished 2015 13″ and 15″ Retina MacBook Pros available for up to $380 off the cost of new models. An Apple one-year warranty is included with each model, and shipping is free... Read more
Apple refurbished 11-inch MacBook Airs availa...
Apple has Certified Refurbished 11″ MacBook Airs (the latest models), available for up to $170 off the cost of new models. An Apple one-year warranty is included with each MacBook, and shipping is... Read more
Goal Zero and OtterBox Partner to Expand iPh...
Goal Zero, specialists in portable power, have announced a partnership with OtterBox, brand smartphone case protection, to offer the Slide and Slide Plus Batteries as modules compatible with the new... Read more
15-inch Retina MacBook Pros on sale for up to...
B&H Photo has 15″ Retina MacBook Pros on sale for up to $210 off MSRP. Shipping is free, and B&H charges NY tax only: - 15″ 2.2GHz Retina MacBook Pro: $1799 $200 off MSRP - 15″ 2.5GHz Retina... Read more

Jobs Board

Senior *Apple* Engineer - Signature Technol...
One-year contract for an Apple consultant. The resource should be an Apple Certified Technical Coordinator or get the certification within 60 days of starting Read more
Senior *Apple* Engineer - Signature Technol...
One-year contract for an Apple consultant. The resource should be an Apple Certified Technical Coordinator or get the certification within 60 days of starting Read more
*Apple* Architect - AECOM (United States)
**Requisition/Vacancy No.** 132759BR **Position Title** Apple Architect **Job Category** Information Technology **Business Line** Government **Country** United Read more
*Apple* Solutions Consultant - APPLE (United...
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
*Apple* Project Engineer - Smart Source Inc...
SmartSource is in need of an Apple Project Engineer for a 12 month contract opportunity in Pittsburg, PA. Role: Apple Project Engineer Location: Pittsburg, PA Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.