About a GUI for Genode. That's in the roadmap for the beginning of 2013. So I began to think about it.
My first idea was an old idea, very simple. Each visual application (text or graphics) had it's own framebuffer (could be different size for each). When pressing Ctrl-PageUp or Ctrl-PageDown, you go from one to the other in a round-robin way. Each application occupy full-screen.
Now I am thinking about it for about half an hour ant it is evolving a bit.
First, this is not obvious that you have to use Ctrl-PageUp or Ctrl-PageDown. I suggest to use a small band on the left. Upper-Left would have a Ctrl-PageUp arrow icon. Down-Left would have a Ctrl-PageDown arrow icon. Each click on one of these arrows, change to the next application (fullscreen except the left region, and the still to come right region).
Now how do you launch a new application? My first idea was that one of the application was the launcher. Basically, similar the start page of Windows 8: one icon by available applications. Well that's look a bit wrong... why not category icons to the left, and to the right of it, a 'scrollable' list of icons for each application in the category.
Now, it is not funny to go around all the applications to find the launcher. I suggest to put the launcher icon in the middle of the left band. So now the launcher is always easy to get. As soon you click the launcher icon, your application disappears and the launcher take all the 'application' space and the launcher arrow become a go back arrow, to return to your application.
Now, a notification area seems important. I suggest to use the right part of the screen for it. In it, you only see the number of urgent, normal, information messages. As soon the mouse cursor goes to the right of the screen, the notifyer take all the 'application' area (almost full-screen) and a go-back to your application icon appears to the right of the screen (similar to the launcher).
It is very important that there is an inactive margin space between the application area and the left-part and between the application area and the right-part. That way, if there is a scroller in the application to the right, you will not activate the notifyer by mistake.
Perhaps, rather than have only the launcher in left-middle, there could also be an opened-application selector icon, for people that do open a lot of windows.
Ok, that's basically my suggestion, I am open for comments about it.
Rather than having the notification area to the right, I want it at the bottom.
It should contains 2 or 3 lines of text with the following fields: Origin application: ex.: gedit(3) Clicking it change the application area to that application. hour: 13h15:23 Up/Down arrow to switch to other same importance level message X button, to ... not delete it, archive it The Yes, No, Cancel, Ok buttons (depending on a mask).
First line should be current application, modal messages. Second line, any application, important message. Third line is normal message level.
Information messages, are only available with the notifyer icon to the bottom right. The notifyer then occupy application area, and the icon become a go-back to the application button.
Now, I was beginning to think of a general form application. Many application need forms to be filled, and a general application for that seems to make sense. When a button is click, or a text area is changed, the general application could signal it to the application 'model'.
Anyway, that is not what this message is really about. About the GUI, I now realize that what is good for database needs might be good for the GUI.
I did suggest a Up,Down, and Launcher. In database we have the Up,Down,New,Delete. Launcher is New. Delete was missing.
Often, Delete is restricted. New could be.
What's good about the Up,Down,New,Delete, is that it is hierarchical, like the internal structure of Genode.
Highest level is the task: Play, Work, Communicate, Administrate
Second level is the applications category (or application if there is just one) relative to a task: -Play: Strategy Games, Card Games, Arcade games -Work: Office apps -Communicate: Email, InsantMessenger, Web Navigators -Administrate: Desktop, Updates, Backup, etc.
Lower levels: gedit (Up: next document, Down: previous document, New: Open or New?, Delete: current document).
So all that to say that the applications could and probably should use a left band too with up, down, new and delete buttons. And the application area of an application, could very well be an application too.
Should an application area contains it's own notification area for it's chils only? It make some sense.
Well, about the GUI, once again. I had: +:New -:Delete Up:Next Down:Previous. I should add a toggle button: 1/List: toggle the 'application' area between the selected one, and the list of things.
Now, especially for programs, the list of things is not clear because there is in fact two lists:
1) The list of available programs: In which, +:Add a program to the list of new programs, probably by giving the path to it, and maybe selecting an icon. In which, -:Remove the program from the list of 'available/favorites' programs Up/Down: change between available programs [Hum, one could argue that +:Add a new package to the system -:Remove the package providing the program, which I may well agree.]
2) The list of active(open) programs: In which, +: Open a new instance of this program In which, -: Close this instance of the program Up/Down: change between open programs
So the left band should have two pairs of +,-,1/List,Up,Down icons, only one active at a time. Probably only the active pair should be shown in the band, and to the left of it, a toggle button to select which pair is active.
Scrap almost all.
Let's have 4 levels: Tasks -> Categories of applications -> Applications -> Instances of an application
There is always just one band shown on the left, showing these buttons: Esc) Go to the higher level Up/Down) Navigate between items +/-) Level dependant meaning Ok) Level dependant meaning
Instance of an applicaton Esc) Go to the Application level +) Open a new instance -) Close this instance Ok) Not available Main area is managed by this instance of the application.
Application level Esc) Go to the Categorie level Ok) Go to Instance level of the selected application +) Add an application to the list of this categorie (from?) -) Delete this application from this categorie Main area give the name+description of this application
Categorie level Esc) Go to the Task level Ok) Go to Application level of the selected categorie +) Create a new categorie for this task -) Delete this categorie from this tak Main area give the name+description of this categorie
Task level Esc) Not available Ok) Go to Category level of the selected task +) Create a new category -) Delete current category Main area give the name+description of this task.
Each left band level should have a different color.
I now believe that there should be just one notification area, to the bottom of the screen.
Mockups would provide more clarity.
Regards,
Robert
On Thu, Jan 24, 2013 at 8:11 AM, Paul Dufresne <dufresnep@...9...> wrote:
Scrap almost all.
Let's have 4 levels: Tasks -> Categories of applications -> Applications -> Instances of an application
There is always just one band shown on the left, showing these buttons: Esc) Go to the higher level Up/Down) Navigate between items +/-) Level dependant meaning Ok) Level dependant meaning
Instance of an applicaton Esc) Go to the Application level +) Open a new instance -) Close this instance Ok) Not available Main area is managed by this instance of the application.
Application level Esc) Go to the Categorie level Ok) Go to Instance level of the selected application +) Add an application to the list of this categorie (from?) -) Delete this application from this categorie Main area give the name+description of this application
Categorie level Esc) Go to the Task level Ok) Go to Application level of the selected categorie +) Create a new categorie for this task -) Delete this categorie from this tak Main area give the name+description of this categorie
Task level Esc) Not available Ok) Go to Category level of the selected task +) Create a new category -) Delete current category Main area give the name+description of this task.
Each left band level should have a different color.
I now believe that there should be just one notification area, to the bottom of the screen.
Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft MVPs and experts. ON SALE this month only -- learn more at: http://p.sf.net/sfu/learnnow-d2d _______________________________________________ Genode-main mailing list Genode-main@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/genode-main
Hi Paul,
I like the idea of the uniform navigation throughout the hierarchy. Hereby, I'd like to share my thoughts about it.
Why would we limit the hierarchy to four levels? The hierarchy could be entirely dynamic, depending on what the user is doing, in particular when moving a bit towards a more data-centric way. Just an example, the top level could host an item "new web page" among several others. When clicking on it, a new subsystem is created that will host the website. When starting up, it presents some bookmarks, possibly the list of recently visited web pages, and and an URL entry field. Once the user clicks on one of links or enters the URL, the subsystem will just load and display the single website. There is no dedicated browser needed. Because of the uniform navigation that you suggested, any number of web pages can be open at a time (be repeatedly clicking on "new web page" without any browser-specific tab navigation. Now, when the website contains a mailto link, the website subsystem will launch an new instance of an email subsystem once the user clicks on the link, thereby adding just another hierarchy level. So things like "email" or "website" are first-level objects. This email subsystem may, in turn, provide a button "new attachment". When clicked, a new attachment subsystem will be created where the user might decide to attach a new image. By doing so, we just instantiate a new subsystem for creating and manipulating an image. So the work flow would be completely in line with the hierarchy. It is quite different from what we have today, but it would be fun to experiment with this idea.
This scheme could be applied everywhere where we have hierarchies in our work flow and data, which is, ermm.... almost everywhere. ;-)
I am not sure though, that the hierarchy presented at the GUI level should one-to-one correspond to the Genode hierarchy. Both are not necessarily the same thing. But I have to think this more through.
While pondering a bit about the best way to go forward implementing it, I found a way, which does not look overly complicated and quite doable given the current state of Genode. There is already the 'Framebuffer::Session' interface, which all graphical applications are using (directly or indirectly). So this new UI server could provide a "Framebuffer" service as well as a "Navigation" service. The latter one would implement the logic behind the visible bands, maintain the current focus, and notify its clients about the user interactions with the bands, i.e., "new item" clicked. Each node in the hierarchy would open a "Navigation" session. When such a session is created, the UI server receives a label string that tells him, where the session request comes from (this label already exists in Genode and is used for applying client-specific policies, e.g. as used by nitpicker). So the UI can maintain a global view of the nodes in the hierarchy. Because the "Framebuffer" sessions are created with the same label as the "Navigation" sessions, the UI can even match those.
Internally, the UI server might use the existing nitpicker GUI server as compositing engine. So it does not need to implement things like mouse-cursor handling, alpha blending, etc. This is all already implemented in nitpicker.
I agree that we also need a notification mechanism. But I think of it as a feature that is largely decoupled from this UI navigation idea. So maybe it would be beneficial to focus in the navigation and defer the discussion of notifications for now.
As a closing remark, I think that there won't be "the" Genode GUI. Genode is a tool box, which should enable us to build very different kinds of systems. Your idea is very compelling to me but other people may have different tastes. So we should try to design the software such that we get little components that are easily reusable in different contexts. For example, for doing my daily development work, I need a way to see multiple terminals at once. So a tiling window manager would be the way to go (rather than full-screen GUIs as you suggested). It would be fantastic if our solution would be modular enough so that your navigation scheme could be combined with my preference of using tiled windows (or another's preference of using floating windows) in the end.
Cheers Norman
About the GUI once again.
I came to think that one of the problem of the previous design, was that Up Down was moving from the (same application) instances. I was also thinking on the fact that limiting to a single application on the screen is a ... drawback. Often someone will work with different kinds of programs at the same time. Havin to Escape to go to a different application is not fun. Also, I was thinking about tiling manager (which I am not used to). Now, it came to my idea that tiling at first glance means that all sub-windows are rectangles. But it seems more usefull for me, to have one main application occupy full screen, except for a less often used application occupying one of the corner. So I begin to think about what I would call the corner window manager.
Basically at the beginning, the screen is empty, except for a '+' icon at each corner, plus one '+' at the center of the screen.
When you click on one of the + icon, a popup screen allows you to choose which program to open. The newly open program appears in the corner where you had clicked or the center if you had clicked on the + at the center of the screen. You can change the size of the newly opened program. It is important to note that the size is linked to the program occupying the corner, not to the corner itself.
So you can open up to 5 programs. Each corner and the center is either active if a program is open there, or inactive if there is no program there. An active corner have a closing icon. An inactive corner (or the middle) have a opening icon: '+'. Also, the program in the center occupy the full 'screen', except for the active corners programs that appears to overlap it.
As soon as one program is opened, the floating control center appears. It has 3 buttons with the following functions: -Rotate programs to the right (clockwise) among active corners and the center if it is active. -Rotate programs to the left (counterclockwise) among active corners and the center if it is active. -Close the main program (the one in the center)
So if you have just the center and a single corner active, pressing any of the Rotate buttons does exchange the main program with the corner program.
It make some sense to me to add also on each corner, a floating icon. That would transform the program in the corner, to an overlapping window. Floating windows would not be affected by rotation commands. Floating windows would have an 'unfloat' icon, to allow them to move back in an inactive corner if there is one. So that they would once again, by 'rotatable'. Floating windows would also have a closing icon.
I realize I am becoming a bit off topic with this window manager idea. Complain if you think I am too much.
Just adding some late thoughts on this.
First, previous comment was making corners to accept just one application, by the fact that once you added a program in a corner, the opening icon was changed to a closing one. This is really a mistake because one of my main usage pattern expected is to use just center area plus many applications open in one corner, only one being visible at a time. So my first change is to say that the opening icon is always visible in a corner. I wish also to allow opening in the same way many programs at the center (full-screen) area, only the last being visible. That is why I wish to make the opening icon permanent on the floating 'control center'. This allows the usage pattern of just using the center slot, making it similar to one of my previous 'full-page' only one window open at a time.
One of the rational of the design is to make it easy to change how programs are 'tiled' on screen with minimal keybord shortcuts: Ctrl-PageUp to rotate programs counterclockwise (probably 2 to 8) among the visual slots (corners). Ctrl-PageDown to rotate in the other direction: clockwise.
I have seen realized that sometime, the corner will cover a usefull spot of the center (full-screen) program. For this, my first idea, that I am keeping is to have a button on the control center to hide/show all corners. This button would alsow hide/show opening/closing icons too. If floating windows is kept in the design, on other button to hide/show all floating windows (except control center) would be added too.
A fancy design, could allow each corner to hide/show individually. I came with the 5 on a dice toggle buttons for this: O O O O O
Each corner would hide/show the corresponding corner. The center button would hide/show all the corner. There could also be small buttons between the center button and corners buttons, to allows flipping the program in the corner with the one in the center.
Now, an other solution to a corner hiding important window on the center app, is to allow to rotate not only the programs but the corner themselves. I guess I would not only rotate active corners, but all the corners. So now we would add to buttons in the control center: RCL: Rotate Corners Counterclockwise (Left) RCR: Rotate Corners Clockwise (Right)
It has also come to my mind that maybe corners could not be the best place to put my slots. Maybe, Up, Right, Down, Left would have been less used on the center app than it's corners. So at first, I thought about changing the CornerWindowManager to a CrossWindowManager. Actually, I guess it is a question of taste.
So I suggest that: Rotating Clockwise/CounterClockwise corners of a CornerWindow would make it a CrossWindow. Rotating Clockwise/CounterClockwise Up/Right/Down/Left slots of a CrossWindow would make it a CornerWindow.
Basically, the slots would looks like 1 2 3 4 5 6 7 8 9 in the initial position.
Rotating Slots Right (Clockwise) on initial position leads to: 4 1 2 7 5 3 8 9 6
Rotating Slots Left (Counterclockwise) on *initial* position leads to: 2 3 6 1 5 9 4 7 8
It is important to note that each slots is not just one program, but a stack of programs (latest open on the top, which is the visible one). So that when rotating clockwise *Programs*, if you examine one of the slots: -The program on the bottow of the stack goes to top of the 'next' slot -All programs goes down one level in the stack -The top (visible) level of the stack is filled with 'previous' slot
When rotating counterclockwise programs, one one slot: -The top level program is moved to the bottom of an other slot -All programs goes up one level in the stack -The bottom program is filled with an other slot top program
Frankly, I am not too sure how this design would feel. But sure I'd like to be able to test it!