From: Antonino A. D. <ad...@gm...> - 2005-07-27 00:38:32
|
Add capability to fbdev to listen to the FB_ACTIVATE_ALL flag. If set, it notifies fbcon that all consoles must be set to the current var. From: Antonino Daplas <ad...@po...> Signed-off-by: Antonino Daplas <ad...@po...> --- drivers/video/console/fbcon.c | 48 ++++++++++++++++++++++++++++++++++++++++++ drivers/video/fbmem.c | 6 +++-- include/linux/fb.h | 3 ++ 3 files changed, 55 insertions(+), 2 deletions(-) Index: drivers/video/console/fbcon.c =================================================================== --- 5ab26ac17f9da3181ac77da24d40bf1c3447cf6a/drivers/video/console/fbcon.c (mode:100644) +++ b6ae21b3932b059ce4bf95d0254f9a90650b49f9/drivers/video/console/fbcon.c (mode:100644) @@ -2592,6 +2592,51 @@ } } +static void fbcon_set_all_vcs(struct fb_info *info) +{ + struct fbcon_ops *ops = info->fbcon_par; + struct vc_data *vc; + struct display *p; + int i, rows, cols; + + if (!ops || ops->currcon < 0) + return; + + for (i = 0; i < MAX_NR_CONSOLES; i++) { + vc = vc_cons[i].d; + if (!vc || vc->vc_mode != KD_TEXT || + registered_fb[con2fb_map[i]] != info) + continue; + + p = &fb_display[vc->vc_num]; + + info->var.xoffset = info->var.yoffset = p->yscroll = 0; + var_to_display(p, &info->var, info); + cols = info->var.xres / vc->vc_font.width; + rows = info->var.yres / vc->vc_font.height; + vc_resize(vc, cols, rows); + + if (CON_IS_VISIBLE(vc)) { + updatescrollmode(p, info, vc); + scrollback_max = 0; + scrollback_current = 0; + update_var(vc->vc_num, info); + fbcon_set_palette(vc, color_table); + update_screen(vc); + if (softback_buf) { + int l = fbcon_softback_size / vc->vc_size_row; + if (l > 5) + softback_end = softback_buf + l * vc->vc_size_row; + else { + /* Smaller scrollback makes no sense, and 0 + would screw the operation totally */ + softback_top = 0; + } + } + } + } +} + static int fbcon_mode_deleted(struct fb_info *info, struct fb_videomode *mode) { @@ -2707,6 +2752,9 @@ case FB_EVENT_MODE_CHANGE: fbcon_modechanged(info); break; + case FB_EVENT_MODE_CHANGE_ALL: + fbcon_set_all_vcs(info); + break; case FB_EVENT_MODE_DELETE: mode = event->data; ret = fbcon_mode_deleted(info, mode); Index: drivers/video/fbmem.c =================================================================== --- 5ab26ac17f9da3181ac77da24d40bf1c3447cf6a/drivers/video/fbmem.c (mode:100644) +++ b6ae21b3932b059ce4bf95d0254f9a90650b49f9/drivers/video/fbmem.c (mode:100644) @@ -682,11 +682,13 @@ if (!err && info->flags & FBINFO_MISC_USEREVENT) { struct fb_event event; + int evnt = (var->activate & FB_ACTIVATE_ALL) ? + FB_EVENT_MODE_CHANGE_ALL : + FB_EVENT_MODE_CHANGE; info->flags &= ~FBINFO_MISC_USEREVENT; event.info = info; - notifier_call_chain(&fb_notifier_list, - FB_EVENT_MODE_CHANGE, + notifier_call_chain(&fb_notifier_list, evnt, &event); } } Index: include/linux/fb.h =================================================================== --- 5ab26ac17f9da3181ac77da24d40bf1c3447cf6a/include/linux/fb.h (mode:100644) +++ b6ae21b3932b059ce4bf95d0254f9a90650b49f9/include/linux/fb.h (mode:100644) @@ -495,6 +495,9 @@ #define FB_EVENT_BLANK 0x08 /* Private modelist is to be replaced */ #define FB_EVENT_NEW_MODELIST 0x09 +/* The resolution of the passed in fb_info about to change and + all vc's should be changed */ +#define FB_EVENT_MODE_CHANGE_ALL 0x0A struct fb_event { struct fb_info *info; |