diff options
author | Marcus Brinkmann <marcus@gnu.org> | 2002-09-08 21:55:59 +0000 |
---|---|---|
committer | Marcus Brinkmann <marcus@gnu.org> | 2002-09-08 21:55:59 +0000 |
commit | 18cfa8b70ce9a6a3572908115f98211f3fa9a367 (patch) | |
tree | 42fd94dea9b27bb7020154a39a834429e936a560 /libcons/cons.h | |
parent | 187b5b4b28eba6990f7e43a5288a71b62a271dd9 (diff) |
libcons/
2002-09-09 Marcus Brinkmann <marcus@gnu.org>
* vcons-remove.c: New file.
* Makefile (SRCS): Add vcons-destroy.c.
* cons.h: New type vcons_list_t.
(struct vcons_list): New structure.
(struct cons_notify): Remove VCONS member.
(struct vcons): Remove members NEXT, PREV and NOTIFY. Add the
notify structure to the top to make it possible to use a vcons as
a port. New member VCONS_ENTRY.
(struct cons): Change type of members vcons_list and vcons_last to
vcons_list_t. Remove member active.
(cons_vcons_add): Change prototype to match new definition.
(cons_vcons_remove): Likewise.
(cons_switch): Likewise.
(cons_lookup): Likewise.
(cons_vcons_open): Likewise.
(cons_vcons_destroy): New prototype.
* cons-lookup.c (cons_lookup): Change type of R_VCONS argument
vcons_list_t. Change type of previous_vcons and vcons variables
to vcons_list_t. Append _entry to all these variables.
Don't allocate and initialize a vcons_t, but a vcons_list_t.
After this has been added to the list, call cons_vcons_add.
* cons-switch.c: Do not include <error.h>
(cons_switch): Add arguments ACTIVE_ID and R_VCONS. New variable
ERR and VCONS_ENTRY. Remove variable ACTIVE. Do not keep track
of active console. Instead, look it up using ACTIVE_ID. Lock the
returned console. Call cons_vcons_open, not cons_vcons_activate.
* dir-changed.c (add_one): Change VCONS to VCONS_ENTRY and its
type from vcons_t to vcons_list_t to follow cons_lookup change.
(lookup_one): Likewise.
(cons_S_dir_changed): Likewise.
* file-changed.c (cons_S_file_changed): Cast NOTIFY to VCONS.
Check that NOTIFY->cons is not set instead that NOTIFY->vcons is.
* init-init.c (cons_init): Pass cons_vcons_destroy as
clean_routine to ports_create_class.
Don't initialize CONS->active, nor DIR_NOTIFY_PORT->vcons.
* vcons-add.c (cons_vcons_add): Change argument VCONS to CONS and
VCONS_ENTRY. Don't do anything here (the user must implement it
all).
* vcons-close.c: Don't include <errno.h>, <unistd.h>, <stdio.h>,
<sys/mman.h>, <sys/fcntl.h>, <mach.h>. Include <assert.h>,
<hurd/ports.h> and <cthreads.h>.
(cons_vcons_close): Clear VCONS->vcons_entry->vcons. Derefence
and destroy VCONS.
* vcons-open.c (cons_vcons_open): Change arguments from VCONS to
CONS, VCONS_ENTRY and R_VCONS. New variable VCONS. Set up VCONS
as a port, and request notification messages on that.
* vcons-remove.c: Do not include <errno.h>.
(cons_vcons_remove): Assert that VCONS_ENTRY does not have an open
VCONS.
utils/
2002-09-09 Marcus Brinkmann <marcus@gnu.org>
* console-ncurses.c: New global variable global_lock.
(main): Initialize global_lock.
(cons_vcons_activate): Removed.
(console_switch): New function.
(cons_vcons_add): New function.
(input_loop): Call console_switch, not cons_switch. Do not take
active_vcons lock but global_lock.
(cons_vcons_update): Take global lock.
(cons_vcons_set_cursor_pos): Likewise.
(cons_vcons_set_cursor_status): Likewise.
(cons_vcons_scroll): Likewise.
(cons_vcons_write): Likewise.
(cons_vcons_beep): Likewise.
(cons_vcons_flash): Likewise.
Diffstat (limited to 'libcons/cons.h')
-rw-r--r-- | libcons/cons.h | 124 |
1 files changed, 83 insertions, 41 deletions
diff --git a/libcons/cons.h b/libcons/cons.h index 7966657b..e7484db5 100644 --- a/libcons/cons.h +++ b/libcons/cons.h @@ -28,23 +28,51 @@ #include <hurd/console.h> -typedef struct vcons *vcons_t; typedef struct cons *cons_t; +typedef struct vcons_list *vcons_list_t; +typedef struct vcons *vcons_t; typedef struct cons_notify *cons_notify_t; +struct vcons_list +{ + cons_t cons; + vcons_list_t next; + vcons_list_t prev; + + /* The ID of the virtual console entry in the list. */ + int id; + + /* The opened vcons port on which we receive notifications. */ + vcons_t vcons; +}; + +struct cons_notify +{ + struct port_info pi; + + /* This is set for the dir notification port. */ + cons_t cons; +}; + struct vcons { - vcons_t next; - vcons_t prev; + /* This must come first for the port info structure. */ + struct cons_notify notify; + + /* These elements are static from creation time. */ cons_t cons; + vcons_list_t vcons_entry; int id; + /* The lock that protects all other members. */ struct mutex lock; + /* The FD of the input node. */ int input; + + /* The shared memory of the display. */ struct cons_display *display; size_t display_size; - cons_notify_t notify; struct { @@ -82,9 +110,8 @@ struct cons /* Protects the cons structure and the linked list in VCONS_LIST. */ struct mutex lock; - vcons_t vcons_list; - vcons_t vcons_last; - vcons_t active; + vcons_list_t vcons_list; + vcons_list_t vcons_last; struct port_class *port_class; struct port_bucket *port_bucket; @@ -93,23 +120,12 @@ struct cons int slack; }; -struct cons_notify -{ - struct port_info pi; - - /* This is set for the dir notification port. */ - cons_t cons; - - /* This is set for the file notification ports. */ - vcons_t vcons; -}; - /* The user must define this variable. Set this to the name of the console client. */ extern const char *cons_client_name; -/* The user must define this variables. Set this to be the client +/* The user must define this variable. Set this to be the client version number. */ extern const char *cons_client_version; @@ -133,10 +149,31 @@ void cons_vcons_set_cursor_status (vcons_t vcons, uint32_t status); /* The user must define this function. Scroll the content of virtual console VCONS, which is locked, up by DELTA if DELTA is positive or - down by -DELTA if DELTA is negative. This call will be immediately - followed by corresponding cons_vcons_write calls to fill the - resulting gap on the screen, and VCONS will be looked throughout - the whole time. */ + down by -DELTA if DELTA is negative. DELTA will never be zero, and + the absolute value if DELTA will be smaller than or equal to the + height of the screen matrix. + + This call will be immediately followed by corresponding + cons_vcons_write calls to fill the resulting gap on the screen, and + VCONS will be looked throughout the whole time. The purpose of the + function is two-fold: It is called with an absolute value of DELTA + smaller than the screen height to perform scrolling. It is called + with an absolute value of DELTA equal to the screen height to + prepare a full refresh of the screen. In the latter case the user + should not really perform any scrolling. Instead it might + deallocate limited resources (like display glyph slots and palette + colors) if that helps to perform the subsequent write. It goes + without saying that the same deallocation, if any, should be + performed on the area that will be filled with the scrolled in + content. + + XXX Possibly need a function to invalidate scrollback buffer, or in + general to signal a switch of the console so state can be reset. + Only do this if we make guarantees about validity of scrollback + buffer, of course. + + The driver is allowed to delay the effect of this operation until + the UPDATE function is called. */ void cons_vcons_scroll (vcons_t vcons, int delta); /* The user may define this function. Make the changes from @@ -157,21 +194,22 @@ void cons_vcons_beep (vcons_t vcons); void cons_vcons_flash (vcons_t vcons); /* The user must define this function. It is called whenever a - virtual console is selected to be the active one. */ + virtual console is selected to be the active one. It is the user's + responsibility to close the console at some later time. */ error_t cons_vcons_activate (vcons_t vcons); -/* The user may define this function. It is called whenever a - virtual console is added. VCONS->cons is locked. */ -void cons_vcons_add (vcons_t vcons); +/* The user may define this function. It is called after a + virtual console entry was added. CONS is locked. */ +void cons_vcons_add (cons_t cons, vcons_list_t vcons_entry); -/* The user may define this function. It is called whenever a - virtual console is removed. VCONS->cons is locked. */ -void cons_vcons_remove (vcons_t vcons); +/* The user may define this function. It is called just before a + virtual console entry is removed. CONS is locked. */ +void cons_vcons_remove (cons_t cons, vcons_list_t vcons_entry); -/* Switch the active console in CONS to ID or the current one plus - DELTA. This will call back into the user code by doing a - cons_vcons_activate. */ -error_t cons_switch (cons_t cons, int id, int delta); +/* Open the virtual console ID or the ACTIVE_ID plus DELTA one in CONS + and return it in R_VCONS. */ +error_t cons_switch (cons_t cons, int active_id, int id, int delta, + vcons_t *r_vcons); extern const struct argp cons_startup_argp; @@ -184,18 +222,22 @@ void cons_server_loop (void); int cons_demuxer (mach_msg_header_t *inp, mach_msg_header_t *outp); /* Lookup the virtual console with number ID in the console CONS, - acquire a reference for it, and return it in R_VCONS. If CREATE is - true, the virtual console will be created if it doesn't exist yet. - If CREATE is true, and ID 0, the first free virtual console id is - used. CONS must be locked. */ -error_t cons_lookup (cons_t cons, int id, int create, vcons_t *r_vcons); + acquire a reference for it, and return its list entry in R_VCONS. + If CREATE is true, the virtual console will be created if it + doesn't exist yet. If CREATE is true, and ID 0, the first free + virtual console id is used. CONS must be locked. */ +error_t cons_lookup (cons_t cons, int id, int create, vcons_list_t *r_vcons); -/* Open the virtual console VCONS. VCONS->cons is locked. */ -error_t cons_vcons_open (vcons_t vcons); +/* Open the virtual console for VCONS_ENTRY. CONS is locked. */ +error_t cons_vcons_open (cons_t cons, vcons_list_t vcons_entry, + vcons_t *r_vcons); /* Close the virtual console VCONS. VCONS->cons is locked. */ void cons_vcons_close (vcons_t vcons); +/* Destroy the virtual console VCONS. */ +void cons_vcons_destroy (void *port); + /* Redraw the virtual console VCONS, which is locked. */ void cons_vcons_refresh (vcons_t vcons); |