Compare commits

...

5 Commits

Author SHA1 Message Date
noctuum c32b56e9d8 Do not reschedule a deleted scheduler item
schedule.remove from the scheduled command deletes the item.
2026-09-16 11:37:19 +02:00
noctuum de54a4c2ad Clamp the negative width in wstring_width
A narrow terminal makes the file list width go below zero.
2026-09-16 11:18:54 +02:00
noctuum 26fdca8f4d Use empty_visible in the view focus movers
empty() counts filtered entries, so size() - 1 underflows.
2026-09-16 10:57:25 +02:00
noctuum 00bcdaee23 Check the info-hash target in p.call_target
Without it an unknown info-hash segfaults the process.
2026-09-16 10:29:52 +02:00
rakshasa 3787dbe7f3 Tagged release 0.16.23. 2026-09-15 14:49:21 +02:00
5 changed files with 19 additions and 7 deletions
+3 -3
View File
@@ -1,6 +1,6 @@
m4_pattern_allow([PKG_CHECK_EXISTS]) m4_pattern_allow([PKG_CHECK_EXISTS])
AC_INIT([rtorrent],[0.16.22],[sundell.software@gmail.com]) AC_INIT([rtorrent],[0.16.23],[sundell.software@gmail.com])
AC_CONFIG_HEADERS([config.h]) AC_CONFIG_HEADERS([config.h])
AC_CONFIG_MACRO_DIRS([scripts]) AC_CONFIG_MACRO_DIRS([scripts])
@@ -14,7 +14,7 @@ AX_CXX_COMPILE_STDCXX(20, noext, mandatory)
PKG_PROG_PKG_CONFIG PKG_PROG_PKG_CONFIG
AC_DEFINE([API_VERSION], [26], [api version]) AC_DEFINE([API_VERSION], [27], [api version])
RAK_CHECK_CFLAGS RAK_CHECK_CFLAGS
RAK_CHECK_CXXFLAGS RAK_CHECK_CXXFLAGS
@@ -49,7 +49,7 @@ fi
PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"]) PKG_CHECK_MODULES([CPPUNIT], [cppunit],, [no_cppunit="yes"])
PKG_CHECK_MODULES([ZLIB], [zlib]) PKG_CHECK_MODULES([ZLIB], [zlib])
PKG_CHECK_MODULES([DEPENDENCIES], [libtorrent >= 0.16.22]) PKG_CHECK_MODULES([DEPENDENCIES], [libtorrent >= 0.16.23])
AC_LANG_PUSH(C++) AC_LANG_PUSH(C++)
TORRENT_WITH_XMLRPC_C TORRENT_WITH_XMLRPC_C
+3
View File
@@ -431,6 +431,9 @@ p_call_target(const torrent::Object::list_type& args) {
const std::string& peer_id = itr++->as_string(); const std::string& peer_id = itr++->as_string();
const std::string& command_key = itr++->as_string(); const std::string& command_key = itr++->as_string();
if (download == nullptr)
throw torrent::input_error("invalid parameters: info-hash not found");
torrent::HashString hash; torrent::HashString hash;
if (peer_id.size() != 40) if (peer_id.size() != 40)
+2 -2
View File
@@ -216,7 +216,7 @@ View::set_not_visible(Download* download) {
void void
View::next_focus(unsigned int i) { View::next_focus(unsigned int i) {
if (empty()) if (empty_visible())
return; return;
// If at the boundary, roll over // If at the boundary, roll over
@@ -239,7 +239,7 @@ View::next_focus(unsigned int i) {
void void
View::prev_focus(unsigned int i) { View::prev_focus(unsigned int i) {
if (empty()) if (empty_visible())
return; return;
// If at the boundary, roll over // If at the boundary, roll over
+4 -1
View File
@@ -25,7 +25,10 @@ WindowFileList::WindowFileList(const ui::ElementFileList* element) :
// Convert std::string to std::wstring of given width (in screen positions), // Convert std::string to std::wstring of given width (in screen positions),
// taking into account that some characters may be occupying two screen positions. // taking into account that some characters may be occupying two screen positions.
std::wstring std::wstring
wstring_width(const std::string& i_str, [[maybe_unused]] int width) { wstring_width(const std::string& i_str, int width) {
if (width < 0)
width = 0;
std::wstring result(width + 1, L' '); std::wstring result(width + 1, L' ');
size_t length = std::mbstowcs(result.data(), i_str.c_str(), width); size_t length = std::mbstowcs(result.data(), i_str.c_str(), width);
+7 -1
View File
@@ -61,14 +61,20 @@ CommandScheduler::call_item(value_type item) {
// Remove the item before calling the command if it should be // Remove the item before calling the command if it should be
// removed. // removed.
std::string key = item->key();
try { try {
rpc::call_object(item->command()); rpc::call_object(item->command());
} catch (torrent::input_error& e) { } catch (torrent::input_error& e) {
if (m_slotErrorMessage) if (m_slotErrorMessage)
m_slotErrorMessage("Scheduled command failed: " + item->key() + ": " + e.what()); m_slotErrorMessage("Scheduled command failed: " + key + ": " + e.what());
} }
// The command is allowed to erase or replace this item, which deletes it.
if (std::find(begin(), end(), item) == end())
return;
// Still schedule if we caught a torrrent::input_error? // Still schedule if we caught a torrrent::input_error?
auto next = item->next_time_scheduled(); auto next = item->next_time_scheduled();