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