TweetFollow Us on Twitter

Template Application
Volume Number:1
Issue Number:2
Column Tag: C Workshop

“Template” Application

By Robert B. Denny

This month’s C Workshop presents a “template” application. Most Macintosh programs share a common overall structure, dictated by the operating system environment. The purpose of the template program is to give you a framework for developing your own applications. It will also be used as the basis for topics discussed in future C Workshops. The functions that do the actual work of the program have been “stubbed”.

Since “a program is worth a thousand words”, most of this month’s column is the program itself, sprinkled liberally with comments. Please take the time to study the program. But first, a few introductory words.

Some C Basics for the Macintosh

Many data structures that you’ll be working with are stored in the “heap”, dynamic memory. Most of these struc- tures are accessed by a “handle” rather than a pointer. A handle is a pointer to a pointer. Why this extra level of indirection?

The heap is used for almost everything. Code goes there. Resources go there (code is really a resource). Data structures allocated at run time go there. Nothing is preallocated. The memory manager is rather dumb about allocating and deallocating blocks of space in the heap.

As a result, the heap can (and does) get chopped up into small pieces. When someone makes a request for a block of space that exceeds the size of the largest free block, the memory manager compacts the heap. It moves blocks of data around in an effort to collect enough contiguous space to satisfy the request. Blocks that are eligible to be moved are called relocatable. Most Mac data structures fall into this class. You can control whether or not your own data structures are relocatable. The tradeoff should be obvious.

Relocatable data structures are accessed via handles so that your references remain valid if the structure is moved. The handle points to a master pointer which in turn points to the relocatable structure. If the structure is moved, the memory manager updates the master pointer and your handle reference remains valid. Obviously, the area containing the master pointers is not relocatable.

Accessing data structures defined by struct statements via handles isn’t too difficult. The example is shown in figure 1 below:

The expression assigns the value contained in the relocatable structure via its handle to “intval”. The only safe way to access relocatable structures is to use the double-indirect access shown above at all times. Do not attempt to cache the pointer (*foo_handle) at any time. To do so is to defeat the purpose of handle access.

Template Application

Now to the template application. It is written for the Consulair Mac C system and Toolkit. Changes to the details of the program will probably be necessary for other languages since there is little consistency in the toolbox interface.

/*
 * *************
 * *  TEMPL.H  *
 * *************
 *
 * Common stuff for template program
 *  (C) 1984, MacTech  by Robert B. Denny
 *
 * NOTE:Dependent on the menu                 
 *   structure defined in the resources.
 */

// Toolbox traps must start with ‘#’ now.
#Options -N

//
// Include Macintosh data structure 
// definitions.  These files are included 
// with the Mac C Toolkit, or from the 
// Stanford University Macintosh C 
//  Programming system (SuMacC).
//

#include  <MacDefs.H>
#include<QuickDraw.H>
#include<Control.H>
#include<Events.H>
#include<Menu.H>
#include<TextEdit.H>

#define MAX_WINDOWS8
#define MAX_MENUS8

#define TRUE1
#define FALSE    0
#define NULL0

/*
*  Each window requires a window                
*  control block to define it’s structure. 
*  Note which things are handles and           
*  which are pointers.
*
* wcb = Window Control Block
 */
struct wcb
 {
 WindowPtrwp;  // Pointer to window rec in heap
 Rect drag_rect; // Dragging limits
 Rect grow_rect; // Window size limits
 TEHandle te_handle; // Handle to textEdit rec in heap
 Point  te_origin; // Text origin
 ControlHandle vs_handle; // Vert scroller’s handle
 ControlHandle hs_handle; // Horiz scroller’s handle
 };

//
// Supress extern declarations in module 
// containing the real declarations.
//
#ifndef GLOB_DATA
extern struct wcb dw[MAX_WINDOWS];
extern struct wcb *dwp;   // --> Current doc-window
extern unsigned n_windows;// No. of open windows
extern EventRecord Event; // Our event record (duh)
extern short EvType; // Event result type
extern WindowPtr EvWindow;// Event window
/*
 * Array of menu handles 
 */
extern MenuHandle menus[];// Our menu contexts
#define APPLE    1
#define FILE2
#define EDIT3
#define OPTIONS  4
#endif

