41 Commits

Author SHA1 Message Date
708b78f145 Bump liberty
All checks were successful
Alpine 3.21 Success
Arch Linux AUR Success
OpenBSD 7.6 Success
2025-08-02 18:24:16 +02:00
3361df0ccb Bump liberty
All checks were successful
Alpine 3.21 Success
Arch Linux AUR Success
OpenBSD 7.6 Success
2025-06-04 22:00:25 +02:00
13195e797a Bump liberty and termo
All checks were successful
Alpine 3.20 Success
Arch Linux AUR Success
OpenBSD 7.6 Success
OpenBSD 7.5 Abandoned
2025-04-23 22:02:50 +02:00
7fee01a5c6 Update NEWS 2025-01-08 09:42:31 +01:00
8b4300c796 Bump liberty, check the connection while searching
All checks were successful
Alpine 3.20 Success
Arch Linux AUR Success
OpenBSD 7.5 Success
This just prevents immediate assertion failures.
2025-01-08 08:10:19 +01:00
cd3d4eb1ad README.adoc: update package information 2024-11-13 08:36:52 +01:00
641803df35 Enable user-defined actions
All checks were successful
Alpine 3.20 Success
Arch Linux AUR Success
OpenBSD 7.5 Success
Also fix pclose() handling within Info plugins,
and prevent them from screwing up the terminal with error output
on initialization.

This is still rather crude, but at least it's possible.
2024-10-31 21:19:28 +01:00
eec0706333 Support libunistring versions before 1.2
All checks were successful
Alpine 3.20 Success
Arch Linux AUR Success
OpenBSD 7.5 Success
2024-09-02 23:25:08 +02:00
9d0acddf9a Implement font fallbacks in the editor
Some checks failed
Alpine 3.20 Success
Arch Linux AUR Success
OpenBSD 7.5 Scripts failed
Opting for not making any changes in the XUI.
2024-09-02 21:47:50 +02:00
ec12e2ac25 Bump liberty, fix calloc argument order
All checks were successful
Alpine 3.20 Success
Arch Linux AUR Success
OpenBSD 7.5 Success
2024-08-08 09:19:29 +02:00
24449fe721 Make global search match on filenames
All checks were successful
Alpine 3.20 Success
OpenBSD 7.5 Success
Arch Linux AUR Success
2024-08-07 22:12:43 +02:00
60171cc5a3 Bump liberty 2024-08-07 22:05:29 +02:00
20502200d9 Make global search indicate the search terms
All checks were successful
Alpine 3.20 Success
Arch Linux AUR Success
OpenBSD 7.5 Success
2024-07-21 21:04:17 +02:00
e6de4f11e7 Be actually able to use a system Termo library
All checks were successful
Alpine 3.19 Success
Arch Linux AUR Success
OpenBSD 7.3 Success
2024-04-10 17:31:40 +02:00
c4bce75866 Bump version, update NEWS
All checks were successful
Arch Linux AUR Success
Alpine 3.19 Success
2024-02-27 00:39:23 +01:00
08b87bccbd Bump liberty, fix a dead link 2024-02-27 00:30:39 +01:00
fa460b97cf Fix info plugins installation
They could never become executable.
2024-02-25 05:15:00 +01:00
ef19337bad Bump version, update NEWS 2024-02-10 18:39:57 +01:00
9699b80e9d Very mildly improve stream handling 2024-02-10 18:35:10 +01:00
7601a754af Bump liberty 2024-02-10 12:50:39 +01:00
31d975604b README.adoc: remove unintended line break 2024-02-10 10:21:09 +01:00
59f82b7a72 Bump liberty, set the window icon 2024-02-10 10:09:32 +01:00
8bcdb0afd5 Bump liberty, install rasterized icons 2024-02-10 06:04:39 +01:00
9dfd89ef06 CMakeLists.txt: declare compatibility with 3.27
Sadly, the 3.5 deprecation warning doesn't go away after this.
2023-08-01 03:01:06 +02:00
4b592ec295 Fix build in bare configurations 2023-08-01 02:37:48 +02:00
58eb7edfd5 Make the scroll wheel act on the gauge and volume 2023-07-23 15:51:22 +02:00
48fc9bdb19 Add vertical padding to the status bar as well
For symmetry, if for nothing else.
2023-07-23 15:36:37 +02:00
9ab5ab6928 Change volume in finer steps 2023-07-20 13:20:34 +02:00
93e0d7027a Fix build on systems without A_ITALIC
Unfortunately, this font style doesn't work in X11 either in that case.
2023-07-04 06:45:33 +02:00
5900b0708a README.adoc: update package information 2023-07-01 22:00:34 +02:00
5f97b95026 Bump liberty 2023-06-28 16:27:05 +02:00
b3fe85995f Dissolve widget_redistribute()
liberty-xui has xui_hbox() and xui_vbox(),
the way we use widgets is odd.
2023-06-19 13:44:53 +02:00
19a0a468a9 Bump liberty, move the UI to liberty-xui.c
Also bump termo.

