So ... Happy new year and what not.
As a new years resolution... I've decided to be a bit more
communicative. I'm
going to start with this email.
So things have been a bit quiet lately. I've been busy with buying a
house
(oddly it's my first house I've ever bought) in London. Like most
places that
are not astronomically prices, it needs work. I've been having it get
renovated
and oddly this actually has proven to be an extra full-time job in
addition to
my full time work at Arm, so time for E is preciously small. Bonuses
are that
the work is coming towards the latter end (well it was originally meant
to be a
10 week project. 24 weeks later and it's still going...). I've been
living
without a proper bathroom and no kitchen now for several months
(relying on a
small shower room) and battling dust and dirt, freezing cold coming
through
open doorways (with no doors), a central heating system that is broken
(it
seems some people have zero clue how to install and commission these).
Oddly I
have gigabit internet with cat6a wired up through the house... no
kitchen but
gigabit networking. I guess I'm officially a nerd. Once things settle
I'll have
more time, but there is so much to do still even when builder do
finally leave
one day...
Now that aside let's get on with E stuff.
I've been working away at a rewrite of efm. Why? The old efm code is...
old. It
has some nasty dark corners that mean e gets i/o stalls and especially
in some
cases when on possibly slow storage like some slow usb drive or network
mount.
I've really needed to TOTALLY isolate the i/o from the front end. Bonus
- doing
this means I can fake the back-end fs. Let's not waste your curiosity
and give
you a link to the work so far (not in git yet):
http://www.rasterman.com/files/efm2.tar.gz
To unpack + build:
tar zxvf efm2.tar.gz
cd efm2
meson . build
ninja -C build
sudo ninja -C build install
efm ./testdir
(note - pass any dir as the argument on the cmdline or no dir == list
current
dir).
It's a TEST tool. It is not a final, look and feel. Actually the window
is more
about testing things like focus movement - the buttons surrounding the
scrollable view are all for testing. It's all about creating enough
code to
test and build the actual efm internals for the view and make the
back-end
file i/o function. You will need a git checkout of efl for new theme
elements
BTW.
So ... what is this? Roughly... A file manager view that currently does
regular
row by row icon view (with fixed icon sizes), simple list view (icon +
name),
detailed list view (lots of columns with resizable drag bars, and an
interesting size view with a colored and sized bar for relative file
size, full
permission display, mime type etc.) ... currently custom view is
unimplemented
(this is for icons you can manually place anywhere - i.e. like on the
desktop).
I was hoping to also add the ability to have custom icon sizes per file
there
too when I get to that. It does drag and drop (it won't DO anything
like
move/copy files but it'll tell you on stdout what it should be doing),
copy &
paste, single and multiple selections, monitor the directory for
changes and
update accordingly. In theory it has various sorting modes but only
exp;oses
access to one right now. Focus should work (tab/arrow keys). It should
handle
massive dirs (1000's of files). The front end and back end should be
totally
divorced and thus you can point it at some insanely slow sshfs mount to
the
other side of the planet over a 2400 baud modem and the gui should
remain
fluid... it just may update slowly (exception right now - .desktop
files
that refer to local content within that slow fs - to be addressed)...
:). It
will generate thumbnails and update them. The backend fs is a separate
process
the front end talks to via stdin/out - as is the thumbnailer too that
the
back-end uses. Why do this? You could implement a new fs as a python or
shell
script. The idea is that you can write new fs backends that maybe wrap
the
default one that do extra setup stuff at the start like mount a
specific fs,
ask for user and password things etc. at this point (the front end will
eventually provide commands via stdin/out to present these ui things).
It will
see .desktop files and handle them specially using the label from the
.desktop
and the icon the .desktop says to use (I know - potential security
problem
here ... undecided how to handle this yet). It will handle som
extensions I
made to .desktop files to have different images/icons when clicked and
selected
(testdir has an example). It handles dirs with custom icons (example in
testdir). If desktop filers use animated icons (gifs, webp etc.) they
will also
play.
It will not actually run anything. It won't actually copy, move, delete
etc.
anything. I've started filling in keyboard handling and enough hooks to
glue
this together so it'll print what it sees event wise or action-wise on
stdout.
The backends are installed in PREFIX/lib/efm/backends - there is only
one right
now (default) and it has 2 binaries. open and thumb. open opens a
target dir
and monitors it for changes - listing the contents and sending updates.
thumb
does what you think - it will generate a thumbnail. Thumbnails are
always
installed in ~/ assuming ~/ is fast and thus any i/o to access
thumbnails there
is "instant" (It's still done async in threads though...).
Have a look at sample-open-stdio.txt in the base source to get an idea
of the
text output from the open back-end that gets sent to the front-end as
well as
the commands sent to the back-end (it sends a set-dir to set which dir
to
list/monitor). As this is 2-way communication it can be made to do just
about
anything.
What I currently have not decided is how "actions" will work. Should
they be
CMD's sent back to the open back-end to then implement - I think it
should be.
This back-end I plan to then just run a local cp/mv/rm binary in the
backend
and pass on updates via stdout (and allow cancelling). This will allow
the open
binary to basically be the master of everything. open already handles
running
the thumb tool to update/generate thumbnails when needed, so might as
well do
the rest. So from efm's point of view it talks to this open tool (can
be a
binary, perl, python, lua, bash or whatever script) and this open tool
does all
the necessary i/o itself or via other tools.
So I'm filling in all the bits. Custom view will be needed soon. I also
haven't
handled video files in icons (It won't play a video as an icon at this
point -
but on my todo list - this will also double up to play audio files with
the
same code at some point).
What I will need to do is expand the commands that the back-end can
send over.
Things on my todo list are like:
* Display and update a progress bar (for various things but mostly
cp/mv/rm ops)
* Handle a list/stack of these progress bars
* Display an overlayed progress bar per icon
* Display other overlayed info on icons (labels, overlay icons)
* Set different states fo an icon (fade, pulse, zoom/grow, bounce, ...)
* Select/unselect files
* Display overlayed text on view (doesn't scroll) in a corner, edge or
center
* Display overlayed icons/images like above
* Display background images (don't scroll)
* Display overlayed foreground images (don't scroll)
* Display background images (scroll and size of file view not scroller)
* Display overlay foreground images (scroll and size of file view not
scroller)
* Scroll to a position or file
* Display in-view popup with label, icons, entry (text and passwd) list
of
text+icons and buttons and get events
* Display bottom/top/left/right edge extra panels with
buttons/icons/etc.
content and hear events from these
* Hear events from front end like select/unselect, scroll, dnd, copy &
paste,
keys, mouse events etc.
* Graphs ... display 1 or more and allow overlay with updates and
interaction
events (line graph, bar graph etc. etc. - a few canned types to make
themes
sane)
* Allow extension or replacement of right click menu on view background
or
files
* Allow typebuf like updates of what a user types so the back-end can
parse/interpret what a user types and "Do smart things" like run like a
pseudo-cmdline shell
* Vertical highlight display along edges (e.g. for search highlights)
The above list should begin to give you some idea that the idea is
there is a
bit of a pseudo high-level remote UI handled by the efm front end that
the
back end can use and interact with. The idea at least is, over time as
this
matures, to allow the fm back end to e.g. do a download manager like
display
like maybe you find on steam with some graph that shows download speed
and disk
speed as 2 overlayed graphs. For the back-end to display a copy or move
operation in the view as little progress bars per icon that is being
copied or
moved. Given a flexible enough front end that even allows more advanced
layout
of items. Imagine commands that can create boxes or tables with various
labels,
bars, graphs, buttons, lists etc. and then the back-end can even create
relatively featureful UIs like if the back-end detects this is your
music
collection... it can display a whole ,music player UI in a side-panel
and when
you select a file it starts playing it allowing for controls to do
that.
Imagine a directory of just photos and the view switches icon view
style to have
the label overlay the icon and display the selected icon (photo) as the
background (temporarily). The point is to allow for rich and powerful
file
view backends that can avoid having to do a lot of graphics and design
work
and just simply present what they want to show the user or ask of them
and have
the front end deal with it in a nice way.
Eventually I'd like to see a backend "repository" where people can post
new
backends available for download that users can grab and use thus adding
to
their workflow and power. Share your created bash shell backend with
others by
uploading it. Yes. I know. Security implications. How do you know this
backend
is not just going to delete all your files... I'll have to come up with
some
kind of rating, signing and blacklisting (removal) system. This kind of
thing
has already been tried with screenshots in e to some reasonable
success. This
will need to expand it to track the uploader by some unique key/hash so
only
the uploader can upload updates to a backend and that uploader can be
identified and banned if they do bad things. New backends that have not
had
anyone look into them yet can be flagged as "in staging" with big
warning
symbols until enough people (or the right people) give them a clean
bill of
health. Will cross that bridge when we come to it.
I plan to re-use the whole stdin/out system in future for gadgets too
allowing
much more easily hacked together gadgets and such in e. Imagine you
right click
on a gadget and you get an "edit source" menu and up comes the bash
script for
that gadget - you can edit and press "save" and it will change/update
on the
fly. like with fm backends press "share" to share your creation... same
problems with security, so will need the same solution for both, but
the point
here is ease of use and separating out gui from back end.
Anyway - there is a new year update on what I have been doing and where
it is
now, where it's going etc. and real code to back it up - not just hot
air.