diff options
author | Bram Moolenaar <Bram@vim.org> | 2010-05-22 18:28:27 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2010-05-22 18:28:27 +0200 |
commit | 67c53844343011089e1b847200b5c5257a83e1c4 (patch) | |
tree | 8f1c5bfe10864b7e49a8bc62ce12b1db449803da /src | |
parent | ca7e1f2066e3518ee6caeef32e499ab954ec05a3 (diff) |
Included the patch to support netbeans in a terminal.
Diffstat (limited to 'src')
-rw-r--r-- | src/edit.c | 3 | ||||
-rw-r--r-- | src/ex_cmds.c | 4 | ||||
-rw-r--r-- | src/feature.h | 6 | ||||
-rw-r--r-- | src/getchar.c | 3 | ||||
-rw-r--r-- | src/gui.c | 12 | ||||
-rw-r--r-- | src/gui_gtk_x11.c | 3 | ||||
-rw-r--r-- | src/gui_w48.c | 5 | ||||
-rw-r--r-- | src/gui_x11.c | 6 | ||||
-rw-r--r-- | src/main.c | 34 | ||||
-rw-r--r-- | src/netbeans.c | 357 | ||||
-rw-r--r-- | src/os_unix.c | 70 | ||||
-rw-r--r-- | src/proto.h | 18 | ||||
-rw-r--r-- | src/proto/netbeans.pro | 4 |
13 files changed, 314 insertions, 211 deletions
diff --git a/src/edit.c b/src/edit.c index 88943cd7f4..a80f19607a 100644 --- a/src/edit.c +++ b/src/edit.c @@ -9433,8 +9433,7 @@ ins_tab() #ifdef FEAT_NETBEANS_INTG if (usingNetbeans) { - netbeans_removed(curbuf, fpos.lnum, cursor->col, - (long)(i + 1)); + netbeans_removed(curbuf, fpos.lnum, cursor->col, (long)(i + 1)); netbeans_inserted(curbuf, fpos.lnum, cursor->col, (char_u *)"\t", 1); } diff --git a/src/ex_cmds.c b/src/ex_cmds.c index 1f9a7f2173..bcbcc8ba66 100644 --- a/src/ex_cmds.c +++ b/src/ex_cmds.c @@ -3815,10 +3815,10 @@ do_ecmd(fnum, ffname, sfname, eap, newlnum, flags, oldwin) DO_AUTOCHDIR #if defined(FEAT_SUN_WORKSHOP) || defined(FEAT_NETBEANS_INTG) - if (gui.in_use && curbuf->b_ffname != NULL) + if (curbuf->b_ffname != NULL) { # ifdef FEAT_SUN_WORKSHOP - if (usingSunWorkShop) + if (gui.in_use && usingSunWorkShop) workshop_file_opened((char *)curbuf->b_ffname, curbuf->b_p_ro); # endif # ifdef FEAT_NETBEANS_INTG diff --git a/src/feature.h b/src/feature.h index 4568ffc1de..6b8f600ec0 100644 --- a/src/feature.h +++ b/src/feature.h @@ -1193,11 +1193,9 @@ #endif /* - * The Netbeans features currently only work with Motif and GTK and Win32. - * It also requires +listcmds and +eval. + * The Netbeans feature requires +listcmds and +eval. */ -#if ((!defined(FEAT_GUI_MOTIF) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_W32)) \ - || !defined(FEAT_LISTCMDS) || !defined(FEAT_EVAL)) \ +#if (!defined(FEAT_LISTCMDS) || !defined(FEAT_EVAL)) \ && defined(FEAT_NETBEANS_INTG) # undef FEAT_NETBEANS_INTG #endif diff --git a/src/getchar.c b/src/getchar.c index d28eef5f07..ca0cca7318 100644 --- a/src/getchar.c +++ b/src/getchar.c @@ -2941,7 +2941,8 @@ inchar(buf, maxlen, wait_time, tb_change_cnt) #if defined(FEAT_NETBEANS_INTG) /* Process the queued netbeans messages. */ - netbeans_parse_messages(); + if (usingNetbeans) + netbeans_parse_messages(); #endif if (got_int || (script_char = getc(scriptin[curscript])) < 0) @@ -593,11 +593,6 @@ gui_init() gui_mch_disable_beval_area(balloonEval); #endif -#ifdef FEAT_NETBEANS_INTG - if (starting == 0 && usingNetbeans) - /* Tell the client that it can start sending commands. */ - netbeans_startup_done(); -#endif #if defined(FEAT_XIM) && defined(FEAT_GUI_GTK) if (!im_xim_isvalid_imactivate()) EMSG(_("E599: Value of 'imactivatekey' is invalid")); @@ -2367,7 +2362,8 @@ gui_outstr_nowrap(s, len, flags, fg, bg, back) if (draw_sign) /* Draw the sign on top of the spaces. */ gui_mch_drawsign(gui.row, col, gui.highlight_mask); -# ifdef FEAT_NETBEANS_INTG +# if defined(FEAT_NETBEANS_INTG) && (defined(FEAT_GUI_MOTIF) \ + || defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32)) if (multi_sign) netbeans_draw_multisign_indicator(gui.row); # endif @@ -4784,6 +4780,10 @@ ex_gui(eap) * of the argument ending up after the shell prompt. */ msg_clr_eos_force(); gui_start(); +#ifdef FEAT_NETBEANS_INTG + if (usingNetbeans) + netbeans_gui_register(); +#endif } if (!ends_excmd(*eap->arg)) ex_next(eap); diff --git a/src/gui_gtk_x11.c b/src/gui_gtk_x11.c index baaed59ba2..4caf0bbeaf 100644 --- a/src/gui_gtk_x11.c +++ b/src/gui_gtk_x11.c @@ -6596,7 +6596,8 @@ gui_mch_wait_for_chars(long wtime) #if defined(FEAT_NETBEANS_INTG) /* Process the queued netbeans messages. */ - netbeans_parse_messages(); + if (usingNetbeans) + netbeans_parse_messages(); #endif /* diff --git a/src/gui_w48.c b/src/gui_w48.c index 477acfa94e..b1ea5687d0 100644 --- a/src/gui_w48.c +++ b/src/gui_w48.c @@ -1732,7 +1732,7 @@ process_message(void) #ifdef FEAT_NETBEANS_INTG if (msg.message == WM_NETBEANS) { - messageFromNetbeansW32(); + netbeans_read(); return; } #endif @@ -1999,7 +1999,8 @@ gui_mch_wait_for_chars(int wtime) #ifdef FEAT_NETBEANS_INTG /* Process the queued netbeans messages. */ - netbeans_parse_messages(); + if (usingNetbeans) + netbeans_parse_messages(); #endif /* diff --git a/src/gui_x11.c b/src/gui_x11.c index 4110fc69d7..522f92336a 100644 --- a/src/gui_x11.c +++ b/src/gui_x11.c @@ -635,8 +635,8 @@ gui_x11_expose_cb(w, dud, event, dum) gui_mch_update(); } -#if (defined(FEAT_NETBEANS_INTG) || defined(FEAT_SUN_WORKSHOP)) \ - || defined(PROTO) +#if ((defined(FEAT_NETBEANS_INTG) || defined(FEAT_SUN_WORKSHOP)) \ + && defined(FEAT_GUI_MOTIF)) || defined(PROTO) /* * This function fills in the XRectangle object with the current x,y * coordinates and height, width so that an XtVaSetValues to the same shell of @@ -709,7 +709,7 @@ gui_x11_resize_window_cb(w, dud, event, dum) workshop_frame_moved(rec.x, rec.y, rec.width, rec.height); } #endif -#ifdef FEAT_NETBEANS_INTG +#if defined(FEAT_NETBEANS_INTG) && defined(FEAT_GUI_MOTIF) if (usingNetbeans) { XRectangle rec; diff --git a/src/main.c b/src/main.c index b9e92094ed..14921ff30f 100644 --- a/src/main.c +++ b/src/main.c @@ -528,10 +528,6 @@ main * Set the default values for the options that use Rows and Columns. */ ui_get_shellsize(); /* inits Rows and Columns */ -#ifdef FEAT_NETBEANS_INTG - if (usingNetbeans) - Columns += 2; /* leave room for glyph gutter */ -#endif win_init_size(); #ifdef FEAT_DIFF /* Set the 'diff' option now, so that it can be checked for in a .vimrc @@ -937,8 +933,20 @@ main #ifdef FEAT_NETBEANS_INTG if (usingNetbeans) + { +# ifdef FEAT_GUI +# if !defined(FEAT_GUI_MOTIF) && !defined(FEAT_GUI_GTK) \ + && !defined(FEAT_GUI_W32) + if (gui.in_use) + { + mch_errmsg(_("netbeans is not supported with this GUI\n")); + mch_exit(2); + } +# endif +# endif /* Tell the client that it can start sending commands. */ netbeans_startup_done(); + } #endif TIME_MSG("before starting main loop"); @@ -1616,10 +1624,10 @@ early_arg_scan(parmp) # endif # ifndef FEAT_NETBEANS_INTG else if (strncmp(argv[i], "-nb", (size_t)3) == 0) - { - mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n")); - mch_exit(2); - } + { + mch_errmsg(_("'-nb' cannot be used: not enabled at compile time\n")); + mch_exit(2); + } # endif } @@ -1879,6 +1887,16 @@ command_line_scan(parmp) break; case 'n': /* "-n" no swap file */ +#ifdef FEAT_NETBEANS_INTG + /* checking for "-nb", netbeans parameters */ + if (argv[0][argv_idx] == 'b') + { + ++usingNetbeans; + netbeansArg = argv[0]; + argv_idx = -1; /* skip to next argument */ + } + else +#endif parmp->no_swap_file = TRUE; break; diff --git a/src/netbeans.c b/src/netbeans.c index 93a9aea755..f1bae5991e 100644 --- a/src/netbeans.c +++ b/src/netbeans.c @@ -61,10 +61,11 @@ #define GUARDED 10000 /* typenr for "guarded" annotation */ #define GUARDEDOFFSET 1000000 /* base for "guarded" sign id's */ +#define MAX_COLOR_LENGTH 32 /* max length of color name in defineAnnoType */ /* The first implementation (working only with Netbeans) returned "1.1". The * protocol implemented here also supports A-A-P. */ -static char *ExtEdProtocolVersion = "2.4"; +static char *ExtEdProtocolVersion = "2.5"; static long pos2off __ARGS((buf_T *, pos_T *)); static pos_T *off2pos __ARGS((buf_T *, long)); @@ -90,6 +91,11 @@ static void nb_parse_cmd __ARGS((char_u *)); static int nb_do_cmd __ARGS((int, char_u *, int, int, char_u *)); static void nb_send __ARGS((char *buf, char *fun)); +/* TRUE when netbeans is running with a GUI. */ +#ifdef FEAT_GUI +# define NB_HAS_GUI (gui.in_use || gui.starting) +#endif + #ifdef WIN64 typedef __int64 NBSOCK; #else @@ -110,16 +116,6 @@ extern HWND s_hwnd; /* Gvim's Window handle */ static int r_cmdno; /* current command number for reply */ static int haveConnection = FALSE; /* socket is connected and initialization is done */ -#ifdef FEAT_GUI_MOTIF -static void netbeans_Xt_connect __ARGS((void *context)); -#endif -#ifdef FEAT_GUI_GTK -static void netbeans_gtk_connect __ARGS((void)); -#endif -#ifdef FEAT_GUI_W32 -static void netbeans_w32_connect __ARGS((void)); -#endif - static int dosetvisible = FALSE; /* @@ -130,101 +126,39 @@ static int dosetvisible = FALSE; #endif /* Connect back to Netbeans process */ -#ifdef FEAT_GUI_MOTIF - static void -netbeans_Xt_connect(void *context) -{ - netbeans_connect(); - if (sd > 0) - { - /* tell notifier we are interested in being called - * when there is input on the editor connection socket - */ - inputHandler = XtAppAddInput((XtAppContext)context, sd, - (XtPointer)(XtInputReadMask + XtInputExceptMask), - messageFromNetbeans, NULL); - } -} - static void netbeans_disconnect(void) { +#ifdef FEAT_GUI_MOTIF if (inputHandler != (XtInputId)NULL) { XtRemoveInput(inputHandler); inputHandler = (XtInputId)NULL; } - sd = -1; - haveConnection = FALSE; -# ifdef FEAT_BEVAL - bevalServers &= ~BEVAL_NETBEANS; -# endif -} -#endif /* FEAT_MOTIF_GUI */ - -#ifdef FEAT_GUI_GTK - static void -netbeans_gtk_connect(void) -{ - netbeans_connect(); - if (sd > 0) - { - /* - * Tell gdk we are interested in being called when there - * is input on the editor connection socket - */ - inputHandler = gdk_input_add((gint)sd, (GdkInputCondition) - ((int)GDK_INPUT_READ + (int)GDK_INPUT_EXCEPTION), - messageFromNetbeans, NULL); - } -} - - static void -netbeans_disconnect(void) -{ +#else +# ifdef FEAT_GUI_GTK if (inputHandler != 0) { gdk_input_remove(inputHandler); inputHandler = 0; } - sd = -1; - haveConnection = FALSE; -# ifdef FEAT_BEVAL - bevalServers &= ~BEVAL_NETBEANS; -# endif -} -#endif /* FEAT_GUI_GTK */ - -#if defined(FEAT_GUI_W32) || defined(PROTO) - static void -netbeans_w32_connect(void) -{ - netbeans_connect(); - if (sd > 0) - { - /* - * Tell Windows we are interested in receiving message when there - * is input on the editor connection socket - */ - inputHandler = WSAAsyncSelect(sd, s_hwnd, WM_NETBEANS, FD_READ); - } -} - - static void -netbeans_disconnect(void) -{ +# else +# ifdef FEAT_GUI_W32 if (inputHandler == 0) { WSAAsyncSelect(sd, s_hwnd, 0, 0); inputHandler = -1; } +# endif +# endif +#endif + sd = -1; haveConnection = FALSE; -# ifdef FEAT_BEVAL +#ifdef FEAT_BEVAL bevalServers &= ~BEVAL_NETBEANS; -# endif +#endif } -#endif /* FEAT_GUI_W32 */ #define NB_DEF_HOST "localhost" #define NB_DEF_ADDR "3219" @@ -240,7 +174,7 @@ netbeans_connect(void) u_short port; # else int port; -#endif +# endif #else struct sockaddr_un server; #endif @@ -709,31 +643,35 @@ netbeans_parse_messages(void) #define MAXMSGSIZE 4096 /* - * Read and process a command from netbeans. + * Read a command from netbeans. */ -#if defined(FEAT_GUI_W32) || defined(PROTO) -/* Use this one when generating prototypes, the others are static. */ - void -messageFromNetbeansW32() -#else -# ifdef FEAT_GUI_MOTIF +#ifdef FEAT_GUI_MOTIF static void messageFromNetbeans(XtPointer clientData UNUSED, int *unused1 UNUSED, XtInputId *unused2 UNUSED) -# endif -# ifdef FEAT_GUI_GTK +{ + netbeans_read(); +} +#endif + +#ifdef FEAT_GUI_GTK static void messageFromNetbeans(gpointer clientData UNUSED, gint unused1 UNUSED, GdkInputCondition unused2 UNUSED) -# endif +{ + netbeans_read(); +} #endif + + void +netbeans_read() { static char_u *buf = NULL; int len = 0; int readlen = 0; -#ifndef FEAT_GUI_GTK +#if defined(NB_HAS_GUI) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_W32) static int level = 0; #endif #ifdef HAVE_SELECT @@ -751,8 +689,11 @@ messageFromNetbeans(gpointer clientData UNUSED, return; } -#ifndef FEAT_GUI_GTK - ++level; /* recursion guard; this will be called from the X event loop */ +#if defined(NB_HAS_GUI) && !defined(FEAT_GUI_GTK) && !defined(FEAT_GUI_W32) + /* recursion guard; this will be called from the X event loop at unknown + * moments */ + if (NB_HAS_GUI) + ++level; #endif /* Allocate a buffer to read into. */ @@ -770,17 +711,17 @@ messageFromNetbeans(gpointer clientData UNUSED, { #ifdef HAVE_SELECT FD_ZERO(&rfds); - FD_SET(sd, &rfds); - tval.tv_sec = 0; - tval.tv_usec = 0; - if (select(sd + 1, &rfds, NULL, NULL, &tval) <= 0) - break; + FD_SET(sd, &rfds); + tval.tv_sec = 0; + tval.tv_usec = 0; + if (select(sd + 1, &rfds, NULL, NULL, &tval) <= 0) + break; #else # ifdef HAVE_POLL fds.fd = sd; fds.events = POLLIN; - if (poll(&fds, 1, 0) <= 0) - break; + if (poll(&fds, 1, 0) <= 0) + break; # endif #endif len = sock_read(sd, buf, MAXMSGSIZE); @@ -807,18 +748,21 @@ messageFromNetbeans(gpointer clientData UNUSED, return; /* don't try to parse it */ } -#if defined(FEAT_GUI_GTK) || defined(FEAT_GUI_W32) +#if defined(NB_HAS_GUI) && !defined(FEAT_GUI_W32) /* Let the main loop handle messages. */ + if (NB_HAS_GUI) + { # ifdef FEAT_GUI_GTK - if (gtk_main_level() > 0) - gtk_main_quit(); -# endif -#else - /* Parse the messages now, but avoid recursion. */ - if (level == 1) - netbeans_parse_messages(); + if (gtk_main_level() > 0) + gtk_main_quit(); +# else + /* Parse the messages now, but avoid recursion. */ + if (level == 1) + netbeans_parse_messages(); - --level; + --level; +# endif + } #endif } @@ -945,7 +889,7 @@ static int globalsignmapused; static int mapsigntype __ARGS((nbbuf_T *, int localsigntype)); static void addsigntype __ARGS((nbbuf_T *, int localsigntype, char_u *typeName, char_u *tooltip, char_u *glyphfile, - int usefg, int fg, int usebg, int bg)); + char_u *fg, char_u *bg)); static void print_read_msg __ARGS((nbbuf_T *buf)); static void print_save_msg __ARGS((nbbuf_T *buf, long nchars)); @@ -1848,7 +1792,9 @@ nb_do_cmd( buf->bufp = curbuf; maketitle(); buf->insertDone = FALSE; +#if defined(FEAT_MENU) && defined(FEAT_GUI) gui_update_menus(0); +#endif /* =====================================================================*/ } else if (streq((char *)cmd, "insertDone")) @@ -2012,7 +1958,9 @@ nb_do_cmd( netbeansReadFile = 1; buf->bufp = curbuf; maketitle(); +#if defined(FEAT_MENU) && defined(FEAT_GUI) gui_update_menus(0); +#endif /* =====================================================================*/ } else if (streq((char *)cmd, "editFile")) @@ -2034,7 +1982,9 @@ nb_do_cmd( #if defined(FEAT_TITLE) maketitle(); #endif +#if defined(FEAT_MENU) && defined(FEAT_GUI) gui_update_menus(0); +#endif /* =====================================================================*/ } else if (streq((char *)cmd, "setVisible")) @@ -2058,17 +2008,21 @@ nb_do_cmd( doupdate = 1; dosetvisible = FALSE; +#ifdef FEAT_GUI /* Side effect!!!. */ if (!gui.starting) gui_mch_set_foreground(); +#endif } /* =====================================================================*/ } else if (streq((char *)cmd, "raise")) { +#ifdef FEAT_GUI /* Bring gvim to the foreground. */ if (!gui.starting) gui_mch_set_foreground(); +#endif /* =====================================================================*/ } else if (streq((char *)cmd, "setModified")) @@ -2199,8 +2153,10 @@ nb_do_cmd( update_screen(VALID); setcursor(); out_flush(); +#ifdef FEAT_GUI gui_update_cursor(TRUE, FALSE); gui_mch_flush(); +#endif /* Quit a hit-return or more prompt. */ if (State == HITRETURN || State == ASKMORE) { @@ -2237,7 +2193,9 @@ nb_do_cmd( EMSG("E649: invalid buffer identifier in close"); } nbdebug((" CLOSE %d: %s\n", bufno, name)); +#ifdef FEAT_GUI need_mouse_correct = TRUE; +#endif if (buf->bufp != NULL) do_buffer(DOBUF_WIPE, DOBUF_FIRST, FORWARD, buf->bufp->b_fnum, TRUE); @@ -2264,10 +2222,9 @@ nb_do_cmd( char_u *tooltip; char_u *p; char_u *glyphFile; - int use_fg = 0; - int use_bg = 0; - int fg = -1; - int bg = -1; + int parse_error = FALSE; + char_u *fg; + char_u *bg; if (buf == NULL) { @@ -2290,33 +2247,32 @@ nb_do_cmd( vim_free(p); args = skipwhite(args + 1); - if (STRNCMP(args, "none", 4) == 0) - args += 5; - else + p = skiptowhite(args); + if (*p != NUL) { - use_fg = 1; - cp = (char *)args; - fg = strtol(cp, &cp, 10); - args = (char_u *)cp; + *p = NUL; + p = skipwhite(p + 1); } - if (STRNCMP(args, "none", 4) == 0) - args += 5; - else + fg = vim_strsave(args); + bg = vim_strsave(p); + if (STRLEN(fg) > MAX_COLOR_LENGTH || STRLEN(bg) > MAX_COLOR_LENGTH) { - use_bg = 1; - cp = (char *)args; - bg = strtol(cp, &cp, 10); - args = (char_u *)cp; + EMSG("E532: highlighting color name too long in defineAnnoType"); + vim_free(typeName); + parse_error = TRUE; } - if (typeName != NULL && tooltip != NULL && glyphFile != NULL) - addsigntype(buf, typeNum, typeName, tooltip, glyphFile, - use_fg, fg, use_bg, bg); + else if (typeName != NULL && tooltip != NULL && glyphFile != NULL) + addsigntype(buf, typeNum, typeName, tooltip, glyphFile, fg, bg); else vim_free(typeName); /* don't free typeName; it's used directly in addsigntype() */ + vim_free(fg); + vim_free(bg); vim_free(tooltip); vim_free(glyphFile); + if (parse_error) + return FAIL; #endif /* =====================================================================*/ @@ -2588,8 +2544,10 @@ nb_do_cmd( update_screen(NOT_VALID); setcursor(); out_flush(); +#ifdef FEAT_GUI gui_update_cursor(TRUE, FALSE); gui_mch_flush(); +#endif /* Quit a hit-return or more prompt. */ if (State == HITRETURN || State == ASKMORE) { @@ -2638,8 +2596,10 @@ coloncmd(char *cmd, ...) setcursor(); /* restore the cursor position */ out_flush(); /* make sure output has been written */ +#ifdef FEAT_GUI gui_update_cursor(TRUE, FALSE); gui_mch_flush(); +#endif } @@ -2707,7 +2667,8 @@ nb_init_graphics(void) if (!did_init) { - coloncmd(":highlight NBGuarded guibg=Cyan guifg=Black"); + coloncmd(":highlight NBGuarded guibg=Cyan guifg=Black" + " ctermbg=LightCyan ctermfg=Black"); coloncmd(":sign define %d linehl=NBGuarded", GUARDED); did_init = TRUE; @@ -2785,7 +2746,7 @@ netbeans_keyname(int key, char *buf) strcat(buf, name); } -#ifdef FEAT_BEVAL +#if defined(FEAT_BEVAL) || defined(PROTO) /* * Function to be called for balloon evaluation. Grabs the text under the * cursor and sends it to the debugger for evaluation. The debugger should @@ -2830,31 +2791,79 @@ netbeans_beval_cb( #endif /* - * Tell netbeans that the window was opened, ready for commands. + * Return netbeans file descriptor. + */ + int +netbeans_filedesc (void) +{ + return sd; +} + +#if defined(FEAT_GUI) || defined(PROTO) +/* + * Register our file descriptor with the gui event handling system. */ void -netbeans_startup_done(void) +netbeans_gui_register(void) { - char *cmd = "0:startupDone=0\n"; + if (!NB_HAS_GUI) + return; - if (usingNetbeans) -#ifdef FEAT_GUI_MOTIF - netbeans_Xt_connect(app_context); -#else -# ifdef FEAT_GUI_GTK - netbeans_gtk_connect(); + if (sd > 0) + { +# ifdef FEAT_GUI_MOTIF + /* tell notifier we are interested in being called + * when there is input on the editor connection socket + */ + if (inputHandler == (XtInputId)NULL) + inputHandler = XtAppAddInput((XtAppContext)app_context, sd, + (XtPointer)(XtInputReadMask + XtInputExceptMask), + messageFromNetbeans, NULL); # else -# ifdef FEAT_GUI_W32 - netbeans_w32_connect(); +# ifdef FEAT_GUI_GTK + /* + * Tell gdk we are interested in being called when there + * is input on the editor connection socket + */ + if (inputHandler == 0) + inputHandler = gdk_input_add((gint)sd, (GdkInputCondition) + ((int)GDK_INPUT_READ + (int)GDK_INPUT_EXCEPTION), + messageFromNetbeans, NULL); +# else +# ifdef FEAT_GUI_W32 + /* + * Tell Windows we are interested in receiving message when there + * is input on the editor connection socket + */ + if (inputHandler == -1) + inputHandler = WSAAsyncSelect(sd, s_hwnd, WM_NETBEANS, FD_READ); +# endif # endif # endif + } + +# ifdef FEAT_BEVAL + bevalServers |= BEVAL_NETBEANS; +# endif +} #endif - if (!haveConnection) +/* + * Tell netbeans that the window was opened, ready for commands. + */ + void +netbeans_startup_done(void) +{ + char *cmd = "0:startupDone=0\n"; + + if (!usingNetbeans) return; -#ifdef FEAT_BEVAL - bevalServers |= BEVAL_NETBEANS; + netbeans_connect(); + if (!haveConnection) + return; +#ifdef FEAT_GUI + netbeans_gui_register(); #endif nbdebug(("EVT: %s", cmd)); @@ -3144,7 +3153,7 @@ netbeans_button_release(int button) if (bufno >= 0 && curwin != NULL && curwin->w_buffer == curbuf) { int col = mouse_col - W_WINCOL(curwin) - - ((curwin->w_p_nu || curwin->w_p_rnu) ? 9 : 1); + - ((curwin->w_p_nu || curwin->w_p_rnu) ? 9 : 1); long off = pos2off(curbuf, &curwin->w_cursor); /* sync the cursor position */ @@ -3404,7 +3413,6 @@ netbeans_gutter_click(linenr_T lnum) } } - /* * Add a sign of the requested type at the requested location. * @@ -3427,14 +3435,12 @@ addsigntype( char_u *typeName, char_u *tooltip UNUSED, char_u *glyphFile, - int use_fg, - int fg, - int use_bg, - int bg) + char_u *fg, + char_u *bg) { - char fgbuf[32]; - char bgbuf[32]; int i, j; + int use_fg = (*fg && STRCMP(fg, "none") != 0); + int use_bg = (*bg && STRCMP(bg, "none") != 0); for (i = 0; i < globalsignmapused; i++) if (STRCMP(typeName, globalsignmap[i]) == 0) @@ -3442,12 +3448,26 @@ addsigntype( if (i == globalsignmapused) /* not found; add it to global map */ { - nbdebug(("DEFINEANNOTYPE(%d,%s,%s,%s,%d,%d)\n", + nbdebug(("DEFINEANNOTYPE(%d,%s,%s,%s,%s,%s)\n", typeNum, typeName, tooltip, glyphFile, fg, bg)); if (use_fg || use_bg) { - sprintf(fgbuf, "guifg=#%06x", fg & 0xFFFFFF); - sprintf(bgbuf, "guibg=#%06x", bg & 0xFFFFFF); + char fgbuf[2 * (8 + MAX_COLOR_LENGTH) + 1]; + char bgbuf[2 * (8 + MAX_COLOR_LENGTH) + 1]; + char *ptr; + int value; + + value = strtol((char *)fg, &ptr, 10); + if (ptr != (char *)fg) + sprintf(fgbuf, "guifg=#%06x", value & 0xFFFFFF); + else + sprintf(fgbuf, "guifg=%s ctermfg=%s", fg, fg); + + value = strtol((char *)bg, &ptr, 10); + if (ptr != (char *)bg) + sprintf(bgbuf, "guibg=#%06x", value & 0xFFFFFF); + else + sprintf(bgbuf, "guibg=%s ctermbg=%s", bg, bg); coloncmd(":highlight NB_%s %s %s", typeName, (use_fg) ? fgbuf : "", (use_bg) ? bgbuf : ""); @@ -3674,7 +3694,8 @@ print_read_msg(buf) } if (!buf->bufp->b_start_eol) { - STRCAT(IObuff, shortmess(SHM_LAST) ? _("[noeol]") : _("[Incomplete last line]")); + STRCAT(IObuff, shortmess(SHM_LAST) ? _("[noeol]") + : _("[Incomplete last line]")); c = TRUE; } msg_add_lines(c, (long)lnum, nchars); @@ -3689,8 +3710,9 @@ print_read_msg(buf) /* - * Print a message after NetBeans writes the file. This message should be identical - * to the standard message a non-netbeans user would see when writing a file. + * Print a message after NetBeans writes the file. This message should be + * identical to the standard message a non-netbeans user would see when + * writing a file. */ static void print_save_msg(buf, nchars) @@ -3702,7 +3724,8 @@ print_save_msg(buf, nchars) if (nchars >= 0) { - msg_add_fname(buf->bufp, buf->bufp->b_ffname); /* fname in IObuff with quotes */ + /* put fname in IObuff with quotes */ + msg_add_fname(buf->bufp, buf->bufp->b_ffname); c = FALSE; msg_add_lines(c, buf->bufp->b_ml.ml_line_count, diff --git a/src/os_unix.c b/src/os_unix.c index 5e11eea3f9..5059ab152c 100644 --- a/src/os_unix.c +++ b/src/os_unix.c @@ -220,7 +220,7 @@ typedef struct { SmcConn smcconn; /* The SM connection ID */ IceConn iceconn; /* The ICE connection ID */ - char *clientid; /* The client ID for the current smc session */ + char *clientid; /* The client ID for the current smc session */ Bool save_yourself; /* If we're in the middle of a save_yourself */ Bool shutdown; /* If we're in shutdown mode */ } xsmp_config_T; @@ -366,6 +366,12 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt) { int len; +#ifdef FEAT_NETBEANS_INTG + /* Process the queued netbeans messages. */ + if (usingNetbeans) + netbeans_parse_messages(); +#endif + /* Check if window changed size while we were busy, perhaps the ":set * columns=99" command was used. */ while (do_resize) @@ -378,6 +384,11 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt) if (!do_resize) /* return if not interrupted by resize */ return 0; handle_resize(); +#ifdef FEAT_NETBEANS_INTG + /* Process the queued netbeans messages. */ + if (usingNetbeans) + netbeans_parse_messages(); +#endif } } else /* wtime == -1 */ @@ -407,12 +418,22 @@ mch_inchar(buf, maxlen, wtime, tb_change_cnt) { while (do_resize) /* window changed size */ handle_resize(); + +#ifdef FEAT_NETBEANS_INTG + /* Process the queued netbeans messages. */ + if (usingNetbeans) + netbeans_parse_messages(); +#endif /* * we want to be interrupted by the winch signal + * or by an event on the monitored file descriptors */ - WaitForChar(-1L); - if (do_resize) /* interrupted by SIGWINCH signal */ - continue; + if (WaitForChar(-1L) == 0) + { + if (do_resize) /* interrupted by SIGWINCH signal */ + handle_resize(); + return 0; + } /* If input was put directly in typeahead buffer bail out here. */ if (typebuf_changed(tb_change_cnt)) @@ -1324,7 +1345,7 @@ catch_signals(func_deadly, func_other) * return TRUE * "when" == SIGNAL_BLOCK: Going to be busy, block signals * "when" == SIGNAL_UNBLOCK: Going to wait, unblock signals, use postponed - * signal + * signal * Returns TRUE when Vim should exit. */ int @@ -4766,6 +4787,9 @@ RealWaitForChar(fd, msec, check_for_gpm) int *check_for_gpm UNUSED; { int ret; +#ifdef FEAT_NETBEANS_INTG + int nb_fd = (usingNetbeans ? netbeans_filedesc() : -1); +#endif #if defined(FEAT_XCLIPBOARD) || defined(USE_XSMP) || defined(FEAT_MZSCHEME) static int busy = FALSE; @@ -4815,7 +4839,7 @@ RealWaitForChar(fd, msec, check_for_gpm) # endif #endif #ifndef HAVE_SELECT - struct pollfd fds[5]; + struct pollfd fds[6]; int nfd; # ifdef FEAT_XCLIPBOARD int xterm_idx = -1; @@ -4826,6 +4850,9 @@ RealWaitForChar(fd, msec, check_for_gpm) # ifdef USE_XSMP int xsmp_idx = -1; # endif +# ifdef FEAT_NETBEANS_INTG + int nb_idx = -1; +# endif int towait = (int)msec; # ifdef FEAT_MZSCHEME @@ -4876,6 +4903,15 @@ RealWaitForChar(fd, msec, check_for_gpm) nfd++; } # endif +#ifdef FEAT_NETBEANS_INTG + if (nb_fd != -1) + { + nb_idx = nfd; + fds[nfd].fd = nb_fd; + fds[nfd].events = POLLIN; + nfd++; + } +#endif ret = poll(fds, nfd, towait); # ifdef FEAT_MZSCHEME @@ -4929,6 +4965,13 @@ RealWaitForChar(fd, msec, check_for_gpm) finished = FALSE; /* Try again */ } # endif +#ifdef FEAT_NETBEANS_INTG + if (ret > 0 && nb_idx != -1 && fds[nb_idx].revents & POLLIN) + { + netbeans_read(); + --ret; + } +#endif #else /* HAVE_SELECT */ @@ -5010,6 +5053,14 @@ RealWaitForChar(fd, msec, check_for_gpm) maxfd = xsmp_icefd; } # endif +#ifdef FEAT_NETBEANS_INTG + if (nb_fd != -1) + { + FD_SET(nb_fd, &rfds); + if (maxfd < nb_fd) + maxfd = nb_fd; + } +#endif # ifdef OLD_VMS /* Old VMS as v6.2 and older have broken select(). It waits more than @@ -5087,6 +5138,13 @@ RealWaitForChar(fd, msec, check_for_gpm) } } # endif +#ifdef FEAT_NETBEANS_INTG + if (ret > 0 && nb_fd != -1 && FD_ISSET(nb_fd, &rfds)) + { + netbeans_read(); + --ret; + } +#endif #endif /* HAVE_SELECT */ diff --git a/src/proto.h b/src/proto.h index dd2e14654e..2b248a5e34 100644 --- a/src/proto.h +++ b/src/proto.h @@ -181,6 +181,16 @@ void qsort __ARGS((void *base, size_t elm_count, size_t elm_size, int (*cmp)(con # include "if_ruby.pro" # endif +/* Ugly solution for "BalloonEval" not being defined while it's used in some + * .pro files. */ +# if |