]> granicus.if.org Git - vim/commitdiff
patch 8.0.1540: popup menu positioning fails with longer string v8.0.1540
authorBram Moolenaar <Bram@vim.org>
Sat, 24 Feb 2018 20:25:44 +0000 (21:25 +0100)
committerBram Moolenaar <Bram@vim.org>
Sat, 24 Feb 2018 20:25:44 +0000 (21:25 +0100)
Problem:    Popup menu positioning fails with longer string.
Solution:   Only align with right side of window when width is less than
            'pumwidth' (closes #2661)

src/popupmnu.c
src/testdir/dumps/Test_popup_position_04.dump [new file with mode: 0644]
src/testdir/screendump.vim
src/testdir/test_popup.vim
src/version.c

index 6ac121d91665b112d010869741adde8c46d48726..d9def36647d44d50c28183298cce7b57350d6928 100644 (file)
@@ -69,7 +69,7 @@ pum_compute_size(void)
 /*
  * Show the popup menu with items "array[size]".
  * "array" must remain valid until pum_undisplay() is called!
- * When possible the leftmost character is aligned with screen column "col".
+ * When possible the leftmost character is aligned with cursor column.
  * The menu appears above the screen line "row" or at "row" + "height" - 1.
  */
     void
@@ -83,7 +83,7 @@ pum_display(
     int                max_width;
     int                row;
     int                context_lines;
-    int                col;
+    int                cursor_col;
     int                above_row;
     int                below_row;
     int                redo_count = 0;
@@ -199,10 +199,11 @@ pum_display(
        /* Calculate column */
 #ifdef FEAT_RIGHTLEFT
        if (curwin->w_p_rl)
-           col = curwin->w_wincol + curwin->w_width - curwin->w_wcol - 1;
+           cursor_col = curwin->w_wincol + curwin->w_width
+                                                         - curwin->w_wcol - 1;
        else
 #endif
-           col = curwin->w_wincol + curwin->w_wcol;
+           cursor_col = curwin->w_wincol + curwin->w_wcol;
 
        /* if there are more items than room we need a scrollbar */
        if (pum_height < size)
@@ -216,15 +217,17 @@ pum_display(
        if (def_width < max_width)
            def_width = max_width;
 
-       if (((col < Columns - p_pw || col < Columns - max_width)
+       if (((cursor_col < Columns - p_pw
+                                          || cursor_col < Columns - max_width)
 #ifdef FEAT_RIGHTLEFT
                    && !curwin->w_p_rl)
-              || (curwin->w_p_rl && (col > p_pw || col > max_width)
+              || (curwin->w_p_rl
+                              && (cursor_col > p_pw || cursor_col > max_width)
 #endif
           ))
        {
-           /* align pum column with "col" */
-           pum_col = col;
+           /* align pum with "cursor_col" */
+           pum_col = cursor_col;
 
            /* start with the maximum space available */
 #ifdef FEAT_RIGHTLEFT
@@ -237,33 +240,36 @@ pum_display(
            if (pum_width > max_width + pum_kind_width + pum_extra_width + 1
                                                && pum_width > p_pw)
            {
-               /* the width is too much, make it narrower */
+               /* the width is more than needed for the items, make it
+                * narrower */
                pum_width = max_width + pum_kind_width + pum_extra_width + 1;
                if (pum_width < p_pw)
                    pum_width = p_pw;
            }
-           else if (((col > p_pw || col > max_width)
+           else if (((cursor_col > p_pw || cursor_col > max_width)
 #ifdef FEAT_RIGHTLEFT
                        && !curwin->w_p_rl)
-               || (curwin->w_p_rl && (col < Columns - p_pw
-                       || col < Columns - max_width)
+               || (curwin->w_p_rl && (cursor_col < Columns - p_pw
+                       || cursor_col < Columns - max_width)
 #endif
                    ))
            {
-               /* align right pum edge with "col" */
+               /* align pum edge with "cursor_col" */
 #ifdef FEAT_RIGHTLEFT
                if (curwin->w_p_rl
                        && W_ENDCOL(curwin) < max_width + pum_scrollbar + 1)
                {
-                   pum_col = col + max_width + pum_scrollbar + 1;
+                   pum_col = cursor_col + max_width + pum_scrollbar + 1;
                    if (pum_col >= Columns)
                        pum_col = Columns - 1;
                }
                else if (!curwin->w_p_rl)
 #endif
                {
-                   if (curwin->w_wincol > Columns - max_width - pum_scrollbar)
+                   if (curwin->w_wincol > Columns - max_width - pum_scrollbar
+                                                         && max_width <= p_pw)
                    {
+                       /* use full width to end of the screen */
                        pum_col = Columns - max_width - pum_scrollbar;
                        if (pum_col < 0)
                            pum_col = 0;
diff --git a/src/testdir/dumps/Test_popup_position_04.dump b/src/testdir/dumps/Test_popup_position_04.dump
new file mode 100644 (file)
index 0000000..b1a3af2
--- /dev/null
@@ -0,0 +1,10 @@
+|1+0&#ffffff0|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7||+1&&|1+0&&|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7
+|8|9|_|a| @32||+1&&|8+0&&|9|_|a| @32
+|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7||+1&&|1+0&&|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7
+|8|9|_|b| @32||+1&&|8+0&&|9|_|b| @32
+@12|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5||+1&&| +0&&@11|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5
+|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|a| @20||+1&&|6+0&&|7|8|9|_|1|2|3|4|5|6|7|8|9|_|a| @20
+|~+0#4040ff13&| @35||+1#0000000&|~+0#4040ff13&| @9| +0#0000001#e0e0e08|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5
+|~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @9| +0#0000001#ffd7ff255|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5|6|7|8|9|_|1|2|3|4|5
+|~+0#4040ff13#ffffff0| @35||+1#0000000&|~+0#4040ff13&| @35
+|~| @35||+1#0000000&|~+0#4040ff13&| @35
index 584f9ac71491c0eebc2f92d7ddb3a7b8dfb744ab..1016646c5bde5a67d4a4c9d029283183a0b8fe14 100644 (file)
@@ -48,7 +48,7 @@ endfunc
 " Stop a Vim running in terminal buffer "buf".
 func StopVimInTerminal(buf)
   call assert_equal("running", term_getstatus(a:buf))
-  call term_sendkeys(a:buf, ":qa!\<cr>")
+  call term_sendkeys(a:buf, "\<Esc>\<Esc>:qa!\<cr>")
   call WaitFor('term_getstatus(' . a:buf . ') == "finished"')
   only!
 endfunc
index b0024e67bf9fe8aa93d77e022ba55b7bb5efaab7..499b08bd6e6fa45fff153553dec8b5ee6b10812f 100644 (file)
@@ -772,6 +772,15 @@ func Test_popup_position()
   call term_sendkeys(buf, "GA\<C-N>")
   call VerifyScreenDump(buf, 'Test_popup_position_03', {'rows': 8})
 
+  " completed text wider than the window and 'pumwidth' smaller than available
+  " space
+  call term_sendkeys(buf, "\<Esc>u")
+  call term_sendkeys(buf, ":set pumwidth=20\<CR>")
+  call term_sendkeys(buf, "ggI123456789_\<Esc>")
+  call term_sendkeys(buf, "jI123456789_\<Esc>")
+  call term_sendkeys(buf, "GA\<C-N>")
+  call VerifyScreenDump(buf, 'Test_popup_position_04', {'rows': 10})
+  
   call term_sendkeys(buf, "\<Esc>u")
   call StopVimInTerminal(buf)
   call delete('Xtest')
index c75d29033d993fe206615cddbebd18b81f60281d..48c21fc448adc2b4af78a0a540b305659fe16f4e 100644 (file)
@@ -778,6 +778,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    1540,
 /**/
     1539,
 /**/