To: vim-dev@vim.org Subject: Patch 7.2.334 Fcc: outbox From: Bram Moolenaar Mime-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ------------ Patch 7.2.334 Problem: Postponing keys in Netbeans interface does not work properly. Solution: Store the key string instead of the number. Avoid an infinite loop. (Mostly by Xavier de Gaye) Files: src/netbeans.c, src/proto/netbeans.pro *** ../vim-7.2.333/src/netbeans.c 2010-01-19 14:59:14.000000000 +0100 --- src/netbeans.c 2010-01-19 15:12:17.000000000 +0100 *************** *** 70,76 **** static pos_T *off2pos __ARGS((buf_T *, long)); static pos_T *get_off_or_lnum __ARGS((buf_T *buf, char_u **argp)); static long get_buf_size __ARGS((buf_T *)); ! static void netbeans_keystring __ARGS((int key, char *keystr)); static void special_keys __ARGS((char_u *args)); static void netbeans_connect __ARGS((void)); --- 70,77 ---- static pos_T *off2pos __ARGS((buf_T *, long)); static pos_T *get_off_or_lnum __ARGS((buf_T *buf, char_u **argp)); static long get_buf_size __ARGS((buf_T *)); ! static int netbeans_keystring __ARGS((char_u *keystr)); ! static void postpone_keycommand __ARGS((char_u *keystr)); static void special_keys __ARGS((char_u *args)); static void netbeans_connect __ARGS((void)); *************** *** 502,508 **** struct keyqueue { ! int key; struct keyqueue *next; struct keyqueue *prev; }; --- 503,509 ---- struct keyqueue { ! char_u *keystr; struct keyqueue *next; struct keyqueue *prev; }; *************** *** 514,526 **** /* * Queue up key commands sent from netbeans. */ static void ! postpone_keycommand(int key) { keyQ_T *node; node = (keyQ_T *)alloc(sizeof(keyQ_T)); if (keyHead.next == NULL) /* initialize circular queue */ { --- 515,531 ---- /* * Queue up key commands sent from netbeans. + * We store the string, because it may depend on the global mod_mask and + * :nbkey doesn't have a key number. */ static void ! postpone_keycommand(char_u *keystr) { keyQ_T *node; node = (keyQ_T *)alloc(sizeof(keyQ_T)); + if (node == NULL) + return; /* out of memory, drop the key */ if (keyHead.next == NULL) /* initialize circular queue */ { *************** *** 534,540 **** keyHead.prev->next = node; keyHead.prev = node; ! node->key = key; } /* --- 539,545 ---- keyHead.prev->next = node; keyHead.prev = node; ! node->keystr = vim_strsave(keystr); } /* *************** *** 543,557 **** static void handle_key_queue(void) { ! while (keyHead.next && keyHead.next != &keyHead) { /* first, unlink the node */ keyQ_T *node = keyHead.next; keyHead.next = node->next; node->next->prev = node->prev; ! /* now, send the keycommand */ ! netbeans_keycommand(node->key); /* Finally, dispose of the node */ vim_free(node); --- 548,567 ---- static void handle_key_queue(void) { ! int postponed = FALSE; ! ! while (!postponed && keyHead.next && keyHead.next != &keyHead) { /* first, unlink the node */ keyQ_T *node = keyHead.next; keyHead.next = node->next; node->next->prev = node->prev; ! /* Now, send the keycommand. This may cause it to be postponed again ! * and change keyHead. */ ! if (node->keystr != NULL) ! postponed = !netbeans_keystring(node->keystr); ! vim_free(node->keystr); /* Finally, dispose of the node */ vim_free(node); *************** *** 2495,2501 **** } else { ! nbdebug((" Buffer has no changes!\n")); } /* =====================================================================*/ } --- 2505,2511 ---- } else { ! nbdebug((" Buffer has no changes!\n")); } /* =====================================================================*/ } *************** *** 2658,2664 **** ex_nbkey(eap) exarg_T *eap; { ! netbeans_keystring(0, (char *)eap->arg); } --- 2668,2674 ---- ex_nbkey(eap) exarg_T *eap; { ! (void)netbeans_keystring(eap->arg); } *************** *** 2680,2686 **** } /* ! * Convert key to netbeans name. */ static void netbeans_keyname(int key, char *buf) --- 2690,2696 ---- } /* ! * Convert key to netbeans name. This uses the global "mod_mask". */ static void netbeans_keyname(int key, char *buf) *************** *** 3127,3149 **** /* * Send a keypress event back to netbeans. This usually simulates some * kind of function key press. This function operates on a key code. */ ! void netbeans_keycommand(int key) { char keyName[60]; netbeans_keyname(key, keyName); ! netbeans_keystring(key, keyName); } /* * Send a keypress event back to netbeans. This usually simulates some * kind of function key press. This function operates on a key string. */ ! static void ! netbeans_keystring(int key, char *keyName) { char buf[2*MAXPATHL]; int bufno = nb_getbufno(curbuf); --- 3137,3163 ---- /* * Send a keypress event back to netbeans. This usually simulates some * kind of function key press. This function operates on a key code. + * Return TRUE when the key was sent, FALSE when the command has been + * postponed. */ ! int netbeans_keycommand(int key) { char keyName[60]; netbeans_keyname(key, keyName); ! return netbeans_keystring((char_u *)keyName); } /* * Send a keypress event back to netbeans. This usually simulates some * kind of function key press. This function operates on a key string. + * Return TRUE when the key was sent, FALSE when the command has been + * postponed. */ ! static int ! netbeans_keystring(char_u *keyName) { char buf[2*MAXPATHL]; int bufno = nb_getbufno(curbuf); *************** *** 3151,3157 **** char_u *q; if (!haveConnection) ! return; if (bufno == -1) --- 3165,3171 ---- char_u *q; if (!haveConnection) ! return TRUE; if (bufno == -1) *************** *** 3160,3166 **** q = curbuf->b_ffname == NULL ? (char_u *)"" : nb_quote(curbuf->b_ffname); if (q == NULL) ! return; vim_snprintf(buf, sizeof(buf), "0:fileOpened=%d \"%s\" %s %s\n", 0, q, "T", /* open in NetBeans */ --- 3174,3180 ---- q = curbuf->b_ffname == NULL ? (char_u *)"" : nb_quote(curbuf->b_ffname); if (q == NULL) ! return TRUE; vim_snprintf(buf, sizeof(buf), "0:fileOpened=%d \"%s\" %s %s\n", 0, q, "T", /* open in NetBeans */ *************** *** 3170,3178 **** nbdebug(("EVT: %s", buf)); nb_send(buf, "netbeans_keycommand"); ! if (key > 0) ! postpone_keycommand(key); ! return; } /* sync the cursor position */ --- 3184,3191 ---- nbdebug(("EVT: %s", buf)); nb_send(buf, "netbeans_keycommand"); ! postpone_keycommand(keyName); ! return FALSE; } /* sync the cursor position */ *************** *** 3198,3203 **** --- 3211,3217 ---- off, (long)curwin->w_cursor.lnum, (long)curwin->w_cursor.col); nbdebug(("EVT: %s", buf)); nb_send(buf, "netbeans_keycommand"); + return TRUE; } *** ../vim-7.2.333/src/proto/netbeans.pro 2009-01-06 16:13:42.000000000 +0100 --- src/proto/netbeans.pro 2010-01-19 13:31:01.000000000 +0100 *************** *** 16,22 **** void netbeans_removed __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, long len)); void netbeans_unmodified __ARGS((buf_T *bufp)); void netbeans_button_release __ARGS((int button)); ! void netbeans_keycommand __ARGS((int key)); void netbeans_save_buffer __ARGS((buf_T *bufp)); void netbeans_deleted_all_lines __ARGS((buf_T *bufp)); int netbeans_is_guarded __ARGS((linenr_T top, linenr_T bot)); --- 16,22 ---- void netbeans_removed __ARGS((buf_T *bufp, linenr_T linenr, colnr_T col, long len)); void netbeans_unmodified __ARGS((buf_T *bufp)); void netbeans_button_release __ARGS((int button)); ! int netbeans_keycommand __ARGS((int key)); void netbeans_save_buffer __ARGS((buf_T *bufp)); void netbeans_deleted_all_lines __ARGS((buf_T *bufp)); int netbeans_is_guarded __ARGS((linenr_T top, linenr_T bot)); *** ../vim-7.2.333/src/version.c 2010-01-19 14:59:14.000000000 +0100 --- src/version.c 2010-01-19 15:08:44.000000000 +0100 *************** *** 683,684 **** --- 683,686 ---- { /* Add new patch number below this line */ + /**/ + 334, /**/ -- hundred-and-one symptoms of being an internet addict: 119. You are reading a book and look for the scroll bar to get to the next page. /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ /// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ \\\ download, build and distribute -- http://www.A-A-P.org /// \\\ help me help AIDS victims -- http://ICCF-Holland.org ///