This deduplicates code between nncmpp and hex,
and adds support for bold + italic attributes under X11.

There is still a lot of space for prettification.
Unfortunately, most of our specialized widgets are quite entangled.
2023-06-19 13:38:24 +02:00
016469d5a8 Cleanup 2023-06-18 16:12:35 +02:00
6bd40f3ec1 Fix potential issue with struct padding
The UI could very theoretically end up textless.
2023-06-18 13:01:14 +02:00
eb925f18c8 Fix CMake option description 2023-06-17 21:50:46 +02:00
0c35cc301d Cleanup 2023-06-17 21:50:46 +02:00
89e6826586 Update NEWS 2023-06-15 16:35:26 +02:00
4166b17b00 Add an icon and a desktop file for the GUI 2023-06-15 16:25:01 +02:00
d0d248e44c Fix crash when scrolling too far up 2023-06-15 14:45:26 +02:00
ebda305e2d Change default active tab bar attributes
It mostly just looked weird when the underline wasn't on the last row.
2023-06-15 14:38:47 +02:00
12 changed files with 695 additions and 2006 deletions

View File

@@ -1,5 +1,5 @@
cmake_minimum_required (VERSION 3.0) cmake_minimum_required (VERSION 3.0...3.27)
project (nncmpp VERSION 2.0.0 LANGUAGES C) project (nncmpp VERSION 2.1.1 LANGUAGES C)
# Moar warnings # Moar warnings
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC) if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
@@ -68,8 +68,8 @@ if (WITH_PULSE)
list (APPEND extra_libraries ${libpulse_LIBRARIES}) list (APPEND extra_libraries ${libpulse_LIBRARIES})
endif () endif ()
pkg_check_modules (x11 x11 xrender xft fontconfig) pkg_check_modules (x11 x11 xrender xft fontconfig libpng)
add_option (WITH_X11 "Use FFTW to enable spectrum visualisation" "${x11_FOUND}") add_option (WITH_X11 "Build with X11 support" "${x11_FOUND}")
if (WITH_X11) if (WITH_X11)
if (NOT x11_FOUND) if (NOT x11_FOUND)
message (FATAL_ERROR "Some X11 libraries were not found") message (FATAL_ERROR "Some X11 libraries were not found")
@@ -121,14 +121,36 @@ add_custom_command (OUTPUT ${actions}
# Build the main executable and link it # Build the main executable and link it
add_executable (${PROJECT_NAME} ${PROJECT_NAME}.c ${actions}) add_executable (${PROJECT_NAME} ${PROJECT_NAME}.c ${actions})
target_link_libraries (${PROJECT_NAME} ${Unistring_LIBRARIES} target_link_libraries (${PROJECT_NAME} ${Unistring_LIBRARIES}
${Ncursesw_LIBRARIES} termo-static ${curl_LIBRARIES} ${extra_libraries}) ${Ncursesw_LIBRARIES} ${Termo_LIBRARIES} ${curl_LIBRARIES}
${extra_libraries})
add_threads (${PROJECT_NAME}) add_threads (${PROJECT_NAME})
# Installation # Installation
install (TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR}) install (TARGETS ${PROJECT_NAME} DESTINATION ${CMAKE_INSTALL_BINDIR})
install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR}) install (FILES LICENSE DESTINATION ${CMAKE_INSTALL_DOCDIR})
install (DIRECTORY contrib DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}) install (DIRECTORY contrib DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME})
install (DIRECTORY info DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}) install (DIRECTORY info DESTINATION ${CMAKE_INSTALL_DATADIR}/${PROJECT_NAME}
USE_SOURCE_PERMISSIONS)
if (WITH_X11)
include (IconUtils)
set (icon_base ${PROJECT_BINARY_DIR}/icons)
set (icon_png_list)
foreach (icon_size 16 32 48)
icon_to_png (${PROJECT_NAME} ${PROJECT_SOURCE_DIR}/${PROJECT_NAME}.svg
${icon_size} ${icon_base} icon_png)
list (APPEND icon_png_list ${icon_png})
endforeach ()
add_custom_target (icons ALL DEPENDS ${icon_png_list})
install (FILES ${PROJECT_NAME}.svg
DESTINATION ${CMAKE_INSTALL_DATADIR}/icons/hicolor/scalable/apps)
install (DIRECTORY ${icon_base}
DESTINATION ${CMAKE_INSTALL_DATADIR})
install (FILES ${PROJECT_NAME}.desktop
DESTINATION ${CMAKE_INSTALL_DATADIR}/applications)
endif ()
# Generate documentation from text markup # Generate documentation from text markup
find_program (ASCIIDOCTOR_EXECUTABLE asciidoctor) find_program (ASCIIDOCTOR_EXECUTABLE asciidoctor)
@@ -176,6 +198,33 @@ foreach (page ${project_MAN_PAGES})
DESTINATION "${CMAKE_INSTALL_MANDIR}/man${CMAKE_MATCH_1}") DESTINATION "${CMAKE_INSTALL_MANDIR}/man${CMAKE_MATCH_1}")
endforeach () endforeach ()
# Testing
option (BUILD_TESTING "Build tests" OFF)
if (BUILD_TESTING)
enable_testing ()
find_program (xmlwf_EXECUTABLE xmlwf)
find_program (xmllint_EXECUTABLE xmllint)
foreach (xml ${PROJECT_NAME}.svg)
if (xmlwf_EXECUTABLE)
add_test (test-xmlwf-${xml} ${xmlwf_EXECUTABLE}
${PROJECT_SOURCE_DIR}/${xml})
endif ()
if (xmllint_EXECUTABLE)
add_test (test-xmllint-${xml} ${xmllint_EXECUTABLE} --noout
${PROJECT_SOURCE_DIR}/${xml})
endif ()
endforeach ()
find_program (dfv_EXECUTABLE desktop-file-validate)
if (dfv_EXECUTABLE)
foreach (df ${PROJECT_NAME}.desktop)
add_test (test-dfv-${df} ${dfv_EXECUTABLE}
${PROJECT_SOURCE_DIR}/${df})
endforeach ()
endif ()
endif ()
# CPack # CPack
set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Terminal/X11 MPD client") set (CPACK_PACKAGE_DESCRIPTION_SUMMARY "Terminal/X11 MPD client")
set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch") set (CPACK_PACKAGE_VENDOR "Premysl Eric Janouch")

