From 18cfa8b70ce9a6a3572908115f98211f3fa9a367 Mon Sep 17 00:00:00 2001 From: Marcus Brinkmann Date: Sun, 8 Sep 2002 21:55:59 +0000 Subject: libcons/ 2002-09-09 Marcus Brinkmann * 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 (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 , , , , , . Include , and . (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 . (cons_vcons_remove): Assert that VCONS_ENTRY does not have an open VCONS. utils/ 2002-09-09 Marcus Brinkmann * 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. --- libcons/cons-switch.c | 82 ++++++++++++++++++++++----------------------------- 1 file changed, 35 insertions(+), 47 deletions(-) (limited to 'libcons/cons-switch.c') diff --git a/libcons/cons-switch.c b/libcons/cons-switch.c index f2b72daf..d9aa64af 100644 --- a/libcons/cons-switch.c +++ b/libcons/cons-switch.c @@ -19,77 +19,65 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111, USA. */ #include -#include #include #include "cons.h" -/* 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. */ +/* Open the virtual console ID or the ACTIVE_ID plus DELTA one in CONS + and return it in R_VCONS, which will be locked. */ error_t -cons_switch (cons_t cons, int id, int delta) +cons_switch (cons_t cons, int active_id, int id, int delta, vcons_t *r_vcons) { - vcons_t vcons = NULL; - vcons_t active; + error_t err = 0; + vcons_list_t vcons_entry = NULL; if (!id && !delta) return 0; mutex_lock (&cons->lock); - active = cons->active; + vcons_entry = cons->vcons_list; + while (vcons_entry && vcons_entry->id != (id ?: active_id)) + vcons_entry = vcons_entry->next; - if (!id && !active) + if (!id && vcons_entry) { - mutex_unlock (&cons->lock); - return EINVAL; - } - - if (id) - { - vcons = cons->vcons_list; - while (vcons && vcons->id != id) - vcons = vcons->next; - } - else if (delta > 0) - { - vcons = cons->active; - while (delta-- > 0) + if (delta > 0) { - vcons = vcons->next; - if (!vcons) - vcons = cons->vcons_list; + while (delta-- > 0) + { + vcons_entry = vcons_entry->next; + if (!vcons_entry) + vcons_entry = cons->vcons_list; + } } - } - else - { - assert (delta < 0); - while (delta++ < 0) + else { - vcons = vcons->prev; - if (!vcons) - vcons = cons->vcons_last; + assert (delta < 0); + while (delta++ < 0) + { + vcons_entry = vcons_entry->prev; + if (!vcons_entry) + vcons_entry = cons->vcons_last; + } } } - - if (!vcons) + if (!vcons_entry) { mutex_unlock (&cons->lock); return ESRCH; } - if (vcons != active) + if (vcons_entry->vcons) { - error_t err = cons_vcons_activate (vcons); - if (err) - { - mutex_unlock (&cons->lock); - return err; - } - - cons->active = vcons; - cons_vcons_refresh (vcons); + *r_vcons = vcons_entry->vcons; + mutex_lock (&vcons_entry->vcons->lock); + } + else + { + err = cons_vcons_open (cons, vcons_entry, r_vcons); + if (!err) + vcons_entry->vcons = *r_vcons; } mutex_unlock (&cons->lock); - return 0; + return err; } -- cgit v1.2.3