gui.h
上传用户:gddssl
上传日期:2007-01-06
资源大小:1003k
文件大小:13k
源码类别:

编辑器/阅读器

开发平台:

DOS

  1. /* vi:set ts=8 sts=4 sw=4:
  2.  *
  3.  * VIM - Vi IMproved by Bram Moolenaar
  4.  * Motif support by Robert Webb
  5.  *
  6.  * Do ":help uganda"  in Vim to read copying and usage conditions.
  7.  * Do ":help credits" in Vim to see a list of people who contributed.
  8.  */
  9. /* For debugging */
  10. /* #define D(x) printf x; */
  11. #define D(x)
  12. #if defined(USE_GUI_AMIGA)
  13. # include <intuition/intuition.h>
  14. #endif
  15. #ifdef USE_GUI_MOTIF
  16. # define USE_GUI_X11
  17. # include <Xm/Xm.h>
  18. #endif
  19. #ifdef USE_GUI_ATHENA
  20. # define USE_GUI_X11
  21. # include <X11/Intrinsic.h>
  22. # include <X11/StringDefs.h>
  23. #endif
  24. #ifdef USE_GUI_WIN32
  25. # include <windows.h>
  26. #endif
  27. #ifdef USE_GUI_BEOS
  28. # include "gui_beos.h"
  29. #endif
  30. #ifdef USE_GUI_MAC
  31. # include <Types.h>
  32. /*# include <Memory.h>*/
  33. # include <Quickdraw.h>
  34. # include <Fonts.h>
  35. # include <Events.h>
  36. # include <Menus.h>
  37. # include <Windows.h>
  38. # include <Controls.h>
  39. /*# include <TextEdit.h>*/
  40. # include <Dialogs.h>
  41. # include <OSUtils.h>
  42. /*
  43. # include <ToolUtils.h>
  44. # include <SegLoad.h>*/
  45. #endif
  46. #ifdef RISCOS
  47. # include "gui_riscos.h"
  48. #endif
  49. /* In the GUI we always have the clipboard and the mouse */
  50. #ifndef USE_CLIPBOARD
  51. # define USE_CLIPBOARD
  52. #endif
  53. #ifndef USE_MOUSE
  54. # define USE_MOUSE
  55. #endif
  56. /*
  57.  * On some systems, when we compile with the GUI, we always use it.  On Mac
  58.  * there is no terminal version, and on Windows we can't figure out how to
  59.  * fork one off with :gui.
  60.  */
  61. #if defined(USE_GUI_WIN32) || defined(USE_GUI_MAC)
  62. # define ALWAYS_USE_GUI
  63. #endif
  64. /*
  65.  * These macros convert between character row/column and pixel coordinates.
  66.  * TEXT_X   - Convert character column into X pixel coord for drawing strings.
  67.  * TEXT_Y   - Convert character row into Y pixel coord for drawing strings.
  68.  * FILL_X   - Convert character column into X pixel coord for filling the area
  69.  * under the character.
  70.  * FILL_Y   - Convert character row into Y pixel coord for filling the area
  71.  * under the character.
  72.  * X_2_COL  - Convert X pixel coord into character column.
  73.  * Y_2_ROW  - Convert Y pixel coord into character row.
  74.  */
  75. #define TEXT_X(col) ((col) * gui.char_width  + gui.border_offset)
  76. #define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent 
  77.  + gui.border_offset)
  78. #define FILL_X(col) ((col) * gui.char_width  + gui.border_offset)
  79. #define FILL_Y(row) ((row) * gui.char_height + gui.border_offset)
  80. #define X_2_COL(x) (((x) - gui.border_offset) / gui.char_width)
  81. #define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height)
  82. /* Indices into GuiMenu->strings[] and GuiMenu->noremap[] for each mode */
  83. #define MENU_INDEX_INVALID -1
  84. #define MENU_INDEX_NORMAL 0
  85. #define MENU_INDEX_VISUAL 1
  86. #define MENU_INDEX_OP_PENDING 2
  87. #define MENU_INDEX_INSERT 3
  88. #define MENU_INDEX_CMDLINE 4
  89. #define MENU_INDEX_TIP 5
  90. #define MENU_MODES 6
  91. /* Menu modes */
  92. #define MENU_NORMAL_MODE (1 << MENU_INDEX_NORMAL)
  93. #define MENU_VISUAL_MODE (1 << MENU_INDEX_VISUAL)
  94. #define MENU_OP_PENDING_MODE (1 << MENU_INDEX_OP_PENDING)
  95. #define MENU_INSERT_MODE (1 << MENU_INDEX_INSERT)
  96. #define MENU_CMDLINE_MODE (1 << MENU_INDEX_CMDLINE)
  97. #define MENU_TIP_MODE (1 << MENU_INDEX_TIP)
  98. #define MENU_ALL_MODES ((1 << MENU_INDEX_TIP) - 1)
  99. /*note MENU_INDEX_TIP is not a 'real' mode*/
  100. /* The character for each menu mode */
  101. #define MENU_MODE_CHARS "nvoict"
  102. /* Indices for arrays of scrollbars */
  103. #define SBAR_NONE     -1
  104. #define SBAR_LEFT     0
  105. #define SBAR_RIGHT     1
  106. #define SBAR_BOTTOM     2
  107. /* Orientations for scrollbars */
  108. #define SBAR_VERT     0
  109. #define SBAR_HORIZ     1
  110. /* Default size of scrollbar */
  111. #define SB_DEFAULT_WIDTH    16
  112. /* Default height of the menu bar */
  113. #define MENU_DEFAULT_HEIGHT 1 /* figure it out at runtime */
  114. /* Flags for gui_mch_outstr_nowrap() */
  115. #define GUI_MON_WRAP_CURSOR 0x01 /* wrap cursor at end of line */
  116. #define GUI_MON_INVERT 0x02 /* invert the characters */
  117. #define GUI_MON_IS_CURSOR 0x04 /* drawing cursor */
  118. #define GUI_MON_TRS_CURSOR 0x08 /* drawing transparent cursor */
  119. #define GUI_MON_NOCLEAR 0x10 /* don't clear selection */
  120. /* Flags for gui_mch_draw_string() */
  121. #define DRAW_TRANSP 0x01 /* draw with transparant bg */
  122. #define DRAW_BOLD 0x02 /* draw bold text */
  123. #define DRAW_UNDERL 0x04 /* draw underline text */
  124. #ifdef RISCOS
  125. # define DRAW_ITALIC 0x08 /* draw italic text */
  126. #endif
  127. /* For our own tearoff menu item */
  128. #define TEAR_STRING "-->Detach"
  129. #define TEAR_LEN (9) /* length of above string */
  130. #define MNU_HIDDEN_CHAR ']' /* Start a menu name with this to not
  131.  * include it on the main menu bar */
  132. /* for the toolbar */
  133. #define TOOLBAR_BUTTON_HEIGHT 15
  134. #define TOOLBAR_BUTTON_WIDTH 16
  135. typedef struct GuiMenu
  136. {
  137.     int modes;     /* Which modes is this menu visible for? */
  138.     char_u *name;     /* Name of menu */
  139.     char_u *dname;     /* Displayed Name (without '&') */
  140.     int mnemonic;     /* mnemonic key (after '&') */
  141.     char_u *actext;     /* accelerator text (after TAB) */
  142.     int priority;     /* Menu order priority */
  143.     void (*cb)();     /* Call-back routine */
  144.     char_u *strings[MENU_MODES]; /* Mapped string for each mode */
  145.     int noremap[MENU_MODES]; /* A noremap flag for each mode */
  146.     struct GuiMenu *children;     /* Children of sub-menu */
  147.     struct GuiMenu *next;     /* Next item in menu */
  148. #ifdef USE_GUI_X11
  149.     Widget id;     /* Manage this to enable item */
  150.     Widget submenu_id;     /* If this is submenu, add children here */
  151. #endif
  152. #ifdef USE_GUI_WIN32
  153.     UINT id;     /* Id of menu item */
  154.     HMENU submenu_id;     /* If this is submenu, add children here */
  155.     HWND tearoff_handle;     /* hWnd of tearoff if created */
  156.     struct GuiMenu *parent;     /* Parent of menu (needed for tearoffs) */
  157. #endif
  158. #if USE_GUI_BEOS
  159.     BMenuItem *id;     /* Id of menu item */
  160.     BMenu *submenu_id;     /* If this is submenu, add children here */
  161. #endif
  162. #ifdef macintosh
  163.     MenuHandle id;
  164.     short index;     /* the item index within the father menu */
  165.     short menu_id;     /* the menu id to which this item belong */
  166.     short submenu_id;     /* the menu id of the children (could be
  167.        get throught some tricks) */
  168.     MenuHandle menu_handle;
  169.     MenuHandle submenu_handle;
  170. #endif
  171. #if defined(USE_GUI_AMIGA)
  172.     /* only one of these will ever be set, but
  173.      * they are used to allow the menu routine
  174.      * to easily get a hold of the parent menu
  175.      * pointer which is needed by all items to
  176.      * form the chain correctly */
  177.     int     id;     /* unused by the amiga, but used in the
  178.      * code kept for compatibility */
  179.     struct Menu     *menuPtr;
  180.     struct MenuItem *menuItemPtr;
  181. #endif
  182. #ifdef RISCOS
  183.     int *id;     /* Not used, but gui.c needs it */
  184.     int greyed_out;     /* Flag */
  185.     int hidden;
  186. #endif
  187. } GuiMenu;
  188. typedef struct GuiScrollbar
  189. {
  190.     long ident;     /* Unique identifier for each scrollbar */
  191.     struct window *wp;     /* Scrollbar's window, NULL for bottom */
  192.     int value;     /* Represents top line number visible */
  193.     int pixval;     /* pixel count of value */
  194.     int size;     /* Size of scrollbar thumb */
  195.     int max;     /* Number of lines in buffer */
  196.     /* Values measured in characters: */
  197.     int top;     /* Top of scroll bar (chars from row 0) */
  198.     int height;     /* Height of scroll bar (num rows) */
  199.     int status_height;     /* Height of status line */
  200. #ifdef USE_GUI_X11
  201.     Widget id;     /* Id of real scroll bar */
  202. #endif
  203. #ifdef USE_GUI_WIN32
  204.     HWND id;     /* Id of real scroll bar */
  205. #endif
  206. #if USE_GUI_BEOS
  207.     VimScrollBar *id;     /* Pointer to real scroll bar */
  208. #endif
  209. #ifdef macintosh
  210.     ControlHandle id;     /* A handle to the scrollbar */
  211. #endif
  212. #ifdef RISCOS
  213.     int id;     /* Window handle of scrollbar window */
  214. #endif
  215. } GuiScrollbar;
  216. typedef long     GuiColor;     /* handle for a GUI color */
  217. typedef long_u     GuiFont;     /* handle for a GUI font */
  218. typedef struct Gui
  219. {
  220.     int in_focus;     /* Vim has input focus */
  221.     int in_use;     /* Is the GUI being used? */
  222.     int starting;     /* GUI will start in a little while */
  223.     int window_created;     /* Has the window been created yet? */
  224.     int dying;     /* Is vim dying? Then output to terminal */
  225.     int dofork;     /* Use fork() when GUI is starting */
  226.     int dragged_sb;     /* Which scrollbar being dragged, if any? */
  227.     struct window   *dragged_wp;    /* Which WIN's sb being dragged, if any? */
  228.     int pointer_hidden;     /* Is the mouse pointer hidden? */
  229.     int col;     /* Current cursor column in GUI display */
  230.     int row;     /* Current cursor row in GUI display */
  231.     int cursor_col;     /* Physical cursor column in GUI display */
  232.     int cursor_row;     /* Physical cursor row in GUI display */
  233.     char cursor_is_valid;    /* There is a cursor at cursor_row/col */
  234.     int num_cols;     /* Number of columns */
  235.     int num_rows;     /* Number of rows */
  236.     int scroll_region_top;  /* Top (first) line of scroll region */
  237.     int scroll_region_bot;  /* Bottom (last) line of scroll region */
  238.     int highlight_mask;     /* Highlight attribute mask */
  239.     GuiMenu *root_menu;     /* Root of menu hierarchy */
  240.     int scrollbar_width;    /* Width of vertical scrollbars */
  241.     int scrollbar_height;   /* Height of horizontal scrollbar */
  242.     int left_sbar_x;     /* Calculated x coord for left scrollbar */
  243.     int right_sbar_x;     /* Calculated x coord for right scrollbar */
  244.     int menu_height;     /* Height of the menu bar */
  245.     int menu_width;     /* Width of the menu bar */
  246.     char menu_is_active;     /* TRUE if menu is present */
  247.     char menu_height_fixed;  /* TRUE if menu height fixed */
  248.     GuiScrollbar bottom_sbar;     /* Bottom scrollbar */
  249.     int which_scrollbars[3];/* Which scrollbar boxes are active? */
  250.     int prev_wrap;     /* For updating the horizontal scrollbar */
  251.     int char_width;     /* Width of char in pixels */
  252.     int char_height;     /* Height of char in pixels */
  253.     int char_ascent;     /* Ascent of char in pixels */
  254.     int border_width;     /* Width of our border around text area */
  255.     int border_offset;     /* Total pixel offset for all borders */
  256.     GuiFont norm_font;
  257.     GuiFont bold_font;
  258.     GuiFont ital_font;
  259.     GuiFont boldital_font;
  260.     GuiColor back_pixel;     /* Color of background */
  261.     GuiColor norm_pixel;     /* Color of normal text */
  262.     GuiColor def_back_pixel;     /* default Color of background */
  263.     GuiColor def_norm_pixel;     /* default Color of normal text */
  264. #ifdef USE_GUI_X11
  265.     GuiColor menu_fg_pixel;     /* Color of menu foregound */
  266.     GuiColor menu_bg_pixel;     /* Color of menu backgound */
  267.     GuiColor scroll_fg_pixel;    /* Color of scrollbar foregrnd */
  268.     GuiColor scroll_bg_pixel;    /* Color of scrollbar backgrnd */
  269.     Display *dpy;     /* X display */
  270.     Window wid;     /* Window id of text area */
  271.     int visibility;     /* Is window partially/fully obscured? */
  272.     GC text_gc;
  273.     GC back_gc;
  274.     GC invert_gc;
  275.     Cursor blank_pointer;     /* Blank pointer */
  276.     /* X Resources */
  277.     char_u *dflt_font;     /* Resource font, used if 'font' not set */
  278.     char_u *dflt_bold_fn;     /* Resource bold font */
  279.     char_u *dflt_ital_fn;     /* Resource italic font */
  280.     char_u *dflt_boldital_fn;  /* Resource bold-italic font */
  281.     char_u *geom;     /* Geometry, eg "80x24" */
  282.     Bool rev_video;     /* Use reverse video? */
  283. #endif
  284. #ifdef USE_GUI_WIN32
  285.     GuiFont currFont;     /* Current font */
  286.     GuiColor currFgColor;     /* Current foreground text color */
  287.     GuiColor currBgColor;     /* Current background text color */
  288. #endif
  289. #ifdef USE_GUI_BEOS
  290.     VimApp     *vimApp;
  291.     VimWindow  *vimWindow;
  292.     VimFormView *vimForm;
  293.     VimTextAreaView *vimTextArea;
  294.     int vdcmp;     /* Vim Direct Communication Message Port */
  295. #endif
  296. #ifdef USE_GUI_MAC
  297.     WindowPtr VimWindow;
  298.     GuiColor menu_fg_pixel;     /* Color of menu foregound */
  299.     GuiColor menu_bg_pixel;     /* Color of menu backgound */
  300.     GuiColor scroll_fg_pixel;    /* Color of scrollbar foregrnd */
  301.     GuiColor scroll_bg_pixel;    /* Color of scrollbar backgrnd */
  302.     WindowPtr wid;     /* Window id of text area */
  303.     int visibility;     /* Is window partially/fully obscured? */
  304.     /* GC text_gc;
  305. GC back_gc;
  306. GC invert_gc;
  307.      */
  308.     /* X Resources */
  309.     char_u *dflt_font;     /* Resource font, used if 'font' not set */
  310.     char_u *dflt_bold_fn;     /* Resource bold font */
  311.     char_u *dflt_ital_fn;     /* Resource italic font */
  312.     char_u *dflt_boldital_fn;  /* Resource bold-italic font */
  313.     char_u *geom;     /* Geometry, eg "80x24" */
  314.     char_u rev_video;     /* Use reverse video? */
  315. #endif
  316. #if defined(USE_GUI_AMIGA)
  317.     struct Window *window;     /* a handle to the amiga window */
  318.     struct Menu   *menu;     /* a pointer to the first menu */
  319.     struct TextFont *textfont;     /* a pointer to the font structure */
  320. #endif
  321. #ifdef RISCOS
  322.     int window_handle;
  323.     char_u *window_title;
  324.     int window_title_size;
  325.     int fg_colour;     /* in 0xBBGGRR format */
  326.     int bg_colour;
  327. #endif
  328. } Gui;
  329. extern Gui gui;     /* this is defined in gui.c */
  330. extern int force_menu_update;     /* this is defined in gui.c */