Git Product home page Git Product logo

canto-curses's Introduction

Canto Curses

The curses (text) client for canto-daemon.

Canto-daemon is required to work and is found at:

http://github.com/themoken/canto-next

Requirements

Debian / Ubuntu
- python3 (will grab libncursesw5 and libreadline6 too)
- python3-dev
- libncursesw5-dev
- libreadline6-dev
- build-essential

Arch
- readline
- python
- ncurses
- gcc (or base-devel)

Others, just ensure you have Python 3.3+, ncurses, their headers and GCC

Install

    $ sudo python3 setup.py install

canto-curses's People

Contributors

dkasak avatar themoken avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

canto-curses's Issues

Feature Request: Multikey Bindings

It would be awesome if canto had support for being able to use key sequences as bindings in addition to single letters letters. An example of this would be vim's "gg"

The syntax would look like ":bind .... action"
For example: ":bind gt goto"

If this was to be implemented I would say that not having a timeout would be preferable. This would mean that if you had "gt" bound, you could not also have "g" bound. Pressing g would do nothing until you pressed another key (as opposed to timing out to g's default action).

Old canto look

Hi! Is it possible to get the look of the old version in canto-ng?

Implicit function declaration in widecurse.c - false alarm?

When building this package on Gentoo (modified ebuild to use latest version), I run across this warning message:

* QA Notice: Package triggers severe warnings which indicate that it
 *            may exhibit random runtime failures.
 * canto_curses/widecurse.c:63:4: warning: implicit declaration of function ‘waddwstr’; did you mean ‘waddstr’? [-Wimplicit-function-declaration]

 * Please do not file a Gentoo bug and instead report the above QA
 * issues directly to the upstream developers of this software.
 * Homepage: https://codezen.org/canto-ng/

This definitely appears to be a bug upstream, and the fix seems quite easy. Is this benign?

How to specify link to follow

I am using canto-curses for the first time and i have some habits from the Previous implementation of canto.
What is now the equivalent of goto (g + linkNumber + enter) on canto-curses?

Feature Request: option to strip HTML tags from title

Feed from Jira have HTML in title that make it hard to read with canto-curses
Simple remove like this is working fine

def remove_html_markup(s):
    tag = False
    quote = False
    out = ""
    for c in s:
        if c == '<' and not quote:
            tag = True
        elif c == '>' and not quote:
            tag = False
        elif (c == '"' or c == "'") and tag:
            quote = not quote
        elif not tag:
            out = out + c
    return out

Error building

Got the following error while compiling:

$ git clone https://github.com/themoken/canto-curses.git
Cloning into 'canto-curses'...
remote: Counting objects: 3477, done.
remote: Total 3477 (delta 0), reused 0 (delta 0), pack-reused 3477
Receiving objects: 100% (3477/3477), 1.24 MiB | 497.00 KiB/s, done.
Resolving deltas: 100% (2380/2380), done.
CHecking connectivity... done.
$ cd canto-curses/
$ python3 setup.py install --prefix=~/usr/local/bin/canto
running install
running build
running build_py
creating build
creating build/lib.macosx-10.8-x86_64-3.5
creating build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/__init__.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/color.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/command.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/config.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/gui.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/guibase.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/html.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/input.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/locks.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/main.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/reader.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/screen.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/story.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/subthread.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/tag.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/tagcore.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/taglist.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/text.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
copying canto_curses/theme.py -> build/lib.macosx-10.8-x86_64-3.5/canto_curses
running build_ext
building 'canto_curses.widecurse' extension
creating build/temp.macosx-10.8-x86_64-3.5
creating build/temp.macosx-10.8-x86_64-3.5/canto_curses
clang -Wno-unused-result -Wsign-compare -Wunreachable-code -fno-common -dynamic -DNDEBUG o
canto_curses/widecurse.c:63:4: warning: implicit declaration of function 'waddwstr' is
      invalid in C99 [-Wimplicit-function-declaration]
                        waddwstr(win, dest);
                        ^
canto_curses/widecurse.c:200:11: warning: comparison of constant 9223372036854775807 with
      expression of type 'int' is always false
      [-Wtautological-constant-out-of-range-compare]
                if (len > PY_SSIZE_T_MAX) {
                    ~~~ ^ ~~~~~~~~~~~~~~
2 warnings generated.
clang -bundle -undefined dynamic_lookup build/temp.macosx-10.8-x86_64-3.5/canto_curses/wio
ld: warning: directory not found for option '-L/opt/local/lib'
ld: library not found for -lncursesw
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: command 'clang' failed with exit status 1

Different behaviour between "item-state read" and "item-state -read"?

I have two keys set with this options (h/l dunno if they're defaults) + global_transform filter_read

Problem:
item-state read: marks the item as read, nothing more
item-state -read: unmark the item as read and kicks in the filter_read. So if I want to unmark more than one item, but not the whole tag I would need to deactivate the filter.

Is there some default setting set for h? Did I use the wrong option? I don't want that the filter kicks in while setting feeds as unread.

canto-curses fails to start under Ubuntu 12.04

Here is the log content:

07:10:39 : CANTO-CURSES -> Canto-curses started.
07:10:39 : CANTO-CURSES -> Exiting on exception:
07:10:39 : CANTO-CURSES ->
Traceback (most recent call last):
File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 297, in start
self.run()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 230, in run
self.gui = CantoCursesGui(self)
File "/usr/local/lib/python3.2/dist-packages/canto_curses/gui.py", line 507, in init
self.daemon_init()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/gui.py", line 547, in daemon_init
self.screen.refresh()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 559, in refresh
c.refresh()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/input.py", line 69, in refresh
self.callbacks"refresh"
File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 208, in
refcb = lambda : self.refresh_callback(ci, top, left, bottom, right)
File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 462, in refresh_callback
c.pad.noutrefresh(0, 0, t, l, b, r)
TypeError: noutrefresh() takes exactly 0 arguments (6 given)

07:10:39 : CANTO-CURSES -> Exiting.

Ghost feed not listed in frontend

Hi !

I have a feed added that doesn't show up anymore in the list.
I can't :del it as I don't see the feed.
If I add it again, here is the curses-log file :

COMMON -> Adding feed http://www.purepeople.com/rss/news_t0.xml - Purepeople - Toutes les news
ERRORS!
[feeds][12][name] -> Purepeople - Toutes les news: Feed name already used!
[feeds][12][name] -> Purepeople - Toutes les news: Set but invalid and required

The feeds files in .config/canto/ seems to be crypted.
The canto-remote listfeeds show the entry on #6, but if I :del 6 it delete another feed.

Any idea ?

Difficulty compiling canto-curses on Ubuntu 12.10

I have the requirements ...

sudo apt-get install python3 libncursesw5-dev libncurses5-dev python-dev python-feedparser
Reading package lists... Done
Building dependency tree
Reading state information... Done
libncurses5-dev is already the newest version.
libncursesw5-dev is already the newest version.
python-dev is already the newest version.
python-feedparser is already the newest version.
python3 is already the newest version.
0 upgraded, 0 newly installed, 0 to remove and 20 not upgraded.

But when it comes to install ...

sudo python setup.py install
running install
running build
running build_py
running build_ext
building 'canto_curses.widecurse' extension
gcc -pthread -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -Wstrict-prototypes -fPIC -I/usr/local/include -I/opt/local/include -I/usr/include/python2.7 -c canto_curses/widecurse.c -o build/temp.linux-i686-2.7/canto_curses/widecurse.o
canto_curses/widecurse.c: In function ‘py_waddch’:
canto_curses/widecurse.c:62:6: warning: implicit declaration of function ‘waddwstr’ [-Wimplicit-function-declaration]
canto_curses/widecurse.c: At top level:
canto_curses/widecurse.c:92:15: error: variable ‘moduledef’ has initialiser but incomplete type
canto_curses/widecurse.c:93:2: error: ‘PyModuleDef_HEAD_INIT’ undeclared here (not in a function)
canto_curses/widecurse.c:93:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:93:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:94:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:94:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:95:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:95:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:96:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:96:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:97:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:97:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:98:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:98:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:99:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:99:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:100:2: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:100:2: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c:102:1: warning: excess elements in struct initializer [enabled by default]
canto_curses/widecurse.c:102:1: warning: (near initialization for ‘moduledef’) [enabled by default]
canto_curses/widecurse.c: In function ‘PyInit_widecurse’:
canto_curses/widecurse.c:107:5: warning: implicit declaration of function ‘PyModule_Create’ [-Wimplicit-function-declaration]
canto_curses/widecurse.c:107:5: warning: ‘return’ with a value, in function returning void [enabled by default]
In file included from canto_curses/widecurse.c:10:0:
canto_curses/widecurse.c: At top level:
/usr/include/python2.7/py_curses.h:92:15: warning: ‘PyCurses_API’ defined but not used [-Wunused-variable]
/usr/include/python2.7/py_curses.h:105:14: warning: ‘catchall_ERR’ defined but not used [-Wunused-variable]
/usr/include/python2.7/py_curses.h:106:14: warning: ‘catchall_NULL’ defined but not used [-Wunused-variable]
error: command 'gcc' failed with exit status 1

Can't set browser

No matter what I try, I can't seem to set the browser. I try running ':set browser firefox-bin' and ':set browser xdg-open' and it seems like canto won't recognise either. Links won't open, and when I quit and kill the daemon, my config file does not have a browser entry. I even hacked in some print()'s to the code, and it seems my settings are not recognised. Or at least, _fork() is called with "firefox" and not "firefox-bin", I can't work out where settings are actually set.

I also tried '$ canto-remote one-config CantoCurses.browser = firefox-bin %u' which does print 'CantoCurses.browser = firefox-bin %u' but after running said command canto-curses won't start. Instead it just silently dies with

13:40:01 : CANTO-CURSES -> Canto-curses started.
13:40:01 : CANTO-CURSES -> Exiting on exception:
13:40:01 : CANTO-CURSES ->
Traceback (most recent call last):
File "/usr/lib64/python3.3/site-packages/canto_curses/main.py", line 297, in start
self.run()
File "/usr/lib64/python3.3/site-packages/canto_curses/main.py", line 230, in run
self.gui = CantoCursesGui(self)
File "/usr/lib64/python3.3/site-packages/canto_curses/gui.py", line 526, in init
self.daemon_init()
File "/usr/lib64/python3.3/site-packages/canto_curses/gui.py", line 554, in daemon_init
self.prot_configs(self.wait_response("CONFIGS")[1])
File "/usr/lib64/python3.3/site-packages/canto_curses/gui.py", line 918, in prot_configs
self.validators)
File "/usr/lib64/python3.3/site-packages/canto_curses/gui.py", line 847, in validate_config
chgs, dels = self.validate_config(c[key], d[key], v[key])
File "/usr/lib64/python3.3/site-packages/canto_curses/gui.py", line 833, in validate_config
c[key] = d[key]
TypeError: 'str' object does not support item assignment

13:40:01 : CANTO-CURSES -> Exiting.

Am I correctly setting my browser? Why won't the setting work, or even stick in the conf file?

daemon-log showing traceback calls

This is happening even with a completely fresh instance of canto. Note that the paths look weird because of the way NixOS handles them (I'm the maintainer for canto on this distribution). Therefore please disregard the path "weirdness".

Traceback (most recent call last):
  File "/nix/store/i1ngys8ag4mc28hi9vk4s5smw91g15na-canto-daemon-0.9.3/lib/python3.4/site-packages/canto_next/server.py", line 40, in read_loop
    d = self.do_read(conn)
  File "/nix/store/i1ngys8ag4mc28hi9vk4s5smw91g15na-canto-daemon-0.9.3/lib/python3.4/site-packages/canto_next/protocol.py", line 214, in do_read
    r = self._do_read(conn, timeout)
  File "/nix/store/i1ngys8ag4mc28hi9vk4s5smw91g15na-canto-daemon-0.9.3/lib/python3.4/site-packages/canto_next/protocol.py", line 250, in _do_read
    size = struct.unpack('!q', conn.recv(8))[0]
struct.error: unpack requires a bytes object of length 8

Other than the callbacks in the daemon-log it doesn't seem that canto is suffering functionality, all feeds display fine and work as expected. So I'm not exactly sure if the above traceback is expected or not.

Indicator counter reacts on "mark unread"

It's currently possible to "manipulate" the new indicator by simply marking an item unread again (Even using the same item again and again doing "read-->unread-->read.....")

While not really tragic I suppose it contradicts the purpose you mentioned in your blogpost from 17.12.2014
"A minor change to canto-curses is that the tag status line now includes a grey indicator (similar to the blue indicator for unread items) for items that have been updated, but haven’t been displayed yet."

But manually marking an item unread is an item which is already displayed so normally it shouldn't be displayed.

Fetching issue in Reader-Mode(?)

Got the following error, while trying to use 'f' + Number and hitting return in readermode

Exception running command fetch

Traceback (most recent call last):
File "/usr/lib/python3.3/site-packages/canto_curses/command.py", line 80, in command
 r = func(self, args = args)
File "/usr/lib/python3.3/site-packages/canto_next/plugins.py", line 136, in newfunc
 r = realfunc(*args, **kwargs)
File "/usr/lib/python3.3/site-packages/canto_curses/reader.py", line 167, in cmd_fetch
self._fetch(links)
File "/usr/lib/python3.3/site-packages/canto_curses/guibase.py", line 276, in _fetch
self._goto(urls, True)
File "/usr/lib/python3.3/site-packages/canto_curses/guibase.py", line 266, in _goto
pid = self._fork(browser["path"], url, browser["text"], fetch)
File "/usr/lib/python3.3/site-packages/canto_curses/guibase.py", line 89, in _fork 
tmppath = urllib2.urlparse.urlparse(href).path
NameError: global name 'urllib2' is not defined

Continuing...

canto-curses fails to start under Debian Wheezy (ARM)

canto-daemon executes with no issues, but canto-curses exits with the error below. OS is Debian Wheezy on a raspberry pi.

18:17:25 : CANTO-CURSES -> Canto-curses started.
18:17:26 : CANTO-CURSES -> Exiting on exception:
18:17:26 : CANTO-CURSES ->
Traceback (most recent call last):
File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 297, in start
self.run()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 230, in run
self.gui = CantoCursesGui(self)
File "/usr/local/lib/python3.2/dist-packages/canto_curses/gui.py", line 507, in init
self.daemon_init()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/gui.py", line 547, in daemon_init
self.screen.refresh()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 559, in refresh
c.refresh()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/input.py", line 69, in refresh
self.callbacks"refresh"
File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 208, in
refcb = lambda : self.refresh_callback(ci, top, left, bottom, right)
File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 462, in refresh_callback
c.pad.noutrefresh(0, 0, t, l, b, r)
TypeError: noutrefresh() takes exactly 0 arguments (6 given)

18:17:26 : CANTO-CURSES -> Exiting.

New items counter reacting on mark read/unread

I noticed this a while ago, but forget it, as it is just a visual glitch (dunno what happens if the counter var overflows)

1470513703
Feed has 28 unread items and 3 new ones

If I mark one item as read:
1470513719
Now it says something about 5 unread

Marking it as unread again:
1470513730
Now 9

Updating via F5:
1470514885
Just the 3 more (28 --> 31) the counter intially showed

Config for marking read/unread (maybe the issue is with the config):

"h": "item-state -read",
"l": "item-state read",

Any difference between -read and unread? I noticed in the config one line where I still have unread set as value

"goto selected item in browser" on collapsed feed

Small issue/feature I noticed.
If staying on a collapsed feed (just [+]$FEEDNAME visible) and using "g" (Goto the selected item in your browser) opens an item from another feed, which is kinda an unexpected behaviour?
I would have assumed nothing should happen, or the complete list of items in the feed would be opened. But not a kinda random open of another item

':del Reddit' unsubs random other feed

Greetings,

(system: Arch-Linux, at most a week since last update, used pkg: canto-curses-git 0.9.7-1)

while trying to debug some other issues I purged the package + config
pacman -Rns canto-curses-git; rm -r ~/.config/canto
and reinstalled the package from aur. It comes preinstalled with a few feeds, one of them being reddit. Trying to delete them one by one led me to fire up the client and type.
:del Reddit
(actually, I did this twice, being confused and trying again before stopping at the error message - the one preinstalled feed I am not mentioning here was therefore the first to be deleted)
As a result the client displays

Invalid tag : 'Reddit'
Unsubscribing from http://rss.slashdot.org/slashdot/Slashdot

Slashdot is promptly unsubbed and not displayed any more although that string that is displayed in the client, and that I always understood to be the tag (I am squarely prepared to be embarrassed here), as well as the only other non-url item reported by
canto-remote listfeeds
actually matches the string "Reddit" rather well.

Is this intended?
It greatly hampers my ability to investigate other issues I've encountered in a reasonable time because it modifies my feed list in a way not speedily investigated or recovered.

If I remember correctly, this operation once in the past displayed a rudimentary dialog asking for confirmation to unsub from a random other feed instead that I could instruct to do nothing by hitting "n". Do not quote me on that one, though, memory is fallible and I would not know how to reproduce.

Best regards

Datetime column

I have been looking everywhere I could, and I cannot find a way to find a datetime associated to the feeds.

I think it would be nice to have this info both in the taglist view, along within the Reader view.

Is there already a way to do that?

reading variables from xrdb .xresources

most curses based applications let you use variables from xrdb so if i change my colour theme i don't need to edit 10 different files, would it be possible to implement this?

Is it possible to connect to a remote canto-daemon?

On another machine on my local network with IP address 192.168.20.3, I'm running canto-daemon --port=3333. However, when I try canto-curses --address=192.168.20.3 --port=3333 on a different machine, I get this:

16:02:37 : CANTO-CURSES -> Error: [Errno 111] Connection refused

Is it possible to do what I want here? Specifically, I want to be able to run the server on a different machine to the client.

Have arrow keys "left" and "right" bind to "-read" and "read" by default

This is obviously a subjective proposition. However, I find it rather intuitive to be able to use the left and right arrows to mark an item read or unread. Since there seems to be no default setting for this sort of behavior I thought this might be something worth looking into?

Obviously users can bind it themselves, I just thought it might be even more convenient if this was already the case.

Thanks! :-)

Font in reader

Hello!

I would like to know if there is any way to change the font of the text displayed in the reader. Reading longer articles in the terminal is rather tiresome with a typical small monospace console font.

Feature request : filter

Hi !

I think it should be a good idea to create a filter (or at least an option for all feeds) that could lead to display only a number of lines on each feed.

The choice of how many lines is displayed would be great.

Then, if there are not many feeds, it will permit to users to uncollapse all of the feeds and see in one time (one display) if there are newer articles.

Thanks.

[Q/REQ?] Possible to have one list with all (unread) items from all feeds?

I recently started using canto. I am really liking the simplicity on the one hand and the configuration options on the other. Great job!

I read through the manual but I couldn't find a way to have canto show all the (unread) items from all feeds at the same time in one list. I would like to be able to see in one list all items from all feeds sorted on their published date (with some indicator from which feed the item originated). The option to choose between all items and all unread items would be great. Now the items are always sorted on their feed first.

(Related to this would the option to sort all items from all feeds from a category together.)

How to close display boxes?

Many things open up a display box (such as :list), which contains output from commands and so on, but how do you close these? I have tried: ctrl-g (nothing), esc (nothing), q (quits canto-curses entirely), enter (nothing).

Curses lockup similar to #20

Scrolling trough the items left me really often with a core at 100% and no reacting interface.
The SIGUSR1 looks different to #20 so I assume this is another problem. Beats me why it happens on my Laptop, but couldn't produce it on the desktop

Using:
canto-curses-0.9.2
canto-daemon-0.9.1

12:46:22 : CANTO-CURSES ->

LOCKS:
NAME: MainThread
FILE: "/usr/bin/canto-curses", line 7, in
c = CantoCurses()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 290, in init
self.start()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 276, in start
self.run()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 228, in run
time.sleep(1)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 148, in sigusr1
for filename, lineno, fname, line in traceback.extract_stack(stack):
12:46:22 : CANTO-CURSES ->

LOCKS:
NAME: Thread-2
FILE: "/usr/lib/python3.4/threading.py", line 889, in _bootstrap
self._bootstrap_inner()
FILE: "/usr/lib/python3.4/threading.py", line 921, in _bootstrap_inner
self.run()
FILE: "/usr/lib/python3.4/threading.py", line 869, in run
self._target(_self._args, *_self._kwargs)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 57, in pthread
r = self.read()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 48, in read
r = self.backend.do_read(self.conn)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 224, in do_read
r = self._do_read(conn, timeout)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 244, in _do_read
p = poll.poll(timeout)
12:46:22 : CANTO-CURSES ->

LOCKS: global sync lock(w)
NAME: Thread-4
FILE: "/usr/lib/python3.4/threading.py", line 889, in _bootstrap
self._bootstrap_inner()
FILE: "/usr/lib/python3.4/threading.py", line 921, in _bootstrap_inner
self.run()
FILE: "/usr/lib/python3.4/threading.py", line 869, in run
self._target(_self._args, *_self._kwargs)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 218, in run
okay = self.issue_cmd(cmd)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 169, in issue_cmd
r = cmd_execute(cmd)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/command.py", line 283, in cmd_execute
c_func(*args)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/taglist.py", line 107, in
"rel-set-cursor 1": (lambda : self.cmd_rel_set_cursor(1), [], "Next item"),
FILE: "/usr/lib/python3.4/site-packages/canto_curses/taglist.py", line 449, in cmd_rel_set_cursor
sel, lines = self._iterate_backward(sel)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/taglist.py", line 436, in _iterate_backward
return (ps, lines)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/story.py", line 90, in eq
return self.id == other.id
FILE: "/usr/lib/python3.4/site-packages/canto_next/plugins.py", line 110, in getattribute
return object.getattribute(self, name)
FILE: "/usr/lib/python3.4/site-packages/canto_next/plugins.py", line 108, in getattribute
def getattribute(self, name):
12:46:22 : CANTO-CURSES ->

LOCKS:
NAME: Thread-1
FILE: "/usr/lib/python3.4/threading.py", line 889, in _bootstrap
self._bootstrap_inner()
FILE: "/usr/lib/python3.4/threading.py", line 921, in _bootstrap_inner
self.run()
FILE: "/usr/lib/python3.4/threading.py", line 869, in run
self._target(_self._args, *_self._kwargs)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 57, in pthread
r = self.read()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 48, in read
r = self.backend.do_read(self.conn)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 224, in do_read
r = self._do_read(conn, timeout)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 244, in _do_read
p = poll.poll(timeout)
12:46:22 : CANTO-CURSES ->

LOCKS:
NAME: Thread-3
FILE: "/usr/lib/python3.4/threading.py", line 889, in _bootstrap
self._bootstrap_inner()
FILE: "/usr/lib/python3.4/threading.py", line 921, in _bootstrap_inner
self.run()
FILE: "/usr/lib/python3.4/threading.py", line 869, in run
self._target(_self._args, *_self._kwargs)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 228, in run_gui
self.do_gui.wait()
FILE: "/usr/lib/python3.4/threading.py", line 553, in wait
signaled = self._cond.wait(timeout)
FILE: "/usr/lib/python3.4/threading.py", line 290, in wait
waiter.acquire()
12:46:22 : CANTO-CURSES ->

STACKS:
12:46:22 : CANTO-CURSES -> Lock global sync lock (0 readers)
12:46:22 : CANTO-CURSES -> Lock writer (thread -1265632448):
12:46:22 : CANTO-CURSES -> File "/usr/lib/python3.4/threading.py", line 889, in _bootstrap
self._bootstrap_inner()
File "/usr/lib/python3.4/threading.py", line 921, in _bootstrap_inner
self.run()
File "/usr/lib/python3.4/threading.py", line 869, in run
self._target(_self._args, *_self._kwargs)
File "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 218, in run
okay = self.issue_cmd(cmd)
File "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 167, in issue_cmd
sync_lock.acquire_write()
File "/usr/lib/python3.4/site-packages/canto_next/rwlock.py", line 90, in acquire_write
self.writer_stacks.append(traceback.format_stack())

12:46:22 : CANTO-CURSES -> VARS: {'input_completions': [], 'dispel_msg': False, 'info_msg': 'No info.', 'needs_refresh': False, 'infobox_offset': 0, 'needs_resize': False, 'curtags': ['maintag:Golem.de', 'maintag:Heise', 'maintag:Stuttmann', 'maintag:Techerator', 'maintag:Stern', 'maintag:Spiegel', 'maintag:BBC', 'maintag:BBC', 'maintag:BBC', 'maintag:Phoronix', 'maintag:Techdirt.', 'maintag:Techdirt.', 'maintag:Techdirt.', 'maintag:Pro-Linux', 'maintag:Pro-Linux', 'maintag:Pro-Linux', 'maintag:Planet Arch Linux', 'maintag:Planet Arch Linux De', 'maintag:Arch Linux Bugtracker::', 'maintag:Canto', 'maintag:BITblokes', 'maintag:Inconsolation', 'maintag:Motho ke motho ka botho'], 'selected': <canto_curses.story.Story object at 0xb6762e2c>, 'input_prompt': '', 'target_obj': <canto_curses.story.Story object at 0xb6762e2c>, 'needs_redraw': True, 'input_do_completions': True, 'errorbox_offset': 0, 'taglist_visible_tags': [[<canto_curses.story.Story object at 0xb5e2ba2c>, <canto_curses.story.Story object at 0xb5e2b32c>, <canto_curses.story.Story object at 0xb5e2b3ec>, <canto_curses.story.Story object at 0xb5e2b5ac>, <canto_curses.story.Story object at 0xb5e2b66c>, <canto_curses.story.Story object at 0xb5e2b74c>, <canto_curses.story.Story object at 0xb5e2b82c>, <canto_curses.story.Story object at 0xb5e2b96c>, <canto_curses.story.Story object at 0xb5e2b8ac>, <canto_curses.story.Story object at 0xb5e2bb0c>, <canto_curses.story.Story object at 0xb5e2bb6c>, <canto_curses.story.Story object at 0xb5e2bbac>, <canto_curses.story.Story object at 0xb5e2bcac>, <canto_curses.story.Story object at 0xb5ec55cc>, <canto_curses.story.Story object at 0xb5ec5c2c>], [<canto_curses.story.Story object at 0xb5e2622c>, <canto_curses.story.Story object at 0xb5e261ec>, <canto_curses.story.Story object at 0xb5e262ec>, <canto_curses.story.Story object at 0xb5e2634c>, <canto_curses.story.Story object at 0xb5e2646c>, <canto_curses.story.Story object at 0xb5e2656c>, <canto_curses.story.Story object at 0xb5e266ec>, <canto_curses.story.Story object at 0xb5e2672c>, <canto_curses.story.Story object at 0xb5e267ac>, <canto_curses.story.Story object at 0xb5e2690c>, <canto_curses.story.Story object at 0xb5e269ac>, <canto_curses.story.Story object at 0xb5e26a2c>, <canto_curses.story.Story object at 0xb5e26bec>, <canto_curses.story.Story object at 0xb5e265cc>, <canto_curses.story.Story object at 0xb5e2358c>, <canto_curses.story.Story object at 0xb5e237cc>, <canto_curses.story.Story object at 0xb5e238ec>, <canto_curses.story.Story object at 0xb5e238ac>, <canto_curses.story.Story object at 0xb5e23a2c>, <canto_curses.story.Story object at 0xb5e23c2c>, <canto_curses.story.Story object at 0xb5e23d0c>, <canto_curses.story.Story object at 0xb5e23ecc>, <canto_curses.story.Story object at 0xb5e23dec>, <canto_curses.story.Story object at 0xb5e235cc>, <canto_curses.story.Story object at 0xb5e2dbac>, <canto_curses.story.Story object at 0xb5e2d36c>, <canto_curses.story.Story object at 0xb5e2d12c>, <canto_curses.story.Story object at 0xb5e2d20c>, <canto_curses.story.Story object at 0xb5e2d2cc>], [<canto_curses.story.Story object at 0xb6762e2c>], [<canto_curses.story.Story object at 0xb54bfe8c>, <canto_curses.story.Story object at 0xb54bffec>, <canto_curses.story.Story object at 0xb54bf0cc>, <canto_curses.story.Story object at 0xb54ca1cc>, <canto_curses.story.Story object at 0xb54ca16c>, <canto_curses.story.Story object at 0xb54ca32c>, <canto_curses.story.Story object at 0xb54ca3cc>, <canto_curses.story.Story object at 0xb54ca46c>, <canto_curses.story.Story object at 0xb54ca56c>, <canto_curses.story.Story object at 0xb54ca62c>, <canto_curses.story.Story object at 0xb54ca76c>, <canto_curses.story.Story object at 0xb54ca68c>, <canto_curses.story.Story object at 0xb54ca7ac>, <canto_curses.story.Story object at 0xb54ca8cc>, <canto_curses.story.Story object at 0xb54ca9cc>, <canto_curses.story.Story object at 0xb54caa4c>, <canto_curses.story.Story object at 0xb54cabec>, <canto_curses.story.Story object at 0xb54caccc>, <canto_curses.story.Story object at 0xb54cadcc>, <canto_curses.story.Story object at 0xb5e6ed0c>, <canto_curses.story.Story object at 0xb5e6eeec>, <canto_curses.story.Story object at 0xb5e6efcc>, <canto_curses.story.Story object at 0xb5e2d72c>, <canto_curses.story.Story object at 0xb5e2d92c>, <canto_curses.story.Story object at 0xb5e2d9ac>, <canto_curses.story.Story object at 0xb5e2daec>, <canto_curses.story.Story object at 0xb5e2dccc>, <canto_curses.story.Story object at 0xb5e2dd2c>, <canto_curses.story.Story object at 0xb5e2deac>, <canto_curses.story.Story object at 0xb5e2deec>, <canto_curses.story.Story object at 0xb5e2df8c>, <canto_curses.story.Story object at 0xb54cf08c>, <canto_curses.story.Story object at 0xb54cf18c>, <canto_curses.story.Story object at 0xb54cf24c>, <canto_curses.story.Story object at 0xb54cf32c>, <canto_curses.story.Story object at 0xb54cf42c>], [<canto_curses.story.Story object at 0xb54bfe8c>, <canto_curses.story.Story object at 0xb54bffec>, <canto_curses.story.Story object at 0xb54bf0cc>, <canto_curses.story.Story object at 0xb54ca1cc>, <canto_curses.story.Story object at 0xb54ca16c>, <canto_curses.story.Story object at 0xb54ca32c>, <canto_curses.story.Story object at 0xb54ca3cc>, <canto_curses.story.Story object at 0xb54ca46c>, <canto_curses.story.Story object at 0xb54ca56c>, <canto_curses.story.Story object at 0xb54ca62c>, <canto_curses.story.Story object at 0xb54ca76c>, <canto_curses.story.Story object at 0xb54ca68c>, <canto_curses.story.Story object at 0xb54ca7ac>, <canto_curses.story.Story object at 0xb54ca8cc>, <canto_curses.story.Story object at 0xb54ca9cc>, <canto_curses.story.Story object at 0xb54caa4c>, <canto_curses.story.Story object at 0xb54cabec>, <canto_curses.story.Story object at 0xb54caccc>, <canto_curses.story.Story object at 0xb54cadcc>, <canto_curses.story.Story object at 0xb5e6ed0c>, <canto_curses.story.Story object at 0xb5e6eeec>, <canto_curses.story.Story object at 0xb5e6efcc>, <canto_curses.story.Story object at 0xb5e2d72c>, <canto_curses.story.Story object at 0xb5e2d92c>, <canto_curses.story.Story object at 0xb5e2d9ac>, <canto_curses.story.Story object at 0xb5e2daec>, <canto_curses.story.Story object at 0xb5e2dccc>, <canto_curses.story.Story object at 0xb5e2dd2c>, <canto_curses.story.Story object at 0xb5e2deac>, <canto_curses.story.Story object at 0xb5e2deec>, <canto_curses.story.Story object at 0xb5e2df8c>, <canto_curses.story.Story object at 0xb54cf08c>, <canto_curses.story.Story object at 0xb54cf18c>, <canto_curses.story.Story object at 0xb54cf24c>, <canto_curses.story.Story object at 0xb54cf32c>, <canto_curses.story.Story object at 0xb54cf42c>], [<canto_curses.story.Story object at 0xb54bfe8c>, <canto_curses.story.Story object at 0xb54bffec>, <canto_curses.story.Story object at 0xb54bf0cc>, <canto_curses.story.Story object at 0xb54ca1cc>, <canto_curses.story.Story object at 0xb54ca16c>, <canto_curses.story.Story object at 0xb54ca32c>, <canto_curses.story.Story object at 0xb54ca3cc>, <canto_curses.story.Story object at 0xb54ca46c>, <canto_curses.story.Story object at 0xb54ca56c>, <canto_curses.story.Story object at 0xb54ca62c>, <canto_curses.story.Story object at 0xb54ca76c>, <canto_curses.story.Story object at 0xb54ca68c>, <canto_curses.story.Story object at 0xb54ca7ac>, <canto_curses.story.Story object at 0xb54ca8cc>, <canto_curses.story.Story object at 0xb54ca9cc>, <canto_curses.story.Story object at 0xb54caa4c>, <canto_curses.story.Story object at 0xb54cabec>, <canto_curses.story.Story object at 0xb54caccc>, <canto_curses.story.Story object at 0xb54cadcc>, <canto_curses.story.Story object at 0xb5e6ed0c>, <canto_curses.story.Story object at 0xb5e6eeec>, <canto_curses.story.Story object at 0xb5e6efcc>, <canto_curses.story.Story object at 0xb5e2d72c>, <canto_curses.story.Story object at 0xb5e2d92c>, <canto_curses.story.Story object at 0xb5e2d9ac>, <canto_curses.story.Story object at 0xb5e2daec>, <canto_curses.story.Story object at 0xb5e2dccc>, <canto_curses.story.Story object at 0xb5e2dd2c>, <canto_curses.story.Story object at 0xb5e2deac>, <canto_curses.story.Story object at 0xb5e2deec>, <canto_curses.story.Story object at 0xb5e2df8c>, <canto_curses.story.Story object at 0xb54cf08c>, <canto_curses.story.Story object at 0xb54cf18c>, <canto_curses.story.Story object at 0xb54cf24c>, <canto_curses.story.Story object at 0xb54cf32c>, <canto_curses.story.Story object at 0xb54cf42c>], [<canto_curses.story.Story object at 0xb54cf92c>, <canto_curses.story.Story object at 0xb54cfa6c>, <canto_curses.story.Story object at 0xb54cfaec>, <canto_curses.story.Story object at 0xb54bf12c>, <canto_curses.story.Story object at 0xb54ca10c>, <canto_curses.story.Story object at 0xb54cf9cc>, <canto_curses.story.Story object at 0xb54cfc2c>, <canto_curses.story.Story object at 0xb54cfccc>, <canto_curses.story.Story object at 0xb54cfd4c>, <canto_curses.story.Story object at 0xb54cfdac>, <canto_curses.story.Story object at 0xb54cfdec>, <canto_curses.story.Story object at 0xb54cff4c>, <canto_curses.story.Story object at 0xb54d648c>, <canto_curses.story.Story object at 0xb54d606c>, <canto_curses.story.Story object at 0xb54d614c>], [<canto_curses.story.Story object at 0xb54cf92c>, <canto_curses.story.Story object at 0xb54cfa6c>, <canto_curses.story.Story object at 0xb54cfaec>, <canto_curses.story.Story object at 0xb54bf12c>, <canto_curses.story.Story object at 0xb54ca10c>, <canto_curses.story.Story object at 0xb54cf9cc>, <canto_curses.story.Story object at 0xb54cfc2c>, <canto_curses.story.Story object at 0xb54cfccc>, <canto_curses.story.Story object at 0xb54cfd4c>, <canto_curses.story.Story object at 0xb54cfdac>, <canto_curses.story.Story object at 0xb54cfdec>, <canto_curses.story.Story object at 0xb54cff4c>, <canto_curses.story.Story object at 0xb54d648c>, <canto_curses.story.Story object at 0xb54d606c>, <canto_curses.story.Story object at 0xb54d614c>], [<canto_curses.story.Story object at 0xb54cf92c>, <canto_curses.story.Story object at 0xb54cfa6c>, <canto_curses.story.Story object at 0xb54cfaec>, <canto_curses.story.Story object at 0xb54bf12c>, <canto_curses.story.Story object at 0xb54ca10c>, <canto_curses.story.Story object at 0xb54cf9cc>, <canto_curses.story.Story object at 0xb54cfc2c>, <canto_curses.story.Story object at 0xb54cfccc>, <canto_curses.story.Story object at 0xb54cfd4c>, <canto_curses.story.Story object at 0xb54cfdac>, <canto_curses.story.Story object at 0xb54cfdec>, <canto_curses.story.Story object at 0xb54cff4c>, <canto_curses.story.Story object at 0xb54d648c>, <canto_curses.story.Story object at 0xb54d606c>, <canto_curses.story.Story object at 0xb54d614c>], [<canto_curses.story.Story object at 0xb5e7ae0c>, <canto_curses.story.Story object at 0xb5e7af0c>, <canto_curses.story.Story object at 0xb5e7afec>, <canto_curses.story.Story object at 0xb54d65ec>, <canto_curses.story.Story object at 0xb54d632c>, <canto_curses.story.Story object at 0xb54d664c>, <canto_curses.story.Story object at 0xb54db0ac>, <canto_curses.story.Story object at 0xb54db12c>, <canto_curses.story.Story object at 0xb54db1cc>, <canto_curses.story.Story object at 0xb54db26c>, <canto_curses.story.Story object at 0xb54db30c>], [<canto_curses.story.Story object at 0xb5e2d70c>, <canto_curses.story.Story object at 0xb54cadec>, <canto_curses.story.Story object at 0xb5e18d2c>, <canto_curses.story.Story object at 0xb5e18a4c>, <canto_curses.story.Story object at 0xb5e187ac>, <canto_curses.story.Story object at 0xb5e189ac>, <canto_curses.story.Story object at 0xb5e1862c>, <canto_curses.story.Story object at 0xb5e18f0c>, <canto_curses.story.Story object at 0xb5e18d0c>, <canto_curses.story.Story object at 0xb5e1860c>, <canto_curses.story.Story object at 0xb54c31ec>, <canto_curses.story.Story object at 0xb54c3cac>, <canto_curses.story.Story object at 0xb54c360c>, <canto_curses.story.Story object at 0xb54c382c>, <canto_curses.story.Story object at 0xb54c3d6c>], [<canto_curses.story.Story object at 0xb54c348c>, <canto_curses.story.Story object at 0xb54c376c>, <canto_curses.story.Story object at 0xb54c36ec>, <canto_curses.story.Story object at 0xb54c37ac>, <canto_curses.story.Story object at 0xb54c35ec>, <canto_curses.story.Story object at 0xb54c316c>], [<canto_curses.story.Story object at 0xb5e18d8c>, <canto_curses.story.Story object at 0xb5e18f8c>, <canto_curses.story.Story object at 0xb54e5b0c>, <canto_curses.story.Story object at 0xb54e5d6c>, <canto_curses.story.Story object at 0xb54e5fac>, <canto_curses.story.Story object at 0xb54e54ec>, <canto_curses.story.Story object at 0xb54e578c>, <canto_curses.story.Story object at 0xb54e54cc>, <canto_curses.story.Story object at 0xb5e4b10c>, <canto_curses.story.Story object at 0xb5e4b8cc>, <canto_curses.story.Story object at 0xb5e4b4ec>, <canto_curses.story.Story object at 0xb5e4b66c>, <canto_curses.story.Story object at 0xb5e4b34c>, <canto_curses.story.Story object at 0xb5e4bc8c>, <canto_curses.story.Story object at 0xb5e4b90c>, <canto_curses.story.Story object at 0xb5e4bd0c>, <canto_curses.story.Story object at 0xb5e4b20c>, <canto_curses.story.Story object at 0xb5e4ba8c>, <canto_curses.story.Story object at 0xb5e4bacc>, <canto_curses.story.Story object at 0xb5e4b9cc>, <canto_curses.story.Story object at 0xb5e4b74c>], [<canto_curses.story.Story object at 0xb54e80ac>, <canto_curses.story.Story object at 0xb54e8d8c>, <canto_curses.story.Story object at 0xb54e832c>, <canto_curses.story.Story object at 0xb54e870c>, <canto_curses.story.Story object at 0xb54e8b0c>, <canto_curses.story.Story object at 0xb54e8ccc>, <canto_curses.story.Story object at 0xb54e89ec>, <canto_curses.story.Story object at 0xb54e8a6c>, <canto_curses.story.Story object at 0xb54e8fcc>, <canto_curses.story.Story object at 0xb54e8d0c>, <canto_curses.story.Story object at 0xb54e8b8c>, <canto_curses.story.Story object at 0xb5e0f46c>, <canto_curses.story.Story object at 0xb5e0f86c>, <canto_curses.story.Story object at 0xb5e0f2ec>, <canto_curses.story.Story object at 0xb5e0f0cc>, <canto_curses.story.Story object at 0xb5e0f10c>, <canto_curses.story.Story object at 0xb5e0f1ac>, <canto_curses.story.Story object at 0xb5e0f22c>, <canto_curses.story.Story object at 0xb5e0f42c>, <canto_curses.story.Story object at 0xb5e0f48c>, <canto_curses.story.Story object at 0xb5e0f5ac>, <canto_curses.story.Story object at 0xb5e0f60c>, <canto_curses.story.Story object at 0xb5e0f66c>, <canto_curses.story.Story object at 0xb5e0f72c>, <canto_curses.story.Story object at 0xb5e0f80c>, <canto_curses.story.Story object at 0xb5e0f94c>, <canto_curses.story.Story object at 0xb5e3ef8c>, <canto_curses.story.Story object at 0xb5e3e4cc>, <canto_curses.story.Story object at 0xb5e3e44c>, <canto_curses.story.Story object at 0xb5e3e2cc>, <canto_curses.story.Story object at 0xb5e3e2ac>, <canto_curses.story.Story object at 0xb5e3e16c>, <canto_curses.story.Story object at 0xb5e3edcc>, <canto_curses.story.Story object at 0xb5e3eeac>, <canto_curses.story.Story object at 0xb5e3ef6c>, <canto_curses.story.Story object at 0xb548d6ec>, <canto_curses.story.Story object at 0xb548dbec>, <canto_curses.story.Story object at 0xb548d02c>, <canto_curses.story.Story object at 0xb548d14c>, <canto_curses.story.Story object at 0xb548d44c>, <canto_curses.story.Story object at 0xb548d52c>, <canto_curses.story.Story object at 0xb548d62c>, <canto_curses.story.Story object at 0xb548d86c>, <canto_curses.story.Story object at 0xb548d94c>], [<canto_curses.story.Story object at 0xb548daec>, <canto_curses.story.Story object at 0xb548db8c>, <canto_curses.story.Story object at 0xb548dc2c>, <canto_curses.story.Story object at 0xb5e4b96c>, <canto_curses.story.Story object at 0xb54c3d8c>, <canto_curses.story.Story object at 0xb54d20cc>, <canto_curses.story.Story object at 0xb54d21ec>, <canto_curses.story.Story object at 0xb54d2ccc>, <canto_curses.story.Story object at 0xb54d29ac>, <canto_curses.story.Story object at 0xb54d292c>]], 'error_msg': 'No error.', 'input_completion_root': None, 'strtags': ['maintag:Golem.de', 'maintag:Heise', 'maintag:Stuttmann', 'maintag:Techerator', 'maintag:Stern', 'maintag:Spiegel', 'maintag:BBC', 'maintag:Phoronix', 'maintag:Techdirt.', 'maintag:Pro-Linux', 'maintag:Planet Arch Linux', 'maintag:Planet Arch Linux De', 'maintag:Arch Linux Bugtracker::', 'maintag:Canto', 'maintag:BITblokes', 'maintag:Inconsolation', 'maintag:Motho ke motho ka botho', 'maintag:BBC', 'maintag:BBC', 'maintag:Pro-Linux', 'maintag:Pro-Linux', 'maintag:Techdirt.', 'maintag:Techdirt.'], 'reader_offset': 0, 'target_offset': 47, 'transforms': [], 'location': [], 'reader_item': None}
12:46:22 : CANTO-CURSES -> OPTS: {'update': {'auto': {'enabled': False, 'interval': 20}, 'style': 'append'}, 'browser': {'text': False, 'path': ' xdg-open %u'}, 'tags': 'maintag:.', 'tagobj': {'selected_end': '%r', 'format': '%?{sel}(%{selected}:%{unselected})%?{c}([+]:[-])%{pre} %t %{post} [%B%1%n%0%b]% %?{pending}([%8%B%{pending}%b%0]:)%?{sel}(%{selected_end}:%{unselected_end})', 'unselected_end': '', 'unselected': '', 'selected': '%R'}, 'tagorder': ['maintag:Golem.de', 'maintag:Heise', 'maintag:Stuttmann', 'maintag:Techerator', 'maintag:Stern', 'maintag:Spiegel', 'maintag:BBC', 'maintag:Phoronix', 'maintag:Techdirt.', 'maintag:Pro-Linux', 'maintag:Planet Arch Linux', 'maintag:Planet Arch Linux De', 'maintag:Arch Linux Bugtracker::', 'maintag:Canto', 'maintag:BITblokes', 'maintag:Inconsolation', 'maintag:Motho ke motho ka botho'], 'color': {'57': 57, '103': 103, '123': 123, '82': 82, '37': 37, '230': 230, '7': 0, '72': 72, '115': 115, '111': 111, '213': 213, '255': 255, '165': 165, '247': 247, '136': 136, '180': 180, '68': 68, '18': 18, '140': 140, '116': 116, '12': 12, '58': 58, '146': 146, '147': 147, '17': 17, '193': 193, '226': 226, '92': 92, '191': 191, '63': 63, '76': 76, '106': 106, '223': 223, '85': 85, '125': 125, '221': 221, '44': 44, '141': 141, '142': 142, '112': 112, '69': 69, '197': 197, '187': 187, '231': 231, '36': 36, '78': 78, '33': 33, 'deffg': -1, '144': 144, '0': 7, '175': 175, '232': 232, '121': 121, '131': 131, '49': 49, '233': 233, '71': 71, '26': 26, '21': 21, '149': 149, '109': 109, '200': 200, '148': 148, '10': 10, '189': 189, '67': 67, '184': 184, '60': 60, '176': 176, '222': 222, '156': 156, '234': 234, '4': 2, '143': 143, '218': 218, '108': 108, '254': 254, '192': 192, '16': 16, '41': 41, '95': 95, '250': 250, '134': 134, '88': 88, '96': 96, '98': 98, '55': 55, '224': 224, '120': 120, '159': 159, '204': 204, '62': 62, '113': 113, 'defbg': -1, '126': 126, '6': {'fg': 7, 'bg': 1}, '66': 66, '207': 207, '65': 65, '46': 46, '205': 205, '107': 107, '29': 29, '137': 137, '158': 158, '35': 35, '132': 132, '81': 81, '195': 195, '240': 240, '1': 4, '100': 100, '173': 173, '169': 169, '84': 84, '93': 93, '248': 248, '83': 83, '79': 79, '182': 182, '97': 97, '220': 220, '242': 242, '246': 246, '27': 27, '8': 8, '124': 124, '39': 39, '150': 150, '194': 194, '203': 203, '181': 181, '59': 59, '253': 253, '3': 4, '77': 77, '118': 118, '102': 102, '154': 154, '227': 227, '214': 214, '235': 235, '186': 186, '101': 101, '153': 153, '9': 9, '94': 94, '185': 185, '114': 114, '171': 171, '89': 89, '238': 238, '190': 190, '30': 30, '152': 152, '211': 211, '139': 139, '73': 73, '22': 22, '19': 19, '167': 167, '54': 54, '99': 99, '202': 202, '51': 51, '172': 172, '244': 244, '50': 50, '104': 104, '61': 61, '64': 64, '177': 177, '43': 43, '216': 216, '117': 117, '90': 90, '75': 75, '215': 215, '48': 48, '24': 24, '56': 56, '241': 241, '155': 155, '20': 20, '32': 32, '11': 11, '133': 133, '174': 174, '34': 34, '15': 15, '157': 157, '52': 52, '163': 163, '219': 219, '183': 183, '127': 127, '162': 162, '236': 236, '25': 25, '110': 110, '151': 151, '249': 249, '87': 87, '2': 3, '28': 28, '122': 122, '105': 105, '209': 209, '135': 135, '239': 239, '252': 252, '161': 161, '168': 168, '119': 119, '208': 208, '166': 166, '31': 31, '237': 237, '130': 130, '170': 170, '80': 80, '129': 129, '53': 53, '245': 245, '188': 188, '179': 179, '45': 45, '86': 86, '164': 164, '70': 70, '217': 217, '38': 38, '128': 128, '138': 138, '178': 178, '13': 13, '243': 243, '201': 201, '14': 14, '145': 145, '229': 229, '40': 40, '206': 206, '198': 198, '91': 91, '212': 212, '23': 23, '225': 225, '228': 228, '196': 196, '74': 74, '5': 5, '42': 42, '251': 251, '47': 47, '210': 210, '160': 160, '199': 199}, 'reader': {'enumerate_links': False, 'window': {'maxheight': 0, 'float': True, 'maxwidth': 0, 'border': 'smart', 'align': 'topleft'}, 'show_description': True, 'show_enclosures': True, 'key': {'P': 'destroy & prev-tag & item-state read & reader', 'l': 'show-links', 's': 'show-summary', 'ppage': 'page-up', 'N': 'destroy & next-tag & item-state read & reader', 'down': 'scroll-down', 'space': 'destroy', 'n': 'destroy & next-item & item-state read & reader', 'npage': 'page-down', 'p': 'destroy & prev-item & item-state read & reader', 'j': 'scroll-down', 'e': 'show-enclosures', 'up': 'scroll-up', 'k': 'scroll-up', 'g': 'goto'}}, 'taglist': {'key': {'C-u': 'unset-cursor', '$': 'item-state read t:. 0-.', '+': 'promote', 'j': 'rel-set-cursor 1', 'r': 'tag-state read', 'h': 'item-state -read', 'down': 'rel-set-cursor 1', '?': 'search-regex', '-': 'demote', 'U': 'item-state -read *', 'K': 'prev-tag', 'k': 'rel-set-cursor -1', 'g': 'foritems & goto & item-state read & clearitems', 'R': 'item-state read *', 'C': 'collapse *', 'V': 'uncollapse *', 'c': 'toggle-collapse', 'l': 'item-state read', 'J': 'next-tag', 'u': 'tag-state -read', 'E': 'toggle taglist.tags_enumerated', 'M': 'item-state -marked *', 'space': 'foritem & item-state read & reader', 'n': 'next-marked', 'ppage': 'page-up', 'p': 'prev-marked', '/': 'search', 'e': 'toggle story.enumerated', 'up': 'rel-set-cursor -1', 'npage': 'page-down'}, 'hide_empty_tags': True, 'window': {'maxheight': 0, 'float': False, 'maxwidth': 0, 'border': 'none', 'align': 'neutral'}, 'tags_enumerated_absolute': False, 'border': False, 'search_attributes': ['title'], 'tags_enumerated': False, 'cursor': {'type': 'edge', 'edge': 5, 'scroll': 'scroll'}}, 'story': {'unread': '%1%B', 'format_attrs': ['title'], 'marked': '%B[] ', 'marked_end': '%b', 'read_end': '%0', 'read': '%2', 'unmarked_end': '', 'unread_end': '%b%0', 'unselected_end': '', 'unmarked': '', 'selected': '%R', 'selected_end': '%r', 'unselected': '', 'format': '%?{sel}(%{selected}:%{unselected})%?{m}(%{marked}:%{unmarked})%?{rd}(%{read}:%{unread})%{pre}%t%{post}%?{m}(%{marked_end}:%{unmarked_end})%?{rd}(%{read_end}:%{unread_end})%?{sel}(%{selected_end}:%{unselected_end})', 'enumerated': False}, 'kill_daemon_on_exit': False, 'input': {'window': {'maxheight': 0, 'float': False, 'maxwidth': 0, 'border': 'none', 'align': 'bottom'}}, 'errorbox': {'key': {'npage': 'page-down', 'ppage': 'page-up', 'space': 'destroy', 'down': 'scroll-down', 'up': 'scroll-up'}, 'window': {'maxheight': 0, 'float': True, 'maxwidth': 0, 'border': 'full', 'align': 'topleft'}}, 'screen': {'key': {'tab': 'focus-rel 1'}}, 'main': {'key': {':': 'command', '?': 'help', 'q': 'quit', '': 'update', 'C-r': 'refresh', 'f5': 'update'}}, 'infobox': {'key': {'ppage': 'page-up', 'space': 'destroy', 'l': 'item-state read', 'h': 'item-state unread', 'up': 'scroll-up', 'down': 'scroll-down', 'npage': 'page-down'}, 'window': {'maxheight': 0, 'float': True, 'maxwidth': 0, 'border': 'full', 'align': 'topleft'}}}

Cyrillic problem in the search line

Hello, I`ve got the problem, here the steps to reproduce it:

  1. Press '/' to make search by keyword.
  2. Enter some cyrillic chars (e.g. 'тестовая строка'), or you can paste them into the line from X clipboard.
  3. See 'Ñ ÐµÑ Ñ Ð¾Ð²Ð°Ñ Ñ Ñ Ñ Ð¾ÐºÐ°' instead of 'тестовая строка'.
    By the way, canto 0.7.10 have the same issue to.

$ canto-curses -V
canto-curses 0.8.2

</etc/issue
Debian GNU/Linux wheezy/sid

$ locale
LANG=en_US.UTF-8
LANGUAGE=en_US:en
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

When I tried to do something an run '$ LC_ALL="mylocale" canto-curses' the error occured:
15:23:54 : CANTO-CURSES -> Exiting on exception:
15:23:54 : CANTO-CURSES ->
Traceback (most recent call last):
File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 296, in start
self.init()
File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 50, in init
locale.setlocale(locale.LC_ALL, '')
File "/usr/lib/python3.2/locale.py", line 541, in setlocale
return _setlocale(category, locale)
locale.Error: unsupported locale setting

15:23:54 : CANTO-CURSES -> Exiting.

Article numbering

I noticed that the numbering of the feeds has problems. Sometimes it just displays 0 for every feed (that is, incorrect numbering). Also, the numbering hides the first character of the feed title. Maybe it is some bad config on my part, I don't know.

All tags empty

So after i mark all the items as read this message appears and nothing else

All tags empty

i would like to still see the items marked as read so i can click them even read i was unable to figure it out using the manual

:add and :del freezes curses interface

I accidently used empty :del and the feed where the cursor was got removed and the curses interface unresponsive. (Items of the deleted feed still visible, but no interaction possible)

Tried then :add $URLFORAFEED and noticed similar behaviour. (curses freezed. After killing and restarting the new feed was displayed)

Log from canto-curses -v + killall SIGUSR1

18:03:24 : CANTO-CURSES ->

LOCKS:
NAME: Thread-2
FILE: "/usr/lib/python3.4/threading.py", line 888, in _bootstrap
self._bootstrap_inner()
FILE: "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
self.run()
FILE: "/usr/lib/python3.4/threading.py", line 868, in run
self._target(_self._args, *_self._kwargs)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 57, in pthread
r = self.read()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 48, in read
r = self.backend.do_read(self.conn)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 224, in do_read
r = self._do_read(conn, timeout)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 244, in _do_read
p = poll.poll(timeout)
18:03:24 : CANTO-CURSES ->

LOCKS:
NAME: Thread-1
FILE: "/usr/lib/python3.4/threading.py", line 888, in _bootstrap
self._bootstrap_inner()
FILE: "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
self.run()
FILE: "/usr/lib/python3.4/threading.py", line 868, in run
self._target(_self._args, *_self._kwargs)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 57, in pthread
r = self.read()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/subthread.py", line 48, in read
r = self.backend.do_read(self.conn)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 224, in do_read
r = self._do_read(conn, timeout)
FILE: "/usr/lib/python3.4/site-packages/canto_next/protocol.py", line 244, in _do_read
p = poll.poll(timeout)
18:03:24 : CANTO-CURSES ->

LOCKS:
NAME: Thread-4
FILE: "/usr/lib/python3.4/threading.py", line 888, in _bootstrap
self._bootstrap_inner()
FILE: "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
self.run()
FILE: "/usr/lib/python3.4/threading.py", line 868, in run
self._target(_self._args, *_self._kwargs)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 194, in run
self.callbacks"set_var"
FILE: "/usr/lib/python3.4/site-packages/canto_curses/config.py", line 953, in set_var
call_hook("curses_var_change", [{ tweak : value }])
FILE: "/usr/lib/python3.4/site-packages/canto_next/hooks.py", line 50, in call_hook
func(*args)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/text.py", line 222, in on_var_change
self.cmd_destroy()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/text.py", line 227, in cmd_destroy
TextBox.cmd_destroy(self)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/guibase.py", line 96, in cmd_destroy
self.callbacks"die"
FILE: "/usr/lib/python3.4/site-packages/canto_curses/screen.py", line 519, in die_callback
sync_lock.acquire_write()
FILE: "/usr/lib/python3.4/site-packages/canto_next/rwlock.py", line 85, in acquire_write
r = self.lock.acquire(block)
18:03:24 : CANTO-CURSES ->

LOCKS:
NAME: MainThread
FILE: "/usr/bin/canto-curses", line 7, in
c = CantoCurses()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 290, in init
self.start()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 276, in start
self.run()
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 228, in run
time.sleep(1)
FILE: "/usr/lib/python3.4/site-packages/canto_curses/main.py", line 148, in sigusr1
for filename, lineno, fname, line in traceback.extract_stack(stack):
18:03:24 : CANTO-CURSES ->

STACKS:
18:03:24 : CANTO-CURSES -> Lock global sync lock (0 readers)
18:03:24 : CANTO-CURSES -> Lock writer (thread -1255146688):
18:03:24 : CANTO-CURSES -> File "/usr/lib/python3.4/threading.py", line 888, in _bootstrap
self._bootstrap_inner()
File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
self.run()
File "/usr/lib/python3.4/threading.py", line 868, in run
self._target(_self._args, *_self._kwargs)
File "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 242, in run_gui
sync_lock.acquire_write()
File "/usr/lib/python3.4/site-packages/canto_next/rwlock.py", line 90, in acquire_write
self.writer_stacks.append(traceback.format_stack())

18:03:24 : CANTO-CURSES -> Lock global sync lock (0 readers)
18:03:24 : CANTO-CURSES -> Lock writer (thread -1255146688):
18:03:24 : CANTO-CURSES -> File "/usr/lib/python3.4/threading.py", line 888, in _bootstrap
self._bootstrap_inner()
File "/usr/lib/python3.4/threading.py", line 920, in _bootstrap_inner
self.run()
File "/usr/lib/python3.4/threading.py", line 868, in run
self._target(_self._args, *_self._kwargs)
File "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 244, in run_gui
self.glog_handler.flush_deferred_logs()
File "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 52, in flush_deferred_logs
self._emit("info_msg", InfoBox, record)
File "/usr/lib/python3.4/site-packages/canto_curses/gui.py", line 37, in _emit
self.screen.add_window_callback(window_type)
File "/usr/lib/python3.4/site-packages/canto_curses/screen.py", line 571, in add_window_callback
sync_lock.acquire_write()
File "/usr/lib/python3.4/site-packages/canto_next/rwlock.py", line 90, in acquire_write
self.writer_stacks.append(traceback.format_stack())

18:03:24 : CANTO-CURSES -> VARS: {'needs_redraw': True, 'info_msg': '', 'reader_offset': 0, 'reader_item': None, 'taglist_visible_tags': [[<canto_curses.story.Story object at 0xb5eb62cc>, <canto_curses.story.Story object at 0xb5eb650c>, <canto_curses.story.Story object at 0xb5eb66cc>], [<canto_curses.story.Story object at 0xb5e9620c>], [<canto_curses.story.Story object at 0xb5e96b0c>, <canto_curses.story.Story object at 0xb5e96c4c>, <canto_curses.story.Story object at 0xb5e96ccc>, <canto_curses.story.Story object at 0xb5e96e0c>], [<canto_curses.story.Story object at 0xb5eb8cac>, <canto_curses.story.Story object at 0xb5eb8e2c>, <canto_curses.story.Story object at 0xb5eb8f8c>, <canto_curses.story.Story object at 0xb5eb8e4c>, <canto_curses.story.Story object at 0xb5eb890c>, <canto_curses.story.Story object at 0xb54c84ec>], [<canto_curses.story.Story object at 0xb5ea23cc>]], 'strtags': ['maintag:Golem.de', 'maintag:Heise', 'maintag:Stuttmann', 'maintag:Techerator', 'maintag:Spiegel', 'maintag:BBC', 'maintag:Phoronix', 'maintag:Techdirt.', 'maintag:Pro-Linux', 'maintag:Planet Arch Linux', 'maintag:Planet Arch Linux De', 'maintag:Arch Linux Bugtracker::', 'maintag:Canto', 'maintag:BITblokes', 'maintag:Inconsolation', 'maintag:Motho ke motho ka botho', 'maintag:Neusprech', 'maintag:Niggemeier', 'maintag:Slate Star Codex', 'maintag:TekSec', 'maintag:Schneier on Security', 'maintag:Mostly signs (some portents)', 'maintag:The Legal Satyricon'], 'error_msg': 'No error.', 'needs_resize': False, 'target_offset': 15, 'target_obj': <canto_curses.story.Story object at 0xb54c8b4c>, 'input_do_completions': True, 'selected': <canto_curses.story.Story object at 0xb54c8b4c>, 'input_prompt': '', 'input_completion_root': '', 'input_completions': [], 'location': [], 'curtags': ['maintag:Golem.de', 'maintag:Heise', 'maintag:Stuttmann', 'maintag:Techerator', 'maintag:Spiegel', 'maintag:BBC', 'maintag:Phoronix', 'maintag:Techdirt.', 'maintag:Pro-Linux', 'maintag:Planet Arch Linux', 'maintag:Planet Arch Linux De', 'maintag:Arch Linux Bugtracker::', 'maintag:Canto', 'maintag:BITblokes', 'maintag:Inconsolation', 'maintag:Motho ke motho ka botho', 'maintag:Neusprech', 'maintag:Niggemeier', 'maintag:Slate Star Codex', 'maintag:TekSec', 'maintag:Schneier on Security', 'maintag:Mostly signs (some portents)', 'maintag:The Legal Satyricon'], 'transforms': [], 'needs_refresh': True, 'dispel_msg': False, 'infobox_offset': 0, 'errorbox_offset': 0}
18:03:24 : CANTO-CURSES -> OPTS: {'kill_daemon_on_exit': False, 'main': {'key': {'?': 'help', ':': 'command', '': 'update', 'f5': 'update', 'C-r': 'refresh', 'q': 'quit'}}, 'update': {'auto': {'interval': 20, 'enabled': False}, 'style': 'append'}, 'reader': {'enumerate_links': False, 'key': {'l': 'show-links', 'up': 'scroll-up', 'j': 'scroll-down', 'g': 'goto', 'space': 'destroy', 'k': 'scroll-up', 'down': 'scroll-down', 'p': 'destroy & prev-item & item-state read & reader', 'n': 'destroy & next-item & item-state read & reader', 'N': 'destroy & next-tag & item-state read & reader', 'npage': 'page-down', 'e': 'show-enclosures', 'P': 'destroy & prev-tag & item-state read & reader', 'ppage': 'page-up', 's': 'show-summary'}, 'show_description': True, 'show_enclosures': True, 'window': {'align': 'topleft', 'border': 'smart', 'float': True, 'maxheight': 0, 'maxwidth': 0}}, 'browser': {'text': False, 'path': ' xdg-open %u'}, 'errorbox': {'key': {'up': 'scroll-up', 'space': 'destroy', 'ppage': 'page-up', 'npage': 'page-down', 'down': 'scroll-down'}, 'window': {'align': 'topleft', 'border': 'full', 'float': True, 'maxheight': 0, 'maxwidth': 0}}, 'screen': {'key': {'tab': 'focus-rel 1'}}, 'color': {'92': 92, '63': 63, '209': 209, '81': 81, '113': 113, '144': 144, '167': 167, '243': 243, '17': 17, '65': 65, '164': 164, '22': 22, '74': 74, '253': 253, '204': 204, '142': 142, '31': 31, '213': 213, '104': 104, '85': 85, '51': 51, '114': 114, '143': 143, '91': 91, '4': 2, '183': 183, '21': 21, '75': 75, '80': 80, '108': 108, '229': 229, '172': 172, '41': 41, '96': 96, '129': 129, '251': 251, '88': 88, '180': 180, '159': 159, '15': 15, '182': 182, '195': 195, '90': 90, '28': 28, '177': 177, '46': 46, '158': 158, '102': 102, '35': 35, '225': 225, '203': 203, '69': 69, '176': 176, '34': 34, '249': 249, '11': 11, '239': 239, '252': 252, '116': 116, '236': 236, '246': 246, '192': 192, '95': 95, '56': 56, '10': 10, '93': 93, '154': 154, '47': 47, '223': 223, '168': 168, '248': 248, '42': 42, '139': 139, '62': 62, '86': 86, '157': 157, '169': 169, '94': 94, '109': 109, '59': 59, '181': 181, '153': 153, '68': 68, '132': 132, '115': 115, '214': 214, '171': 171, '70': 70, '40': 40, '9': 9, '72': 72, '32': 32, '122': 122, '174': 174, '165': 165, '8': 8, '241': 241, '173': 173, '30': 30, '48': 48, '103': 103, '208': 208, '145': 145, '50': 50, '18': 18, '89': 89, '202': 202, '149': 149, '24': 24, '25': 25, '71': 71, '107': 107, '247': 247, '191': 191, '64': 64, '12': 12, '184': 184, '235': 235, '147': 147, '66': 66, '19': 19, '128': 128, '156': 156, '146': 146, '118': 118, '126': 126, '123': 123, '207': 207, '170': 170, '194': 194, '240': 240, '14': 14, '38': 38, '185': 185, '163': 163, '112': 112, '43': 43, '110': 110, 'defbg': -1, '125': 125, '13': 13, '197': 197, '130': 130, '78': 78, '160': 160, '217': 217, '228': 228, '61': 61, '3': 4, '45': 45, 'deffg': -1, '55': 55, '100': 100, '212': 212, '205': 205, '200': 200, '1': 4, '201': 201, '83': 83, '33': 33, '135': 135, '84': 84, '97': 97, '127': 127, '148': 148, '29': 29, '155': 155, '49': 49, '98': 98, '26': 26, '222': 222, '244': 244, '87': 87, '73': 73, '16': 16, '196': 196, '193': 193, '106': 106, '237': 237, '99': 99, '131': 131, '150': 150, '219': 219, '117': 117, '227': 227, '120': 120, '7': 0, '20': 20, '151': 151, '216': 216, '206': 206, '44': 44, '220': 220, '121': 121, '179': 179, '162': 162, '175': 175, '190': 190, '218': 218, '141': 141, '211': 211, '82': 82, '134': 134, '124': 124, '224': 224, '226': 226, '133': 133, '221': 221, '234': 234, '210': 210, '39': 39, '52': 52, '53': 53, '119': 119, '105': 105, '250': 250, '199': 199, '255': 255, '233': 233, '152': 152, '36': 36, '188': 188, '198': 198, '79': 79, '77': 77, '178': 178, '138': 138, '0': 7, '166': 166, '76': 76, '6': {'bg': 1, 'fg': 7}, '58': 58, '2': 3, '238': 238, '101': 101, '161': 161, '67': 67, '37': 37, '111': 111, '242': 242, '140': 140, '245': 245, '254': 254, '215': 215, '27': 27, '136': 136, '5': 5, '60': 60, '189': 189, '137': 137, '57': 57, '187': 187, '23': 23, '232': 232, '230': 230, '186': 186, '54': 54, '231': 231}, 'tags': 'maintag:.', 'input': {'window': {'align': 'bottom', 'border': 'none', 'float': False, 'maxheight': 0, 'maxwidth': 0}}, 'tagobj': {'unselected': '', 'selected_end': '%r', 'selected': '%R', 'unselected_end': '', 'format': '%?{sel}(%{selected}:%{unselected})%?{c}([+]:[-])%{pre} %t %{post} [%B%1%n%0%b]% %?{pending}([%8%B%{pending}%b%0]:)%?{sel}(%{selected_end}:%{unselected_end})'}, 'story': {'unselected': '', 'marked': '%B[] ', 'unmarked_end': '', 'unread_end': '%b%0', 'format_attrs': ['title'], 'read': '%2', 'enumerated': False, 'marked_end': '%b', 'read_end': '%0', 'format': '%?{sel}(%{selected}:%{unselected})%?{m}(%{marked}:%{unmarked})%?{rd}(%{read}:%{unread})%{pre}%t%{post}%?{m}(%{marked_end}:%{unmarked_end})%?{rd}(%{read_end}:%{unread_end})%?{sel}(%{selected_end}:%{unselected_end})', 'unselected_end': '', 'selected_end': '%r', 'unread': '%1%B', 'selected': '%R', 'unmarked': ''}, 'infobox': {'key': {'h': 'item-state unread', 'l': 'item-state read', 'npage': 'page-down', 'up': 'scroll-up', 'space': 'destroy', 'ppage': 'page-up', 'down': 'scroll-down'}, 'window': {'align': 'topleft', 'border': 'full', 'float': True, 'maxheight': 0, 'maxwidth': 0}}, 'tagorder': ['maintag:Golem.de', 'maintag:Heise', 'maintag:Stuttmann', 'maintag:Techerator', 'maintag:Spiegel', 'maintag:BBC', 'maintag:Phoronix', 'maintag:Techdirt.', 'maintag:Pro-Linux', 'maintag:Planet Arch Linux', 'maintag:Planet Arch Linux De', 'maintag:Arch Linux Bugtracker::', 'maintag:Canto', 'maintag:BITblokes', 'maintag:Inconsolation', 'maintag:Motho ke motho ka botho', 'maintag:Neusprech', 'maintag:Niggemeier', 'maintag:Slate Star Codex', 'maintag:TekSec', 'maintag:Schneier on Security', 'maintag:Mostly signs (some portents)', 'maintag:The Legal Satyricon'], 'taglist': {'hide_empty_tags': True, 'border': False, 'window': {'align': 'neutral', 'border': 'none', 'float': False, 'maxheight': 0, 'maxwidth': 0}, 'tags_enumerated': False, 'cursor': {'edge': 5, 'scroll': 'scroll', 'type': 'edge'}, 'search_attributes': ['title'], 'tags_enumerated_absolute': False, 'key': {'up': 'rel-set-cursor -1', 'j': 'rel-set-cursor 1', 'E': 'toggle taglist.tags_enumerated', '/': 'search', 'R': 'item-state read *', 'k': 'rel-set-cursor -1', '$': 'item-state read t:. 0-.', 'down': 'rel-set-cursor 1', 'h': 'item-state -read', 'r': 'tag-state read', 'e': 'toggle story.enumerated', 'C-u': 'unset-cursor', 'ppage': 'page-up', 'c': 'toggle-collapse', 'l': 'item-state read', 'U': 'item-state -read *', 'u': 'tag-state -read', '?': 'search-regex', 'J': 'next-tag', 'space': 'foritem & item-state read & reader', '+': 'promote', 'g': 'foritems & goto & item-state read & clearitems', 'C': 'collapse *', 'p': 'prev-marked', 'n': 'next-marked', '-': 'demote', 'V': 'uncollapse *', 'K': 'prev-tag', 'npage': 'page-down', 'M': 'item-state -marked *'}}}

Concerning numbers in tag headers

When I open canto-curses with no filters (all tags compressed or not, doesn't matter), the numbers in the brackets in the tag headers show the total number of items (not just number of unread items). Is that the intended behavior?

When I move the cursor over a compressed tag, however, the number changes to zero or whatever number of items are unread. I guess that is not intended, either way.

Strange curses error

Here is an error I get when starting canto-curses on a 32 bit Debian installation (wheezy):

08:47:53 : CANTO-CURSES -> Canto-curses started.
08:47:53 : CANTO-CURSES -> Exiting on exception:
08:47:53 : CANTO-CURSES -> 
Traceback (most recent call last):
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 297, in start
    self.run()
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/main.py", line 230, in run
    self.gui = CantoCursesGui(self)
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/gui.py", line 510, in __init__
    self.daemon_init()
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/gui.py", line 550, in daemon_init
    self.screen.refresh()
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 559, in refresh
    c.refresh()
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/input.py", line 69, in refresh
    self.callbacks["refresh"]()
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 208, in <lambda>
    refcb = lambda : self.refresh_callback(ci, top, left, bottom, right)
  File "/usr/local/lib/python3.2/dist-packages/canto_curses/screen.py", line 462, in refresh_callback
    c.pad.noutrefresh(0, 0, t, l, b, r)
TypeError: noutrefresh() takes exactly 0 arguments (6 given)

08:47:53 : CANTO-CURSES -> Exiting.

I don't have any such problems on a similar 64 bit Debian wheezy installation (same suite of packages, configuration, etc.). It's probably something incredibly simple I'm missing due to my not knowing curses.

Since 3.5.2 non ascii chars missing

Kinda curious. After the update of python to the latest version (3.5.2) chars like ä, ö, ü won't be displayed anymore.
Nothing found in the logs, so dunno how to provide information about this.

libreadline.so.6 not found

Hi !

I just upgraded my Archlinux system, and canto-curses doesn't work anymore :
Traceback (most recent call last): File "/usr/bin/canto-curses", line 3, in <module> from canto_curses.main import CantoCurses File "/usr/lib/python3.5/site-packages/canto_curses/main.py", line 18, in <module> from .gui import CantoCursesGui, GraphicalLog File "/usr/lib/python3.5/site-packages/canto_curses/gui.py", line 12, in <module> from .tag import alltags File "/usr/lib/python3.5/site-packages/canto_curses/tag.py", line 14, in <module> from .theme import FakePad, WrapPad, theme_print, theme_reset, theme_border, prep_for_display File "/usr/lib/python3.5/site-packages/canto_curses/theme.py", line 10, in <module> from .widecurse import waddch, wcwidth ImportError: libreadline.so.6: cannot open shared object file: No such file or directory

By searching file, I found this :
/usr/lib/libreadline.so -> libreadline.so.7

Miss something ? Should I create a symbolic link ?

Thanks.

curses lockup

Frequently the curses interface is not reacting anymore and eats up one of my cores. This is happening while navigating through the list, of after starting the curses interface (no movement at all with the cursor) and updates where fetched (but not displayed). And trying to move the cursor results in lockup. Extremely vague descriptions, but I cannot reproduce this error effectivly. It just happens sometimes

Unfortunately the curses log in verbose mode doesn't seem particulary helpful as it seems the commands are "working". The key input itself land directly in the terminal (after killing the curses-interface I have the key press events there

~ $ kkkkkkkjjjjjjjjjkkkkkkjjjjjj

)
https://paste.archlinux.de/zTJ8/

string index out of buffer with tab-completion on :

Hi

I experience the following error.
In the curses interface I enter : to get into the command mode
Instead of typing something I use tab for completion.
Visually nothing happens but upon pressing return (doesn't matter if : without following anything or a command entered like :list) an error window will pop up

canto-curses-tabcompletion

Installed versions
canto-curses 0.9.6-3
canto-next-git 0.9.5.r7.gb1defec-1

Prepend tag header with extra tags

Hi!

I'd like to prepend my tag headers with the list of extra tags. I've achieved this by hacking tag.py like so:

diff --git a/canto_curses/tag.py b/canto_curses/tag.py
index ef2e3c0..f314abd 100644
--- a/canto_curses/tag.py
+++ b/canto_curses/tag.py
@@ -306,6 +306,9 @@ class Tag(list):

         # Make sure to strip out the category from category:name
         tag = self.tag.split(':', 1)[1]
+        extra = self.callbacks["get_tag_conf"](self)['extra_tags']
+        if extra:
+            tag = ", ".join(extra) + " -- " + tag

         unread = len([s for s in self\
                 if "canto-state" not in s.content or\

Can this be achieved with the current code somehow? I saw a format is defined, but haven't had the time to figure out how it works. That would be best, since even if someone wants to do this, they won't necessarily want it exactly like me.

Auto-generated canto.conf file uses non-existent feed

Canto Version: Canto v 0.7.10 (sh:) (The version from running sudo apt-get install canto in Linux Mint)
Operating System: Linux 4.2.0-30-generic #3614.04.1Ubuntu 86_64 (Linux Mint)

Issue:

Upon starting canto for the first time, it auto generates the ~/.canto/conf.py.example file. In this file, it specifies the lines:

add("http://codezen.org/canto/feeds/latest")
add("http://kerneltrap.org/node/feed")

However, the first one points to a feed that does not exist, and the second one's URL times out. Upon running canto -u, it gives the following errors:

Exception trying to get feed http://codezen.org/canto/feeds/latest : HTTP Error 404: Not Found
Exception trying to get feed http://kerneltrap.org/node/feed : <urlopen error timed out>

Try going to http://codezen.org/canto/feeds/latest and it will tell you that the page can't be found. Also, try going to http://kerneltrap.org/node/feed and the page will continuously load.

A possible replacement for this could be using http://www.theguardian.com/international/rss instead, or a different feed that works.

show-category does not work as expected

I have two feeds in a category heise. When I want to show that category there seem to be some problems:

screenshot from 2015-07-21 10-42-18
screenshot from 2015-07-21 10-42-34

After :show-category heise:

screenshot from 2015-07-21 10-42-53

I expect that canto shows the two feeds which are categorized in heise. It seems that canto only shows the selected item instead.

Wrong colors when using sync-inoreader

Latest clean (without configs) version of canto-curses-git is running fine (blue colors). But if you add latest version of sync-inoreader.py and configure username/password, canto-curses fills your screen with errors and colors are just bad. I have no time to track this at the moment, so I'll just leave it there.

Canto logs

It was present in some version ago, so it's not the most recent issue. I just had no time to compose an issue and used inoreader in web.

browser.path gets reset to firefox everytime canto-curses is started

When explicitly setting the browser to chromium using :set browser.path chromium the value is saved in ~/.config/canto/conf as expected (and works as expected!). However, after quitting and restarting canto-curses the value changes to firefox instead, and indeed it'll start firefox when I wish to open a feed.

Am I doing something wrong?

Thanks!

Canto-curses won't load

There is an error when i try to start canto-curses:
``Traceback (most recent call last):

 File "/usr/bin/canto-curses", line 3, in <module>

 from canto_curses.main import CantoCurses

 ImportError: No module named 'canto_curses'

``

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.