/*
 * Resource ID’s of menus in rsrc file.
 */
#define APPLE_ID 1
#define FILE_ID  256 
#define EDIT_ID  257
#define OPTIONS_ID 258 //Add more menu resource ID’s here

/*
 * File menu item numbers
 */

#define FM_EXIT  // This should reflect file menu rsrc

/*
 * Edit menu item numbers
 *
 * Note that SystemEdit expects the Edit    
 *  menu items as follows:
 *
 * 0: undo (** YES, zero-based **)
 * 1: --------
 * 2: cut 
 * 3:  copy
 * 4: paste
 *
 * The rest of the items may be chosen 
 *    at will by the application.
 */

#define EM_UNDO  1
#define EM_CUT 3
#define EM_COPY  4
#define EM_PASTE 5
#define EM_CLEAR 6

/*
 * Options menu assignments
 */
#define MM_EDIT_WINDOW  1
#define MM_SCRAWL_WINDOW  2
#define MM_MUSIC  4

/*
 *   Other resource ID’s
 */
#define ABOUT_ID 256
#define WINDOW_ID256

/*
 * Macro to hack the Point struct,               
 * composed of 2 short (16-bit) ints
 * into a long, which can be passed by         
 * value to toolbox routines.
 * Takes address of a Point and turns it      
 * into a scalar long.  NOTE
 * this generates NO runtime code.
 */
#define PtLong(ptr) *((long *)ptr)

MAIN PROGRAM

A Template Application in C

Template program for the C Workshop. Has hooks for multiple dynamically allocated windows (to be added in future columns), supports desk accessories, has a menu bar with 4 menus and an “about” dialog in the Apple menu. The program will eventually support multiple dynamically allocated text edit and drawing windows. The text edit windows will have scroll bar controls and resizing (“grow”) capability. Also, an interface to the sound system will be added. The components of this program are:

TMAIN.C This module, the main program & global data.

TMENU.C Menu handling functions, fig. 6.

TEMPL.H Common “include” file of definitions, fig. 4.

TEMPL.R RMAKER source for program resources, fig. 5.

TEMPL.LINK Linker command file, fig. 3.

TEMPL.JOB Exec command procedure to build template, fig. 2.

Additional modules will be added in future C Workshop columns. This program was written for the MAC C system by Consulair Corp. Changes will be needed for other C systems. Also, prerelease versions of MAC C and RMAKER may not work with this program. [Note: one or two obscure Mac C statements may have been changed in the current Mac C so that a change may be needed to fully compile this program using present Mac C systems. This program was written with an early version of Mac C. Any offending lines should be obvious at compile time. -Ed.]

/*
 * TMAIN.C - Template application
 * (c) 1984 MacTech by Robert B. Denny
 */
 *     GLOBALS DEFINITIONS
#define GLOB_DATA
#include <Templ.H>
/*
 Define window control block for window   management. See Templ.H file.
 */
struct wcb dw[MAX_WINDOWS];  // our windows
struct wcb *dwp = NULL; // --> Current window
unsigned n_windows = 0; // Number of open windows
EventRecord Event; // Our event record
short EvType;    // Event result type
WindowPtr EvWindow;// Event window
MenuHandle menus[MAX_MENUS]; // Our menus
 
/*
 *   MAIN PROGRAM  
 *
 * Link with MacCLib, which does 
 * Quickdraw and Window initialization.
 *
 */
