Compare commits
40 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
9ff110a44e
|
|||
|
0f30000109
|
|||
|
faf82acc15
|
|||
|
fc275b0860
|
|||
|
2295cab3a4
|
|||
|
bda11fe9f0
|
|||
|
7f6d6b24e5
|
|||
|
8b2b8bc08f
|
|||
|
b98dffdf46
|
|||
|
9420e1c5f1
|
|||
|
a842b82849
|
|||
|
29f970d135
|
|||
|
aa566be6b6
|
|||
|
a886221d7d
|
|||
|
ab81899996
|
|||
|
ba86b859ea
|
|||
|
ab0c618991
|
|||
|
b0a0fc1b69
|
|||
|
6eeb1161c9
|
|||
|
115599a848
|
|||
|
bb8bea696e
|
|||
|
190149a660
|
|||
|
9ba7a0fce5
|
|||
|
1a0f61f6d8
|
|||
|
6aa822fe34
|
|||
|
6cf6231282
|
|||
|
708b78f145
|
|||
|
3361df0ccb
|
|||
|
13195e797a
|
|||
|
7fee01a5c6
|
|||
|
8b4300c796
|
|||
|
cd3d4eb1ad
|
|||
|
641803df35
|
|||
|
eec0706333
|
|||
|
9d0acddf9a
|
|||
|
ec12e2ac25
|
|||
|
24449fe721
|
|||
|
60171cc5a3
|
|||
|
20502200d9
|
|||
|
e6de4f11e7
|
@@ -2,6 +2,7 @@
|
||||
/build
|
||||
|
||||
# Qt Creator files
|
||||
/.qtcreator
|
||||
/CMakeLists.txt.user*
|
||||
/nncmpp.config
|
||||
/nncmpp.files
|
||||
|
||||
+34
-3
@@ -1,5 +1,5 @@
|
||||
cmake_minimum_required (VERSION 3.0...3.27)
|
||||
project (nncmpp VERSION 2.1.1 LANGUAGES C)
|
||||
project (nncmpp VERSION 2.3.2 LANGUAGES C)
|
||||
|
||||
# Moar warnings
|
||||
if ("${CMAKE_C_COMPILER_ID}" MATCHES "GNU" OR CMAKE_COMPILER_IS_GNUCC)
|
||||
@@ -77,6 +77,15 @@ if (WITH_X11)
|
||||
list (APPEND extra_libraries ${x11_LIBRARIES})
|
||||
endif ()
|
||||
|
||||
add_option (WITH_APPKIT "Build as a bundle with AppKit support" "${APPLE}")
|
||||
if (WITH_APPKIT)
|
||||
enable_language (OBJC)
|
||||
set (CMAKE_OBJC_FLAGS
|
||||
"${CMAKE_OBJC_FLAGS} -std=gnu99 -Wall -Wextra -Wno-unused-function")
|
||||
list (APPEND extra_libraries "-framework AppKit"
|
||||
"-framework CoreFoundation" "-framework MediaPlayer")
|
||||
endif ()
|
||||
|
||||
include_directories (${Unistring_INCLUDE_DIRS}
|
||||
${Ncursesw_INCLUDE_DIRS} ${Termo_INCLUDE_DIRS} ${curl_INCLUDE_DIRS}
|
||||
${fftw_INCLUDE_DIRS} ${libpulse_INCLUDE_DIRS} ${x11_INCLUDE_DIRS})
|
||||
@@ -120,8 +129,30 @@ add_custom_command (OUTPUT ${actions}
|
||||
|
||||
# Build the main executable and link it
|
||||
add_executable (${PROJECT_NAME} ${PROJECT_NAME}.c ${actions})
|
||||
target_link_libraries (${PROJECT_NAME} ${Unistring_LIBRARIES}
|
||||
${Ncursesw_LIBRARIES} termo-static ${curl_LIBRARIES} ${extra_libraries})
|
||||
if (WITH_APPKIT)
|
||||
set_source_files_properties (${PROJECT_NAME}.c PROPERTIES LANGUAGE OBJC)
|
||||
set_target_properties (${PROJECT_NAME} PROPERTIES MACOSX_BUNDLE TRUE)
|
||||
|
||||
set (MACOSX_BUNDLE_GUI_IDENTIFIER name.janouch.${PROJECT_NAME})
|
||||
set (MACOSX_BUNDLE_ICON_FILE ${PROJECT_NAME}.icns)
|
||||
|
||||
# XXX: This will not normally work from within Nix.
|
||||
set (icns "${PROJECT_BINARY_DIR}/${MACOSX_BUNDLE_ICON_FILE}")
|
||||
set (iconset "${PROJECT_BINARY_DIR}/${PROJECT_NAME}.iconset")
|
||||
add_custom_command (OUTPUT "${icns}"
|
||||
COMMAND ${CMAKE_COMMAND} -E make_directory "${iconset}"
|
||||
COMMAND sips --js "${PROJECT_SOURCE_DIR}/gen-icon.js" -o "${iconset}"
|
||||
COMMAND iconutil -c icns -o "${icns}" "${iconset}"
|
||||
DEPENDS gen-icon.js
|
||||
COMMENT "Generating application icon" VERBATIM)
|
||||
|
||||
target_sources (${PROJECT_NAME} PRIVATE "${icns}")
|
||||
set_source_files_properties ("${icns}" PROPERTIES
|
||||
MACOSX_PACKAGE_LOCATION Resources)
|
||||
endif ()
|
||||
target_link_libraries (${PROJECT_NAME} PRIVATE ${Unistring_LIBRARIES}
|
||||
${Ncursesw_LIBRARIES} ${Termo_LIBRARIES} ${curl_LIBRARIES}
|
||||
${extra_libraries})
|
||||
add_threads (${PROJECT_NAME})
|
||||
|
||||
# Installation
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2016 - 2023, Přemysl Eric Janouch <p@janouch.name>
|
||||
Copyright (c) 2016 - 2026, 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.
|
||||
|
||||
@@ -1,3 +1,48 @@
|
||||
2.3.2 (2026-09-05)
|
||||
|
||||
* X11: fixed doubled Fontconfig substitutions
|
||||
|
||||
|
||||
2.3.1 (2026-09-04)
|
||||
|
||||
* Added a Readline-like C-t editor binding
|
||||
|
||||
* X11: improved focus handling, improved IME integration
|
||||
|
||||
|
||||
2.3.0 (2026-08-08)
|
||||
|
||||
* The "elapsed" attribute is now used for "remaining" as well.
|
||||
For the typical theme, remove "remaining" and reverse your "elapsed".
|
||||
|
||||
* Added "b", "f", "p", "s" bindings for back/forward seek, play/pause, stop
|
||||
|
||||
* AppKit: the application now shows up in Now Playing,
|
||||
and as a consequence responds to media keys
|
||||
|
||||
* AppKit: made the application icon look nicer
|
||||
|
||||
* X11: improved font lookup of italic and bold variants
|
||||
|
||||
|
||||
2.2.0 (2026-05-26)
|
||||
|
||||
* Added an AppKit user interface; the -x (--x11) option has become -g (--gui)
|
||||
|
||||
* 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
|
||||
|
||||
+6
-4
@@ -2,8 +2,8 @@ nncmpp
|
||||
======
|
||||
|
||||
'nncmpp' is yet another MPD client. Its specialty is running equally well in
|
||||
the terminal, or as an X11 client--it will provide the same keyboard- and
|
||||
mouse-friendly interface.
|
||||
the terminal, as an X11 client, or as a macOS application--it will provide
|
||||
the same keyboard- and mouse-friendly interface.
|
||||
|
||||
This project began its life as a simplified TUI version of Sonata. I had
|
||||
already written a lot of the required code before, so I had the perfect
|
||||
@@ -33,6 +33,8 @@ 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
|
||||
-------------
|
||||
See the link:nncmpp.adoc[man page] for information about usage.
|
||||
@@ -72,8 +74,8 @@ however, tricky to get consistent results on, so be aware of the following:
|
||||
- Xterm needs `XTerm*metaSendsEscape: true` for the default bindings to work
|
||||
- urxvt's 'vtwheel' plugin sabotages scrolling
|
||||
|
||||
The X11 graphical interface is a second-class citizen, so some limitations of
|
||||
terminals carry over, such as the plain default theme.
|
||||
The X11 and macOS graphical interfaces are second-class citizens, so some
|
||||
limitations of terminals carry over, such as the plain default theme.
|
||||
|
||||
Contributing and Support
|
||||
------------------------
|
||||
|
||||
@@ -11,5 +11,6 @@
|
||||
#cmakedefine WITH_FFTW
|
||||
#cmakedefine WITH_PULSE
|
||||
#cmakedefine WITH_X11
|
||||
#cmakedefine WITH_APPKIT
|
||||
|
||||
#endif /* ! CONFIG_H */
|
||||
|
||||
@@ -33,8 +33,7 @@
|
||||
colors = {
|
||||
normal = "1 0"
|
||||
highlight = "12 0 bold"
|
||||
elapsed = "4 4"
|
||||
remains = "4 8"
|
||||
elapsed = "4 8"
|
||||
|
||||
tab_bar = "8 0"
|
||||
tab_active = "6 8 bold"
|
||||
|
||||
@@ -1,8 +1,7 @@
|
||||
colors = {
|
||||
normal = "237 255"
|
||||
highlight = "16 255 bold"
|
||||
elapsed = "231 250"
|
||||
remains = "250 231"
|
||||
elapsed = "250 231"
|
||||
|
||||
tab_bar = "252 16"
|
||||
tab_active = "231 237 bold"
|
||||
|
||||
+74
@@ -0,0 +1,74 @@
|
||||
// gen-icon.js: generate a program icon for nncmpp as an Apple iconset
|
||||
//
|
||||
// Copyright (c) 2026, Přemysl Eric Janouch <p@janouch.name>
|
||||
// SPDX-License-Identifier: 0BSD
|
||||
//
|
||||
// API documentation: https://manicmaniac.github.io/sips-js-api/modules.html
|
||||
|
||||
// Apple uses something close to a "quintic superellipse" in their icons,
|
||||
// but doesn't quite match. Either way, it looks better than rounded rectangles.
|
||||
function addSquircle(canvas, bounds) {
|
||||
const midX = bounds.x + bounds.width / 2
|
||||
const midY = bounds.y + bounds.height / 2
|
||||
canvas.moveTo(bounds.x + bounds.width, midY)
|
||||
for (let theta = 0; theta < Math.PI * 2; theta += Math.PI / 1e4) {
|
||||
const x = Math.pow(Math.abs(Math.cos(theta)), 2 / 5) * bounds.width / 2
|
||||
* Math.sign(Math.cos(theta)) + midX
|
||||
const y = Math.pow(Math.abs(Math.sin(theta)), 2 / 5) * bounds.height / 2
|
||||
* Math.sign(Math.sin(theta)) + midY
|
||||
canvas.lineTo(x, y)
|
||||
}
|
||||
canvas.closePath()
|
||||
}
|
||||
|
||||
function drawIcon(size) {
|
||||
const canvas = new Canvas(size, size)
|
||||
const nominal = 1024
|
||||
const scale = size / nominal
|
||||
|
||||
// Drawing in the Postscript coordinate system.
|
||||
canvas.translate(0, size)
|
||||
canvas.scale(scale, -scale)
|
||||
|
||||
const bounds = new Rect(100, 100, nominal - 200, nominal - 200)
|
||||
|
||||
canvas.save()
|
||||
canvas.beginPath()
|
||||
addSquircle(canvas, bounds)
|
||||
canvas.shadowOffsetX = 0
|
||||
canvas.shadowOffsetY = -12 * scale
|
||||
canvas.shadowBlur = 28 * scale
|
||||
canvas.shadowColor = 'rgba(0, 0, 0, 0.375)'
|
||||
canvas.fillStyle = '#d8d8d8'
|
||||
canvas.fill()
|
||||
canvas.restore()
|
||||
|
||||
canvas.save()
|
||||
canvas.beginPath()
|
||||
addSquircle(canvas, bounds)
|
||||
canvas.clip()
|
||||
const gradient = canvas.createLinearGradient(0, 100, 0, nominal - 100)
|
||||
gradient.addColorStop(0, '#cccccc')
|
||||
gradient.addColorStop(1, '#ffffff')
|
||||
canvas.fillStyle = gradient
|
||||
canvas.fillRect(0, 0, nominal, nominal)
|
||||
canvas.restore()
|
||||
|
||||
// The same shape as in nncmpp.svg.
|
||||
canvas.beginPath()
|
||||
canvas.moveTo(nominal * 0.325, nominal * 0.30)
|
||||
canvas.lineTo(nominal * 0.325, nominal * 0.70)
|
||||
canvas.lineTo(nominal * 0.725, nominal * 0.50)
|
||||
canvas.closePath()
|
||||
canvas.fillStyle = '#000'
|
||||
canvas.fill()
|
||||
|
||||
return canvas
|
||||
}
|
||||
|
||||
// Beware, this is most likely going to be generated in the Display P3 profile,
|
||||
// and I haven't found a way to change this.
|
||||
for (const size of [16, 32, 128, 256, 512]) {
|
||||
new Output(drawIcon(size), `icon_${size}x${size}.png`).addToQueue()
|
||||
new Output(drawIcon(size * 2), `icon_${size}x${size}@2x.png`).addToQueue()
|
||||
}
|
||||
+1
-1
Submodule liberty updated: 969a4cfc3e...eba8ead2b7
@@ -68,6 +68,7 @@ EDITOR_F_WORD, Go forward a word
|
||||
EDITOR_HOME, Go to start of line
|
||||
EDITOR_END, Go to end of line
|
||||
|
||||
EDITOR_TRANSPOSE_CHARS, Transpose characters
|
||||
EDITOR_UPCASE_WORD, Convert word to uppercase
|
||||
EDITOR_DOWNCASE_WORD, Convert word to lowercase
|
||||
EDITOR_CAPITALIZE_WORD, Capitalize word
|
||||
|
||||
+2
-2
@@ -1,6 +1,6 @@
|
||||
# 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
|
||||
#
|
||||
# Usage: env LC_ALL=C A=0 B=1 awk -f nncmpp.actions.awk \
|
||||
@@ -91,7 +91,7 @@ END {
|
||||
print "enum action {"
|
||||
for (i in Constants)
|
||||
print "\t" "ACTION_" Constants[i] ","
|
||||
print "\t" "ACTION_COUNT"
|
||||
print "\t" "ACTION_USER_0"
|
||||
print "};"
|
||||
print ""
|
||||
print "static const char *g_action_names[] = {"
|
||||
|
||||
+19
-8
@@ -14,10 +14,10 @@ Synopsis
|
||||
|
||||
Description
|
||||
-----------
|
||||
*nncmpp* is a hybrid terminal/X11 MPD client. On start up it will welcome
|
||||
you with an overview of all key bindings and the actions they're assigned to.
|
||||
Individual tabs can be switched to either using the mouse or by pressing *M-1*
|
||||
through *M-9*, corresponding to the order they appear in.
|
||||
*nncmpp* is a hybrid terminal/X11/AppKit MPD client. On start up it will
|
||||
welcome you with an overview of all key bindings and the actions they're
|
||||
assigned to. Individual tabs can be switched to either using the mouse
|
||||
or by pressing *M-1* through *M-9*, corresponding to the order they appear in.
|
||||
|
||||
As a convenience utility, any program arguments are added to the MPD queue.
|
||||
Note that to add files outside the database, you need to connect to MPD using
|
||||
@@ -29,8 +29,8 @@ Options
|
||||
Adds a "Debug" tab showing all MPD communication and other information
|
||||
that help debug various issues.
|
||||
|
||||
*-x*, *--x11*::
|
||||
Use an X11 interface even when run from a terminal.
|
||||
*-g*, *--gui*::
|
||||
Use a graphical interface even when run from a terminal.
|
||||
Note that the application may be built with this feature disabled.
|
||||
|
||||
*-h*, *--help*::
|
||||
@@ -57,8 +57,7 @@ settings = {
|
||||
colors = {
|
||||
normal = ""
|
||||
highlight = "bold"
|
||||
elapsed = "reverse"
|
||||
remains = "ul"
|
||||
elapsed = "ul"
|
||||
tab_bar = "reverse"
|
||||
tab_active = "ul"
|
||||
even = ""
|
||||
@@ -85,6 +84,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.
|
||||
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
|
||||
-------------------
|
||||
When built against the FFTW library, *nncmpp* can make use of MPD's "fifo"
|
||||
|
||||
+1
-1
Submodule termo updated: 2518b53e5a...a8f3f6eca3
Reference in New Issue
Block a user