Ticket #4200 (closed defect: fixed)

Opened 3 years ago

Last modified 3 years ago

If wchar is not included in ncurses, mc 4.8.26 fails to compile.

Reported by: mrbump Owned by:
Priority: minor Milestone: 4.8.28
Component: mc-tty Version: 4.8.26
Keywords: Cc:
Blocked By: Blocking:
Branch state: merged Votes for changeset: committed-master

Description

With the introduction of shadows in mc (which are nice) on platforms that support them with the following commit - https://github.com/MidnightCommander/mc/commit/8b4386df83ab5a525f0568113fe1e53d362f433e.patch and Ticket #4120: draw shadows for dialog boxes and menus.

Mc 4.8.26 fails to compile on LibreELEC. - https://libreelec.tv/ - the Tagline being Just enough OS for KODI

We use --disable-widec in the ncurses build, https://github.com/LibreELEC/LibreELEC.tv/blob/master/packages/devel/ncurses/package.mk

Reverting the whole patch fixes the compile, but it would be ideal to use alternatives or limit shadows if wchar is not available.

Results of the failed compile

./.libs/libinternal.a(tty-ncurses.o):tty-ncurses.c:function tty_colorize_area: error: undefined reference to 'mvin_wchnstr'
./.libs/libinternal.a(tty-ncurses.o):tty-ncurses.c:function tty_colorize_area: error: undefined reference to 'getcchar'
./.libs/libinternal.a(tty-ncurses.o):tty-ncurses.c:function tty_colorize_area: error: undefined reference to 'setcchar'
./.libs/libinternal.a(tty-ncurses.o):tty-ncurses.c:function tty_colorize_area: error: undefined reference to 'mvadd_wchnstr'

Attachments

4200_ncurses_disable_widec.patch (2.1 KB) - added by andrew_b 3 years ago.

Change History

comment:1 Changed 3 years ago by mrbump

The code that has the wchar is

+++ b/lib/tty/tty-ncurses.c
@@ -533,6 +550,38

/* --------------------------------------------------------------------------------------------- */

+void
+tty_colorize_area (int y, int x, int rows, int cols, int color)
+{
+ cchar_t *ctext;
+ wchar_t wch[10]; /* TODO not sure if the length is correct */
+ attr_t attrs;
+ short color_pair;
+

+ if (!use_colors
!tty_clip (&y, &x, &rows, &cols))

+ return;
+
+ tty_setcolor (color);
+ ctext = g_malloc (sizeof (cchar_t) * (cols + 1));
+
+ for (int row = 0; row < rows; row++)
+ {
+ mvin_wchnstr (y + row, x, ctext, cols);
+
+ for (int col = 0; col < cols; col++)
+ {
+ getcchar (&ctext[col], wch, &attrs, &color_pair, NULL);
+ setcchar (&ctext[col], wch, attrs, color, NULL);
+ }
+
+ mvadd_wchnstr (y + row, x, ctext, cols);

Version 0, edited 3 years ago by mrbump (next)

comment:2 Changed 3 years ago by mrbump

Original change that created the issue #4102

comment:3 Changed 3 years ago by andrew_b

  • Status changed from new to closed
  • Component changed from mc-core to mc-tty
  • Resolution set to invalid
  • Milestone Future Releases deleted

Fixed as #4181.

comment:4 Changed 3 years ago by mrbump

Whilst that patch fixed MacOS it doesn’t fix LibreELEC as wide char is not included. I had tested that patch as I had compiled against master https://github.com/MidnightCommander/mc/commits/master . If you could suggest a direction of what would be acceptable to the mc team, I would be happy to develop a code fix. As in tty-slang I see that tty_colorize_area is essentially a noop.

Should I write a —without-wchar configure option?

comment:5 Changed 3 years ago by zaytsev

How is it possible that LibreELEC doesn't have a definition of wchar_t? Kodi itself seems to use it all over the place... How do you solve this problem?

To me it seems that of course you do have wchar_t, only for some reason we cannot understand yet you compile ncurses with --disable-widec, so even though mc does compile against ncurses, according to your log the linking fails, because mvadd_wchnstr function cannot be found. Just compile ncurses --enable-widec to solve this problem if you can. I would be surprised if mc interface will be rendered correctly if you compile against ncurses with --disable-widec anyways.

Changed 3 years ago by andrew_b

comment:6 Changed 3 years ago by andrew_b

Please test the attached patch.

comment:7 Changed 3 years ago by andrew_b

ping

comment:8 Changed 3 years ago by andrew_b

@mrbump, please let me know if this patch works or not.

Last edited 3 years ago by andrew_b (previous) (diff)

comment:9 Changed 3 years ago by mrbump

Hi @andrew_b

we just pulled the patch into 4.8.27. And removed the previous revert patch. All works as expected. https://github.com/LibreELEC/LibreELEC.tv/pull/5562

Regards
Rudi

comment:10 Changed 3 years ago by andrew_b

  • Status changed from closed to reopened
  • Resolution invalid deleted
  • Branch state changed from no branch to on review
  • Milestone set to 4.8.28

Branch: 4200_ncurses_disable_widec
changeset:e7bbf72544ab62db9c92bfe7bd1155227e78c621

comment:11 Changed 3 years ago by andrew_b

  • Votes for changeset set to mrbump andrew_b
  • Branch state changed from on review to approved

comment:12 Changed 3 years ago by andrew_b

  • Status changed from reopened to closed
  • Votes for changeset changed from mrbump andrew_b to committed-master
  • Resolution set to fixed
  • Branch state changed from approved to merged
Note: See TracTickets for help on using tickets.