static void hvfb_cfb_imageblit(struct fb_info *p, const struct fb_image *image) { struct hvfb_par *par = p->par; cfb_imageblit(p, image); if (par->synchronous_fb) synthvid_update(p); }
static void hvfb_cfb_copyarea(struct fb_info *p, const struct fb_copyarea *area) { struct hvfb_par *par = p->par; cfb_copyarea(p, area); if (par->synchronous_fb) synthvid_update(p); }
static void hvfb_cfb_fillrect(struct fb_info *p, const struct fb_fillrect *rect) { struct hvfb_par *par = p->par; cfb_fillrect(p, rect); if (par->synchronous_fb) synthvid_update(p); }
/* * Delayed work callback: * It is called at HVFB_UPDATE_DELAY or longer time interval to process * screen updates. It is re-scheduled if further update is necessary. */ static void hvfb_update_work(struct work_struct *w) { struct hvfb_par *par = container_of(w, struct hvfb_par, dwork.work); struct fb_info *info = par->info; if (par->fb_ready) synthvid_update(info); if (par->update) schedule_delayed_work(&par->dwork, HVFB_UPDATE_DELAY); }
static int hvfb_on_panic(struct notifier_block *nb, unsigned long e, void *p) { struct hvfb_par *par; struct fb_info *info; par = container_of(nb, struct hvfb_par, hvfb_panic_nb); par->synchronous_fb = true; info = par->info; synthvid_update(info); return NOTIFY_DONE; }
/* * Delayed work callback: * It is called at HVFB_UPDATE_DELAY or longer time interval to process * screen updates. It is re-scheduled if further update is necessary. */ static void hvfb_update_work(struct work_struct *w) { struct hvfb_par *par = container_of(w, struct hvfb_par, dwork.work); struct fb_info *info = par->info; char *argv[] = {"/usr/bin/xrefresh", "-display", ":0.0", NULL}; char *envp[] = {"HOME=/", "PATH=/sbin:/usr/sbin:/bin:/usr/bin", NULL }; if (par->xrefresh) { par->xrefresh = false; call_usermodehelper(argv[0], argv, envp, 0); } if (par->fb_ready) synthvid_update(info); if (par->update) schedule_delayed_work(&par->dwork, HVFB_UPDATE_DELAY); }