main()
 {
 register WindowPtr wp; // Try to save space/time
 int i;
 #InitFonts();   // Not done in MacCLib ...
 #InitDialogs(0);// No restart function
 #OpenResFile(“\011TemplRsrc”);// Open resfile (Pstring)
 setup_menu();   // Set up our menus
 #TEInit(); // Initialize TextEdit
 #FlushEvents(-1,0); // Flush all events
 #InitCursor();  // Make arrow cursor
 for(i=0; i<MAX_WINDOWS; i++) // Mark all WCB’s free
 dw[i].wp = NULL;
 dwp = NULL;// No windows
 n_windows = 0;

 //   -- EVENT LOOP --
 // This is the “outer loop” of a typical    // application.  All event 
types
 // are dequeued, most are processed.  // Those not processed are ignored.
 // 
 while(TRUE)// Loop here forever
 {
 #SystemTask();  // Handle desk accessories
 // dwp always points to the WCB   //for the active (front) window.
 // If dwp = NULL, than it’s not   //”our” window.
 // (Is this possible??)

dwp = (struct wcb *)find_wcb(#FrontWindow());
if(dwp != NULL && dwp->te_handle != 0) // If active wind & text
#TEIdle(dwp->te_handle);  // Flash the insertion mark
if(!#GetNextEvent(-1, &Event)) // Process only our events
continue;
 switch(Event.what)// Dispatch on event type
 {
 case mouseDown: // Mouse click
 do_mouse();// Dispatch on mouse location
 break;
 case keyDown: // Keypress
 case autoKey:  // Repeat-key generator
 do_key();
 break;
 case updateEvt: // window needs refresh
EvWindow = (WindowPtr)Event.message; // Which window?
 upd_wind(EvWindow); // Do the update
 break;
 case activateEvt: // Activate/deactivate
EvWindow = (WindowPtr)Event.message; // Which window?
 if(Event.modifiers & 1) // If Activate
 act_wind(EvWindow); // Activate window
 else // If Deactivate
 deact_wind(EvWindow); // Deactivate window
 
// Additional cases for other event types 
 default: // Do nothing for other events
 }
 }
 //
 // -- END OF EVENT LOOP --
 //
 }

/*
 * *  LOCAL FUNCTIONS  *
 *     Handle mouse-down events
 */
do_mouse()
 {
 short window_part;// FindWindow result code //
 // Following fills in EvWindow with //--> window in which the click
 // occurred (or NULL if none).
 //
 window_part = #FindWindow(PtLong(&Event.where), &EvWindow);
 
 switch(window_part) // Dispatch on where clicked
 {
 case inMenuBar: do_menu(#MenuSelect(PtLong(&Event.where))); 
 break;
 case inSysWindow:
 #SystemClick(&Event, EvWindow);
 break;
 case inContent: // Click in content of a window
 #SelectWindow(EvWindow); // Activate window
 #SetPort(EvWindow); // Hook QuickDraw up
 break;
 case inDrag:
 #SelectWindow(EvWindow); // Activate 
 #SetPort(EvWindow); // Hook QuickDraw up 
 break;
 case inGoAway:  // Go-away handling
 break;
 case inGrow:  // Grow handling
 break;
// Add dispatches for other area types
 default:
 }
 }

/*
 *  - Handle keypress and command keys
 *     Handles edit command keys 
 */
do_key()
 {
 unsigned short ch;
 ch = (unsigned short)Event.message; // Isolate key codes
 if(Event.modifiers & cmdKey) // If command character
 do_menu(#MenuKey(ch)); // Try menu shortcut cmd
 }
// Stub functions
upd_wind(wp)
WindowPtr wp;
 {
 return(0);
 }
act_wind(wp)
WindowPtr wp;
 {
 return(0);
 }
deact_wind(wp)
WindowPtr wp;
 {
 return(0);
 }
find_wcb(wp)// Never one of our windows
WindowPtr wp;
 {
 return(0);
 }

MENU SUB-PROGRAM IN C

/*
 * TMenu.C - Handle menu selections for 
 * template program
 *
 *  (c) 1984, MacTutor  by Bob Denny
 */
#include<Templ.H>
/*
 * SETUP_MENU() - Initialize menu system 
 *
 * Fills in an array of menu handles.  Not     
*  used in this version of the program. 
 */
setup_menu()
 {
 #InitMenus();
 #InsertMenu(menus[APPLE] = (MenuHandle)#GetMenu(APPLE_ID), 0);
 #AddResMenu(menus[APPLE], ‘DRVR’);
 #InsertMenu(menus[FILE] = (MenuHandle)#GetMenu(FILE_ID), 0);
 #InsertMenu(menus[EDIT] = (MenuHandle)#GetMenu(EDIT_ID), 0);
 #InsertMenu(menus[OPTIONS] = (MenuHandle)#GetMenu(OPTIONS_ID), 0);
 #DrawMenuBar();
 }
 
/*
 * DO_MENU() - Handle menu selection
 *
 * Input:
 * Result longword from MenuSelect       
 *        or MenuKey
 */
do_menu(result)
unsigned result;
 {
 unsigned short menu_id; // Resource ID of selected menu
 unsigned short item_no; // Item number selected
 char item_name[64]; // Item name (for desk acc.)
 Ptr dp;// Dialog pointer for “about ...”
 unsigned short item_hit; // Dialog item that was hit 
 if(result == 0) // Just for safety with MenuKey
 return;// Ignore zero results
 menu_id = (short)#HiWord(result); // Use toolbox 
 item_no = (short)#LoWord(result);
 
 switch(menu_id)
 {
 case APPLE_ID: // “Apple” menu
 if(item_no > 1) // If desk accessory
 {
 #GetItem(menus[APPLE], item_no, item_name);
 #OpenDeskAcc(item_name);
 }
 else  // Our About ... dialog
 {
 dp = #GetNewDialog(ABOUT_ID, 0, -1); 
 // Bring in dialog to front
 #SetPort(dp); // Hook QuickDraw up to dialog
 #ModalDialog(0, &item_hit); // dialog item hit
 #DisposeDialog(dp); // Close & free heap 
 }
 break;

 case FILE_ID: // File menu
 if(item_no == FM_EXIT)
 #ExitToShell(); // Ugly exit
 break;
 
 case EDIT_ID:
 //
 // First we must hand off any   // desk-accessory edit commands.
 // Note the comments in Demo.H 
 // regarding implicit assumptions
 // in numbering items in Edit menu.
 //
 if(#SystemEdit(item_no - 1)) // Relies on item no.!!
 break;
 //
 // Do the requested edit function only      // if this is an editing 
window and there // is a window open.  For now, we have  // no windows, 
so we just return.
 //
 break;
 
 case OPTIONS_ID: // Options menu.
 switch(item_no)
 {
 case MM_MUSIC:
 play_tune();
 break;
 case MM_EDIT_WINDOW:
 edit_window();
 break;
 case MM_SCRAWL_WINDOW:
 scrawl_window();
 break;
 
 default:
 }
 break;
 
 default:
 }
 #HiliteMenu(0); // Turn off highlighted title
 }
// Stub functions
play_tune() // Make crude music -- demo driver 
 {
 return(0);
 }
edit_window()  // Create a new editing window
 {
 return(0);
 }
scrawl_window()  // Create a new “scrawling” window
 {
 return(0);
 }

Resource File

This is the RMAKER source for the Mac C template application. The dialog box will not come out right with the version of the RMAKER that I have. The \0D entries in the staticText item are supposed to be “hard” carriage returns in the text. Instead, they come out as “D”. To fix this, use the AlertDialog Editor on the file after building it to put the 2 carriage returns in and remove the “D”s. Perhaps RMAKER (or it’s successor) will work some day ...

The menu items for things that aren’t in the template (yet) have been dimmed. As things are filled in, you’ll have to edit this file to un-dim & thus activate the corresponding menu items. Note that the Edit menu is enabled to support SystemEdit editing in desk accessories.

* Templ.R  --  Resources for the 
*                     template program
*
*  (C) 1984, MacTech by R. B. Denny 

TemplRsrc
RSRCXXXX

TYPE WIND
  ,256
Please Wait ...
50 50 250 250
Visible GoAway
0
0

TYPE MENU
  ,1
\14
About Template ...
(-

  ,256
File
Quit

  ,257
Edit
(Can’t Undo
(-
Cut/X
Copy/C
Paste/V
Clear/D

  ,258
Options
(New Edit Window
(New Scrawl Window
(-
(Play a tune

TYPE DLOG
  ,256

54 145 203 376
Visible NoGoAway
1
0
256


TYPE DITL
  ,256
2

button
116 58 142 174
RESUME DEMO

staticText Disabled
9 9 105 228
This program was written as an example of native Macintosh ++ 
application programming in the C language, using Mac C. 
\0D \0D ++ 
Bob Denny            October, 1984

 

Community Search:
MacTech Search:

Software Updates via MacUpdate

Together 3.6.1 - Store and organize all...
Together helps you organize your Mac, giving you the ability to store, edit and preview your files in a single clean, uncluttered interface. Features Smart storage. With simple drag-and-drop... Read more
Cloud 4.1.1 - File sharing from your men...
Cloud is simple file sharing for the Mac. Drag a file from your Mac to the CloudApp icon in the menubar and we take care of the rest. A link to the file will automatically be copied to your clipboard... Read more
OmniFocus 2.7.1 - GTD task manager with...
OmniFocus helps you manage your tasks the way that you want, freeing you to focus your attention on the things that matter to you most. Capturing tasks and ideas is always a keyboard shortcut away in... Read more
CleanApp 5.1.1 - Application deinstaller...
CleanApp is an application deinstaller and archiver.... Your hard drive gets fuller day by day, but do you know why? CleanApp 5 provides you with insights how to reclaim disk space. There are... Read more
ForkLift 3.0 Beta 2 - Powerful file mana...
ForkLift is a powerful file manager and ferociously fast FTP client clothed in a clean and versatile UI that offers the combination of absolute simplicity and raw power expected from a well-executed... Read more
Sublime Text 3126 - Sophisticated text e...
Sublime Text is a sophisticated text editor for code, markup, and prose. You'll love the slick user interface, extraordinary features, and amazing performance. Features Goto Anything. Use Goto... Read more
1Password 6.3.3 - Powerful password mana...
1Password is a password manager that uniquely brings you both security and convenience. It is the only program that provides anti-phishing protection and goes beyond password management by adding Web... Read more
WhatsApp 0.2.1880 - Desktop client for W...
WhatsApp is the desktop client for WhatsApp Messenger, a cross-platform mobile messaging app which allows you to exchange messages without having to pay for SMS. WhatsApp Messenger is available for... Read more
NeoFinder 6.9.3 - Catalog your external...
NeoFinder (formerly CDFinder) rapidly organizes your data, either on external or internal disks, or any other volumes. It catalogs all your data, so you stay in control of your data archive or disk... Read more
Amadeus Pro 2.3.1 - Multitrack sound rec...
Amadeus Pro lets you use your Mac computer for any audio-related task, such as live audio recording, digitizing tapes and records, converting between a variety of sound formats, etc. Thanks to its... Read more

Zip—Zap (Games)
Zip—Zap 1.01 Device: iOS Universal Category: Games Price: $1.99, Version: 1.01 (iTunes) Description: Touch to contract.Release to let go.Bring the clumsy mechanical beings home. · · · over 100 levelsno adsno in-app-purchases Zip—... | Read more »
Paperback: The Game (Games)
Paperback: The Game 1.0 Device: iOS Universal Category: Games Price: $3.99, Version: 1.0 (iTunes) Description: You are an author trying to finish kitschy paperback novels. Complete Westerns, Science Fiction, Romance or even a Crime... | Read more »
How to Rule With a Firm Hand in My Majes...
My Majesty is a kingdom management sim not unlike August’s magisterial hit, Reigns. It’s essentially a reskin of developer Tigrido’s previous management sim, Dictator. As supreme ruler of the land, you must consult with a number of subjects to... | Read more »
Our 5 Favorite iMessage Sticker Packs
At long last, iMessage joins the ranks of messaging apps the likes of LINE and Whatsapp, adding an impressive collection of stickers. They’re a great way to add a little something extra to your daily conversations. [Read more] | Read more »
How to get past Vulture Island's tr...
Vulture Island is a colorful and quirky mish-mash of platforming and puzzles. It’s creative and fresh, but sometimes the game can throw a curveball at you, leaving you stuck as to how you should progress. These tips will help you explore smoothly... | Read more »
The new Clash of Kings is just for Weste...
If you’ve played the original Clash of Kings, you’ll probably recognise the city building, alliance forging and strategic battles in Clash of Kings: The West. What sets this version apart is that it’s tailor made for a Western audience and the... | Read more »
Frost - Survival card game (Games)
Frost - Survival card game 1.12.1 Device: iOS Universal Category: Games Price: $3.99, Version: 1.12.1 (iTunes) Description: *Warning: the game will work on iPhone 5C and above and iPad Pro / 4. Other devices are not supported* | Read more »
How to build and care for your team in D...
Before you hit the trail and become a dog sledding legend, there’s actually a fair bit of prep work to be done. In Dog Sled Saga, you’re not only racing, you’re also building and caring for a team of furry friends. There’s a lot to consider—... | Read more »
How to win every race in Dog Sled Saga
If I had to guess, I’d say Dog Sled Saga is the most adorable racing game on the App Store right now. It’s a dog sled racing sim full of adorable, loyal puppies. Just look at those fluffy little tails wagging. Behind that cute, pixelated facade is... | Read more »
Let the war games commence in Gunship Ba...
Buzz Lightyear famously said, “This isn’t flying, this is falling – with style!” In the case of Gunship Battle: Second War, though, this really is flying - with style! The flight simulator app from Joycity puts you in control of 20 faithfully... | Read more »

Price Scanner via MacPrices.net

15-inch 2.2GHz Retina MacBook Pro on sale for...
B&H Photo has the 2015 15″ 2.2GHz Retina MacBook Pro (MJLQ2LL/A) on sale for $1799, including free shipping plus NY sales tax only. Amazon also has the 2015 15″ 2.2GHz Retina MacBook Pro (... Read more
Toughbook Celebrates 20 Years of Ruggedized M...
Panasonic System Communications Company of North America, Division of Panasonic Corporation of North America (Panasonic) today celebrates the 20th anniversary of its industry-leading Toughbook mobile... Read more
12-inch 1.1GHz Gray Retina MacBook on sale fo...
B&H Photo has the 2016 12″ 1.1GHz Gray Retina MacBook on sale for $1199.99 including free shipping plus NY sales tax only. Their price is $100 off MSRP. Read more
13-inch 2.5GHz MacBook Pro (Apple refurbished...
Apple has Certified Refurbished 13″ 2.5GHz MacBook Pros available for $829, or $270 off the cost of new models. Apple’s one-year warranty is standard, and shipping is free: - 13″ 2.5GHz MacBook Pros... Read more
Save 30% on Camera Guard’s Secure Protection...
To celebrate the release of macOS Sierra, Miami-based security solutions company, ProtectStar has announced a special 30% discount on Camera Guard Professional for Mac 2016. This innovative security... Read more
DVDFab Special Deal – Get a 1-Year Free Licen...
Beijing, China based specialist in the field of DVD, Blu-ray and video backup solutions, Fengtao Software has launched its Autumn Special Deals 2016, giving a 1-year free license of a randomly picked... Read more
21-inch iMacs on sale for up to $120 off MSRP
B&H Photo has 21″ iMacs on sale for up to $120 off MSRP including free shipping plus NY sales tax only: - 21″ 3.1GHz iMac 4K: $1379 $120 off MSRP - 21″ 2.8GHz iMac: $1199.99 $100 off MSRP - 21″ 1... Read more
13-inch 2.7GHz/256GB Retina MacBook Pro on sa...
Amazon.com has the 13″ 2.7GHz/256GB Retina Apple MacBook Pro on sale for $151 off MSRP including free shipping: - 13″ 2.7GHz/256GB Retina MacBook Pro (sku MF840LL/A): $1348 $151 off MSRP Read more
Apple TVs on sale for up to $50 off MSRP
Best Buy has 32GB and 64GB Apple TVs on sale for $40-$50 off MSRP on their online store. Choose free shipping or free local store pickup (if available). Sale prices for online orders only, in-store... Read more
Apple refurbished 13-inch Retina MacBook Pros...
Apple has Certified Refurbished 13″ Retina MacBook Pros available for up to $270 off the cost of new models. An Apple one-year warranty is included with each model, and shipping is free: - 13″ 2.7GHz... Read more

Jobs Board

*Apple* Retail - Multiple Positions (US) - A...
Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, you're also the Read more
Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
Sr. *Apple* Mac Engineer - Net2Source Inc....
…staffing, training and technology. We have following position open with our client. Sr. Apple Mac Engineer6+ Months CTH Start date : 19th Sept Travelling Job If Read more
*Apple* Retail - Multiple Positions-Norfolk,...
Job Description: Sales Specialist - Retail Customer Service and Sales Transform Apple Store visitors into loyal Apple customers. When customers enter the store, Read more
Restaurant Manager (Neighborhood Captain) - A...
…in every aspect of daily operation. WHY YOU'LL LIKE IT: You'll be the Big Apple . You'll solve problems. You'll get to show your ability to handle the stress and Read more
All contents are Copyright 1984-2011 by Xplain Corporation. All rights reserved. Theme designed by Icreon.