View File

@@ -1,4 +1,4 @@
Copyright (c) 2016 - 2023, Přemysl Eric Janouch <p@janouch.name> Copyright (c) 2016 - 2024, Přemysl Eric Janouch <p@janouch.name>
Permission to use, copy, modify, and/or distribute this software for any Permission to use, copy, modify, and/or distribute this software for any
purpose with or without fee is hereby granted. purpose with or without fee is hereby granted.

33
NEWS
View File

@@ -1,5 +1,30 @@
Unreleased Unreleased
* Made global search indicate the search terms, and match on filenames
* Added ability to configure bindable user-defined actions;
these can launch arbitrary shell commands
* Prevented crashes when the daemon disconnects during search
* X11: added support for font fallbacks to the editor as well
* X11: fixed that XSettings had to be present
* X11: fixed a new Fontconfig warning
2.1.1 (2024-02-27)
* Fixed installation of Info tab plugins
* Fixed display of playback mode toggles in the terminal user interface
* Fixed a dead link in the manual page
2.1.0 (2024-02-11)
* Added ability to look up song lyrics, * Added ability to look up song lyrics,
using a new scriptable extension interface for the Info tab using a new scriptable extension interface for the Info tab
@@ -7,16 +32,24 @@ Unreleased
* Escape no longer quits the program * Escape no longer quits the program
* X11: added an icon and a desktop entry file
* X11: added support for font fallbacks and italic fonts * X11: added support for font fallbacks and italic fonts
* X11: fixed rendering of overflowing, partially visible list items * X11: fixed rendering of overflowing, partially visible list items
* X11: fixed a crash when resizing the window to zero dimensions
* Added a "o" binding to select the currently playing song * Added a "o" binding to select the currently playing song
* Added Readline-like M-u, M-l, M-c editor bindings * Added Readline-like M-u, M-l, M-c editor bindings
* Made the scroll wheel work on the elapsed time gauge and the volume display
* Changed volume adjustment bindings to use +/- keys * Changed volume adjustment bindings to use +/- keys
* Changed volume adjustment to go in steps of 5 rather than 10 %
2.0.0 (2022-09-03) 2.0.0 (2022-09-03)

