summaryrefslogtreecommitdiff
path: root/libcons/cons.h
diff options
context:
space:
mode:
authorMarcus Brinkmann <marcus@gnu.org>2002-09-08 21:55:59 +0000
committerMarcus Brinkmann <marcus@gnu.org>2002-09-08 21:55:59 +0000
commit18cfa8b70ce9a6a3572908115f98211f3fa9a367 (patch)
tree42fd94dea9b27bb7020154a39a834429e936a560 /libcons/cons.h
parent187b5b4b28eba6990f7e43a5288a71b62a271dd9 (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.h124
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);