| /* |
| * Internal include file |
| * --------------------- |
| * GraphApp internal functions (Windows version). |
| * |
| * The type objptr is defined in this file to be an |
| * object pointer. This differs from the normal graphapp.h |
| * definition which makes an objptr a pointer to int. |
| * There are a few reasons for this: |
| * 1. The graphapp.h file is platform independent, |
| * so making the basic object type an int pointer |
| * is platform-neutral. |
| * 2. Thus the object type does not need to be defined in |
| * graphapp.h since this type includes platform-specific |
| * information. |
| * 3. An int pointer facilitates data-hiding. No-one can |
| * poke around in the object data structure. |
| * 4. Inside the library code we can treat all fonts, windows |
| * controls, cursors, etc as ordinary objects. There is |
| * no need for typecasting, so code size is reduced. |
| */ |
| |
| #ifndef _GRAPH_INT_H |
| #define _GRAPH_INT_H |
| |
| /* |
| * Set DEBUG to 1 to produce object debugging, otherwise zero. |
| */ |
| #ifndef DEBUG |
| #define DEBUG 0 |
| #endif |
| |
| /* |
| * If compiling the whole library from graphapp.c, we |
| * define PROTECTED to be the storage class "static", |
| * hence optimising the library's symbol table by |
| * omitting the internal library function names. |
| */ |
| #ifdef _GRAPHAPP_ |
| #define PROTECTED static |
| #else |
| #define PROTECTED |
| #endif |
| |
| /* |
| * Type definitions. |
| */ |
| |
| typedef struct callinfo callinfo; |
| typedef struct objinfo objinfo; |
| typedef objinfo *object; |
| |
| /* in w32api this needs to be before ga.h */ |
| #ifndef __WINDOWS_H /* prevent multiple includes */ |
| #include <windows.h> |
| #endif |
| #include <stdint.h> /* for intptr_t */ |
| |
| #ifndef __GA__VERSION__ |
| #define objptr object |
| #include "ga.h" |
| #endif |
| |
| /* extras */ |
| rect getcliprect(void); |
| void setcliprect(rect r); |
| PROTECTED void updatestatus(const char *text); |
| PROTECTED font new_font_object(HFONT hf); |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <stdio.h> |
| #include <stdlib.h> |
| #include <string.h> |
| #include <ctype.h> |
| #include <math.h> |
| |
| |
| #include <commdlg.h> |
| |
| #ifdef __MWERKS__ |
| /* Metrowerks Codewarrior Cross-Platform C/C++ Compiler */ |
| #define COMPILER 32 |
| #endif |
| |
| #ifdef __MINGW32__ |
| #define COMPILER 32 |
| #ifndef WINVER |
| #define WINVER 0x0400 |
| #endif |
| #define PASS_ARGS 1 |
| #ifndef WIN32 |
| #define WIN32 |
| #endif |
| #else |
| #define PASS_ARGS 1 |
| #endif |
| |
| |
| #ifdef _MSC_VER |
| /* Microsoft Visual C++ Compiler */ |
| #ifdef WIN32 |
| #define COMPILER 32 |
| #else |
| #define COMPILER 16 |
| #endif |
| #endif |
| |
| /* |
| * Set USE_NATIVE_LABELS to 1 for Windows text labels (never necessary). |
| * Set USE_NATIVE_TOGGLES to 1 for Windows checkboxes and radiobuttons. |
| * Set USE_NATIVE_BUTTONS to 1 for Windows buttons. |
| */ |
| |
| #define USE_NATIVE_LABELS 0 |
| #define USE_NATIVE_TOGGLES 1 |
| #define USE_NATIVE_BUTTONS 1 |
| |
| #ifdef WINVER |
| #if (WINVER <= 0x030a) |
| #undef USE_NATIVE_TOGGLES |
| #define USE_NATIVE_TOGGLES 0 |
| #undef USE_NATIVE_BUTTONS |
| #define USE_NATIVE_BUTTONS 0 |
| #endif |
| #endif |
| |
| #define USE_NATIVE_CONTROLS (USE_NATIVE_LABELS + USE_NATIVE_BUTTONS + USE_NATIVE_TOGGLES) |
| |
| /* |
| * Check that certain words are defined. |
| */ |
| #ifdef COMPILER |
| #ifndef __MINGW32__ |
| #ifndef _argc |
| #define _argc __argc |
| #endif |
| #ifndef _argv |
| #define _argv __argv |
| #endif |
| #endif |
| #endif /* special compiler definitions */ |
| |
| /* |
| * Object types. |
| */ |
| |
| #define BaseObject 0x4000 |
| |
| #define Image8 0x0008 |
| #define Image32 0x0020 |
| |
| #define ControlObject 0x1000 |
| #define WindowObject 0x1100 |
| #define BitmapObject 0x0200 |
| #define CursorObject 0x0400 |
| #define FontObject 0x0800 |
| |
| #define UserObject 0x1080 |
| #define LabelObject 0x1001 |
| #define ButtonObject 0x1004 |
| #define CheckboxObject 0x1005 |
| #define RadioObject 0x1006 |
| #define ScrollbarObject 0x1008 |
| #define FieldObject 0x1011 |
| #define TextboxObject 0x1012 |
| #define ListboxObject 0x1020 |
| #define MultilistObject 0x1021 |
| #define DroplistObject 0x1022 |
| #define DropfieldObject 0x1023 |
| #define ProgressbarObject 0x1024 |
| |
| #define MenubarObject 0x0041 |
| #define MenuObject 0x0042 |
| #define MenuitemObject 0x0048 |
| |
| #define RadiogroupObject 0x2006 |
| |
| #define PrinterObject 0x0030 |
| #define MetafileObject 0x0050 |
| |
| /* |
| * Object information structures. |
| */ |
| |
| struct objinfo |
| { |
| int kind; /* what kind of object is it? */ |
| int refcount; /* equals zero after del() */ |
| HANDLE handle; /* handle to associated Windows object */ |
| object menubar,popup,toolbar; |
| char status[256]; |
| object next; /* next object in the list */ |
| object prev; /* previous object in the list */ |
| object parent; /* object's parent/container */ |
| object child; /* first born */ |
| |
| actionfn die; /* private object destructor */ |
| |
| rect rect; /* rectangle size */ |
| int depth; /* pixel depth */ |
| |
| drawstate drawstate; /* private drawstate */ |
| image img; /* associated image */ |
| |
| int id; /* a unique id number */ |
| long state; /* enabled/visible/armed etc */ |
| long flags; /* kind of window/child control */ |
| void * data; /* data supplied by user */ |
| char * text; /* text associated with the object */ |
| rgb fg; /* foreground colour */ |
| rgb bg; /* background colour */ |
| |
| actionfn action; /* button/checkbox action */ |
| actionfn dble ; /* listbox double-click action */ |
| intfn hit; /* menuitem/scrollbar action */ |
| int value; /* current argument to hit() */ |
| int key; /* menuitem key equivalent */ |
| int shortcut; /* menu shortcut key */ |
| int max; /* scrollbar maximum value */ |
| int size; /* scrollbar page size */ |
| int xmax; /* scrollbar maximum value */ |
| int xsize; /* scrollbar page size */ |
| |
| callinfo *call; /* window/control call-backs */ |
| void * extra; /* for extra internal data */ |
| WNDPROC winproc; /* control's normal event handler */ |
| |
| #if USE_NATIVE_CONTROLS |
| HBRUSH bgbrush; /* background brush */ |
| #endif |
| int caretwidth; /* Caret (blinking cursor) is set here. caretwidth=0 for none, |
| negative for not focussed */ |
| int caretheight; |
| int caretshowing; |
| }; |
| |
| struct callinfo |
| { |
| actionfn die; /* user-defined destructor */ |
| actionfn close; /* window close function */ |
| |
| drawfn redraw; /* draw the window/control */ |
| drawfn resize; /* window/control was resized */ |
| |
| keyfn keydown; /* normal key pressed */ |
| keyfn keyaction; /* function/arrow key pressed */ |
| |
| mousefn mousedown; /* mouse button was clicked */ |
| mousefn mouseup; /* mouse button was released */ |
| mousefn mousemove; /* mouse was moved */ |
| mousefn mousedrag; /* mouse dragged (button is down) */ |
| mousefn mouserepeat; /* mouse-down timer auto repeat */ |
| |
| dropfn drop; /* drag-and-drop function */ |
| |
| imfn im; /* input method function */ |
| |
| actionfn focus; |
| }; |
| |
| |
| /* Useful definitions. */ |
| |
| #undef min |
| #undef max |
| #define min(a,b) (((a) < (b)) ? (a) : (b)) |
| #define max(a,b) (((a) > (b)) ? (a) : (b)) |
| |
| #define MinMenuID 0x0100 |
| #define MinChildID 0x6000 |
| #define MinDocID 0xE000 |
| |
| #define sendmessage(a,b,c,d) SendMessage((HWND)(a),(UINT)(b),(WPARAM)c,(LPARAM)d) |
| |
| /* |
| * Function prototypes. |
| */ |
| |
| /* Array memory management. */ |
| |
| #define create(type) ( (type*) memalloc(sizeof(type)) ) |
| #define array(n,type) ( (type*) memalloc(n*sizeof(type)) ) |
| #define len(a) ( memlength((char*)(a))/sizeof((a)[0]) ) |
| #define element(a,i) ( (((i)<len(a)) && ((i)>=0)) ? (a)[i] : 0 ) |
| #define append(a,e) ( *(char**)&(a)=memexpand((char*)(a),sizeof((a)[0])),\ |
| (a)[len(a)-1]=(e) ) |
| #define join(a,b) ( *(char**)&(a)=memjoin((char*)(a),(char*)(b)) ) |
| #define discard(a) ( memfree((char*)(a)), (a)=0 ) |
| |
| char * memalloc(long size); |
| void memfree(char *a); |
| long memlength(char *a); |
| char * memexpand(char *a, long extra); |
| char * memjoin(char *a, char *b); |
| |
| /* Module initialisation methods. */ |
| |
| PROTECTED void init_objects(void); |
| PROTECTED void init_events(void); |
| PROTECTED void init_contexts(void); |
| PROTECTED void init_menus(void); |
| PROTECTED void init_fonts(void); |
| PROTECTED void init_cursors(void); |
| |
| PROTECTED window simple_window(void); |
| |
| /* Module finaliser methods. */ |
| |
| PROTECTED void app_cleanup(void); |
| |
| PROTECTED void finish_objects(void); |
| PROTECTED void finish_events(void); |
| PROTECTED void finish_contexts(void); |
| |
| /* Object management. */ |
| |
| PROTECTED object new_object(int kind, HANDLE handle, object parent); |
| PROTECTED object tree_search(object top, HANDLE handle, int id, int key); |
| PROTECTED object find_object(HANDLE handle, int id, int key); |
| PROTECTED void move_to_front(object obj); |
| PROTECTED void apply_to_list(object first, actionfn fn); |
| |
| #define find_by_handle(h) find_object(h, 0, 0) |
| #define find_by_id(id) find_object(0, id, 0) |
| #define find_by_key(base, key) tree_search(base, 0, 0, key) |
| |
| /* Object refcounts and deletion. */ |
| |
| PROTECTED void decrease_refcount(object obj); |
| PROTECTED void increase_refcount(object obj); |
| PROTECTED void protect_object(object obj); |
| PROTECTED void deletion_traversal(void); |
| |
| /* Menu event management. */ |
| |
| PROTECTED void adjust_menu(WPARAM wParam); |
| PROTECTED void handle_menu_id(WPARAM wParam); |
| PROTECTED int handle_menu_key(WPARAM wParam); |
| |
| /* Control event management. */ |
| |
| PROTECTED void handle_control(HWND hwnd, UINT message); |
| PROTECTED object find_valid_sibling(object obj); |
| |
| /* Dialog event management */ |
| |
| PROTECTED void handle_findreplace(HWND hwnd, LPFINDREPLACE pfr); |
| PROTECTED HWND get_modeless(void); |
| |
| /* Drawing context management. */ |
| |
| PROTECTED void add_context(object obj, HDC dc, HGDIOBJ old); |
| PROTECTED HDC get_context(object obj); |
| PROTECTED void remove_context(object obj); |
| PROTECTED void del_context(object obj); |
| PROTECTED void del_all_contexts(void); |
| |
| PROTECTED void fix_brush(HDC dc, object obj, HBRUSH brush); |
| |
| /* Window private functions. */ |
| |
| PROTECTED rect screen_coords(object obj); |
| PROTECTED void show_window(object obj); |
| PROTECTED void hide_window(object obj); |
| |
| /* Image private functions. */ |
| |
| PROTECTED image load_gif(const char *filename); |
| PROTECTED void save_gif(image img, const char *filename); |
| |
| PROTECTED rgb get_image_pixel(image img, int x, int y); |
| PROTECTED rgb get_monochrome_pixel(image img, int x, int y); |
| PROTECTED rgb get_grey_pixel(image img, int x, int y); |
| |
| PROTECTED int has_transparent_pixels(image img); |
| |
| /* Debugging functions. */ |
| |
| #if DEBUG |
| PROTECTED void printimage(FILE *file, image img); |
| PROTECTED void print_object_list(void); |
| #endif |
| |
| /* String functions. */ |
| |
| char * new_string(const char *src); |
| void del_string(const char *str); |
| long string_length(const char *s); |
| void copy_string(char *dest, const char *src); |
| int compare_strings(const char *s1, const char *s2); |
| const char * add_strings(const char *s1, const char *s2); |
| char * char_to_string(char ch); |
| char * int_to_string(long i); |
| char * float_to_string(float f); |
| |
| PROTECTED int string_diff(const char *s, const char *t); |
| PROTECTED char * to_dos_string(const char *str); |
| PROTECTED char * to_c_string(const char *str); |
| |
| /* New functions yet to be placed in the official header file */ |
| |
| |
| /* |
| * variables used building R |
| */ |
| #ifdef GA_EXTERN |
| extern __declspec(dllimport) HWND hwndClient; |
| #else |
| extern HWND hwndClient; |
| #endif |
| |
| |
| /* |
| * Library internal variables. |
| */ |
| |
| #if defined(R_DLL_BUILD) |
| extern |
| #else |
| extern __declspec(dllimport) |
| #endif |
| unsigned int localeCP; /* from Defn.h */ |
| extern int app_initialised; |
| extern char * app_name; |
| |
| extern HANDLE this_instance; |
| extern HANDLE prev_instance; |
| |
| LRESULT WINAPI app_win_proc (HWND, UINT, WPARAM, LPARAM); |
| LRESULT WINAPI app_doc_proc (HWND, UINT, WPARAM, LPARAM); |
| LRESULT WINAPI app_work_proc (HWND, UINT, WPARAM, LPARAM); |
| long WINAPI app_control_procedure (HWND, UINT, WPARAM, LPARAM); |
| UINT WINAPI app_timer_procedure(HWND, UINT, UINT, DWORD); |
| extern WNDPROC app_control_proc; |
| |
| extern int menus_active; |
| extern int active_windows; |
| extern intptr_t child_id; |
| |
| extern window current_window; |
| extern menubar current_menubar; |
| extern menu current_menu; |
| |
| extern HACCEL hAccel; |
| extern HWND hwndMain; |
| extern HWND hwndFrame; |
| extern object MDIFrame; |
| extern object MDIToolbar; |
| extern HWND MDIStatus; |
| extern HDC dc; |
| extern HPEN the_pen; |
| extern HBRUSH the_brush; |
| extern COLORREF win_rgb; |
| |
| extern drawstruct app_drawstate; |
| |
| extern drawstate current; /* global colour, font &c */ |
| extern int keystate; /* state of Shift, Ctrl, Alt */ |
| |
| static inline RECT *rect2RECT(rect *r) {return (RECT *)r;} |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* GraphApp internal header file */ |