View File

@@ -28,8 +28,12 @@ image::nncmpp.png[align="center"]
Packages Packages
-------- --------
Regular releases are sporadic. git master should be stable enough. You can get Regular releases are sporadic. git master should be stable enough.
a package with the latest development version from Archlinux's AUR. You can get a package with the latest development version using Arch Linux's
https://aur.archlinux.org/packages/nncmpp-git[AUR],
or as a https://git.janouch.name/p/nixexprs[Nix derivation].
Stable versions are present in: OpenBSD ports.
Documentation Documentation
------------- -------------
@@ -38,10 +42,12 @@ The rest of this README will concern itself with externalities.
Building Building
-------- --------
Build dependencies: CMake, pkg-config, awk, liberty (included), Build-only dependencies: CMake, pkg-config, awk, liberty (included),
termo (included), asciidoctor or asciidoc (recommended but optional) + termo (included), asciidoctor or asciidoc (recommended but optional),
rsvg-convert (X11) +
Runtime dependencies: ncursesw, libunistring, cURL + Runtime dependencies: ncursesw, libunistring, cURL +
Optional runtime dependencies: fftw3, libpulse, x11, xft, Perl + cURL (lyrics) Optional runtime dependencies: fftw3, libpulse, x11 + xft + libpng (X11),
Perl + cURL (lyrics)
$ git clone --recursive https://git.janouch.name/p/nncmpp.git $ git clone --recursive https://git.janouch.name/p/nncmpp.git
$ mkdir nncmpp/build $ mkdir nncmpp/build

Submodule liberty updated: 0e86ffe7c3...7425355d01

View File

