blob: 3150031ec8178039814ea2f5f45f66a8d2380d9c [file] [log] [blame] [edit]
/*
* 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 */