blob: 77d7873fef4b8a5fb9921d8c69723b2de2d2e9f9 [file] [log] [blame]
Bram Moolenaaredf3f972016-08-29 22:49:24 +02001/* vi:set ts=8 sts=4 sw=4 noet:
Bram Moolenaar071d4272004-06-13 20:20:40 +00002 *
3 * VIM - Vi IMproved by Bram Moolenaar
4 * Photon GUI support by Julian Kinraid
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 *
10 * Clipboard support is in os_qnx.c
11 * PhAttach() is called in os_qnx.c:qnx_init()
12 */
13
14#include "vim.h"
15
Bram Moolenaar82881492012-11-20 16:53:39 +010016/* cproto fails on missing include files */
17#ifndef PROTO
18# ifdef FEAT_TOOLBAR
19# include <photon/PxImage.h>
20# endif
Bram Moolenaar071d4272004-06-13 20:20:40 +000021#endif
22
23#if !defined(__QNX__)
24/* Used when generating prototypes. */
25# define PgColor_t int
26# define PhEvent_t int
27# define PhPoint_t int
28# define PtWidget_t int
29# define Pg_BLACK 0
30# define PtCallbackF_t int
31# define PtCallbackInfo_t int
32# define PhTile_t int
33# define PtWidget_t int
34# define PhImage_t int
35#endif
36
37#define ARRAY_LENGTH(a) (sizeof(a) / sizeof(a[0]))
Bram Moolenaard2221132011-07-27 14:09:09 +020038#define RGB(r, g, b) PgRGB(r, g, b)
Bram Moolenaar071d4272004-06-13 20:20:40 +000039
Bram Moolenaard2221132011-07-27 14:09:09 +020040#define EVENT_BUFFER_SIZE sizeof(PhEvent_t) + 1000
Bram Moolenaar071d4272004-06-13 20:20:40 +000041
42/* Some defines for gui_mch_mousehide() */
43#define MOUSE_HIDE TRUE
44#define MOUSE_SHOW FALSE
45
46/* Optional support for using a PtPanelGroup widget, needs work */
47#undef USE_PANEL_GROUP
48
49#ifdef USE_PANEL_GROUP
50static char *empty_title = " ";
51static char **panel_titles = NULL;
52static ushort_t num_panels = 0;
53static short pg_margin_left, pg_margin_right, pg_margin_top, pg_margin_bottom;
54#endif
55
56#define GUI_PH_MARGIN 4 /* Size of the bevel */
57
58#define GUI_PH_MOUSE_TYPE Ph_CURSOR_INSERT
59static PgColor_t gui_ph_mouse_color = Pg_BLACK;
60
61static PhPoint_t gui_ph_raw_offset;
62static PtWidget_t *gui_ph_timer_cursor; /* handle cursor blinking */
63static PtWidget_t *gui_ph_timer_timeout; /* used in gui_mch_wait_for_chars */
Bram Moolenaar84a05ac2013-05-06 04:24:17 +020064static short is_timeout; /* Has the timeout occurred? */
Bram Moolenaar071d4272004-06-13 20:20:40 +000065
66/*
67 * This is set inside the mouse callback for a right mouse
68 * button click, and used for the popup menus
69 */
70static PhPoint_t abs_mouse;
71
72/* Try and avoid redraws while a resize is in progress */
73static int is_ignore_draw = FALSE;
74
75/* Used for converting to/from utf-8 and other charsets */
76static struct PxTransCtrl *charset_translate;
77
78/*
79 * Cursor blink functions.
80 *
81 * This is a simple state machine:
82 * BLINK_NONE not blinking at all
83 * BLINK_OFF blinking, cursor is not shown
84 * BLINK_ON blinking, cursor is shown
85 */
86static enum {
87 BLINK_NONE,
88 BLINK_OFF,
89 BLINK_ON
90} blink_state = BLINK_NONE;
91
92static long_u blink_waittime = 700;
93static long_u blink_ontime = 400;
94static long_u blink_offtime = 250;
95
96static struct
97{
98 int key_sym;
99 char_u vim_code0;
100 char_u vim_code1;
101} special_keys[] =
102{
103 {Pk_Up, 'k', 'u'},
104 {Pk_Down, 'k', 'd'},
105 {Pk_Left, 'k', 'l'},
106 {Pk_Right, 'k', 'r'},
107
108 {Pk_F1, 'k', '1'},
109 {Pk_F2, 'k', '2'},
110 {Pk_F3, 'k', '3'},
111 {Pk_F4, 'k', '4'},
112 {Pk_F5, 'k', '5'},
113 {Pk_F6, 'k', '6'},
114 {Pk_F7, 'k', '7'},
115 {Pk_F8, 'k', '8'},
116 {Pk_F9, 'k', '9'},
117 {Pk_F10, 'k', ';'},
118
119 {Pk_F11, 'F', '1'},
120 {Pk_F12, 'F', '2'},
121 {Pk_F13, 'F', '3'},
122 {Pk_F14, 'F', '4'},
123 {Pk_F15, 'F', '5'},
124 {Pk_F16, 'F', '6'},
125 {Pk_F17, 'F', '7'},
126 {Pk_F18, 'F', '8'},
127 {Pk_F19, 'F', '9'},
128 {Pk_F20, 'F', 'A'},
129
130 {Pk_F21, 'F', 'B'},
131 {Pk_F22, 'F', 'C'},
132 {Pk_F23, 'F', 'D'},
133 {Pk_F24, 'F', 'E'},
134 {Pk_F25, 'F', 'F'},
135 {Pk_F26, 'F', 'G'},
136 {Pk_F27, 'F', 'H'},
137 {Pk_F28, 'F', 'I'},
138 {Pk_F29, 'F', 'J'},
139
140 {Pk_F30, 'F', 'K'},
141 {Pk_F31, 'F', 'L'},
142 {Pk_F32, 'F', 'M'},
143 {Pk_F33, 'F', 'N'},
144 {Pk_F34, 'F', 'O'},
145 {Pk_F35, 'F', 'P'},
146
147 {Pk_Help, '%', '1'},
148 {Pk_BackSpace, 'k', 'b'},
149 {Pk_Insert, 'k', 'I'},
150 {Pk_Delete, 'k', 'D'},
151 {Pk_Home, 'k', 'h'},
152 {Pk_End, '@', '7'},
153 {Pk_Prior, 'k', 'P'},
154 {Pk_Next, 'k', 'N'},
155 {Pk_Print, '%', '9'},
156
157 {Pk_KP_Add, 'K', '6'},
158 {Pk_KP_Subtract,'K', '7'},
159 {Pk_KP_Divide, 'K', '8'},
160 {Pk_KP_Multiply,'K', '9'},
161 {Pk_KP_Enter, 'K', 'A'},
162
163 {Pk_KP_0, KS_EXTRA, KE_KINS}, /* Insert */
164 {Pk_KP_Decimal, KS_EXTRA, KE_KDEL}, /* Delete */
165
166 {Pk_KP_4, 'k', 'l'}, /* Left */
167 {Pk_KP_6, 'k', 'r'}, /* Right */
168 {Pk_KP_8, 'k', 'u'}, /* Up */
169 {Pk_KP_2, 'k', 'd'}, /* Down */
170
171 {Pk_KP_7, 'K', '1'}, /* Home */
172 {Pk_KP_1, 'K', '4'}, /* End */
173
174 {Pk_KP_9, 'K', '3'}, /* Page Up */
175 {Pk_KP_3, 'K', '5'}, /* Page Down */
176
177 {Pk_KP_5, '&', '8'}, /* Undo */
178
179 /* Keys that we want to be able to use any modifier with: */
180 {Pk_Return, CAR, NUL},
181 {Pk_space, ' ', NUL},
182 {Pk_Tab, TAB, NUL},
183 {Pk_Escape, ESC, NUL},
184 {NL, NL, NUL},
185 {CAR, CAR, NUL},
186
187 /* End of list marker: */
188 {0, 0, 0}
189};
190
191
192/****************************************************************************/
193
194static PtCallbackF_t gui_ph_handle_timer_cursor;
195static PtCallbackF_t gui_ph_handle_timer_timeout;
196
197static PtCallbackF_t gui_ph_handle_window_cb;
198
199static PtCallbackF_t gui_ph_handle_scrollbar;
200static PtCallbackF_t gui_ph_handle_keyboard;
201static PtCallbackF_t gui_ph_handle_mouse;
202static PtCallbackF_t gui_ph_handle_pulldown_menu;
203static PtCallbackF_t gui_ph_handle_menu;
204static PtCallbackF_t gui_ph_handle_focus; /* focus change of text area */
205
206static PtCallbackF_t gui_ph_handle_menu_resize;
207
208/* When a menu is unrealized, give focus back to vimTextArea */
209static PtCallbackF_t gui_ph_handle_menu_unrealized;
210
211#ifdef USE_PANEL_GROUP
Bram Moolenaard2221132011-07-27 14:09:09 +0200212static void gui_ph_get_panelgroup_margins(short*, short*, short*, short*);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000213#endif
214
Bram Moolenaard2221132011-07-27 14:09:09 +0200215static void gui_ph_draw_start(void);
216static void gui_ph_draw_end(void);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000217
218/* Set the text for the balloon */
Bram Moolenaard2221132011-07-27 14:09:09 +0200219static PtWidget_t * gui_ph_show_tooltip(PtWidget_t *window,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000220 PtWidget_t *widget,
221 int position,
222 char *text,
223 char *font,
224 PgColor_t fill_color,
Bram Moolenaard2221132011-07-27 14:09:09 +0200225 PgColor_t text_color);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000226
227/****************************************************************************/
228
Bram Moolenaard2221132011-07-27 14:09:09 +0200229static PtWidget_t * gui_ph_show_tooltip(PtWidget_t *window,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000230 PtWidget_t *widget,
231 int position,
232 char *text,
233 char *font,
234 PgColor_t fill_color,
Bram Moolenaard2221132011-07-27 14:09:09 +0200235 PgColor_t text_color)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000236{
237 PtArg_t arg;
238 vimmenu_T *menu;
239 char_u *tooltip;
240
Bram Moolenaard2221132011-07-27 14:09:09 +0200241 PtSetArg(&arg, Pt_ARG_POINTER, &menu, 0);
242 PtGetResources(widget, 1, &arg);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000243
244 /* Override the text and position */
245
246 tooltip = text;
Bram Moolenaard2221132011-07-27 14:09:09 +0200247 if (menu != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000248 {
249 int index = MENU_INDEX_TIP;
Bram Moolenaard2221132011-07-27 14:09:09 +0200250 if (menu->strings[ index ] != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000251 tooltip = menu->strings[ index ];
252 }
253
Bram Moolenaard2221132011-07-27 14:09:09 +0200254 return PtInflateBalloon(
Bram Moolenaar071d4272004-06-13 20:20:40 +0000255 window,
256 widget,
257 /* Don't put the balloon at the bottom,
258 * it gets drawn over by gfx done in the PtRaw */
259 Pt_BALLOON_TOP,
260 tooltip,
261 font,
262 fill_color,
Bram Moolenaard2221132011-07-27 14:09:09 +0200263 text_color);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000264}
265
266 static void
Bram Moolenaard2221132011-07-27 14:09:09 +0200267gui_ph_resize_container(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000268{
269 PhArea_t area;
270
Bram Moolenaard2221132011-07-27 14:09:09 +0200271 PtWidgetArea(gui.vimWindow, &area);
272 PtWidgetPos (gui.vimContainer, &area.pos);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000273
Bram Moolenaard2221132011-07-27 14:09:09 +0200274 PtSetResource(gui.vimContainer, Pt_ARG_AREA, &area, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000275}
276
277 static int
278gui_ph_handle_menu_resize(
279 PtWidget_t *widget,
280 void *other,
Bram Moolenaard2221132011-07-27 14:09:09 +0200281 PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000282{
283 PtContainerCallback_t *sizes = info->cbdata;
284 PtWidget_t *container;
285 PhPoint_t below_menu;
286 int_u height;
287
288 height = sizes->new_dim.h;
289
Bram Moolenaarccc18222007-05-10 18:25:20 +0000290 /* Because vim treats the toolbar and menubar separately,
Bram Moolenaar071d4272004-06-13 20:20:40 +0000291 * and here they're lumped together into a PtToolbarGroup,
292 * we only need either menu_height or toolbar_height set at once */
Bram Moolenaard2221132011-07-27 14:09:09 +0200293 if (gui.menu_is_active)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000294 {
295 gui.menu_height = height;
296 gui.toolbar_height = 0;
297 }
298#ifdef FEAT_TOOLBAR
299 else
300 gui.toolbar_height = height;
301#endif
302
303 below_menu.x = 0;
304 below_menu.y = height;
305
306#ifdef USE_PANEL_GROUP
307 container = gui.vimPanelGroup;
308#else
309 container = gui.vimContainer;
310#endif
311
Bram Moolenaard2221132011-07-27 14:09:09 +0200312 PtSetResource(container, Pt_ARG_POS, &below_menu, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000313
314 gui_ph_resize_container();
315
316#ifdef USE_PANEL_GROUP
317 gui_ph_get_panelgroup_margins(
318 &pg_margin_top, &pg_margin_bottom,
Bram Moolenaard2221132011-07-27 14:09:09 +0200319 &pg_margin_left, &pg_margin_right);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000320#endif
Bram Moolenaard2221132011-07-27 14:09:09 +0200321 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000322}
323
324/*
325 * Pt_ARG_TIMER_REPEAT isn't used because the on & off times
326 * are different
327 */
328 static int
329gui_ph_handle_timer_cursor(
330 PtWidget_t *widget,
331 void *data,
Bram Moolenaard2221132011-07-27 14:09:09 +0200332 PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000333{
Bram Moolenaard2221132011-07-27 14:09:09 +0200334 if (blink_state == BLINK_ON)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000335 {
336 gui_undraw_cursor();
337 blink_state = BLINK_OFF;
Bram Moolenaard2221132011-07-27 14:09:09 +0200338 PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL,
339 blink_offtime, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000340 }
341 else
342 {
343 gui_update_cursor(TRUE, FALSE);
344 blink_state = BLINK_ON;
Bram Moolenaard2221132011-07-27 14:09:09 +0200345 PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL,
346 blink_ontime, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000347 }
Bram Moolenaard2221132011-07-27 14:09:09 +0200348 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000349}
350
351 static int
352gui_ph_handle_timer_timeout(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
353{
354 is_timeout = TRUE;
355
Bram Moolenaard2221132011-07-27 14:09:09 +0200356 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000357}
358
359 static int
Bram Moolenaard0988c52011-08-10 12:19:04 +0200360gui_ph_handle_window_cb(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000361{
362 PhWindowEvent_t *we = info->cbdata;
363 ushort_t *width, *height;
364
Bram Moolenaard0988c52011-08-10 12:19:04 +0200365 switch (we->event_f) {
Bram Moolenaar071d4272004-06-13 20:20:40 +0000366 case Ph_WM_CLOSE:
367 gui_shell_closed();
368 break;
369
370 case Ph_WM_FOCUS:
371 /* Just in case it's hidden and needs to be shown */
Bram Moolenaard0988c52011-08-10 12:19:04 +0200372 gui_mch_mousehide(MOUSE_SHOW);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000373
Bram Moolenaard0988c52011-08-10 12:19:04 +0200374 if (we->event_state == Ph_WM_EVSTATE_FOCUS)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000375 {
376 gui_focus_change(TRUE);
377 gui_mch_start_blink();
378 }
379 else
380 {
381 gui_focus_change(FALSE);
Bram Moolenaar1dd45fb2018-01-31 21:10:01 +0100382 gui_mch_stop_blink(TRUE);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000383 }
384 break;
385
386 case Ph_WM_RESIZE:
Bram Moolenaard0988c52011-08-10 12:19:04 +0200387 PtGetResource(gui.vimWindow, Pt_ARG_WIDTH, &width, 0);
388 PtGetResource(gui.vimWindow, Pt_ARG_HEIGHT, &height, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000389#ifdef USE_PANEL_GROUP
390 width -= (pg_margin_left + pg_margin_right);
391 height -= (pg_margin_top + pg_margin_bottom);
392#endif
Bram Moolenaard0988c52011-08-10 12:19:04 +0200393 gui_resize_shell(*width, *height);
394 gui_set_shellsize(FALSE, FALSE, RESIZE_BOTH);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000395 is_ignore_draw = FALSE;
Bram Moolenaard0988c52011-08-10 12:19:04 +0200396 PtEndFlux(gui.vimContainer);
397 PtContainerRelease(gui.vimContainer);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000398 break;
399
400 default:
401 break;
402 }
403
Bram Moolenaard2221132011-07-27 14:09:09 +0200404 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000405}
406
407 static int
Bram Moolenaard0988c52011-08-10 12:19:04 +0200408gui_ph_handle_scrollbar(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000409{
410 PtScrollbarCallback_t *scroll;
411 scrollbar_T *sb;
412 int value, dragging = FALSE;
413
414 scroll = info->cbdata;
415
416 sb = (scrollbar_T *) data;
Bram Moolenaard0988c52011-08-10 12:19:04 +0200417 if (sb != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000418 {
419 value = scroll->position;
Bram Moolenaard0988c52011-08-10 12:19:04 +0200420 switch (scroll->action)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000421 {
422 case Pt_SCROLL_DRAGGED:
423 dragging = TRUE;
424 break;
425
426 case Pt_SCROLL_SET:
427 /* FIXME: return straight away here? */
Bram Moolenaard2221132011-07-27 14:09:09 +0200428 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000429 break;
430 }
431
432 gui_drag_scrollbar(sb, value, dragging);
433 }
Bram Moolenaard2221132011-07-27 14:09:09 +0200434 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000435}
436
437 static int
Bram Moolenaard0988c52011-08-10 12:19:04 +0200438gui_ph_handle_keyboard(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000439{
440 PhKeyEvent_t *key;
441 unsigned char string[6];
442 int len, i;
443 int ch, modifiers;
444
Bram Moolenaard0988c52011-08-10 12:19:04 +0200445 key = PhGetData(info->event);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000446
447 ch = modifiers = len = 0;
448
Bram Moolenaard0988c52011-08-10 12:19:04 +0200449 if (p_mh)
450 gui_mch_mousehide(MOUSE_HIDE);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000451
452 /* We're a good lil photon program, aren't we? yes we are, yeess wee arrr */
Bram Moolenaard0988c52011-08-10 12:19:04 +0200453 if (key->key_flags & Pk_KF_Compose)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000454 {
Bram Moolenaard2221132011-07-27 14:09:09 +0200455 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000456 }
457
Bram Moolenaard0988c52011-08-10 12:19:04 +0200458 if ((key->key_flags & Pk_KF_Cap_Valid) &&
459 PkIsKeyDown(key->key_flags))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000460 {
461#ifdef FEAT_MENU
462 /*
463 * Only show the menu if the Alt key is down, and the Shift & Ctrl
464 * keys aren't down, as well as the other conditions
465 */
Bram Moolenaard0988c52011-08-10 12:19:04 +0200466 if (((key->key_mods & Pk_KM_Alt) &&
467 !(key->key_mods & Pk_KM_Shift) &&
468 !(key->key_mods & Pk_KM_Ctrl)) &&
Bram Moolenaar071d4272004-06-13 20:20:40 +0000469 gui.menu_is_active &&
Bram Moolenaard0988c52011-08-10 12:19:04 +0200470 (*p_wak == 'y' ||
471 (*p_wak == 'm' &&
472 gui_is_menu_shortcut(key->key_cap))))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000473 {
474 /* Fallthrough and let photon look for the hotkey */
Bram Moolenaard2221132011-07-27 14:09:09 +0200475 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000476 }
477#endif
478
Bram Moolenaar15d63192011-09-14 16:05:15 +0200479 for (i = 0; special_keys[i].key_sym != 0; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000480 {
Bram Moolenaard0988c52011-08-10 12:19:04 +0200481 if (special_keys[i].key_sym == key->key_cap)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000482 {
483 len = 0;
Bram Moolenaard0988c52011-08-10 12:19:04 +0200484 if (special_keys[i].vim_code1 == NUL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000485 ch = special_keys[i].vim_code0;
486 else
487 {
488 /* Detect if a keypad number key has been pressed
489 * and change the key if Num Lock is on */
Bram Moolenaard0988c52011-08-10 12:19:04 +0200490 if (key->key_cap >= Pk_KP_Enter && key->key_cap <= Pk_KP_9
491 && (key->key_mods & Pk_KM_Num_Lock))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000492 {
493 /* FIXME: For now, just map the key to a ascii value
494 * (see <photon/PkKeyDef.h>) */
495 ch = key->key_cap - 0xf080;
496 }
497 else
Bram Moolenaard0988c52011-08-10 12:19:04 +0200498 ch = TO_SPECIAL(special_keys[i].vim_code0,
499 special_keys[i].vim_code1);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000500 }
501 break;
502 }
503 }
504
Bram Moolenaard0988c52011-08-10 12:19:04 +0200505 if (key->key_mods & Pk_KM_Ctrl)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000506 modifiers |= MOD_MASK_CTRL;
Bram Moolenaard0988c52011-08-10 12:19:04 +0200507 if (key->key_mods & Pk_KM_Alt)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000508 modifiers |= MOD_MASK_ALT;
Bram Moolenaard0988c52011-08-10 12:19:04 +0200509 if (key->key_mods & Pk_KM_Shift)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000510 modifiers |= MOD_MASK_SHIFT;
511
512 /* Is this not a special key? */
Bram Moolenaard0988c52011-08-10 12:19:04 +0200513 if (special_keys[i].key_sym == 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000514 {
Bram Moolenaard0988c52011-08-10 12:19:04 +0200515 ch = PhTo8859_1(key);
516 if (ch == -1
Bram Moolenaar071d4272004-06-13 20:20:40 +0000517#ifdef FEAT_MBYTE
Bram Moolenaard0988c52011-08-10 12:19:04 +0200518 || (enc_utf8 && ch > 127)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000519#endif
520 )
521 {
522#ifdef FEAT_MBYTE
Bram Moolenaard0988c52011-08-10 12:19:04 +0200523 len = PhKeyToMb(string, key);
524 if (len > 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000525 {
526 static char buf[6];
527 int src_taken, dst_made;
Bram Moolenaard0988c52011-08-10 12:19:04 +0200528 if (enc_utf8 != TRUE)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000529 {
530 PxTranslateFromUTF(
531 charset_translate,
532 string,
533 len,
534 &src_taken,
535 buf,
536 6,
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200537 &dst_made);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000538
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200539 add_to_input_buf(buf, dst_made);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000540 }
541 else
542 {
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200543 add_to_input_buf(string, len);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000544 }
545
Bram Moolenaard2221132011-07-27 14:09:09 +0200546 return Pt_CONSUME;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000547 }
548 len = 0;
549#endif
550 ch = key->key_cap;
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200551 if (ch < 0xff)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000552 {
553 /* FIXME: is this the right thing to do? */
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200554 if (modifiers & MOD_MASK_CTRL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000555 {
556 modifiers &= ~MOD_MASK_CTRL;
557
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200558 if ((ch >= 'a' && ch <= 'z') ||
Bram Moolenaar071d4272004-06-13 20:20:40 +0000559 ch == '[' ||
560 ch == ']' ||
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200561 ch == '\\')
562 ch = Ctrl_chr(ch);
563 else if (ch == '2')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000564 ch = NUL;
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200565 else if (ch == '6')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000566 ch = 0x1e;
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200567 else if (ch == '-')
Bram Moolenaar071d4272004-06-13 20:20:40 +0000568 ch = 0x1f;
569 else
570 modifiers |= MOD_MASK_CTRL;
571 }
572
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200573 if (modifiers & MOD_MASK_ALT)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000574 {
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200575 ch = Meta(ch);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000576 modifiers &= ~MOD_MASK_ALT;
577 }
578 }
579 else
580 {
Bram Moolenaard2221132011-07-27 14:09:09 +0200581 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000582 }
583 }
584 else
585 modifiers &= ~MOD_MASK_SHIFT;
586 }
587
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200588 ch = simplify_key(ch, &modifiers);
589 if (modifiers)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000590 {
591 string[ len++ ] = CSI;
592 string[ len++ ] = KS_MODIFIER;
593 string[ len++ ] = modifiers;
594 }
595
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200596 if (IS_SPECIAL(ch))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000597 {
598 string[ len++ ] = CSI;
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200599 string[ len++ ] = K_SECOND(ch);
600 string[ len++ ] = K_THIRD(ch);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000601 }
602 else
603 {
604 string[ len++ ] = ch;
605 }
606
607 if (len == 1 && ((ch == Ctrl_C && ctrl_c_interrupts)
608 || ch == intr_char))
609 {
610 trash_input_buf();
611 got_int = TRUE;
612 }
613
614 if (len == 1 && string[0] == CSI)
615 {
616 /* Turn CSI into K_CSI. */
617 string[ len++ ] = KS_EXTRA;
618 string[ len++ ] = KE_CSI;
619 }
620
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200621 if (len > 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000622 {
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200623 add_to_input_buf(string, len);
Bram Moolenaard2221132011-07-27 14:09:09 +0200624 return Pt_CONSUME;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000625 }
626 }
627
Bram Moolenaard2221132011-07-27 14:09:09 +0200628 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000629}
630
631 static int
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200632gui_ph_handle_mouse(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000633{
634 PhPointerEvent_t *pointer;
635 PhRect_t *pos;
636 int button = 0, repeated_click, modifiers = 0x0;
637 short mouse_x, mouse_y;
638
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200639 pointer = PhGetData(info->event);
640 pos = PhGetRects(info->event);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000641
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200642 gui_mch_mousehide(MOUSE_SHOW);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000643
644 /*
645 * Coordinates need to be relative to the base window,
646 * not relative to the vimTextArea widget
647 */
648 mouse_x = pos->ul.x + gui.border_width;
649 mouse_y = pos->ul.y + gui.border_width;
650
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200651 if (info->event->type == Ph_EV_PTR_MOTION_NOBUTTON)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000652 {
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200653 gui_mouse_moved(mouse_x, mouse_y);
Bram Moolenaard2221132011-07-27 14:09:09 +0200654 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000655 }
656
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200657 if (pointer->key_mods & Pk_KM_Shift)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000658 modifiers |= MOUSE_SHIFT;
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200659 if (pointer->key_mods & Pk_KM_Ctrl)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000660 modifiers |= MOUSE_CTRL;
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200661 if (pointer->key_mods & Pk_KM_Alt)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000662 modifiers |= MOUSE_ALT;
663
664 /*
665 * FIXME More than one button may be involved, but for
666 * now just deal with one
667 */
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200668 if (pointer->buttons & Ph_BUTTON_SELECT)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000669 button = MOUSE_LEFT;
670
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200671 if (pointer->buttons & Ph_BUTTON_MENU)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000672 {
673 button = MOUSE_RIGHT;
674 /* Need the absolute coordinates for the popup menu */
675 abs_mouse.x = pointer->pos.x;
676 abs_mouse.y = pointer->pos.y;
677 }
678
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200679 if (pointer->buttons & Ph_BUTTON_ADJUST)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000680 button = MOUSE_MIDDLE;
681
682 /* Catch a real release (not phantom or other releases */
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200683 if (info->event->type == Ph_EV_BUT_RELEASE)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000684 button = MOUSE_RELEASE;
685
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200686 if (info->event->type & Ph_EV_PTR_MOTION_BUTTON)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000687 button = MOUSE_DRAG;
688
689#if 0
690 /* Vim doesn't use button repeats */
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200691 if (info->event->type & Ph_EV_BUT_REPEAT)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000692 button = MOUSE_DRAG;
693#endif
694
695 /* Don't do anything if it is one of the phantom mouse release events */
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200696 if ((button != MOUSE_RELEASE) ||
697 (info->event->subtype == Ph_EV_RELEASE_REAL))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000698 {
699 repeated_click = (pointer->click_count >= 2) ? TRUE : FALSE;
700
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200701 gui_send_mouse_event(button , mouse_x, mouse_y, repeated_click, modifiers);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000702 }
703
Bram Moolenaard2221132011-07-27 14:09:09 +0200704 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000705}
706
707/* Handle a focus change of the PtRaw widget */
708 static int
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200709gui_ph_handle_focus(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000710{
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200711 if (info->reason == Pt_CB_LOST_FOCUS)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000712 {
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200713 PtRemoveEventHandler(gui.vimTextArea, Ph_EV_PTR_MOTION_NOBUTTON,
714 gui_ph_handle_mouse, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000715
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200716 gui_mch_mousehide(MOUSE_SHOW);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000717 }
718 else
719 {
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200720 PtAddEventHandler(gui.vimTextArea, Ph_EV_PTR_MOTION_NOBUTTON,
721 gui_ph_handle_mouse, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000722 }
Bram Moolenaard2221132011-07-27 14:09:09 +0200723 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000724}
725
726 static void
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200727gui_ph_handle_raw_draw(PtWidget_t *widget, PhTile_t *damage)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000728{
729 PhRect_t *r;
730 PhPoint_t offset;
731 PhPoint_t translation;
732
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200733 if (is_ignore_draw == TRUE)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000734 return;
735
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200736 PtSuperClassDraw(PtBasic, widget, damage);
737 PgGetTranslation(&translation);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000738 PgClearTranslation();
739
740#if 0
741 /*
Bram Moolenaarccc18222007-05-10 18:25:20 +0000742 * This causes some weird problems, with drawing being done from
Bram Moolenaar071d4272004-06-13 20:20:40 +0000743 * within this raw drawing function (rather than just simple clearing
744 * and text drawing done by gui_redraw)
745 *
746 * The main problem is when PhBlit is used, and the cursor appearing
747 * in places where it shouldn't
748 */
749 out_flush();
750#endif
751
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200752 PtWidgetOffset(widget, &offset);
753 PhTranslatePoint(&offset, PtWidgetPos(gui.vimTextArea, NULL));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000754
755#if 1
756 /* Redraw individual damage regions */
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200757 if (damage->next != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000758 damage = damage->next;
759
Bram Moolenaar15d63192011-09-14 16:05:15 +0200760 while (damage != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000761 {
762 r = &damage->rect;
763 gui_redraw(
764 r->ul.x - offset.x, r->ul.y - offset.y,
765 r->lr.x - r->ul.x + 1,
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200766 r->lr.y - r->ul.y + 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000767 damage = damage->next;
768 }
769#else
770 /* Redraw the rectangle that covers all the damaged regions */
771 r = &damage->rect;
772 gui_redraw(
773 r->ul.x - offset.x, r->ul.y - offset.y,
774 r->lr.x - r->ul.x + 1,
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200775 r->lr.y - r->ul.y + 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000776#endif
777
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200778 PgSetTranslation(&translation, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000779}
780
781 static int
782gui_ph_handle_pulldown_menu(
783 PtWidget_t *widget,
784 void *data,
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200785 PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000786{
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200787 if (data != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000788 {
789 vimmenu_T *menu = (vimmenu_T *) data;
790
Bram Moolenaar0d55ff12011-09-07 19:09:01 +0200791 PtPositionMenu(menu->submenu_id, NULL);
792 PtRealizeWidget(menu->submenu_id);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000793 }
794
Bram Moolenaard2221132011-07-27 14:09:09 +0200795 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000796}
797
798/* This is used for pulldown/popup menus and also toolbar buttons */
799 static int
Bram Moolenaar15d63192011-09-14 16:05:15 +0200800gui_ph_handle_menu(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000801{
Bram Moolenaar15d63192011-09-14 16:05:15 +0200802 if (data != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000803 {
804 vimmenu_T *menu = (vimmenu_T *) data;
Bram Moolenaar15d63192011-09-14 16:05:15 +0200805 gui_menu_cb(menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000806 }
Bram Moolenaard2221132011-07-27 14:09:09 +0200807 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000808}
809
810/* Stop focus from disappearing into the menubar... */
811 static int
812gui_ph_handle_menu_unrealized(
813 PtWidget_t *widget,
814 void *data,
Bram Moolenaar15d63192011-09-14 16:05:15 +0200815 PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000816{
Bram Moolenaar15d63192011-09-14 16:05:15 +0200817 PtGiveFocus(gui.vimTextArea, NULL);
Bram Moolenaard2221132011-07-27 14:09:09 +0200818 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000819}
820
821 static int
822gui_ph_handle_window_open(
823 PtWidget_t *widget,
824 void *data,
Bram Moolenaar15d63192011-09-14 16:05:15 +0200825 PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000826{
Bram Moolenaar15d63192011-09-14 16:05:15 +0200827 gui_set_shellsize(FALSE, TRUE, RESIZE_BOTH);
Bram Moolenaard2221132011-07-27 14:09:09 +0200828 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000829}
830
831/****************************************************************************/
832
833#define DRAW_START gui_ph_draw_start()
834#define DRAW_END gui_ph_draw_end()
835
836/* TODO: Set a clipping rect? */
837 static void
Bram Moolenaar15d63192011-09-14 16:05:15 +0200838gui_ph_draw_start(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000839{
Bram Moolenaara0b19972009-07-01 14:13:18 +0000840 PhGC_t *gc;
841
842 gc = PgGetGC();
Bram Moolenaar15d63192011-09-14 16:05:15 +0200843 PgSetRegion(PtWidgetRid(PtFindDisjoint(gui.vimTextArea)));
844 PgClearClippingsCx(gc);
845 PgClearTranslationCx(gc);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000846
Bram Moolenaar15d63192011-09-14 16:05:15 +0200847 PtWidgetOffset(gui.vimTextArea, &gui_ph_raw_offset);
848 PhTranslatePoint(&gui_ph_raw_offset, PtWidgetPos(gui.vimTextArea, NULL));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000849
Bram Moolenaar15d63192011-09-14 16:05:15 +0200850 PgSetTranslation(&gui_ph_raw_offset, Pg_RELATIVE);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000851}
852
853 static void
Bram Moolenaar15d63192011-09-14 16:05:15 +0200854gui_ph_draw_end(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000855{
856 gui_ph_raw_offset.x = -gui_ph_raw_offset.x;
857 gui_ph_raw_offset.y = -gui_ph_raw_offset.y;
Bram Moolenaar15d63192011-09-14 16:05:15 +0200858 PgSetTranslation(&gui_ph_raw_offset, Pg_RELATIVE);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000859}
860
861#ifdef USE_PANEL_GROUP
862 static vimmenu_T *
Bram Moolenaar15d63192011-09-14 16:05:15 +0200863gui_ph_find_buffer_item(char_u *name)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000864{
865 vimmenu_T *top_level = root_menu;
866 vimmenu_T *items = NULL;
867
Bram Moolenaar15d63192011-09-14 16:05:15 +0200868 while (top_level != NULL &&
869 (STRCMP(top_level->dname, "Buffers") != 0))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000870 top_level = top_level->next;
871
Bram Moolenaar15d63192011-09-14 16:05:15 +0200872 if (top_level != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000873 {
874 items = top_level->children;
875
Bram Moolenaar15d63192011-09-14 16:05:15 +0200876 while (items != NULL &&
877 (STRCMP(items->dname, name) != 0))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000878 items = items->next;
879 }
Bram Moolenaard2221132011-07-27 14:09:09 +0200880 return items;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000881}
882
883 static void
Bram Moolenaar15d63192011-09-14 16:05:15 +0200884gui_ph_pg_set_buffer_num(int_u buf_num)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000885{
886 int i;
887 char search[16];
888 char *mark;
889
Bram Moolenaar15d63192011-09-14 16:05:15 +0200890 if (gui.vimTextArea == NULL || buf_num == 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000891 return;
892
893 search[0] = '(';
Bram Moolenaar15d63192011-09-14 16:05:15 +0200894 ultoa(buf_num, &search[1], 10);
895 STRCAT(search, ")");
Bram Moolenaar071d4272004-06-13 20:20:40 +0000896
Bram Moolenaar15d63192011-09-14 16:05:15 +0200897 for (i = 0; i < num_panels; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000898 {
899 /* find the last "(" in the panel title and see if the buffer
900 * number in the title matches the one we're looking for */
Bram Moolenaar15d63192011-09-14 16:05:15 +0200901 mark = STRRCHR(panel_titles[ i ], '(');
902 if (mark != NULL && STRCMP(mark, search) == 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000903 {
Bram Moolenaar15d63192011-09-14 16:05:15 +0200904 PtSetResource(gui.vimPanelGroup, Pt_ARG_PG_CURRENT_INDEX,
905 i, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000906 }
907 }
908}
909
910 static int
911gui_ph_handle_pg_change(
912 PtWidget_t *widget,
913 void *data,
Bram Moolenaar15d63192011-09-14 16:05:15 +0200914 PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000915{
916 vimmenu_T *menu;
917 PtPanelGroupCallback_t *panel;
918
Bram Moolenaar15d63192011-09-14 16:05:15 +0200919 if (info->event != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000920 {
921 panel = info->cbdata;
Bram Moolenaar15d63192011-09-14 16:05:15 +0200922 if (panel->new_panel != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000923 {
Bram Moolenaar15d63192011-09-14 16:05:15 +0200924 menu = gui_ph_find_buffer_item(panel->new_panel);
925 if (menu)
926 gui_menu_cb(menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000927 }
928 }
Bram Moolenaard2221132011-07-27 14:09:09 +0200929 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000930}
931
932 static void
933gui_ph_get_panelgroup_margins(
934 short *top,
935 short *bottom,
936 short *left,
Bram Moolenaar15d63192011-09-14 16:05:15 +0200937 short *right)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000938{
939 unsigned short abs_raw_x, abs_raw_y, abs_panel_x, abs_panel_y;
940 const unsigned short *margin_top, *margin_bottom;
941 const unsigned short *margin_left, *margin_right;
942
Bram Moolenaar15d63192011-09-14 16:05:15 +0200943 PtGetAbsPosition(gui.vimTextArea, &abs_raw_x, &abs_raw_y);
944 PtGetAbsPosition(gui.vimPanelGroup, &abs_panel_x, &abs_panel_y);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000945
Bram Moolenaar15d63192011-09-14 16:05:15 +0200946 PtGetResource(gui.vimPanelGroup, Pt_ARG_MARGIN_RIGHT, &margin_right, 0);
947 PtGetResource(gui.vimPanelGroup, Pt_ARG_MARGIN_BOTTOM, &margin_bottom, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000948
949 abs_raw_x -= abs_panel_x;
950 abs_raw_y -= abs_panel_y;
951
952 *top = abs_raw_y;
953 *bottom = *margin_bottom;
954
955 *left = abs_raw_x;
956 *right = *margin_right;
957}
958
959/* Used for the tabs for PtPanelGroup */
960 static int
Bram Moolenaar15d63192011-09-14 16:05:15 +0200961gui_ph_is_buffer_item(vimmenu_T *menu, vimmenu_T *parent)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000962{
963 char *mark;
964
Bram Moolenaar15d63192011-09-14 16:05:15 +0200965 if (STRCMP(parent->dname, "Buffers") == 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000966 {
967 /* Look for '(' digits ')' */
Bram Moolenaar15d63192011-09-14 16:05:15 +0200968 mark = vim_strchr(menu->dname, '(');
969 if (mark != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000970 {
971 mark++;
Bram Moolenaar15d63192011-09-14 16:05:15 +0200972 while (isdigit(*mark))
Bram Moolenaar071d4272004-06-13 20:20:40 +0000973 mark++;
974
Bram Moolenaar15d63192011-09-14 16:05:15 +0200975 if (*mark == ')')
Bram Moolenaard2221132011-07-27 14:09:09 +0200976 return TRUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000977 }
978 }
Bram Moolenaard2221132011-07-27 14:09:09 +0200979 return FALSE;
Bram Moolenaar071d4272004-06-13 20:20:40 +0000980}
981
982 static void
Bram Moolenaar15d63192011-09-14 16:05:15 +0200983gui_ph_pg_add_buffer(char *name)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000984{
985 char **new_titles = NULL;
986
Bram Moolenaar15d63192011-09-14 16:05:15 +0200987 new_titles = (char **) alloc((num_panels + 1) * sizeof(char **));
988 if (new_titles != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +0000989 {
Bram Moolenaar15d63192011-09-14 16:05:15 +0200990 if (num_panels > 0)
991 memcpy(new_titles, panel_titles, num_panels * sizeof(char **));
Bram Moolenaar071d4272004-06-13 20:20:40 +0000992
993 new_titles[ num_panels++ ] = name;
994
Bram Moolenaar15d63192011-09-14 16:05:15 +0200995 PtSetResource(gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, new_titles,
996 num_panels);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000997
Bram Moolenaar15d63192011-09-14 16:05:15 +0200998 vim_free(panel_titles);
Bram Moolenaar071d4272004-06-13 20:20:40 +0000999 panel_titles = new_titles;
1000 }
1001}
1002
1003 static void
Bram Moolenaar15d63192011-09-14 16:05:15 +02001004gui_ph_pg_remove_buffer(char *name)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001005{
1006 int i;
1007 char **new_titles = NULL;
1008
1009 /* If there is only 1 panel, we just use the temporary place holder */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001010 if (num_panels > 1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001011 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001012 new_titles = (char **) alloc((num_panels - 1) * sizeof(char **));
1013 if (new_titles != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001014 {
1015 char **s = new_titles;
1016 /* Copy all the titles except the one we're removing */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001017 for (i = 0; i < num_panels; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001018 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001019 if (STRCMP(panel_titles[ i ], name) != 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001020 {
1021 *s++ = panel_titles[ i ];
1022 }
1023 }
1024 num_panels--;
1025
Bram Moolenaar15d63192011-09-14 16:05:15 +02001026 PtSetResource(gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, new_titles,
1027 num_panels);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001028
Bram Moolenaar15d63192011-09-14 16:05:15 +02001029 vim_free(panel_titles);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001030 panel_titles = new_titles;
1031 }
1032 }
1033 else
1034 {
1035 num_panels--;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001036 PtSetResource(gui.vimPanelGroup, Pt_ARG_PG_PANEL_TITLES, &empty_title,
1037 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001038
Bram Moolenaard23a8232018-02-10 18:45:26 +01001039 VIM_CLEAR(panel_titles);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001040 }
1041}
1042
1043/* When a buffer item is deleted from the buffer menu */
1044 static int
1045gui_ph_handle_buffer_remove(
1046 PtWidget_t *widget,
1047 void *data,
Bram Moolenaar15d63192011-09-14 16:05:15 +02001048 PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001049{
1050 vimmenu_T *menu;
1051
Bram Moolenaar15d63192011-09-14 16:05:15 +02001052 if (data != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001053 {
1054 menu = (vimmenu_T *) data;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001055 gui_ph_pg_remove_buffer(menu->dname);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001056 }
1057
Bram Moolenaard2221132011-07-27 14:09:09 +02001058 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001059}
1060#endif
1061
1062 static int
Bram Moolenaar15d63192011-09-14 16:05:15 +02001063gui_ph_pane_resize(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001064{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001065 if (PtWidgetIsRealized(widget))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001066 {
1067 is_ignore_draw = TRUE;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001068 PtStartFlux(gui.vimContainer);
1069 PtContainerHold(gui.vimContainer);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001070 }
1071
Bram Moolenaard2221132011-07-27 14:09:09 +02001072 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001073}
1074
1075/****************************************************************************/
1076
1077#ifdef FEAT_MBYTE
1078 void
Bram Moolenaar15d63192011-09-14 16:05:15 +02001079gui_ph_encoding_changed(int new_encoding)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001080{
1081 /* Default encoding is latin1 */
1082 char *charset = "latin1";
1083 int i;
1084
1085 struct {
1086 int encoding;
1087 char *name;
1088 } charsets[] = {
1089 { DBCS_JPN, "SHIFT_JIS" },
1090 { DBCS_KOR, "csEUCKR" },
1091 { DBCS_CHT, "big5" },
1092 { DBCS_CHS, "gb" }
1093 };
1094
Bram Moolenaar15d63192011-09-14 16:05:15 +02001095 for (i = 0; i < ARRAY_LENGTH(charsets); i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001096 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001097 if (new_encoding == charsets[ i ].encoding)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001098 charset = charsets[ i ].name;
1099 }
1100
Bram Moolenaar15d63192011-09-14 16:05:15 +02001101 charset_translate = PxTranslateSet(charset_translate, charset);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001102}
1103#endif
1104
1105/****************************************************************************/
1106/****************************************************************************/
1107
1108 void
Bram Moolenaar68c2f632016-01-30 17:24:07 +01001109gui_mch_prepare(int *argc, char **argv)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001110{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001111 PtInit(NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001112}
1113
1114 int
1115gui_mch_init(void)
1116{
1117 PtArg_t args[10];
1118 int flags = 0, n = 0;
1119
Bram Moolenaarccc18222007-05-10 18:25:20 +00001120 PhDim_t window_size = {100, 100}; /* Arbitrary values */
Bram Moolenaar071d4272004-06-13 20:20:40 +00001121 PhPoint_t pos = {0, 0};
1122
Bram Moolenaar15d63192011-09-14 16:05:15 +02001123 gui.event_buffer = (PhEvent_t *) alloc(EVENT_BUFFER_SIZE);
1124 if (gui.event_buffer == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001125 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001126
1127 /* Get a translation so we can convert from ISO Latin-1 to UTF */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001128 charset_translate = PxTranslateSet(NULL, "latin1");
Bram Moolenaar071d4272004-06-13 20:20:40 +00001129
1130 /* The +2 is for the 1 pixel dark line on each side */
1131 gui.border_offset = gui.border_width = GUI_PH_MARGIN + 2;
1132
1133 /* Handle close events ourselves */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001134 PtSetArg(&args[ n++ ], Pt_ARG_WINDOW_MANAGED_FLAGS, Pt_FALSE, Ph_WM_CLOSE);
1135 PtSetArg(&args[ n++ ], Pt_ARG_WINDOW_NOTIFY_FLAGS, Pt_TRUE,
1136 Ph_WM_CLOSE | Ph_WM_RESIZE | Ph_WM_FOCUS);
1137 PtSetArg(&args[ n++ ], Pt_ARG_DIM, &window_size, 0);
1138 gui.vimWindow = PtCreateWidget(PtWindow, NULL, n, args);
1139 if (gui.vimWindow == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001140 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001141
Bram Moolenaar15d63192011-09-14 16:05:15 +02001142 PtAddCallback(gui.vimWindow, Pt_CB_WINDOW, gui_ph_handle_window_cb, NULL);
1143 PtAddCallback(gui.vimWindow, Pt_CB_WINDOW_OPENING,
1144 gui_ph_handle_window_open, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001145
1146 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001147 PtSetArg(&args[ n++ ], Pt_ARG_ANCHOR_FLAGS, Pt_ANCHOR_ALL, Pt_IS_ANCHORED);
1148 PtSetArg(&args[ n++ ], Pt_ARG_DIM, &window_size, 0);
1149 PtSetArg(&args[ n++ ], Pt_ARG_POS, &pos, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001150
1151#ifdef USE_PANEL_GROUP
Bram Moolenaar84a05ac2013-05-06 04:24:17 +02001152 /* Put in a temporary place holder title */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001153 PtSetArg(&args[ n++ ], Pt_ARG_PG_PANEL_TITLES, &empty_title, 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001154
Bram Moolenaar15d63192011-09-14 16:05:15 +02001155 gui.vimPanelGroup = PtCreateWidget(PtPanelGroup, gui.vimWindow, n, args);
1156 if (gui.vimPanelGroup == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001157 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001158
Bram Moolenaar15d63192011-09-14 16:05:15 +02001159 PtAddCallback(gui.vimPanelGroup, Pt_CB_PG_PANEL_SWITCHING,
1160 gui_ph_handle_pg_change, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001161#else
1162 /* Turn off all edge decorations */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001163 PtSetArg(&args[ n++ ], Pt_ARG_BASIC_FLAGS, Pt_FALSE, Pt_ALL);
1164 PtSetArg(&args[ n++ ], Pt_ARG_BEVEL_WIDTH, 0, 0);
1165 PtSetArg(&args[ n++ ], Pt_ARG_MARGIN_WIDTH, 0, 0);
1166 PtSetArg(&args[ n++ ], Pt_ARG_MARGIN_HEIGHT, 0, 0);
1167 PtSetArg(&args[ n++ ], Pt_ARG_CONTAINER_FLAGS, Pt_TRUE, Pt_AUTO_EXTENT);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001168
Bram Moolenaar15d63192011-09-14 16:05:15 +02001169 gui.vimContainer = PtCreateWidget(PtPane, gui.vimWindow, n, args);
1170 if (gui.vimContainer == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001171 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001172
Bram Moolenaar15d63192011-09-14 16:05:15 +02001173 PtAddCallback(gui.vimContainer, Pt_CB_RESIZE, gui_ph_pane_resize, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001174#endif
1175
1176 /* Size for the text area is set in gui_mch_set_text_area_pos */
1177 n = 0;
1178
Bram Moolenaar15d63192011-09-14 16:05:15 +02001179 PtSetArg(&args[ n++ ], Pt_ARG_RAW_DRAW_F, gui_ph_handle_raw_draw, 1);
1180 PtSetArg(&args[ n++ ], Pt_ARG_BEVEL_WIDTH, GUI_PH_MARGIN, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001181 /*
1182 * Using focus render also causes the whole widget to be redrawn
1183 * whenever it changes focus, which is very annoying :p
1184 */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001185 PtSetArg(&args[ n++ ], Pt_ARG_FLAGS, Pt_TRUE,
1186 Pt_GETS_FOCUS | Pt_HIGHLIGHTED);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001187#ifndef FEAT_MOUSESHAPE
Bram Moolenaar15d63192011-09-14 16:05:15 +02001188 PtSetArg(&args[ n++ ], Pt_ARG_CURSOR_TYPE, GUI_PH_MOUSE_TYPE, 0);
1189 PtSetArg(&args[ n++ ], Pt_ARG_CURSOR_COLOR, gui_ph_mouse_color, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001190#endif
1191
Bram Moolenaar15d63192011-09-14 16:05:15 +02001192 gui.vimTextArea = PtCreateWidget(PtRaw, Pt_DFLT_PARENT, n, args);
1193 if (gui.vimTextArea == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001194 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001195
1196 /* TODO: use PtAddEventHandlers instead? */
1197 /* Not using Ph_EV_BUT_REPEAT because vim wouldn't use it anyway */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001198 PtAddEventHandler(gui.vimTextArea,
Bram Moolenaar071d4272004-06-13 20:20:40 +00001199 Ph_EV_BUT_PRESS | Ph_EV_BUT_RELEASE | Ph_EV_PTR_MOTION_BUTTON,
Bram Moolenaar15d63192011-09-14 16:05:15 +02001200 gui_ph_handle_mouse, NULL);
1201 PtAddEventHandler(gui.vimTextArea, Ph_EV_KEY,
1202 gui_ph_handle_keyboard, NULL);
1203 PtAddCallback(gui.vimTextArea, Pt_CB_GOT_FOCUS,
1204 gui_ph_handle_focus, NULL);
1205 PtAddCallback(gui.vimTextArea, Pt_CB_LOST_FOCUS,
1206 gui_ph_handle_focus, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001207
1208 /*
1209 * Now that the text area widget has been created, set up the colours,
1210 * which wil call PtSetResource from gui_mch_new_colors
1211 */
1212
1213 /*
1214 * Create the two timers, not as accurate as using the kernel timer
1215 * functions, but good enough
1216 */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001217 gui_ph_timer_cursor = PtCreateWidget(PtTimer, gui.vimWindow, 0, NULL);
1218 if (gui_ph_timer_cursor == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001219 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001220
Bram Moolenaar15d63192011-09-14 16:05:15 +02001221 gui_ph_timer_timeout = PtCreateWidget(PtTimer, gui.vimWindow, 0, NULL);
1222 if (gui_ph_timer_timeout == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001223 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001224
Bram Moolenaar15d63192011-09-14 16:05:15 +02001225 PtAddCallback(gui_ph_timer_cursor, Pt_CB_TIMER_ACTIVATE,
Bram Moolenaar071d4272004-06-13 20:20:40 +00001226 gui_ph_handle_timer_cursor, NULL);
Bram Moolenaar15d63192011-09-14 16:05:15 +02001227 PtAddCallback(gui_ph_timer_timeout, Pt_CB_TIMER_ACTIVATE,
Bram Moolenaar071d4272004-06-13 20:20:40 +00001228 gui_ph_handle_timer_timeout, NULL);
1229
1230#ifdef FEAT_MENU
1231 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001232 PtSetArg(&args[ n++ ], Pt_ARG_WIDTH, window_size.w, 0);
1233 PtSetArg(&args[ n++ ], Pt_ARG_ANCHOR_FLAGS, Pt_ANCHOR_LEFT_RIGHT,
1234 Pt_IS_ANCHORED);
1235 gui.vimToolBarGroup = PtCreateWidget(PtToolbarGroup, gui.vimWindow,
1236 n, args);
1237 if (gui.vimToolBarGroup == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001238 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001239
Bram Moolenaar15d63192011-09-14 16:05:15 +02001240 PtAddCallback(gui.vimToolBarGroup, Pt_CB_RESIZE,
1241 gui_ph_handle_menu_resize, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001242
1243 n = 0;
1244 flags = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001245 PtSetArg(&args[ n++ ], Pt_ARG_WIDTH, window_size.w, 0);
1246 if (! vim_strchr(p_go, GO_MENUS))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001247 {
1248 flags |= Pt_DELAY_REALIZE;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001249 PtSetArg(&args[ n++ ], Pt_ARG_FLAGS, Pt_TRUE, flags);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001250 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02001251 gui.vimMenuBar = PtCreateWidget(PtMenuBar, gui.vimToolBarGroup, n, args);
1252 if (gui.vimMenuBar == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001253 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001254
1255# ifdef FEAT_TOOLBAR
1256 n = 0;
1257
Bram Moolenaar15d63192011-09-14 16:05:15 +02001258 PtSetArg(&args[ n++ ], Pt_ARG_ANCHOR_FLAGS,
1259 Pt_ANCHOR_LEFT_RIGHT |Pt_TOP_ANCHORED_TOP, Pt_IS_ANCHORED);
1260 PtSetArg(&args[ n++ ], Pt_ARG_RESIZE_FLAGS, Pt_TRUE,
1261 Pt_RESIZE_Y_AS_REQUIRED);
1262 PtSetArg(&args[ n++ ], Pt_ARG_WIDTH, window_size.w, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001263
1264 flags = Pt_GETS_FOCUS;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001265 if (! vim_strchr(p_go, GO_TOOLBAR))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001266 flags |= Pt_DELAY_REALIZE;
1267
Bram Moolenaar15d63192011-09-14 16:05:15 +02001268 PtSetArg(&args[ n++ ], Pt_ARG_FLAGS, Pt_DELAY_REALIZE, flags);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001269
Bram Moolenaar15d63192011-09-14 16:05:15 +02001270 gui.vimToolBar = PtCreateWidget(PtToolbar, gui.vimToolBarGroup, n, args);
1271 if (gui.vimToolBar == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001272 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001273
1274 /*
1275 * Size for the toolbar is fetched in gui_mch_show_toolbar, after
1276 * the buttons have been added and the toolbar has resized it's height
1277 * for the buttons to fit
1278 */
1279# endif
1280
1281#endif
1282
Bram Moolenaard2221132011-07-27 14:09:09 +02001283 return OK;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001284}
1285
1286 int
1287gui_mch_init_check(void)
1288{
Bram Moolenaard2221132011-07-27 14:09:09 +02001289 return (is_photon_available == TRUE) ? OK : FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001290}
1291
1292 int
1293gui_mch_open(void)
1294{
1295 gui.norm_pixel = Pg_BLACK;
1296 gui.back_pixel = Pg_WHITE;
1297
1298 set_normal_colors();
1299
1300 gui_check_colors();
1301 gui.def_norm_pixel = gui.norm_pixel;
1302 gui.def_back_pixel = gui.back_pixel;
1303
1304 highlight_gui_started();
1305
1306 if (gui_win_x != -1 && gui_win_y != -1)
1307 gui_mch_set_winpos(gui_win_x, gui_win_y);
1308
Bram Moolenaar15d63192011-09-14 16:05:15 +02001309 return (PtRealizeWidget(gui.vimWindow) == 0) ? OK : FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001310}
1311
1312 void
1313gui_mch_exit(int rc)
1314{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001315 PtDestroyWidget(gui.vimWindow);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001316
Bram Moolenaar15d63192011-09-14 16:05:15 +02001317 PxTranslateSet(charset_translate, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001318
Bram Moolenaar15d63192011-09-14 16:05:15 +02001319 vim_free(gui.event_buffer);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001320
1321#ifdef USE_PANEL_GROUPS
Bram Moolenaar15d63192011-09-14 16:05:15 +02001322 vim_free(panel_titles);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001323#endif
1324}
1325
1326/****************************************************************************/
1327/* events */
1328
1329/* When no events are available, photon will call this function, working is
1330 * set to FALSE, and the gui_mch_update loop will exit. */
1331 static int
Bram Moolenaar15d63192011-09-14 16:05:15 +02001332exit_gui_mch_update(void *data)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001333{
1334 *(int *)data = FALSE;
Bram Moolenaard2221132011-07-27 14:09:09 +02001335 return Pt_END;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001336}
1337
1338 void
1339gui_mch_update(void)
1340{
1341 int working = TRUE;
1342
Bram Moolenaar15d63192011-09-14 16:05:15 +02001343 PtAppAddWorkProc(NULL, exit_gui_mch_update, &working);
1344 while ((working == TRUE) && !vim_is_input_buf_full())
Bram Moolenaar071d4272004-06-13 20:20:40 +00001345 {
1346 PtProcessEvent();
1347 }
1348}
1349
1350 int
1351gui_mch_wait_for_chars(int wtime)
1352{
1353 is_timeout = FALSE;
1354
Bram Moolenaar15d63192011-09-14 16:05:15 +02001355 if (wtime > 0)
1356 PtSetResource(gui_ph_timer_timeout, Pt_ARG_TIMER_INITIAL, wtime, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001357
Bram Moolenaar15d63192011-09-14 16:05:15 +02001358 while (1)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001359 {
1360 PtProcessEvent();
Bram Moolenaar15d63192011-09-14 16:05:15 +02001361 if (input_available())
Bram Moolenaar071d4272004-06-13 20:20:40 +00001362 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001363 PtSetResource(gui_ph_timer_timeout, Pt_ARG_TIMER_INITIAL, 0, 0);
Bram Moolenaard2221132011-07-27 14:09:09 +02001364 return OK;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001365 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02001366 else if (is_timeout == TRUE)
Bram Moolenaard2221132011-07-27 14:09:09 +02001367 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001368 }
1369}
1370
Bram Moolenaar15d63192011-09-14 16:05:15 +02001371#if defined(FEAT_BROWSE) || defined(PROTO)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001372/*
1373 * Put up a file requester.
1374 * Returns the selected name in allocated memory, or NULL for Cancel.
1375 * saving, select file to write
1376 * title title for the window
1377 * default_name default name (well duh!)
1378 * ext not used (extension added)
1379 * initdir initial directory, NULL for current dir
1380 * filter not used (file name filter)
1381 */
1382 char_u *
1383gui_mch_browse(
1384 int saving,
1385 char_u *title,
1386 char_u *default_name,
1387 char_u *ext,
1388 char_u *initdir,
1389 char_u *filter)
1390{
1391 PtFileSelectionInfo_t file;
1392 int flags;
1393 char_u *default_path;
1394 char_u *open_text = NULL;
1395
1396 flags = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001397 memset(&file, 0, sizeof(file));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001398
Bram Moolenaar15d63192011-09-14 16:05:15 +02001399 default_path = alloc(MAXPATHL + 1 + NAME_MAX + 1);
1400 if (default_path != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001401 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001402 if (saving == TRUE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001403 {
1404 /* Don't need Pt_FSR_CONFIRM_EXISTING, vim will ask anyway */
1405 flags |= Pt_FSR_NO_FCHECK;
1406 open_text = "&Save";
1407 }
1408
1409 /* combine the directory and filename into a single path */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001410 if (initdir == NULL || *initdir == NUL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001411 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001412 mch_dirname(default_path, MAXPATHL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001413 initdir = default_path;
1414 }
1415 else
1416 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001417 STRCPY(default_path, initdir);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001418 initdir = default_path;
1419 }
1420
Bram Moolenaar15d63192011-09-14 16:05:15 +02001421 if (default_name != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001422 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001423 if (default_path[ STRLEN(default_path) - 1 ] != '/')
1424 STRCAT(default_path, "/");
Bram Moolenaar071d4272004-06-13 20:20:40 +00001425
Bram Moolenaar15d63192011-09-14 16:05:15 +02001426 STRCAT(default_path, default_name);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001427 }
1428
1429 /* TODO: add a filter? */
1430 PtFileSelection(
1431 gui.vimWindow,
1432 NULL,
1433 title,
1434 default_path,
1435 NULL,
1436 open_text,
1437 NULL,
1438 NULL,
1439 &file,
Bram Moolenaar15d63192011-09-14 16:05:15 +02001440 flags);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001441
Bram Moolenaar15d63192011-09-14 16:05:15 +02001442 vim_free(default_path);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001443
Bram Moolenaar15d63192011-09-14 16:05:15 +02001444 if (file.ret == Pt_FSDIALOG_BTN1)
Bram Moolenaard2221132011-07-27 14:09:09 +02001445 return vim_strsave(file.path);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001446 }
Bram Moolenaard2221132011-07-27 14:09:09 +02001447 return NULL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001448}
1449#endif
1450
Bram Moolenaar15d63192011-09-14 16:05:15 +02001451#if defined(FEAT_GUI_DIALOG) || defined(PROTO)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001452static PtWidget_t *gui_ph_dialog_text = NULL;
1453
1454 static int
Bram Moolenaar15d63192011-09-14 16:05:15 +02001455gui_ph_dialog_close(int button, void *data)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001456{
1457 PtModalCtrl_t *modal_ctrl = data;
1458 char_u *dialog_text, *vim_text;
1459
Bram Moolenaar15d63192011-09-14 16:05:15 +02001460 if (gui_ph_dialog_text != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001461 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001462 PtGetResource(gui_ph_dialog_text, Pt_ARG_TEXT_STRING, &dialog_text, 0);
1463 PtGetResource(gui_ph_dialog_text, Pt_ARG_POINTER, &vim_text, 0);
1464 STRNCPY(vim_text, dialog_text, IOSIZE - 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001465 }
1466
Bram Moolenaar15d63192011-09-14 16:05:15 +02001467 PtModalUnblock(modal_ctrl, (void *) button);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001468
Bram Moolenaard2221132011-07-27 14:09:09 +02001469 return Pt_TRUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001470}
1471
1472 static int
Bram Moolenaar15d63192011-09-14 16:05:15 +02001473gui_ph_dialog_text_enter(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001474{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001475 if (info->reason_subtype == Pt_EDIT_ACTIVATE)
1476 gui_ph_dialog_close(1, data);
Bram Moolenaard2221132011-07-27 14:09:09 +02001477 return Pt_CONTINUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001478}
1479
1480 static int
Bram Moolenaar15d63192011-09-14 16:05:15 +02001481gui_ph_dialog_esc(PtWidget_t *widget, void *data, PtCallbackInfo_t *info)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001482{
1483 PhKeyEvent_t *key;
1484
Bram Moolenaar15d63192011-09-14 16:05:15 +02001485 key = PhGetData(info->event);
1486 if ((key->key_flags & Pk_KF_Cap_Valid) && (key->key_cap == Pk_Escape))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001487 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001488 gui_ph_dialog_close(0, data);
Bram Moolenaard2221132011-07-27 14:09:09 +02001489 return Pt_CONSUME;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001490 }
Bram Moolenaard2221132011-07-27 14:09:09 +02001491 return Pt_PROCESS;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001492}
1493
1494 int
1495gui_mch_dialog(
1496 int type,
1497 char_u *title,
1498 char_u *message,
1499 char_u *buttons,
1500 int default_button,
Bram Moolenaard2c340a2011-01-17 20:08:11 +01001501 char_u *textfield,
1502 int ex_cmd)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001503{
1504 char_u *str;
1505 char_u **button_array;
1506 char_u *buttons_copy;
1507
1508 int button_count;
1509 int i, len;
1510 int dialog_result = -1;
1511
1512 /* FIXME: the vertical option in guioptions is blatantly ignored */
1513 /* FIXME: so is the type */
1514
1515 button_count = len = i = 0;
1516
Bram Moolenaar15d63192011-09-14 16:05:15 +02001517 if (buttons == NULL || *buttons == NUL)
Bram Moolenaard2221132011-07-27 14:09:09 +02001518 return -1;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001519
1520 /* There is one less separator than buttons, so bump up the button count */
1521 button_count = 1;
1522
Bram Moolenaar84a05ac2013-05-06 04:24:17 +02001523 /* Count string length and number of separators */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001524 for (str = buttons; *str; str++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001525 {
1526 len++;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001527 if (*str == DLG_BUTTON_SEP)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001528 button_count++;
1529 }
1530
Bram Moolenaar15d63192011-09-14 16:05:15 +02001531 if (title == NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001532 title = "Vim";
1533
Bram Moolenaar15d63192011-09-14 16:05:15 +02001534 buttons_copy = alloc(len + 1);
1535 button_array = (char_u **) alloc(button_count * sizeof(char_u *));
1536 if (buttons_copy != NULL && button_array != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001537 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001538 STRCPY(buttons_copy, buttons);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001539
1540 /*
1541 * Convert DLG_BUTTON_SEP into NUL's and fill in
1542 * button_array with the pointer to each NUL terminated string
1543 */
1544 str = buttons_copy;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001545 for (i = 0; i < button_count; i++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001546 {
1547 button_array[ i ] = str;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001548 for (; *str; str++)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001549 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001550 if (*str == DLG_BUTTON_SEP)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001551 {
1552 *str++ = NUL;
1553 break;
1554 }
1555 }
1556 }
1557#ifndef FEAT_GUI_TEXTDIALOG
1558 dialog_result = PtAlert(
1559 gui.vimWindow, NULL,
1560 title,
1561 NULL,
1562 message, NULL,
1563 button_count, (const char **) button_array, NULL,
Bram Moolenaar15d63192011-09-14 16:05:15 +02001564 default_button, 0, Pt_MODAL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001565#else
1566 /* Writing the dialog ourselves lets us add extra features, like
1567 * trapping the escape key and returning 0 to vim */
1568 {
1569 int n;
1570 PtArg_t args[5];
1571 PtWidget_t *dialog, *pane;
1572 PtModalCtrl_t modal_ctrl;
1573 PtDialogInfo_t di;
1574
Bram Moolenaar15d63192011-09-14 16:05:15 +02001575 memset(&di, 0, sizeof(di));
1576 memset(&modal_ctrl, 0, sizeof(modal_ctrl));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001577
1578 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001579 PtSetArg(&args[n++], Pt_ARG_GROUP_ROWS_COLS, 0, 0);
1580 PtSetArg(&args[n++], Pt_ARG_WIDTH, 350, 0);
1581 PtSetArg(&args[n++], Pt_ARG_GROUP_ORIENTATION,
1582 Pt_GROUP_VERTICAL, 0);
1583 PtSetArg(&args[n++], Pt_ARG_GROUP_FLAGS,
1584 Pt_TRUE, Pt_GROUP_NO_KEYS | Pt_GROUP_STRETCH_HORIZONTAL);
1585 PtSetArg(&args[n++], Pt_ARG_CONTAINER_FLAGS, Pt_FALSE, Pt_TRUE);
1586 pane = PtCreateWidget(PtGroup, NULL, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001587
1588 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001589 PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, message, 0);
1590 PtCreateWidget(PtLabel, pane, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001591
Bram Moolenaar15d63192011-09-14 16:05:15 +02001592 if (textfield != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001593 {
1594 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001595 PtSetArg(&args[n++], Pt_ARG_MAX_LENGTH, IOSIZE - 1, 0);
1596 PtSetArg(&args[n++], Pt_ARG_TEXT_STRING, textfield, 0);
1597 PtSetArg(&args[n++], Pt_ARG_POINTER, textfield, 0);
1598 gui_ph_dialog_text = PtCreateWidget(PtText, pane, n, args);
1599 PtAddCallback(gui_ph_dialog_text, Pt_CB_ACTIVATE,
1600 gui_ph_dialog_text_enter, &modal_ctrl);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001601 }
1602
1603 di.parent = gui.vimWindow;
1604 di.pane = pane;
1605 di.title = title;
1606 di.buttons = (const char **) button_array;
1607 di.nbtns = button_count;
1608 di.def_btn = default_button;
1609 /* This is just to give the dialog the close button.
1610 * We check for the Escape key ourselves and return 0 */
1611 di.esc_btn = button_count;
1612 di.callback = gui_ph_dialog_close;
1613 di.data = &modal_ctrl;
1614
Bram Moolenaar15d63192011-09-14 16:05:15 +02001615 dialog = PtCreateDialog(&di);
1616 PtAddFilterCallback(dialog, Ph_EV_KEY,
1617 gui_ph_dialog_esc, &modal_ctrl);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001618
Bram Moolenaar15d63192011-09-14 16:05:15 +02001619 if (gui_ph_dialog_text != NULL)
1620 PtGiveFocus(gui_ph_dialog_text, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001621
1622 /* Open dialog, block the vim window and wait for the dialog to close */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001623 PtRealizeWidget(dialog);
1624 PtMakeModal(dialog, Ph_CURSOR_NOINPUT, Ph_CURSOR_DEFAULT_COLOR);
1625 dialog_result = (int) PtModalBlock(&modal_ctrl, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001626
Bram Moolenaar15d63192011-09-14 16:05:15 +02001627 PtDestroyWidget(dialog);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001628 gui_ph_dialog_text = NULL;
1629 }
1630#endif
1631 }
1632
Bram Moolenaar15d63192011-09-14 16:05:15 +02001633 vim_free(button_array);
1634 vim_free(buttons_copy);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001635
Bram Moolenaard2221132011-07-27 14:09:09 +02001636 return dialog_result;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001637}
1638#endif
1639/****************************************************************************/
1640/* window size/position/state */
1641
1642 int
1643gui_mch_get_winpos(int *x, int *y)
1644{
1645 PhPoint_t *pos;
1646
Bram Moolenaar15d63192011-09-14 16:05:15 +02001647 pos = PtWidgetPos(gui.vimWindow, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001648
1649 *x = pos->x;
1650 *y = pos->y;
1651
Bram Moolenaard2221132011-07-27 14:09:09 +02001652 return OK;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001653}
1654
1655 void
1656gui_mch_set_winpos(int x, int y)
1657{
1658 PhPoint_t pos = { x, y };
1659
Bram Moolenaar15d63192011-09-14 16:05:15 +02001660 PtSetResource(gui.vimWindow, Pt_ARG_POS, &pos, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001661}
1662
1663 void
1664gui_mch_set_shellsize(int width, int height,
Bram Moolenaarafa24992006-03-27 20:58:26 +00001665 int min_width, int min_height, int base_width, int base_height,
1666 int direction)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001667{
1668 PhDim_t window_size = { width, height };
1669 PhDim_t min_size = { min_width, min_height };
1670
1671#ifdef USE_PANEL_GROUP
1672 window_size.w += pg_margin_left + pg_margin_right;
1673 window_size.h += pg_margin_top + pg_margin_bottom;
1674#endif
1675
Bram Moolenaar15d63192011-09-14 16:05:15 +02001676 PtSetResource(gui.vimWindow, Pt_ARG_MINIMUM_DIM, &min_size, 0);
1677 PtSetResource(gui.vimWindow, Pt_ARG_DIM, &window_size, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001678
Bram Moolenaar15d63192011-09-14 16:05:15 +02001679 if (! PtWidgetIsRealized(gui.vimWindow))
Bram Moolenaar071d4272004-06-13 20:20:40 +00001680 gui_ph_resize_container();
1681}
1682
1683/*
1684 * Return the amount of screen space that hasn't been allocated (such as
1685 * by the shelf).
1686 */
1687 void
1688gui_mch_get_screen_dimensions(int *screen_w, int *screen_h)
1689{
1690 PhRect_t console;
1691
Bram Moolenaar15d63192011-09-14 16:05:15 +02001692 PhWindowQueryVisible(Ph_QUERY_WORKSPACE, 0,
1693 PhInputGroup(NULL), &console);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001694
1695 *screen_w = console.lr.x - console.ul.x + 1;
1696 *screen_h = console.lr.y - console.ul.y + 1;
1697}
1698
1699 void
1700gui_mch_iconify(void)
1701{
1702 PhWindowEvent_t event;
1703
Bram Moolenaar15d63192011-09-14 16:05:15 +02001704 memset(&event, 0, sizeof (event));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001705 event.event_f = Ph_WM_HIDE;
1706 event.event_state = Ph_WM_EVSTATE_HIDE;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001707 event.rid = PtWidgetRid(gui.vimWindow);
1708 PtForwardWindowEvent(&event);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001709}
1710
1711#if defined(FEAT_EVAL) || defined(PROTO)
1712/*
1713 * Bring the Vim window to the foreground.
1714 */
1715 void
Bram Moolenaar68c2f632016-01-30 17:24:07 +01001716gui_mch_set_foreground(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001717{
1718 PhWindowEvent_t event;
1719
Bram Moolenaar15d63192011-09-14 16:05:15 +02001720 memset(&event, 0, sizeof (event));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001721 event.event_f = Ph_WM_TOFRONT;
1722 event.event_state = Ph_WM_EVSTATE_FFRONT;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001723 event.rid = PtWidgetRid(gui.vimWindow);
1724 PtForwardWindowEvent(&event);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001725}
1726#endif
1727
1728 void
1729gui_mch_settitle(char_u *title, char_u *icon)
1730{
1731#ifdef USE_PANEL_GROUP
Bram Moolenaar15d63192011-09-14 16:05:15 +02001732 gui_ph_pg_set_buffer_num(curwin->w_buffer->b_fnum);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001733#endif
Bram Moolenaar15d63192011-09-14 16:05:15 +02001734 PtSetResource(gui.vimWindow, Pt_ARG_WINDOW_TITLE, title, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001735 /* Not sure what to do with the icon text, set balloon text somehow? */
1736}
1737
1738/****************************************************************************/
1739/* Scrollbar */
1740
1741 void
1742gui_mch_set_scrollbar_thumb(scrollbar_T *sb, int val, int size, int max)
1743{
1744 int n = 0;
1745 PtArg_t args[3];
1746
Bram Moolenaar15d63192011-09-14 16:05:15 +02001747 PtSetArg(&args[ n++ ], Pt_ARG_MAXIMUM, max, 0);
1748 PtSetArg(&args[ n++ ], Pt_ARG_SLIDER_SIZE, size, 0);
1749 PtSetArg(&args[ n++ ], Pt_ARG_GAUGE_VALUE, val, 0);
1750 PtSetResources(sb->id, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001751}
1752
1753 void
1754gui_mch_set_scrollbar_pos(scrollbar_T *sb, int x, int y, int w, int h)
1755{
1756 PhArea_t area = {{ x, y }, { w, h }};
1757
Bram Moolenaar15d63192011-09-14 16:05:15 +02001758 PtSetResource(sb->id, Pt_ARG_AREA, &area, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001759}
1760
1761 void
1762gui_mch_create_scrollbar(scrollbar_T *sb, int orient)
1763{
1764 int n = 0;
1765/* int anchor_flags = 0;*/
1766 PtArg_t args[4];
1767
1768 /*
1769 * Stop the scrollbar from being realized when the parent
1770 * is realized, so it can be explicitly realized by vim.
1771 *
1772 * Also, don't let the scrollbar get focus
1773 */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001774 PtSetArg(&args[ n++ ], Pt_ARG_FLAGS, Pt_DELAY_REALIZE,
1775 Pt_DELAY_REALIZE | Pt_GETS_FOCUS);
1776 PtSetArg(&args[ n++ ], Pt_ARG_SCROLLBAR_FLAGS, Pt_SCROLLBAR_SHOW_ARROWS, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001777#if 0
1778 /* Don't need this anchoring for the scrollbars */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001779 if (orient == SBAR_HORIZ)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001780 {
1781 anchor_flags = Pt_BOTTOM_ANCHORED_BOTTOM |
1782 Pt_LEFT_ANCHORED_LEFT | Pt_RIGHT_ANCHORED_RIGHT;
1783 }
1784 else
1785 {
1786 anchor_flags = Pt_BOTTOM_ANCHORED_BOTTOM | Pt_TOP_ANCHORED_TOP;
Bram Moolenaar15d63192011-09-14 16:05:15 +02001787 if (sb->wp != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001788 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02001789 if (sb == &sb->wp->w_scrollbars[ SBAR_LEFT ])
Bram Moolenaar071d4272004-06-13 20:20:40 +00001790 anchor_flags |= Pt_LEFT_ANCHORED_LEFT;
1791 else
1792 anchor_flags |= Pt_RIGHT_ANCHORED_RIGHT;
1793 }
1794 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02001795 PtSetArg(&args[ n++ ], Pt_ARG_ANCHOR_FLAGS, anchor_flags, Pt_IS_ANCHORED);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001796#endif
Bram Moolenaar15d63192011-09-14 16:05:15 +02001797 PtSetArg(&args[ n++ ], Pt_ARG_ORIENTATION,
1798 (orient == SBAR_HORIZ) ? Pt_HORIZONTAL : Pt_VERTICAL, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001799#ifdef USE_PANEL_GROUP
Bram Moolenaar15d63192011-09-14 16:05:15 +02001800 sb->id = PtCreateWidget(PtScrollbar, gui.vimPanelGroup, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001801#else
Bram Moolenaar15d63192011-09-14 16:05:15 +02001802 sb->id = PtCreateWidget(PtScrollbar, gui.vimContainer, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001803#endif
1804
Bram Moolenaar15d63192011-09-14 16:05:15 +02001805 PtAddCallback(sb->id, Pt_CB_SCROLLBAR_MOVE, gui_ph_handle_scrollbar, sb);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001806}
1807
1808 void
1809gui_mch_enable_scrollbar(scrollbar_T *sb, int flag)
1810{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001811 if (flag != 0)
1812 PtRealizeWidget(sb->id);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001813 else
Bram Moolenaar15d63192011-09-14 16:05:15 +02001814 PtUnrealizeWidget(sb->id);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001815}
1816
1817 void
1818gui_mch_destroy_scrollbar(scrollbar_T *sb)
1819{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001820 PtDestroyWidget(sb->id);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001821 sb->id = NULL;
1822}
1823
1824/****************************************************************************/
1825/* Mouse functions */
1826
1827#if defined(FEAT_MOUSESHAPE) || defined(PROTO)
1828/* The last set mouse pointer shape is remembered, to be used when it goes
1829 * from hidden to not hidden. */
1830static int last_shape = 0;
1831
1832/* Table for shape IDs. Keep in sync with the mshape_names[] table in
1833 * misc2.c! */
1834static int mshape_ids[] =
1835{
1836 Ph_CURSOR_POINTER, /* arrow */
1837 Ph_CURSOR_NONE, /* blank */
1838 Ph_CURSOR_INSERT, /* beam */
1839 Ph_CURSOR_DRAG_VERTICAL, /* updown */
1840 Ph_CURSOR_DRAG_VERTICAL, /* udsizing */
1841 Ph_CURSOR_DRAG_HORIZONTAL, /* leftright */
1842 Ph_CURSOR_DRAG_HORIZONTAL, /* lrsizing */
1843 Ph_CURSOR_WAIT, /* busy */
1844 Ph_CURSOR_DONT, /* no */
1845 Ph_CURSOR_CROSSHAIR, /* crosshair */
1846 Ph_CURSOR_FINGER, /* hand1 */
1847 Ph_CURSOR_FINGER, /* hand2 */
1848 Ph_CURSOR_FINGER, /* pencil */
1849 Ph_CURSOR_QUESTION_POINT, /* question */
1850 Ph_CURSOR_POINTER, /* right-arrow */
1851 Ph_CURSOR_POINTER, /* up-arrow */
1852 Ph_CURSOR_POINTER /* last one */
1853};
1854
1855 void
Bram Moolenaar68c2f632016-01-30 17:24:07 +01001856mch_set_mouse_shape(int shape)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001857{
1858 int id;
1859
1860 if (!gui.in_use)
1861 return;
1862
1863 if (shape == MSHAPE_HIDE || gui.pointer_hidden)
Bram Moolenaar15d63192011-09-14 16:05:15 +02001864 PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_TYPE, Ph_CURSOR_NONE,
1865 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001866 else
1867 {
1868 if (shape >= MSHAPE_NUMBERED)
1869 id = Ph_CURSOR_POINTER;
1870 else
1871 id = mshape_ids[shape];
1872
Bram Moolenaar15d63192011-09-14 16:05:15 +02001873 PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_TYPE, id, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001874 }
1875 if (shape != MSHAPE_HIDE)
1876 last_shape = shape;
1877}
1878#endif
1879
1880 void
1881gui_mch_mousehide(int hide)
1882{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001883 if (gui.pointer_hidden != hide)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001884 {
1885 gui.pointer_hidden = hide;
1886#ifdef FEAT_MOUSESHAPE
Bram Moolenaar15d63192011-09-14 16:05:15 +02001887 if (hide)
1888 PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_TYPE,
1889 Ph_CURSOR_NONE, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001890 else
Bram Moolenaar15d63192011-09-14 16:05:15 +02001891 mch_set_mouse_shape(last_shape);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001892#else
Bram Moolenaar15d63192011-09-14 16:05:15 +02001893 PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_TYPE,
1894 (hide == MOUSE_SHOW) ? GUI_PH_MOUSE_TYPE : Ph_CURSOR_NONE,
1895 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001896#endif
1897 }
1898}
1899
Bram Moolenaar5f2bb9f2005-01-11 21:29:04 +00001900 void
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001901gui_mch_getmouse(int *x, int *y)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001902{
1903 PhCursorInfo_t info;
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001904 short ix, iy;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001905
1906 /* FIXME: does this return the correct position,
1907 * with respect to the border? */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001908 PhQueryCursor(PhInputGroup(NULL), &info);
1909 PtGetAbsPosition(gui.vimTextArea , &ix, &iy);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001910
Bram Moolenaar9588a0f2005-01-08 21:45:39 +00001911 *x = info.pos.x - ix;
1912 *y = info.pos.y - iy;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001913}
1914
1915 void
1916gui_mch_setmouse(int x, int y)
1917{
1918 short abs_x, abs_y;
1919
Bram Moolenaar15d63192011-09-14 16:05:15 +02001920 PtGetAbsPosition(gui.vimTextArea, &abs_x, &abs_y);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001921 /* Add the border offset? */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001922 PhMoveCursorAbs(PhInputGroup(NULL), abs_x + x, abs_y + y);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001923}
1924
1925/****************************************************************************/
1926/* Colours */
1927
1928/*
1929 * Return the RGB value of a pixel as a long.
1930 */
Bram Moolenaar1b58cdd2016-08-22 23:04:33 +02001931 guicolor_T
Bram Moolenaar071d4272004-06-13 20:20:40 +00001932gui_mch_get_rgb(guicolor_T pixel)
1933{
Bram Moolenaar1b58cdd2016-08-22 23:04:33 +02001934 return (guicolor_T)(PgRGB(PgRedValue(pixel),
1935 PgGreenValue(pixel), PgBlueValue(pixel)));
Bram Moolenaar071d4272004-06-13 20:20:40 +00001936}
1937
1938 void
1939gui_mch_new_colors(void)
1940{
1941#if 0 /* Don't bother changing the cursor colour */
1942 short color_diff;
1943
1944 /*
1945 * If there isn't enough difference between the background colour and
1946 * the mouse pointer colour then change the mouse pointer colour
1947 */
1948 color_diff = gui_get_lightness(gui_ph_mouse_color)
1949 - gui_get_lightness(gui.back_pixel);
1950
Bram Moolenaar15d63192011-09-14 16:05:15 +02001951 if (abs(color_diff) < 64)
Bram Moolenaar071d4272004-06-13 20:20:40 +00001952 {
1953 short r, g, b;
1954 /* not a great algorithm... */
Bram Moolenaar15d63192011-09-14 16:05:15 +02001955 r = PgRedValue(gui_ph_mouse_color) ^ 255;
1956 g = PgGreenValue(gui_ph_mouse_color) ^ 255;
1957 b = PgBlueValue(gui_ph_mouse_color) ^ 255;
Bram Moolenaar071d4272004-06-13 20:20:40 +00001958
1959#ifndef FEAT_MOUSESHAPE
Bram Moolenaar15d63192011-09-14 16:05:15 +02001960 gui_ph_mouse_color = PgRGB(r, g, b);
1961 PtSetResource(gui.vimTextArea, Pt_ARG_CURSOR_COLOR,
1962 gui_ph_mouse_color, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001963#endif
1964 }
1965#endif
1966
Bram Moolenaar15d63192011-09-14 16:05:15 +02001967 PtSetResource(gui.vimTextArea, Pt_ARG_FILL_COLOR, gui.back_pixel, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001968}
1969
Bram Moolenaar071d4272004-06-13 20:20:40 +00001970/*
Bram Moolenaarccc18222007-05-10 18:25:20 +00001971 * This should be split out into a separate file,
Bram Moolenaar071d4272004-06-13 20:20:40 +00001972 * every port does basically the same thing.
1973 *
1974 * This is the gui_w32.c version (i think..)
1975 * Return INVALCOLOR when failed.
1976 */
1977
1978 guicolor_T
1979gui_mch_get_color(char_u *name)
1980{
Bram Moolenaarab302212016-04-26 20:59:29 +02001981 return gui_get_color_cmn(name);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001982}
1983
Bram Moolenaar26af85d2017-07-23 16:45:10 +02001984 guicolor_T
1985gui_mch_get_rgb_color(int r, int g, int b)
1986{
1987 return gui_get_rgb_color_cmn(r, g, b);
1988}
1989
Bram Moolenaar071d4272004-06-13 20:20:40 +00001990 void
1991gui_mch_set_fg_color(guicolor_T color)
1992{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001993 PgSetTextColor(color);
Bram Moolenaar071d4272004-06-13 20:20:40 +00001994}
1995
1996 void
1997gui_mch_set_bg_color(guicolor_T color)
1998{
Bram Moolenaar15d63192011-09-14 16:05:15 +02001999 PgSetFillColor(color);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002000}
2001
2002 void
Bram Moolenaare2cc9702005-03-15 22:43:58 +00002003gui_mch_set_sp_color(guicolor_T color)
2004{
2005}
2006
2007 void
Bram Moolenaar071d4272004-06-13 20:20:40 +00002008gui_mch_invert_rectangle(int row, int col, int nr, int nc)
2009{
2010 PhRect_t rect;
2011
Bram Moolenaar15d63192011-09-14 16:05:15 +02002012 rect.ul.x = FILL_X(col);
2013 rect.ul.y = FILL_Y(row);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002014
2015 /* FIXME: This has an off by one pixel problem */
2016 rect.lr.x = rect.ul.x + nc * gui.char_width;
2017 rect.lr.y = rect.ul.y + nr * gui.char_height;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002018 if (nc > 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002019 rect.lr.x -= 1;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002020 if (nr > 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002021 rect.lr.y -= 1;
2022
2023 DRAW_START;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002024 PgSetDrawMode(Pg_DrawModeDSTINVERT);
2025 PgDrawRect(&rect, Pg_DRAW_FILL);
2026 PgSetDrawMode(Pg_DrawModeSRCCOPY);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002027 DRAW_END;
2028}
2029
2030 void
2031gui_mch_clear_block(int row1, int col1, int row2, int col2)
2032{
2033 PhRect_t block = {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002034 { FILL_X(col1), FILL_Y(row1) },
2035 { FILL_X(col2 + 1) - 1, FILL_Y(row2 + 1) - 1}
Bram Moolenaar071d4272004-06-13 20:20:40 +00002036 };
2037
2038 DRAW_START;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002039 gui_mch_set_bg_color(gui.back_pixel);
2040 PgDrawRect(&block, Pg_DRAW_FILL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002041 DRAW_END;
2042}
2043
2044 void
Bram Moolenaar68c2f632016-01-30 17:24:07 +01002045gui_mch_clear_all(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002046{
2047 PhRect_t text_rect = {
2048 { gui.border_width, gui.border_width },
2049 { Columns * gui.char_width + gui.border_width - 1 ,
2050 Rows * gui.char_height + gui.border_width - 1 }
2051 };
2052
Bram Moolenaar15d63192011-09-14 16:05:15 +02002053 if (is_ignore_draw == TRUE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002054 return;
2055
2056 DRAW_START;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002057 gui_mch_set_bg_color(gui.back_pixel);
2058 PgDrawRect(&text_rect, Pg_DRAW_FILL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002059 DRAW_END;
2060}
2061
2062 void
2063gui_mch_delete_lines(int row, int num_lines)
2064{
2065 PhRect_t rect;
2066 PhPoint_t delta;
2067
Bram Moolenaar15d63192011-09-14 16:05:15 +02002068 rect.ul.x = FILL_X(gui.scroll_region_left);
2069 rect.ul.y = FILL_Y(row + num_lines);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002070
Bram Moolenaar15d63192011-09-14 16:05:15 +02002071 rect.lr.x = FILL_X(gui.scroll_region_right + 1) - 1;
2072 rect.lr.y = FILL_Y(gui.scroll_region_bot + 1) - 1;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002073
Bram Moolenaar15d63192011-09-14 16:05:15 +02002074 PtWidgetOffset(gui.vimTextArea, &gui_ph_raw_offset);
2075 PhTranslatePoint(&gui_ph_raw_offset, PtWidgetPos(gui.vimTextArea, NULL));
2076 PhTranslateRect(&rect, &gui_ph_raw_offset);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002077
2078 delta.x = 0;
2079 delta.y = -num_lines * gui.char_height;
2080
2081 PgFlush();
2082
Bram Moolenaar15d63192011-09-14 16:05:15 +02002083 PhBlit(PtWidgetRid(PtFindDisjoint(gui.vimTextArea)), &rect, &delta);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002084
2085 gui_clear_block(
2086 gui.scroll_region_bot - num_lines + 1,
2087 gui.scroll_region_left,
2088 gui.scroll_region_bot,
Bram Moolenaar15d63192011-09-14 16:05:15 +02002089 gui.scroll_region_right);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002090}
2091
2092 void
2093gui_mch_insert_lines(int row, int num_lines)
2094{
2095 PhRect_t rect;
2096 PhPoint_t delta;
2097
Bram Moolenaar15d63192011-09-14 16:05:15 +02002098 rect.ul.x = FILL_X(gui.scroll_region_left);
2099 rect.ul.y = FILL_Y(row);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002100
Bram Moolenaar15d63192011-09-14 16:05:15 +02002101 rect.lr.x = FILL_X(gui.scroll_region_right + 1) - 1;
2102 rect.lr.y = FILL_Y(gui.scroll_region_bot - num_lines + 1) - 1;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002103
Bram Moolenaar15d63192011-09-14 16:05:15 +02002104 PtWidgetOffset(gui.vimTextArea, &gui_ph_raw_offset);
2105 PhTranslatePoint(&gui_ph_raw_offset, PtWidgetPos(gui.vimTextArea, NULL));
2106 PhTranslateRect(&rect, &gui_ph_raw_offset);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002107
2108 delta.x = 0;
2109 delta.y = num_lines * gui.char_height;
2110
2111 PgFlush();
2112
Bram Moolenaar15d63192011-09-14 16:05:15 +02002113 PhBlit(PtWidgetRid(PtFindDisjoint(gui.vimTextArea)) , &rect, &delta);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002114
Bram Moolenaar15d63192011-09-14 16:05:15 +02002115 gui_clear_block(row, gui.scroll_region_left,
2116 row + num_lines - 1, gui.scroll_region_right);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002117}
2118
2119 void
2120gui_mch_draw_string(int row, int col, char_u *s, int len, int flags)
2121{
2122 static char *utf8_buffer = NULL;
2123 static int utf8_len = 0;
2124
Bram Moolenaar15d63192011-09-14 16:05:15 +02002125 PhPoint_t pos = { TEXT_X(col), TEXT_Y(row) };
Bram Moolenaar071d4272004-06-13 20:20:40 +00002126 PhRect_t rect;
2127
Bram Moolenaar15d63192011-09-14 16:05:15 +02002128 if (is_ignore_draw == TRUE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002129 return;
2130
2131 DRAW_START;
2132
Bram Moolenaar15d63192011-09-14 16:05:15 +02002133 if (!(flags & DRAW_TRANSP))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002134 {
2135 PgDrawIRect(
Bram Moolenaar15d63192011-09-14 16:05:15 +02002136 FILL_X(col), FILL_Y(row),
2137 FILL_X(col + len) - 1, FILL_Y(row + 1) - 1,
2138 Pg_DRAW_FILL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002139 }
2140
Bram Moolenaar15d63192011-09-14 16:05:15 +02002141 if (flags & DRAW_UNDERL)
2142 PgSetUnderline(gui.norm_pixel, Pg_TRANSPARENT, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002143
Bram Moolenaar15d63192011-09-14 16:05:15 +02002144 if (charset_translate != NULL
Bram Moolenaar071d4272004-06-13 20:20:40 +00002145#ifdef FEAT_MBYTE
2146 && enc_utf8 == 0
2147#endif
Bram Moolenaar15d63192011-09-14 16:05:15 +02002148 )
Bram Moolenaar071d4272004-06-13 20:20:40 +00002149 {
2150 int src_taken, dst_made;
2151
2152 /* Use a static buffer to avoid large amounts of de/allocations */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002153 if (utf8_len < len)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002154 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002155 utf8_buffer = realloc(utf8_buffer, len * MB_LEN_MAX);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002156 utf8_len = len;
2157 }
2158
2159 PxTranslateToUTF(
2160 charset_translate,
2161 s,
2162 len,
2163 &src_taken,
2164 utf8_buffer,
2165 utf8_len,
Bram Moolenaar15d63192011-09-14 16:05:15 +02002166 &dst_made);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002167 s = utf8_buffer;
2168 len = dst_made;
2169 }
2170
Bram Moolenaar15d63192011-09-14 16:05:15 +02002171 PgDrawText(s, len, &pos, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002172
Bram Moolenaar15d63192011-09-14 16:05:15 +02002173 if (flags & DRAW_BOLD)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002174 {
2175 /* FIXME: try and only calculate these values once... */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002176 rect.ul.x = FILL_X(col) + 1;
2177 rect.ul.y = FILL_Y(row);
2178 rect.lr.x = FILL_X(col + len) - 1;
2179 rect.lr.y = FILL_Y(row + 1) - 1;
2180 /* PgSetUserClip(NULL) causes the scrollbar to not redraw... */
Bram Moolenaar071d4272004-06-13 20:20:40 +00002181#if 0
2182 pos.x++;
2183
Bram Moolenaar15d63192011-09-14 16:05:15 +02002184 PgSetUserClip(&rect);
2185 PgDrawText(s, len, &pos, 0);
2186 PgSetUserClip(NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002187#else
Bram Moolenaar15d63192011-09-14 16:05:15 +02002188 rect.lr.y -= (p_linespace + 1) / 2;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002189 /* XXX: DrawTextArea doesn't work with phditto */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002190 PgDrawTextArea(s, len, &rect, Pg_TEXT_BOTTOM);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002191#endif
2192 }
2193
Bram Moolenaar15d63192011-09-14 16:05:15 +02002194 if (flags & DRAW_UNDERL)
2195 PgSetUnderline(Pg_TRANSPARENT, Pg_TRANSPARENT, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002196
2197 DRAW_END;
2198}
2199
2200/****************************************************************************/
2201/* Cursor */
2202
2203 void
2204gui_mch_draw_hollow_cursor(guicolor_T color)
2205{
2206 PhRect_t r;
2207
2208 /* FIXME: Double width characters */
2209
Bram Moolenaar15d63192011-09-14 16:05:15 +02002210 r.ul.x = FILL_X(gui.col);
2211 r.ul.y = FILL_Y(gui.row);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002212 r.lr.x = r.ul.x + gui.char_width - 1;
2213 r.lr.y = r.ul.y + gui.char_height - 1;
2214
2215 DRAW_START;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002216 PgSetStrokeColor(color);
2217 PgDrawRect(&r, Pg_DRAW_STROKE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002218 DRAW_END;
2219}
2220
2221 void
2222gui_mch_draw_part_cursor(int w, int h, guicolor_T color)
2223{
2224 PhRect_t r;
2225
Bram Moolenaar15d63192011-09-14 16:05:15 +02002226 r.ul.x = FILL_X(gui.col);
2227 r.ul.y = FILL_Y(gui.row) + gui.char_height - h;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002228 r.lr.x = r.ul.x + w - 1;
2229 r.lr.y = r.ul.y + h - 1;
2230
2231 DRAW_START;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002232 gui_mch_set_bg_color(color);
2233 PgDrawRect(&r, Pg_DRAW_FILL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002234 DRAW_END;
2235}
2236
Bram Moolenaar703a8042016-06-04 16:24:32 +02002237 int
2238gui_mch_is_blinking(void)
2239{
2240 return blink_state != BLINK_NONE;
2241}
2242
Bram Moolenaar9d5d3c92016-07-07 16:43:02 +02002243 int
2244gui_mch_is_blink_off(void)
2245{
2246 return blink_state == BLINK_OFF;
2247}
2248
Bram Moolenaar071d4272004-06-13 20:20:40 +00002249 void
2250gui_mch_set_blinking(long wait, long on, long off)
2251{
2252 blink_waittime = wait;
2253 blink_ontime = on;
2254 blink_offtime = off;
2255}
2256
2257 void
2258gui_mch_start_blink(void)
2259{
2260 /* Only turn on the timer on if none of the times are zero */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002261 if (blink_waittime && blink_ontime && blink_offtime && gui.in_focus)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002262 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002263 PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL,
2264 blink_waittime, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002265 blink_state = BLINK_ON;
2266 gui_update_cursor(TRUE, FALSE);
2267 }
2268}
2269
2270 void
Bram Moolenaar1dd45fb2018-01-31 21:10:01 +01002271gui_mch_stop_blink(int may_call_gui_update_cursor)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002272{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002273 PtSetResource(gui_ph_timer_cursor, Pt_ARG_TIMER_INITIAL, 0, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002274
Bram Moolenaar1dd45fb2018-01-31 21:10:01 +01002275 if (blink_state == BLINK_OFF && may_call_gui_update_cursor)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002276 gui_update_cursor(TRUE, FALSE);
2277
2278 blink_state = BLINK_NONE;
2279}
2280
2281/****************************************************************************/
2282/* miscellaneous functions */
2283
2284 void
2285gui_mch_beep(void)
2286{
2287 PtBeep();
2288}
2289
2290 void
2291gui_mch_flash(int msec)
2292{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002293 PgSetFillXORColor(Pg_BLACK, Pg_WHITE);
2294 PgSetDrawMode(Pg_DRAWMODE_XOR);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002295 gui_mch_clear_all();
2296 gui_mch_flush();
2297
Bram Moolenaar15d63192011-09-14 16:05:15 +02002298 ui_delay((long) msec, TRUE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002299
2300 gui_mch_clear_all();
Bram Moolenaar15d63192011-09-14 16:05:15 +02002301 PgSetDrawMode(Pg_DRAWMODE_OPAQUE);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002302 gui_mch_flush();
2303}
2304
2305 void
2306gui_mch_flush(void)
2307{
2308 PgFlush();
2309}
2310
2311 void
2312gui_mch_set_text_area_pos(int x, int y, int w, int h)
2313{
2314 PhArea_t area = {{x, y}, {w, h}};
2315
Bram Moolenaar15d63192011-09-14 16:05:15 +02002316 PtSetResource(gui.vimTextArea, Pt_ARG_AREA, &area, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002317}
2318
2319 int
2320gui_mch_haskey(char_u *name)
2321{
2322 int i;
2323
2324 for (i = 0; special_keys[i].key_sym != 0; i++)
2325 if (name[0] == special_keys[i].vim_code0 &&
2326 name[1] == special_keys[i].vim_code1)
Bram Moolenaard2221132011-07-27 14:09:09 +02002327 return OK;
2328 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002329}
2330
2331/****************************************************************************/
2332/* Menu */
2333
2334#ifdef FEAT_TOOLBAR
2335#include "toolbar.phi"
2336
2337static PhImage_t *gui_ph_toolbar_images[] = {
2338 &tb_new_phi,
2339 &tb_open_phi,
2340 &tb_save_phi,
2341 &tb_undo_phi,
2342 &tb_redo_phi,
2343 &tb_cut_phi,
2344 &tb_copy_phi,
2345 &tb_paste_phi,
2346 &tb_print_phi,
2347 &tb_help_phi,
2348 &tb_find_phi,
2349 &tb_save_all_phi,
2350 &tb_save_session_phi,
2351 &tb_new_session_phi,
2352 &tb_load_session_phi,
2353 &tb_macro_phi,
2354 &tb_replace_phi,
2355 &tb_close_phi,
2356 &tb_maximize_phi,
2357 &tb_minimize_phi,
2358 &tb_split_phi,
2359 &tb_shell_phi,
2360 &tb_find_prev_phi,
2361 &tb_find_next_phi,
2362 &tb_find_help_phi,
2363 &tb_make_phi,
2364 &tb_jump_phi,
2365 &tb_ctags_phi,
2366 &tb_vsplit_phi,
2367 &tb_maxwidth_phi,
2368 &tb_minwidth_phi
2369};
2370
2371static PhImage_t *
Bram Moolenaar15d63192011-09-14 16:05:15 +02002372gui_ph_toolbar_load_icon(char_u *iconfile)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002373{
2374 static PhImage_t external_icon;
2375 PhImage_t *temp_phi = NULL;
2376
Bram Moolenaar15d63192011-09-14 16:05:15 +02002377 temp_phi = PxLoadImage(iconfile, NULL);
2378 if (temp_phi != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002379 {
2380 /* The label widget will free the image/palette/etc. for us when
2381 * it's destroyed */
2382 temp_phi->flags |= Ph_RELEASE_IMAGE_ALL;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002383 memcpy(&external_icon, temp_phi, sizeof(external_icon));
2384 free(temp_phi);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002385
2386 temp_phi = &external_icon;
2387 }
Bram Moolenaard2221132011-07-27 14:09:09 +02002388 return temp_phi;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002389}
2390
2391/*
2392 * This returns either a builtin icon image, an external image or NULL
2393 * if it can't find either. The caller can't and doesn't need to try and
2394 * free() the returned image, and it can't store the image pointer.
2395 * (When setting the Pt_ARG_LABEL_IMAGE resource, the contents of the
2396 * PhImage_t are copied, and the original PhImage_t aren't needed anymore).
2397 */
2398static PhImage_t *
Bram Moolenaar15d63192011-09-14 16:05:15 +02002399gui_ph_toolbar_find_icon(vimmenu_T *menu)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002400{
2401 char_u full_pathname[ MAXPATHL + 1 ];
2402 PhImage_t *icon = NULL;
2403
Bram Moolenaar15d63192011-09-14 16:05:15 +02002404 if (menu->icon_builtin == FALSE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002405 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002406 if (menu->iconfile != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002407 /* TODO: use gui_find_iconfile() */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002408 icon = gui_ph_toolbar_load_icon(menu->iconfile);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002409
2410 /* TODO: Restrict loading to just .png? Search for any format? */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002411 if ((icon == NULL) &&
2412 ((gui_find_bitmap(menu->name, full_pathname, "gif") == OK) ||
2413 (gui_find_bitmap(menu->name, full_pathname, "png") == OK)))
2414 icon = gui_ph_toolbar_load_icon(full_pathname);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002415
Bram Moolenaar15d63192011-09-14 16:05:15 +02002416 if (icon != NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02002417 return icon;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002418 }
2419
Bram Moolenaar15d63192011-09-14 16:05:15 +02002420 if (menu->iconidx >= 0 &&
2421 (menu->iconidx < ARRAY_LENGTH(gui_ph_toolbar_images)))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002422 {
Bram Moolenaard2221132011-07-27 14:09:09 +02002423 return gui_ph_toolbar_images[menu->iconidx];
Bram Moolenaar071d4272004-06-13 20:20:40 +00002424 }
2425
Bram Moolenaard2221132011-07-27 14:09:09 +02002426 return NULL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002427}
2428#endif
2429
Bram Moolenaar15d63192011-09-14 16:05:15 +02002430#if defined(FEAT_MENU) || defined(PROTO)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002431 void
2432gui_mch_enable_menu(int flag)
2433{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002434 if (flag != 0)
2435 PtRealizeWidget(gui.vimMenuBar);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002436 else
Bram Moolenaar15d63192011-09-14 16:05:15 +02002437 PtUnrealizeWidget(gui.vimMenuBar);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002438}
2439
2440 void
2441gui_mch_set_menu_pos(int x, int y, int w, int h)
2442{
2443 /* Nothing */
2444}
2445
2446/* Change the position of a menu button in the parent */
2447 static void
Bram Moolenaar15d63192011-09-14 16:05:15 +02002448gui_ph_position_menu(PtWidget_t *widget, int priority)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002449{
2450 PtWidget_t *traverse;
2451 vimmenu_T *menu;
2452
Bram Moolenaar15d63192011-09-14 16:05:15 +02002453 traverse = PtWidgetChildBack(PtWidgetParent(widget));
Bram Moolenaar071d4272004-06-13 20:20:40 +00002454
2455 /* Iterate through the list of widgets in traverse, until
2456 * we find the position we want to insert our widget into */
2457 /* TODO: traverse from front to back, possible speedup? */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002458 while (traverse != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002459 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002460 PtGetResource(traverse, Pt_ARG_POINTER, &menu, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002461
Bram Moolenaar15d63192011-09-14 16:05:15 +02002462 if (menu != NULL &&
Bram Moolenaar071d4272004-06-13 20:20:40 +00002463 priority < menu->priority &&
Bram Moolenaar15d63192011-09-14 16:05:15 +02002464 widget != traverse)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002465 {
2466 /* Insert the widget before the current traverse widget */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002467 PtWidgetInsert(widget, traverse, 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002468 return;
2469 }
2470
Bram Moolenaar15d63192011-09-14 16:05:15 +02002471 traverse = PtWidgetBrotherInFront(traverse);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002472 }
2473}
2474
2475/* the index is ignored because it's not useful for our purposes */
2476 void
2477gui_mch_add_menu(vimmenu_T *menu, int index)
2478{
2479 vimmenu_T *parent = menu->parent;
2480 char_u *accel_key;
2481 char_u mnemonic_str[MB_LEN_MAX];
2482 int n;
2483 PtArg_t args[5];
2484
2485 menu->submenu_id = menu->id = NULL;
2486
Bram Moolenaar15d63192011-09-14 16:05:15 +02002487 if (menu_is_menubar(menu->name))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002488 {
2489
Bram Moolenaar15d63192011-09-14 16:05:15 +02002490 accel_key = vim_strchr(menu->name, '&');
2491 if (accel_key != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002492 {
2493 mnemonic_str[0] = accel_key[1];
2494 mnemonic_str[1] = NUL;
2495 }
2496
2497 /* Create the menu button */
2498 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002499 PtSetArg(&args[ n++ ], Pt_ARG_TEXT_STRING, menu->dname, 0);
2500 PtSetArg(&args[ n++ ], Pt_ARG_ACCEL_TEXT, menu->actext, 0);
2501 if (accel_key != NULL)
2502 PtSetArg(&args[ n++ ], Pt_ARG_ACCEL_KEY, mnemonic_str, 0);
2503 PtSetArg(&args[ n++ ], Pt_ARG_POINTER, menu, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002504
Bram Moolenaar15d63192011-09-14 16:05:15 +02002505 if (parent != NULL)
2506 PtSetArg(&args[ n++ ], Pt_ARG_BUTTON_TYPE, Pt_MENU_RIGHT, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002507
Bram Moolenaar15d63192011-09-14 16:05:15 +02002508 menu->id = PtCreateWidget(PtMenuButton,
Bram Moolenaar071d4272004-06-13 20:20:40 +00002509 (parent == NULL) ? gui.vimMenuBar : parent->submenu_id,
Bram Moolenaar15d63192011-09-14 16:05:15 +02002510 n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002511
Bram Moolenaar15d63192011-09-14 16:05:15 +02002512 PtAddCallback(menu->id, Pt_CB_ARM, gui_ph_handle_pulldown_menu, menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002513
2514 /* Create the actual menu */
2515 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002516 if (parent != NULL)
2517 PtSetArg(&args[ n++ ], Pt_ARG_MENU_FLAGS, Pt_TRUE, Pt_MENU_CHILD);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002518
Bram Moolenaar15d63192011-09-14 16:05:15 +02002519 menu->submenu_id = PtCreateWidget(PtMenu, menu->id, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002520
Bram Moolenaar15d63192011-09-14 16:05:15 +02002521 if (parent == NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002522 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002523 PtAddCallback(menu->submenu_id, Pt_CB_UNREALIZED,
2524 gui_ph_handle_menu_unrealized, menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002525
Bram Moolenaar15d63192011-09-14 16:05:15 +02002526 if (menu->mnemonic != 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002527 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002528 PtAddHotkeyHandler(gui.vimWindow, tolower(menu->mnemonic),
2529 Pk_KM_Alt, 0, menu, gui_ph_handle_pulldown_menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002530 }
2531 }
2532
Bram Moolenaar15d63192011-09-14 16:05:15 +02002533 gui_ph_position_menu(menu->id, menu->priority);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002534
2535 /* Redraw menubar here instead of gui_mch_draw_menubar */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002536 if (gui.menu_is_active)
2537 PtRealizeWidget(menu->id);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002538 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02002539 else if (menu_is_popup(menu->name))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002540 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002541 menu->submenu_id = PtCreateWidget(PtMenu, gui.vimWindow, 0, NULL);
2542 PtAddCallback(menu->submenu_id, Pt_CB_UNREALIZED,
2543 gui_ph_handle_menu_unrealized, menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002544 }
2545}
2546
2547 void
2548gui_mch_add_menu_item(vimmenu_T *menu, int index)
2549{
2550 vimmenu_T *parent = menu->parent;
2551 char_u *accel_key;
2552 char_u mnemonic_str[MB_LEN_MAX];
2553 int n;
2554 PtArg_t args[13];
2555
2556 n = 0;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002557 PtSetArg(&args[ n++ ], Pt_ARG_POINTER, menu, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002558
2559#ifdef FEAT_TOOLBAR
Bram Moolenaar15d63192011-09-14 16:05:15 +02002560 if (menu_is_toolbar(parent->name))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002561 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002562 if (menu_is_separator(menu->name))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002563 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002564 PtSetArg(&args[ n++ ], Pt_ARG_SEP_FLAGS,
2565 Pt_SEP_VERTICAL, Pt_SEP_ORIENTATION);
2566 PtSetArg(&args[ n++ ], Pt_ARG_SEP_TYPE, Pt_ETCHED_IN, 0);
2567 PtSetArg(&args[ n++ ], Pt_ARG_ANCHOR_FLAGS,
2568 Pt_TRUE, Pt_ANCHOR_TOP_BOTTOM);
2569 PtSetArg(&args[ n++ ], Pt_ARG_WIDTH, 2, 0);
2570 menu->id = PtCreateWidget(PtSeparator, gui.vimToolBar, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002571 }
2572 else
2573 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002574 if (strstr((const char *) p_toolbar, "text") != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002575 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002576 PtSetArg(&args[ n++ ], Pt_ARG_BALLOON_POSITION,
2577 Pt_BALLOON_BOTTOM, 0);
2578 PtSetArg(&args[ n++ ], Pt_ARG_TEXT_STRING, menu->dname, 0);
2579 PtSetArg(&args[ n++ ], Pt_ARG_TEXT_FONT, "TextFont08", 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002580 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02002581 if ((strstr((const char *) p_toolbar, "icons") != NULL) &&
2582 (gui_ph_toolbar_images != NULL))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002583 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002584 PtSetArg(&args[ n++ ], Pt_ARG_LABEL_IMAGE,
2585 gui_ph_toolbar_find_icon(menu), 0);
2586 PtSetArg(&args[ n++ ], Pt_ARG_LABEL_TYPE, Pt_TEXT_IMAGE, 0);
2587 PtSetArg(&args[ n++ ], Pt_ARG_TEXT_IMAGE_SPACING, 0, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002588 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02002589 if (strstr((const char *) p_toolbar, "tooltips") != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002590 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002591 PtSetArg(&args[ n++ ], Pt_ARG_LABEL_BALLOON,
2592 gui_ph_show_tooltip, 0);
2593 PtSetArg(&args[ n++ ], Pt_ARG_LABEL_FLAGS,
2594 Pt_TRUE, Pt_SHOW_BALLOON);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002595 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02002596 PtSetArg(&args[ n++ ], Pt_ARG_MARGIN_HEIGHT, 1, 0);
2597 PtSetArg(&args[ n++ ], Pt_ARG_MARGIN_WIDTH, 1, 0);
2598 PtSetArg(&args[ n++ ], Pt_ARG_FLAGS, Pt_FALSE,
2599 Pt_HIGHLIGHTED | Pt_GETS_FOCUS);
2600 PtSetArg(&args[ n++ ], Pt_ARG_FILL_COLOR, Pg_TRANSPARENT, 0);
2601 menu->id = PtCreateWidget(PtButton, gui.vimToolBar, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002602
Bram Moolenaar15d63192011-09-14 16:05:15 +02002603 PtAddCallback(menu->id, Pt_CB_ACTIVATE, gui_ph_handle_menu, menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002604 }
2605 /* Update toolbar if it's open */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002606 if (PtWidgetIsRealized(gui.vimToolBar))
2607 PtRealizeWidget(menu->id);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002608 }
2609 else
2610#endif
Bram Moolenaar15d63192011-09-14 16:05:15 +02002611 if (menu_is_separator(menu->name))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002612 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002613 menu->id = PtCreateWidget(PtSeparator, parent->submenu_id, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002614 }
2615 else
2616 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002617 accel_key = vim_strchr(menu->name, '&');
2618 if (accel_key != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002619 {
2620 mnemonic_str[0] = accel_key[1];
2621 mnemonic_str[1] = NUL;
2622 }
2623
Bram Moolenaar15d63192011-09-14 16:05:15 +02002624 PtSetArg(&args[ n++ ], Pt_ARG_TEXT_STRING, menu->dname, 0);
2625 if (accel_key != NULL)
2626 PtSetArg(&args[ n++ ], Pt_ARG_ACCEL_KEY, mnemonic_str,
2627 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002628
Bram Moolenaar15d63192011-09-14 16:05:15 +02002629 PtSetArg(&args[ n++ ], Pt_ARG_ACCEL_TEXT, menu->actext, 0);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002630
Bram Moolenaar15d63192011-09-14 16:05:15 +02002631 menu->id = PtCreateWidget(PtMenuButton, parent->submenu_id, n, args);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002632
Bram Moolenaar15d63192011-09-14 16:05:15 +02002633 PtAddCallback(menu->id, Pt_CB_ACTIVATE, gui_ph_handle_menu, menu);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002634
2635#ifdef USE_PANEL_GROUP
Bram Moolenaar15d63192011-09-14 16:05:15 +02002636 if (gui_ph_is_buffer_item(menu, parent) == TRUE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002637 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002638 PtAddCallback(menu->id, Pt_CB_DESTROYED,
2639 gui_ph_handle_buffer_remove, menu);
2640 gui_ph_pg_add_buffer(menu->dname);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002641 }
2642#endif
2643 }
2644
Bram Moolenaar15d63192011-09-14 16:05:15 +02002645 gui_ph_position_menu(menu->id, menu->priority);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002646}
2647
2648 void
2649gui_mch_destroy_menu(vimmenu_T *menu)
2650{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002651 if (menu->submenu_id != NULL)
2652 PtDestroyWidget(menu->submenu_id);
2653 if (menu->id != NULL)
2654 PtDestroyWidget(menu->id);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002655
2656 menu->submenu_id = NULL;
2657 menu->id = NULL;
2658}
2659
2660 void
2661gui_mch_menu_grey(vimmenu_T *menu, int grey)
2662{
2663 long flags, mask, fields;
2664
Bram Moolenaar15d63192011-09-14 16:05:15 +02002665 if (menu->id == NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002666 return;
2667
Bram Moolenaar15d63192011-09-14 16:05:15 +02002668 flags = PtWidgetFlags(menu->id);
2669 if (PtWidgetIsClass(menu->id, PtMenuButton) &&
2670 PtWidgetIsClass(PtWidgetParent(menu->id), PtMenu))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002671 {
2672 fields = Pt_FALSE;
2673 mask = Pt_SELECTABLE | Pt_HIGHLIGHTED;
2674 }
2675 else
2676 {
2677 fields = Pt_TRUE;
2678 mask = Pt_BLOCKED | Pt_GHOST;
2679 }
2680
Bram Moolenaar15d63192011-09-14 16:05:15 +02002681 if (! grey)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002682 fields = ~fields;
2683
Bram Moolenaar15d63192011-09-14 16:05:15 +02002684 PtSetResource(menu->id, Pt_ARG_FLAGS, fields,
2685 mask);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002686}
2687
2688 void
2689gui_mch_menu_hidden(vimmenu_T *menu, int hidden)
2690{
2691 /* TODO: [un]realize the widget? */
2692}
2693
2694 void
2695gui_mch_draw_menubar(void)
2696{
2697 /* The only time a redraw is needed is when a menu button
2698 * is added to the menubar, and that is detected and the bar
2699 * redrawn in gui_mch_add_menu_item
2700 */
2701}
2702
2703 void
2704gui_mch_show_popupmenu(vimmenu_T *menu)
2705{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002706 PtSetResource(menu->submenu_id, Pt_ARG_POS, &abs_mouse, 0);
2707 PtRealizeWidget(menu->submenu_id);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002708}
2709
2710 void
2711gui_mch_toggle_tearoffs(int enable)
2712{
2713 /* No tearoffs yet */
2714}
2715
2716#endif
2717
Bram Moolenaar15d63192011-09-14 16:05:15 +02002718#if defined(FEAT_TOOLBAR) || defined(PROTO)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002719 void
2720gui_mch_show_toolbar(int showit)
2721{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002722 if (showit)
2723 PtRealizeWidget(gui.vimToolBar);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002724 else
Bram Moolenaar15d63192011-09-14 16:05:15 +02002725 PtUnrealizeWidget(gui.vimToolBar);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002726}
2727#endif
2728
2729/****************************************************************************/
2730/* Fonts */
2731
2732 static GuiFont
2733gui_ph_get_font(
2734 char_u *font_name,
2735 int_u font_flags,
2736 int_u font_size,
2737 /* Check whether the resulting font has the font flags and size that
2738 * was asked for */
2739 int_u enforce
2740 )
2741{
2742 char_u *font_tag;
2743 FontQueryInfo info;
2744 int_u style;
2745
Bram Moolenaar15d63192011-09-14 16:05:15 +02002746 font_tag = alloc(MAX_FONT_TAG);
2747 if (font_tag != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002748 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002749 if (PfGenerateFontName(font_name, font_flags, font_size,
2750 font_tag) != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002751 {
2752 /* Enforce some limits on the font used */
2753 style = PHFONT_INFO_FIXED;
2754
Bram Moolenaar15d63192011-09-14 16:05:15 +02002755 if (enforce & PF_STYLE_BOLD)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002756 style |= PHFONT_INFO_BOLD;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002757 if (enforce & PF_STYLE_ANTIALIAS)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002758 style |= PHFONT_INFO_ALIAS;
Bram Moolenaar15d63192011-09-14 16:05:15 +02002759 if (enforce & PF_STYLE_ITALIC)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002760 style |= PHFONT_INFO_ITALIC;
2761
Bram Moolenaar15d63192011-09-14 16:05:15 +02002762 PfQueryFontInfo(font_tag, &info);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002763
Bram Moolenaar15d63192011-09-14 16:05:15 +02002764 if (info.size == 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002765 font_size = 0;
2766
2767 /* Make sure font size matches, and that the font style
2768 * at least has the bits we're checking for */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002769 if (font_size == info.size &&
2770 style == (info.style & style))
Bram Moolenaard2221132011-07-27 14:09:09 +02002771 return (GuiFont)font_tag;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002772 }
Bram Moolenaar15d63192011-09-14 16:05:15 +02002773 vim_free(font_tag);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002774 }
Bram Moolenaard2221132011-07-27 14:09:09 +02002775 return NULL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002776}
2777
2778/*
2779 * Split up the vim font name
2780 *
2781 * vim_font is in the form of
2782 * <name>:s<height>:a:b:i
2783 *
2784 * a = antialias
2785 * b = bold
2786 * i = italic
2787 *
2788 */
2789
2790 static int
2791gui_ph_parse_font_name(
2792 char_u *vim_font,
2793 char_u **font_name,
2794 int_u *font_flags,
Bram Moolenaar15d63192011-09-14 16:05:15 +02002795 int_u *font_size)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002796{
2797 char_u *mark;
2798 int_u name_len, size;
2799
Bram Moolenaar15d63192011-09-14 16:05:15 +02002800 mark = vim_strchr(vim_font, ':');
2801 if (mark == NULL)
2802 name_len = STRLEN(vim_font);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002803 else
Bram Moolenaar15d63192011-09-14 16:05:15 +02002804 name_len = (int_u) (mark - vim_font);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002805
Bram Moolenaar15d63192011-09-14 16:05:15 +02002806 *font_name = vim_strnsave(vim_font, name_len);
Bram Moolenaard0988c52011-08-10 12:19:04 +02002807 if (*font_name != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002808 {
Bram Moolenaard0988c52011-08-10 12:19:04 +02002809 if (mark != NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002810 {
Bram Moolenaard0988c52011-08-10 12:19:04 +02002811 while (*mark != NUL && *mark++ == ':')
Bram Moolenaar071d4272004-06-13 20:20:40 +00002812 {
Bram Moolenaard0988c52011-08-10 12:19:04 +02002813 switch (tolower(*mark++))
Bram Moolenaar071d4272004-06-13 20:20:40 +00002814 {
2815 case 'a': *font_flags |= PF_STYLE_ANTIALIAS; break;
2816 case 'b': *font_flags |= PF_STYLE_BOLD; break;
2817 case 'i': *font_flags |= PF_STYLE_ITALIC; break;
2818
2819 case 's':
Bram Moolenaar15d63192011-09-14 16:05:15 +02002820 size = getdigits(&mark);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002821 /* Restrict the size to some vague limits */
Bram Moolenaard0988c52011-08-10 12:19:04 +02002822 if (size < 1 || size > 100)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002823 size = 8;
2824
2825 *font_size = size;
2826 break;
2827
2828 default:
2829 break;
2830 }
2831 }
2832 }
Bram Moolenaard2221132011-07-27 14:09:09 +02002833 return TRUE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002834 }
Bram Moolenaard2221132011-07-27 14:09:09 +02002835 return FALSE;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002836}
2837
2838 int
2839gui_mch_init_font(char_u *vim_font_name, int fontset)
2840{
2841 char_u *font_tag;
2842 char_u *font_name = NULL;
2843 int_u font_flags = 0;
2844 int_u font_size = 12;
2845
2846 FontQueryInfo info;
2847 PhRect_t extent;
2848
Bram Moolenaard0988c52011-08-10 12:19:04 +02002849 if (vim_font_name == NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002850 {
2851 /* Default font */
Bram Moolenaara0b19972009-07-01 14:13:18 +00002852 vim_font_name = "PC Terminal";
Bram Moolenaar071d4272004-06-13 20:20:40 +00002853 }
2854
Bram Moolenaar15d63192011-09-14 16:05:15 +02002855 if (STRCMP(vim_font_name, "*") == 0)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002856 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002857 font_tag = PtFontSelection(gui.vimWindow, NULL, NULL,
2858 "pcterm12", -1, PHFONT_FIXED, NULL);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002859
Bram Moolenaard0988c52011-08-10 12:19:04 +02002860 if (font_tag == NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02002861 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002862
Bram Moolenaar15d63192011-09-14 16:05:15 +02002863 gui_mch_free_font(gui.norm_font);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002864 gui.norm_font = font_tag;
2865
Bram Moolenaar15d63192011-09-14 16:05:15 +02002866 PfQueryFontInfo(font_tag, &info);
2867 font_name = vim_strsave(info.font);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002868 }
2869 else
2870 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002871 if (gui_ph_parse_font_name(vim_font_name, &font_name, &font_flags,
2872 &font_size) == FALSE)
Bram Moolenaard2221132011-07-27 14:09:09 +02002873 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002874
Bram Moolenaar15d63192011-09-14 16:05:15 +02002875 font_tag = gui_ph_get_font(font_name, font_flags, font_size, 0);
Bram Moolenaard0988c52011-08-10 12:19:04 +02002876 if (font_tag == NULL)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002877 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002878 vim_free(font_name);
Bram Moolenaard2221132011-07-27 14:09:09 +02002879 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002880 }
Bram Moolenaard8b0cf12004-12-12 11:33:30 +00002881
Bram Moolenaar15d63192011-09-14 16:05:15 +02002882 gui_mch_free_font(gui.norm_font);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002883 gui.norm_font = font_tag;
2884 }
2885
Bram Moolenaar15d63192011-09-14 16:05:15 +02002886 gui_mch_free_font(gui.bold_font);
2887 gui.bold_font = gui_ph_get_font(font_name, font_flags | PF_STYLE_BOLD,
2888 font_size, PF_STYLE_BOLD);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002889
Bram Moolenaar15d63192011-09-14 16:05:15 +02002890 gui_mch_free_font(gui.ital_font);
2891 gui.ital_font = gui_ph_get_font(font_name, font_flags | PF_STYLE_ITALIC,
2892 font_size, PF_STYLE_ITALIC);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002893
2894 /* This extent was brought to you by the letter 'g' */
Bram Moolenaar15d63192011-09-14 16:05:15 +02002895 PfExtentText(&extent, NULL, font_tag, "g", 1);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002896
2897 gui.char_width = extent.lr.x - extent.ul.x + 1;
2898 gui.char_height = (- extent.ul.y) + extent.lr.y + 1;
2899 gui.char_ascent = - extent.ul.y;
2900
Bram Moolenaar15d63192011-09-14 16:05:15 +02002901 vim_free(font_name);
Bram Moolenaard2221132011-07-27 14:09:09 +02002902 return OK;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002903}
2904
Bram Moolenaar02743632005-07-25 20:42:36 +00002905/*
2906 * Adjust gui.char_height (after 'linespace' was changed).
2907 */
Bram Moolenaar071d4272004-06-13 20:20:40 +00002908 int
Bram Moolenaar02743632005-07-25 20:42:36 +00002909gui_mch_adjust_charheight(void)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002910{
2911 FontQueryInfo info;
2912
Bram Moolenaar15d63192011-09-14 16:05:15 +02002913 PfQueryFontInfo(gui.norm_font, &info);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002914
2915 gui.char_height = - info.ascender + info.descender + p_linespace;
2916 gui.char_ascent = - info.ascender + p_linespace / 2;
2917
Bram Moolenaard2221132011-07-27 14:09:09 +02002918 return OK;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002919}
2920
2921 GuiFont
2922gui_mch_get_font(char_u *vim_font_name, int report_error)
2923{
2924 char_u *font_name;
2925 char_u *font_tag;
2926 int_u font_size = 12;
2927 int_u font_flags = 0;
2928
Bram Moolenaar15d63192011-09-14 16:05:15 +02002929 if (gui_ph_parse_font_name(vim_font_name, &font_name, &font_flags,
2930 &font_size) != FALSE)
Bram Moolenaar071d4272004-06-13 20:20:40 +00002931 {
Bram Moolenaar15d63192011-09-14 16:05:15 +02002932 font_tag = gui_ph_get_font(font_name, font_flags, font_size, -1);
2933 vim_free(font_name);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002934
Bram Moolenaard0988c52011-08-10 12:19:04 +02002935 if (font_tag != NULL)
Bram Moolenaard2221132011-07-27 14:09:09 +02002936 return (GuiFont)font_tag;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002937 }
2938
Bram Moolenaard0988c52011-08-10 12:19:04 +02002939 if (report_error)
Bram Moolenaarf9e3e092019-01-13 23:38:42 +01002940 semsg(e_font, vim_font_name);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002941
Bram Moolenaard2221132011-07-27 14:09:09 +02002942 return FAIL;
Bram Moolenaar071d4272004-06-13 20:20:40 +00002943}
2944
Bram Moolenaardfccaf02004-12-31 20:56:11 +00002945#if defined(FEAT_EVAL) || defined(PROTO)
Bram Moolenaard8b0cf12004-12-12 11:33:30 +00002946/*
2947 * Return the name of font "font" in allocated memory.
2948 * Don't know how to get the actual name, thus use the provided name.
2949 */
2950 char_u *
Bram Moolenaar68c2f632016-01-30 17:24:07 +01002951gui_mch_get_fontname(GuiFont font, char_u *name)
Bram Moolenaard8b0cf12004-12-12 11:33:30 +00002952{
2953 if (name == NULL)
2954 return NULL;
2955 return vim_strsave(name);
2956}
Bram Moolenaardfccaf02004-12-31 20:56:11 +00002957#endif
Bram Moolenaard8b0cf12004-12-12 11:33:30 +00002958
Bram Moolenaar071d4272004-06-13 20:20:40 +00002959 void
2960gui_mch_set_font(GuiFont font)
2961{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002962 PgSetFont(font);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002963}
2964
2965 void
2966gui_mch_free_font(GuiFont font)
2967{
Bram Moolenaar15d63192011-09-14 16:05:15 +02002968 vim_free(font);
Bram Moolenaar071d4272004-06-13 20:20:40 +00002969}
2970