@@ -1,327 +0,0 @@
/*
* line-editor.c: a line editor component for the TUI part of liberty
*
* Copyright (c) 2017 - 2022, Přemysl Eric Janouch <p@janouch.name>
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*
*/
// This is here just for IDE code model reasons
#ifndef HAVE_LIBERTY
#include "liberty/liberty.c"
#include "liberty/liberty-tui.c"
#endif
static void
row_buffer_append_c (struct row_buffer *self, ucs4_t c, chtype attrs)
{
struct row_char current = { .attrs = attrs, .c = c };
struct row_char invalid = { .attrs = attrs, .c = '?', .width = 1 };
current.width = uc_width (current.c, locale_charset ());
if (current.width < 0 || !app_is_character_in_locale (current.c))
current = invalid;
ARRAY_RESERVE (self->chars, 1);
self->chars[self->chars_len++] = current;
self->total_width += current.width;
}
// --- Line editor -------------------------------------------------------------
enum line_editor_action
{
LINE_EDITOR_B_CHAR, ///< Go back a character
LINE_EDITOR_F_CHAR, ///< Go forward a character
LINE_EDITOR_B_WORD, ///< Go back a word
LINE_EDITOR_F_WORD, ///< Go forward a word
LINE_EDITOR_HOME, ///< Go to start of line
LINE_EDITOR_END, ///< Go to end of line
LINE_EDITOR_UPCASE_WORD, ///< Convert word to uppercase
LINE_EDITOR_DOWNCASE_WORD, ///< Convert word to lowercase
LINE_EDITOR_CAPITALIZE_WORD, ///< Capitalize word
LINE_EDITOR_B_DELETE, ///< Delete last character
LINE_EDITOR_F_DELETE, ///< Delete next character
LINE_EDITOR_B_KILL_WORD, ///< Delete last word
LINE_EDITOR_B_KILL_LINE, ///< Delete everything up to BOL
LINE_EDITOR_F_KILL_LINE, ///< Delete everything up to EOL
};
struct line_editor
{
int point; ///< Caret index into line data
ucs4_t *line; ///< Line data, 0-terminated
int *w; ///< Codepoint widths, 0-terminated
size_t len; ///< Editor length
size_t alloc; ///< Editor allocated
char prompt; ///< Prompt character
void (*on_changed) (void); ///< Callback on text change
void (*on_end) (bool); ///< Callback on abort
};
static void
line_editor_free (struct line_editor *self)
{
free (self->line);
free (self->w);
}
/// Notify whomever invoked the editor that it's been either confirmed or
/// cancelled and clean up editor state
static void
line_editor_abort (struct line_editor *self, bool status)
{
self->on_end (status);
self->on_changed = NULL;
free (self->line);
self->line = NULL;
free (self->w);
self->w = NULL;
self->alloc = 0;
self->len = 0;
self->point = 0;
self->prompt = 0;
}
/// Start the line editor; remember to fill in "change" and "end" callbacks
static void
line_editor_start (struct line_editor *self, char prompt)
{
self->alloc = 16;
self->line = xcalloc (sizeof *self->line, self->alloc);
self->w = xcalloc (sizeof *self->w, self->alloc);
self->len = 0;
self->point = 0;
self->prompt = prompt;
}
static void
line_editor_changed (struct line_editor *self)
{
self->line[self->len] = 0;
self->w[self->len] = 0;
if (self->on_changed)
self->on_changed ();
}
static void
line_editor_move (struct line_editor *self, int to, int from, int len)
{
memmove (self->line + to, self->line + from,
sizeof *self->line * len);
memmove (self->w + to, self->w + from,
sizeof *self->w * len);
}
static void
line_editor_insert (struct line_editor *self, ucs4_t codepoint)
{
while (self->alloc - self->len < 2 /* inserted + sentinel */)
{
self->alloc <<= 1;
self->line = xreallocarray
(self->line, sizeof *self->line, self->alloc);
self->w = xreallocarray
(self->w, sizeof *self->w, self->alloc);
}
line_editor_move (self, self->point + 1, self->point,
self->len - self->point);
self->line[self->point] = codepoint;
self->w[self->point] = app_is_character_in_locale (codepoint)
? uc_width (codepoint, locale_charset ())
: 1 /* the replacement question mark */;
self->point++;
self->len++;
line_editor_changed (self);
}
static bool
line_editor_action (struct line_editor *self, enum line_editor_action action)
{
switch (action)
{
default:
return soft_assert (!"unknown line editor action");
case LINE_EDITOR_B_CHAR:
if (self->point < 1)
return false;
do self->point--;
while (self->point > 0
&& !self->w[self->point]);
return true;
case LINE_EDITOR_F_CHAR:
if (self->point + 1 > (int) self->len)
return false;
do self->point++;
while (self->point < (int) self->len
&& !self->w[self->point]);
return true;
case LINE_EDITOR_B_WORD:
{
if (self->point < 1)
return false;
int i = self->point;
while (i && self->line[--i] == ' ');
while (i-- && self->line[i] != ' ');
self->point = ++i;
return true;
}
case LINE_EDITOR_F_WORD:
{
if (self->point + 1 > (int) self->len)
return false;
int i = self->point;
while (i < (int) self->len && self->line[i] == ' ') i++;
while (i < (int) self->len && self->line[i] != ' ') i++;
self->point = i;
return true;
}
case LINE_EDITOR_HOME:
self->point = 0;
return true;
case LINE_EDITOR_END:
self->point = self->len;
return true;
case LINE_EDITOR_UPCASE_WORD:
{
int i = self->point;
for (; i < (int) self->len && self->line[i] == ' '; i++);
for (; i < (int) self->len && self->line[i] != ' '; i++)
self->line[i] = uc_toupper (self->line[i]);
self->point = i;
line_editor_changed (self);
return true;
}
case LINE_EDITOR_DOWNCASE_WORD:
{
int i = self->point;
for (; i < (int) self->len && self->line[i] == ' '; i++);
for (; i < (int) self->len && self->line[i] != ' '; i++)
self->line[i] = uc_tolower (self->line[i]);
self->point = i;
line_editor_changed (self);
return true;
}
case LINE_EDITOR_CAPITALIZE_WORD:
{
int i = self->point;
ucs4_t (*converter) (ucs4_t) = uc_totitle;
for (; i < (int) self->len && self->line[i] == ' '; i++);
for (; i < (int) self->len && self->line[i] != ' '; i++)
{
self->line[i] = converter (self->line[i]);
converter = uc_tolower;
}
self->point = i;
line_editor_changed (self);
return true;
}
case LINE_EDITOR_B_DELETE:
{
if (self->point < 1)
return false;
int len = 1;
while (self->point - len > 0
&& !self->w[self->point - len])
len++;
line_editor_move (self, self->point - len, self->point,
self->len - self->point);
self->len -= len;
self->point -= len;
line_editor_changed (self);
return true;
}
case LINE_EDITOR_F_DELETE:
{
if (self->point + 1 > (int) self->len)
return false;
int len = 1;
while (self->point + len < (int) self->len
&& !self->w[self->point + len])
len++;
self->len -= len;
line_editor_move (self, self->point, self->point + len,
self->len - self->point);
line_editor_changed (self);
return true;
}
case LINE_EDITOR_B_KILL_WORD:
{
if (self->point < 1)
return false;
int i = self->point;
while (i && self->line[--i] == ' ');
while (i-- && self->line[i] != ' ');
i++;
line_editor_move (self, i, self->point, (self->len - self->point));
self->len -= self->point - i;
self->point = i;
line_editor_changed (self);
return true;
}
case LINE_EDITOR_B_KILL_LINE:
self->len -= self->point;
line_editor_move (self, 0, self->point, self->len);
self->point = 0;
line_editor_changed (self);
return true;
case LINE_EDITOR_F_KILL_LINE:
self->len = self->point;
line_editor_changed (self);
return true;
}
}
static int
line_editor_write (const struct line_editor *self, struct row_buffer *row,
int width, chtype attrs)
{
if (self->prompt)
{
hard_assert (self->prompt < 127);
row_buffer_append_c (row, self->prompt, attrs);
width--;
}
int following = 0;
for (size_t i = self->point; i < self->len; i++)
following += self->w[i];
int preceding = 0;
size_t start = self->point;
while (start && preceding < width / 2)
preceding += self->w[--start];
// There can be one extra space at the end of the line but this way we
// don't need to care about non-spacing marks following full-width chars
while (start && width - preceding - following > 2 /* widest char */)
preceding += self->w[--start];
// XXX: we should also show < > indicators for overflow but it'd probably
// considerably complicate this algorithm
for (; start < self->len; start++)
row_buffer_append_c (row, self->line[start], attrs);
return !!self->prompt + preceding;
}

