1 /* vi:set ts=8 sts=4 sw=4 noet: 2 * 3 * VIM - Vi IMproved by Bram Moolenaar 4 * Motif support by Robert Webb 5 * 6 * Do ":help uganda" in Vim to read copying and usage conditions. 7 * Do ":help credits" in Vim to see a list of people who contributed. 8 */ 9 10 #ifdef FEAT_GUI_MOTIF 11 # include <Xm/Xm.h> 12 #endif 13 14 #ifdef FEAT_GUI_ATHENA 15 # include <X11/Intrinsic.h> 16 # include <X11/StringDefs.h> 17 #endif 18 19 #if defined(FEAT_BEVAL) || defined(PROTO) 20 # include "gui_beval.h" 21 #endif 22 23 #ifdef FEAT_GUI_GTK 24 # ifdef VMS /* undef MIN and MAX because Intrinsic.h redefines them anyway */ 25 # ifdef MAX 26 # undef MAX 27 # endif 28 # ifdef MIN 29 # undef MIN 30 # endif 31 # endif 32 # include <X11/Intrinsic.h> 33 # include <gtk/gtk.h> 34 #endif 35 36 #ifdef FEAT_GUI_MAC 37 # include <Types.h> 38 /*# include <Memory.h>*/ 39 # include <Quickdraw.h> 40 # include <Fonts.h> 41 # include <Events.h> 42 # include <Menus.h> 43 # if !(defined (TARGET_API_MAC_CARBON) && (TARGET_API_MAC_CARBON)) 44 # include <Windows.h> 45 # endif 46 # include <Controls.h> 47 /*# include <TextEdit.h>*/ 48 # include <Dialogs.h> 49 # include <OSUtils.h> 50 /* 51 # include <ToolUtils.h> 52 # include <SegLoad.h>*/ 53 #endif 54 55 #ifdef FEAT_GUI_PHOTON 56 # include <Ph.h> 57 # include <Pt.h> 58 # include "photon/PxProto.h" 59 #endif 60 61 /* 62 * On some systems scrolling needs to be done right away instead of in the 63 * main loop. 64 */ 65 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MAC) || defined(FEAT_GUI_GTK) 66 # define USE_ON_FLY_SCROLL 67 #endif 68 69 /* 70 * GUIs that support dropping files on a running Vim. 71 */ 72 #if defined(FEAT_GUI_MSWIN) || defined(FEAT_GUI_MAC) \ 73 || defined(FEAT_GUI_GTK) 74 # define HAVE_DROP_FILE 75 #endif 76 77 /* 78 * This define makes menus always use a fontset. 79 * We're not sure if this code always works, thus it can be disabled. 80 */ 81 #ifdef FEAT_XFONTSET 82 # define FONTSET_ALWAYS 83 #endif 84 85 /* 86 * These macros convert between character row/column and pixel coordinates. 87 * TEXT_X - Convert character column into X pixel coord for drawing strings. 88 * TEXT_Y - Convert character row into Y pixel coord for drawing strings. 89 * FILL_X - Convert character column into X pixel coord for filling the area 90 * under the character. 91 * FILL_Y - Convert character row into Y pixel coord for filling the area 92 * under the character. 93 * X_2_COL - Convert X pixel coord into character column. 94 * Y_2_ROW - Convert Y pixel coord into character row. 95 */ 96 #ifdef FEAT_GUI_W32 97 # define TEXT_X(col) ((col) * gui.char_width) 98 # define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent) 99 # define FILL_X(col) ((col) * gui.char_width) 100 # define FILL_Y(row) ((row) * gui.char_height) 101 # define X_2_COL(x) ((x) / gui.char_width) 102 # define Y_2_ROW(y) ((y) / gui.char_height) 103 #else 104 # define TEXT_X(col) ((col) * gui.char_width + gui.border_offset) 105 # define FILL_X(col) ((col) * gui.char_width + gui.border_offset) 106 # define X_2_COL(x) (((x) - gui.border_offset) / gui.char_width) 107 # define TEXT_Y(row) ((row) * gui.char_height + gui.char_ascent \ 108 + gui.border_offset) 109 # define FILL_Y(row) ((row) * gui.char_height + gui.border_offset) 110 # define Y_2_ROW(y) (((y) - gui.border_offset) / gui.char_height) 111 #endif 112 113 /* Indices for arrays of scrollbars */ 114 #define SBAR_NONE -1 115 #define SBAR_LEFT 0 116 #define SBAR_RIGHT 1 117 #define SBAR_BOTTOM 2 118 119 /* Orientations for scrollbars */ 120 #define SBAR_VERT 0 121 #define SBAR_HORIZ 1 122 123 /* Default size of scrollbar */ 124 #define SB_DEFAULT_WIDTH 16 125 126 /* Default height of the menu bar */ 127 #define MENU_DEFAULT_HEIGHT 1 /* figure it out at runtime */ 128 129 /* Flags for gui_mch_outstr_nowrap() */ 130 #define GUI_MON_WRAP_CURSOR 0x01 /* wrap cursor at end of line */ 131 #define GUI_MON_INVERT 0x02 /* invert the characters */ 132 #define GUI_MON_IS_CURSOR 0x04 /* drawing cursor */ 133 #define GUI_MON_TRS_CURSOR 0x08 /* drawing transparent cursor */ 134 #define GUI_MON_NOCLEAR 0x10 /* don't clear selection */ 135 136 /* Flags for gui_mch_draw_string() */ 137 #define DRAW_TRANSP 0x01 /* draw with transparent bg */ 138 #define DRAW_BOLD 0x02 /* draw bold text */ 139 #define DRAW_UNDERL 0x04 /* draw underline text */ 140 #define DRAW_UNDERC 0x08 /* draw undercurl text */ 141 #if defined(FEAT_GUI_GTK) 142 # define DRAW_ITALIC 0x10 /* draw italic text */ 143 #endif 144 #define DRAW_CURSOR 0x20 /* drawing block cursor (win32) */ 145 #define DRAW_STRIKE 0x40 /* strikethrough */ 146 147 /* For our own tearoff menu item */ 148 #define TEAR_STRING "-->Detach" 149 #define TEAR_LEN (9) /* length of above string */ 150 151 /* for the toolbar */ 152 #define TOOLBAR_BUTTON_HEIGHT 18 153 #define TOOLBAR_BUTTON_WIDTH 18 154 #define TOOLBAR_BORDER_HEIGHT 12 /* room above+below buttons for MSWindows */ 155 156 #ifdef FEAT_GUI_MSWIN 157 # define TABLINE_HEIGHT 22 158 #endif 159 #ifdef FEAT_GUI_MOTIF 160 # define TABLINE_HEIGHT 30 161 #endif 162 163 #if defined(NO_CONSOLE) || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_X11) 164 # define NO_CONSOLE_INPUT /* use no_console_input() to check if there 165 is no console input possible */ 166 #endif 167 168 typedef struct GuiScrollbar 169 { 170 long ident; /* Unique identifier for each scrollbar */ 171 win_T *wp; /* Scrollbar's window, NULL for bottom */ 172 int type; /* one of SBAR_{LEFT,RIGHT,BOTTOM} */ 173 long value; /* Represents top line number visible */ 174 #ifdef FEAT_GUI_ATHENA 175 int pixval; /* pixel count of value */ 176 #endif 177 long size; /* Size of scrollbar thumb */ 178 long max; /* Number of lines in buffer */ 179 180 /* Values measured in characters: */ 181 int top; /* Top of scroll bar (chars from row 0) */ 182 int height; /* Current height of scroll bar in rows */ 183 int width; /* Current width of scroll bar in cols */ 184 int status_height; /* Height of status line */ 185 #ifdef FEAT_GUI_X11 186 Widget id; /* Id of real scroll bar */ 187 #endif 188 #ifdef FEAT_GUI_GTK 189 GtkWidget *id; /* Id of real scroll bar */ 190 unsigned long handler_id; /* Id of "value_changed" signal handler */ 191 #endif 192 193 #ifdef FEAT_GUI_MSWIN 194 HWND id; /* Id of real scroll bar */ 195 int scroll_shift; /* The scrollbar stuff can handle only up to 196 32767 lines. When the file is longer, 197 scroll_shift is set to the number of shifts 198 to reduce the count. */ 199 #endif 200 #ifdef FEAT_GUI_MAC 201 ControlHandle id; /* A handle to the scrollbar */ 202 #endif 203 #ifdef FEAT_GUI_PHOTON 204 PtWidget_t *id; 205 #endif 206 } scrollbar_T; 207 208 typedef long guicolor_T; /* handle for a GUI color; for X11 this should 209 be "Pixel", but that's an unsigned and we 210 need a signed value */ 211 #define INVALCOLOR (guicolor_T)-11111 /* number for invalid color; on 32 bit 212 displays there is a tiny chance this is an 213 actual color */ 214 215 #ifdef FEAT_GUI_GTK 216 typedef PangoFontDescription *GuiFont; /* handle for a GUI font */ 217 typedef PangoFontDescription *GuiFontset; /* handle for a GUI fontset */ 218 # define NOFONT (GuiFont)NULL 219 # define NOFONTSET (GuiFontset)NULL 220 #else 221 # ifdef FEAT_GUI_PHOTON 222 typedef char *GuiFont; 223 typedef char *GuiFontset; 224 # define NOFONT (GuiFont)NULL 225 # define NOFONTSET (GuiFontset)NULL 226 # else 227 # ifdef FEAT_GUI_X11 228 typedef XFontStruct *GuiFont; /* handle for a GUI font */ 229 typedef XFontSet GuiFontset; /* handle for a GUI fontset */ 230 # define NOFONT (GuiFont)0 231 # define NOFONTSET (GuiFontset)0 232 # else 233 typedef long_u GuiFont; /* handle for a GUI font */ 234 typedef long_u GuiFontset; /* handle for a GUI fontset */ 235 # define NOFONT (GuiFont)0 236 # define NOFONTSET (GuiFontset)0 237 # endif 238 # endif 239 #endif 240 241 typedef struct Gui 242 { 243 int in_focus; /* Vim has input focus */ 244 int in_use; /* Is the GUI being used? */ 245 int starting; /* GUI will start in a little while */ 246 int shell_created; /* Has the shell been created yet? */ 247 int dying; /* Is vim dying? Then output to terminal */ 248 int dofork; /* Use fork() when GUI is starting */ 249 int dragged_sb; /* Which scrollbar being dragged, if any? */ 250 win_T *dragged_wp; /* Which WIN's sb being dragged, if any? */ 251 int pointer_hidden; /* Is the mouse pointer hidden? */ 252 int col; /* Current cursor column in GUI display */ 253 int row; /* Current cursor row in GUI display */ 254 int cursor_col; /* Physical cursor column in GUI display */ 255 int cursor_row; /* Physical cursor row in GUI display */ 256 char cursor_is_valid; /* There is a cursor at cursor_row/col */ 257 int num_cols; /* Number of columns */ 258 int num_rows; /* Number of rows */ 259 int scroll_region_top; /* Top (first) line of scroll region */ 260 int scroll_region_bot; /* Bottom (last) line of scroll region */ 261 int scroll_region_left; /* Left (first) column of scroll region */ 262 int scroll_region_right; /* Right (last) col. of scroll region */ 263 int highlight_mask; /* Highlight attribute mask */ 264 int scrollbar_width; /* Width of vertical scrollbars */ 265 int scrollbar_height; /* Height of horizontal scrollbar */ 266 int left_sbar_x; /* Calculated x coord for left scrollbar */ 267 int right_sbar_x; /* Calculated x coord for right scrollbar */ 268 269 #ifdef FEAT_MENU 270 # ifndef FEAT_GUI_GTK 271 int menu_height; /* Height of the menu bar */ 272 int menu_width; /* Width of the menu bar */ 273 # endif 274 char menu_is_active; /* TRUE if menu is present */ 275 # ifdef FEAT_GUI_ATHENA 276 char menu_height_fixed; /* TRUE if menu height fixed */ 277 # endif 278 #endif 279 280 scrollbar_T bottom_sbar; /* Bottom scrollbar */ 281 int which_scrollbars[3];/* Which scrollbar boxes are active? */ 282 int prev_wrap; /* For updating the horizontal scrollbar */ 283 int char_width; /* Width of char cell in pixels */ 284 int char_height; /* Height of char cell in pixels, includes 285 'linespace' */ 286 int char_ascent; /* Ascent of char in pixels */ 287 int border_width; /* Width of our border around text area */ 288 int border_offset; /* Total pixel offset for all borders */ 289 290 GuiFont norm_font; /* Normal font */ 291 #ifndef FEAT_GUI_GTK 292 GuiFont bold_font; /* Bold font */ 293 GuiFont ital_font; /* Italic font */ 294 GuiFont boldital_font; /* Bold-Italic font */ 295 #else 296 int font_can_bold; /* Whether norm_font supports bold weight. 297 * The styled font variants are not used. */ 298 #endif 299 300 #if defined(FEAT_MENU) && !defined(FEAT_GUI_GTK) 301 # ifdef FONTSET_ALWAYS 302 GuiFontset menu_fontset; /* set of fonts for multi-byte chars */ 303 # else 304 GuiFont menu_font; /* menu item font */ 305 # endif 306 #endif 307 #ifdef FEAT_MBYTE 308 GuiFont wide_font; /* Normal 'guifontwide' font */ 309 # ifndef FEAT_GUI_GTK 310 GuiFont wide_bold_font; /* Bold 'guifontwide' font */ 311 GuiFont wide_ital_font; /* Italic 'guifontwide' font */ 312 GuiFont wide_boldital_font; /* Bold-Italic 'guifontwide' font */ 313 # endif 314 #endif 315 #ifdef FEAT_XFONTSET 316 GuiFontset fontset; /* set of fonts for multi-byte chars */ 317 #endif 318 guicolor_T back_pixel; /* Color of background */ 319 guicolor_T norm_pixel; /* Color of normal text */ 320 guicolor_T def_back_pixel; /* default Color of background */ 321 guicolor_T def_norm_pixel; /* default Color of normal text */ 322 323 #ifdef FEAT_GUI_X11 324 char *rsrc_menu_fg_name; /* Color of menu & dialog foreground */ 325 guicolor_T menu_fg_pixel; /* Same in Pixel format */ 326 char *rsrc_menu_bg_name; /* Color of menu & dialog background */ 327 guicolor_T menu_bg_pixel; /* Same in Pixel format */ 328 char *rsrc_scroll_fg_name; /* Color of scrollbar foreground */ 329 guicolor_T scroll_fg_pixel; /* Same in Pixel format */ 330 char *rsrc_scroll_bg_name; /* Color of scrollbar background */ 331 guicolor_T scroll_bg_pixel; /* Same in Pixel format */ 332 333 # ifdef FEAT_GUI_MOTIF 334 guicolor_T menu_def_fg_pixel; /* Default menu foreground */ 335 guicolor_T menu_def_bg_pixel; /* Default menu background */ 336 guicolor_T scroll_def_fg_pixel; /* Default scrollbar foreground */ 337 guicolor_T scroll_def_bg_pixel; /* Default scrollbar background */ 338 # endif 339 Display *dpy; /* X display */ 340 Window wid; /* Window id of text area */ 341 int visibility; /* Is shell partially/fully obscured? */ 342 GC text_gc; 343 GC back_gc; 344 GC invert_gc; 345 Cursor blank_pointer; /* Blank pointer */ 346 347 /* X Resources */ 348 char_u *rsrc_font_name; /* Resource font name, used if 'guifont' 349 not set */ 350 char_u *rsrc_bold_font_name; /* Resource bold font name */ 351 char_u *rsrc_ital_font_name; /* Resource italic font name */ 352 char_u *rsrc_boldital_font_name; /* Resource bold-italic font name */ 353 char_u *rsrc_menu_font_name; /* Resource menu Font name */ 354 Bool rsrc_rev_video; /* Use reverse video? */ 355 356 char_u *geom; /* Geometry, eg "80x24" */ 357 Bool color_approx; /* Some color was approximated */ 358 #endif 359 360 #ifdef FEAT_GUI_GTK 361 # ifndef USE_GTK3 362 int visibility; /* Is shell partially/fully obscured? */ 363 # endif 364 GdkCursor *blank_pointer; /* Blank pointer */ 365 366 /* X Resources */ 367 char_u *geom; /* Geometry, eg "80x24" */ 368 369 GtkWidget *mainwin; /* top level GTK window */ 370 GtkWidget *formwin; /* manages all the windows below */ 371 GtkWidget *drawarea; /* the "text" area */ 372 # ifdef FEAT_MENU 373 GtkWidget *menubar; /* menubar */ 374 # endif 375 # ifdef FEAT_TOOLBAR 376 GtkWidget *toolbar; /* toolbar */ 377 # endif 378 # ifdef FEAT_GUI_GNOME 379 GtkWidget *menubar_h; /* menubar handle */ 380 GtkWidget *toolbar_h; /* toolbar handle */ 381 # endif 382 # ifdef USE_GTK3 383 GdkRGBA *fgcolor; /* GDK-styled foreground color */ 384 GdkRGBA *bgcolor; /* GDK-styled background color */ 385 GdkRGBA *spcolor; /* GDK-styled special color */ 386 # else 387 GdkColor *fgcolor; /* GDK-styled foreground color */ 388 GdkColor *bgcolor; /* GDK-styled background color */ 389 GdkColor *spcolor; /* GDK-styled special color */ 390 # endif 391 # ifdef USE_GTK3 392 cairo_surface_t *surface; /* drawarea surface */ 393 gboolean by_signal; /* cause of draw operation */ 394 # else 395 GdkGC *text_gc; /* cached GC for normal text */ 396 # endif 397 PangoContext *text_context; /* the context used for all text */ 398 PangoFont *ascii_font; /* cached font for ASCII strings */ 399 PangoGlyphString *ascii_glyphs; /* cached code point -> glyph map */ 400 # ifdef FEAT_GUI_TABLINE 401 GtkWidget *tabline; /* tab pages line handle */ 402 # endif 403 404 GtkAccelGroup *accel_group; 405 GtkWidget *filedlg; /* file selection dialog */ 406 char_u *browse_fname; /* file name from filedlg */ 407 408 guint32 event_time; 409 #endif /* FEAT_GUI_GTK */ 410 411 #if defined(FEAT_GUI_TABLINE) \ 412 && (defined(FEAT_GUI_W32) || defined(FEAT_GUI_MOTIF) \ 413 || defined(FEAT_GUI_MAC)) 414 int tabline_height; 415 #endif 416 417 #ifdef FEAT_FOOTER 418 int footer_height; /* height of the message footer */ 419 #endif 420 421 #if defined(FEAT_TOOLBAR) \ 422 && (defined(FEAT_GUI_ATHENA) || defined(FEAT_GUI_MOTIF)) 423 int toolbar_height; /* height of the toolbar */ 424 #endif 425 426 #ifdef FEAT_BEVAL_TIP 427 /* Tooltip properties; also used for balloon evaluation */ 428 char_u *rsrc_tooltip_font_name; /* tooltip font name */ 429 char *rsrc_tooltip_fg_name; /* tooltip foreground color name */ 430 char *rsrc_tooltip_bg_name; /* tooltip background color name */ 431 guicolor_T tooltip_fg_pixel; /* tooltip foreground color */ 432 guicolor_T tooltip_bg_pixel; /* tooltip background color */ 433 XFontSet tooltip_fontset; /* tooltip fontset */ 434 #endif 435 436 #ifdef FEAT_GUI_MSWIN 437 GuiFont currFont; /* Current font */ 438 guicolor_T currFgColor; /* Current foreground text color */ 439 guicolor_T currBgColor; /* Current background text color */ 440 guicolor_T currSpColor; /* Current special text color */ 441 #endif 442 443 #ifdef FEAT_GUI_MAC 444 WindowPtr VimWindow; 445 MenuHandle MacOSHelpMenu; /* Help menu provided by the MacOS */ 446 int MacOSHelpItems; /* Nr of help-items supplied by MacOS */ 447 WindowPtr wid; /* Window id of text area */ 448 int visibility; /* Is window partially/fully obscured? */ 449 #endif 450 451 #ifdef FEAT_GUI_PHOTON 452 PtWidget_t *vimWindow; /* PtWindow */ 453 PtWidget_t *vimTextArea; /* PtRaw */ 454 PtWidget_t *vimContainer; /* PtPanel */ 455 # if defined(FEAT_MENU) || defined(FEAT_TOOLBAR) 456 PtWidget_t *vimToolBarGroup; 457 # endif 458 # ifdef FEAT_MENU 459 PtWidget_t *vimMenuBar; 460 # endif 461 # ifdef FEAT_TOOLBAR 462 PtWidget_t *vimToolBar; 463 int toolbar_height; 464 # endif 465 PhEvent_t *event_buffer; 466 #endif 467 468 #ifdef FEAT_XIM 469 char *rsrc_input_method; 470 char *rsrc_preedit_type_name; 471 #endif 472 } gui_T; 473 474 extern gui_T gui; /* this is defined in gui.c */ 475 476 /* definitions of available window positionings for gui_*_position_in_parent() 477 */ 478 typedef enum 479 { 480 VW_POS_MOUSE, 481 VW_POS_CENTER, 482 VW_POS_TOP_CENTER 483 } gui_win_pos_T; 484 485 #ifdef FIND_REPLACE_DIALOG 486 /* 487 * Flags used to distinguish the different contexts in which the 488 * find/replace callback may be called. 489 */ 490 # define FRD_FINDNEXT 1 /* Find next in find dialog */ 491 # define FRD_R_FINDNEXT 2 /* Find next in repl dialog */ 492 # define FRD_REPLACE 3 /* Replace once */ 493 # define FRD_REPLACEALL 4 /* Replace remaining matches */ 494 # define FRD_UNDO 5 /* Undo replaced text */ 495 # define FRD_TYPE_MASK 7 /* Mask for the callback type */ 496 /* Flags which change the way searching is done. */ 497 # define FRD_WHOLE_WORD 0x08 /* match whole word only */ 498 # define FRD_MATCH_CASE 0x10 /* match case */ 499 #endif 500 501 #ifdef FEAT_GUI_GTK 502 /* 503 * Convenience macros to convert from 'encoding' to 'termencoding' and 504 * vice versa. If no conversion is necessary the passed-in pointer is 505 * returned as is, without allocating any memory. Thus additional _FREE() 506 * macros are provided. The _FREE() macros also set the pointer to NULL, 507 * in order to avoid bugs due to illegal memory access only happening if 508 * 'encoding' != utf-8... 509 * 510 * Defining these macros as pure expressions looks a bit tricky but 511 * avoids depending on the context of the macro expansion. One of the 512 * rare occasions where the comma operator comes in handy :) 513 * 514 * Note: Do NOT keep the result around when handling control back to 515 * the main Vim! The user could change 'encoding' at any time. 516 */ 517 # define CONVERT_TO_UTF8(String) \ 518 ((output_conv.vc_type == CONV_NONE || (String) == NULL) \ 519 ? (String) \ 520 : string_convert(&output_conv, (String), NULL)) 521 522 # define CONVERT_TO_UTF8_FREE(String) \ 523 ((String) = ((output_conv.vc_type == CONV_NONE) \ 524 ? (char_u *)NULL \ 525 : (vim_free(String), (char_u *)NULL))) 526 527 # define CONVERT_FROM_UTF8(String) \ 528 ((input_conv.vc_type == CONV_NONE || (String) == NULL) \ 529 ? (String) \ 530 : string_convert(&input_conv, (String), NULL)) 531 532 # define CONVERT_FROM_UTF8_FREE(String) \ 533 ((String) = ((input_conv.vc_type == CONV_NONE) \ 534 ? (char_u *)NULL \ 535 : (vim_free(String), (char_u *)NULL))) 536 537 #else 538 # define CONVERT_TO_UTF8(String) (String) 539 # define CONVERT_TO_UTF8_FREE(String) ((String) = (char_u *)NULL) 540 # define CONVERT_FROM_UTF8(String) (String) 541 # define CONVERT_FROM_UTF8_FREE(String) ((String) = (char_u *)NULL) 542 #endif /* FEAT_GUI_GTK */ 543 544 #ifdef FEAT_GUI_GTK 545 /* 546 * The second parameter of g_signal_handlers_disconnect_by_func() is supposed 547 * to be a function pointer which was passed to g_signal_connect_*() somewhere 548 * previously, and hence it must be of type GCallback, i.e., void (*)(void). 549 * 550 * Meanwhile, g_signal_handlers_disconnect_by_func() is a macro calling 551 * g_signal_handlers_disconnect_matched(), and the second parameter of the 552 * former is to be passed to the sixth parameter of the latter the type of 553 * which, however, is declared as void * in the function signature. 554 * 555 * While the ISO C Standard does not require that function pointers be 556 * interconvertible to void *, widely-used compilers such as gcc and clang 557 * do such conversion implicitly and automatically on some platforms without 558 * issuing any warning. 559 * 560 * For Solaris Studio, that is not the case. An explicit type cast is needed 561 * to suppress warnings on that particular conversion. 562 */ 563 # if defined(__SUNPRO_C) && defined(USE_GTK3) 564 # define FUNC2GENERIC(func) (void *)(func) 565 # else 566 # define FUNC2GENERIC(func) G_CALLBACK(func) 567 # endif 568 #endif /* FEAT_GUI_GTK */ 569