View File

@@ -1,6 +1,6 @@
# nncmpp.actions.awk: produce C code for a list of user actions # nncmpp.actions.awk: produce C code for a list of user actions
# #
# Copyright (c) 2022, Přemysl Eric Janouch <p@janouch.name> # Copyright (c) 2022 - 2024, Přemysl Eric Janouch <p@janouch.name>
# SPDX-License-Identifier: 0BSD # SPDX-License-Identifier: 0BSD
# #
# Usage: env LC_ALL=C A=0 B=1 awk -f nncmpp.actions.awk \ # Usage: env LC_ALL=C A=0 B=1 awk -f nncmpp.actions.awk \
@@ -91,7 +91,7 @@ END {
print "enum action {" print "enum action {"
for (i in Constants) for (i in Constants)
print "\t" "ACTION_" Constants[i] "," print "\t" "ACTION_" Constants[i] ","
print "\t" "ACTION_COUNT" print "\t" "ACTION_USER_0"
print "};" print "};"
print "" print ""
print "static const char *g_action_names[] = {" print "static const char *g_action_names[] = {"

View File

@@ -69,7 +69,7 @@ colors = {
scrollbar = "" scrollbar = ""
} }
streams = { streams = {
"dnbradio.com" = "http://www.dnbradio.com/hi.m3u" "dnbradio.com" = "https://dnbradio.com/hi.pls"
"BassDrive.com" = "http://bassdrive.com/v2/streams/BassDrive.pls" "BassDrive.com" = "http://bassdrive.com/v2/streams/BassDrive.pls"
} }
.... ....
@@ -85,6 +85,18 @@ To adjust key bindings, put them within a *normal* or *editor* object.
Run *nncmpp* with the *--debug* option to find out key combinations names. Run *nncmpp* with the *--debug* option to find out key combinations names.
Press *?* in the help tab to learn the action identifiers to use. Press *?* in the help tab to learn the action identifiers to use.
You may also define and bind your own actions, launching arbitrary
shell commands. Note that you cannot override internal actions in this manner.
....
actions = {
"pioneer-on-off" = {
description = "Pioneer amplifier: turn on/off"
command = "elksmart-comm --nec A538"
}
}
....
Spectrum visualiser Spectrum visualiser
------------------- -------------------
When built against the FFTW library, *nncmpp* can make use of MPD's "fifo" When built against the FFTW library, *nncmpp* can make use of MPD's "fifo"

2222
nncmpp.c

File diff suppressed because it is too large Load Diff

9
nncmpp.desktop Normal file
View File

@@ -0,0 +1,9 @@
[Desktop Entry]
Type=Application
Name=nncmpp
GenericName=MPD client
Icon=nncmpp
Exec=nncmpp %U
StartupNotify=false
# Not registering a MimeType, because that depends on MPD.
Categories=AudioVideo;Audio;Player;

9
nncmpp.svg Normal file
View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg version="1.0" width="48" height="48" viewBox="0 0 48 48"
xmlns="http://www.w3.org/2000/svg">
<g transform="translate(5 4) scale(2 2)">
<!-- From x11_icon_play, with a stroke for contrast. -->
<path d="M 0 0 20 10 0 20 Z" stroke="#eee" stroke-width="2" fill="#000"
stroke-linejoin="round" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 385 B

2
termo

Submodule termo updated: 8265f075b1...f9a102456f