📄 links-2.1pre19-xynth.diff
字号:
+ case S_KEYCODE_F11: k = KBD_F11; break;+ case S_KEYCODE_F12: k = KBD_F12; break;+ default:+ k = event->keybd->ascii;+ if (!isprint(k)) {+ return;+ }+ break;+ }+ if (event->keybd->flag & (KEYCODE_CTRLF)) {+ flag |= KBD_CTRL;+ }+ if (event->keybd->flag & (KEYCODE_SHIFTF)) {+ }+ if (event->keybd->flag & (KEYCODE_ALTF | KEYCODE_ALTGRF)) {+ flag |= KBD_ALT;+ }++#define KEYBD_HOOK0 \+ int acc = 0;\+ int pos = 0;\+ struct graphics_device *gd;\+ s_thread_mutex_lock(lxynth_root->gd->mut);\+ while (!s_list_eol(lxynth_root->gd->list, pos)) {\+ gd = (struct graphics_device *) s_list_get(lxynth_root->gd->list, pos);\+ if (gd == lxynth_root->gd->active) {\++#define KEYBD_HOOK1 \+ }\+ pos++;\+ }\+ s_thread_mutex_unlock(lxynth_root->gd->mut);\+ if (acc) {\+ char *title;\+ struct rect r;\+ r.x1 = 0;\+ r.y1 = 0;\+ r.x2 = lxynth_root->window->surface->buf.w;\+ r.y2 = lxynth_root->window->surface->buf.h;\+ title = strdup(((lxynth_device_t *) lxynth_root->gd->active->driver_data)->title);\+ lxynth_set_title(lxynth_root->gd->active, title);\+ lxynth_root->gd->active->resize_handler(lxynth_root->gd->active);\+ lxynth_root->gd->active->redraw_handler(lxynth_root->gd->active, &r);\+ s_free(title);\+ }++ if ((flag == KBD_CTRL) && (event->keybd->ascii == 'w')) {+ KEYBD_HOOK0;+ if (lxynth_root->gd->list->nb_elt > 1) {+ s_list_remove(lxynth_root->gd->list, pos);+ lxynth_root->gd->active = (struct graphics_device *) s_list_get(lxynth_root->gd->list, 0);+ acc = 1;+ break;+ }+ KEYBD_HOOK1;+ if (acc) {+ gd->keyboard_handler(gd, KBD_CLOSE, 0);+ }+ } else if ((flag == KBD_CTRL) && (k == KBD_LEFT)) {+ KEYBD_HOOK0;+ if (pos >= 1) {+ lxynth_root->gd->active = (struct graphics_device *) s_list_get(lxynth_root->gd->list, pos - 1);+ acc = 1;+ break;+ }+ KEYBD_HOOK1;+ } else if ((flag == KBD_CTRL) && (k == KBD_RIGHT)) {+ KEYBD_HOOK0;+ if ((pos + 1) < lxynth_root->gd->list->nb_elt) {+ lxynth_root->gd->active = (struct graphics_device *) s_list_get(lxynth_root->gd->list, pos + 1);+ acc = 1;+ break;+ }+ KEYBD_HOOK1;+ } else {+ lxynth_root->gd->active->keyboard_handler(lxynth_root->gd->active, k, flag);+ }+}++static void lxynth_event_parse_expos (s_event_t *event)+{+ if (event->expose->change & (EXPOSE_CHNGW | EXPOSE_CHNGH)) {+ int pos = 0;+ s_thread_mutex_lock(lxynth_root->gd->mut);+ while (!s_list_eol(lxynth_root->gd->list, pos)) {+ struct graphics_device *gd = (struct graphics_device *) s_list_get(lxynth_root->gd->list, pos);+ lxynth_device_t *wd = gd->driver_data;++ gd->size.x2 = lxynth_root->window->surface->buf.w;+ gd->size.y2 = lxynth_root->window->surface->buf.h;+ wd->surface->width = lxynth_root->window->surface->buf.w;+ wd->surface->height = lxynth_root->window->surface->buf.h;+ s_free(wd->surface->vbuf);+ wd->surface->vbuf = (char *) s_malloc(wd->surface->width *+ wd->surface->height *+ wd->surface->bytesperpixel);+ pos++;+ }+ s_thread_mutex_unlock(lxynth_root->gd->mut);+ lxynth_root->gd->active->resize_handler(lxynth_root->gd->active);+ }+}++static void lxynth_timer (void *arg)+{+ int x = 0;+ int y = 0;+ int k = 0;+ int flag = 0;+ s_event_t *event;++ s_thread_mutex_lock(lxynth_root->eventq->mut);+ while (!s_list_eol(lxynth_root->eventq->list, 0)) {+ event = (s_event_t *) s_list_get(lxynth_root->eventq->list, 0);+ s_list_remove(lxynth_root->eventq->list, 0);+ switch (event->type & EVENT_MASK) {+ case QUIT_EVENT: break;+ case MOUSE_EVENT: lxynth_event_parse_mouse(event); break;+ case KEYBD_EVENT: lxynth_event_parse_keybd(event); break;+ case EXPOSE_EVENT: lxynth_event_parse_expos(event); break;+ }+ s_event_uninit(event);+ }+ s_thread_mutex_unlock(lxynth_root->eventq->mut);++ if (lxynth_root->running) {+ lxynth_root->timerid = install_timer(20, lxynth_timer, NULL);+ }+}++static void lxynth_atevent (s_window_t *window, s_event_t *event)+{+ s_event_t *e;++ if (lxynth_root == NULL) {+ return;+ }+ switch (event->type & EVENT_MASK) {+ case QUIT_EVENT:+ case MOUSE_EVENT:+ case KEYBD_EVENT:+ case EXPOSE_EVENT:+ if (!s_event_init(&e)) {+ e->type = event->type;+ memcpy(e->mouse, event->mouse, sizeof(s_mouse_t));+ memcpy(e->keybd, event->keybd, sizeof(s_keybd_t));+ memcpy(e->expose, event->expose, sizeof(s_expose_t));++ s_thread_mutex_lock(lxynth_root->eventq->mut);+ s_list_add(lxynth_root->eventq->list, e, -1);+ s_thread_mutex_unlock(lxynth_root->eventq->mut);+ }+ break;+ default:+ break;+ }+}++static void lxynth_atexit (s_window_t *window)+{+ if (lxynth_root == NULL) {+ return;+ }+ if (lxynth_root->running) {+ struct graphics_device *gd = lxynth_root->gd->active;++ s_thread_mutex_lock(lxynth_root->gd->mut);+ lxynth_root->running = 0;+ lxynth_root->gd->active = NULL;+ s_thread_mutex_unlock(lxynth_root->gd->mut);+ gd->keyboard_handler(gd, KBD_CLOSE, 0);+ }+}++static unsigned char * lxynth_init_driver (unsigned char *param, unsigned char *display)+{+ int bpp;+ int Bpp;++ DEBUGF ("%s (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__);++ lxynth_root = (lxynth_root_t *) s_malloc(sizeof(lxynth_root_t));+ lxynth_root->eventq = (lxynth_eventq_t *) s_malloc(sizeof(lxynth_eventq_t));+ lxynth_root->eventq->list = (s_list_t *) s_malloc(sizeof(s_list_t));+ s_list_init(lxynth_root->eventq->list);+ s_thread_mutex_init(&(lxynth_root->eventq->mut));+ lxynth_root->gd = (lxynth_gd_t *) s_malloc(sizeof(lxynth_gd_t));+ lxynth_root->gd->list = (s_list_t *) s_malloc(sizeof(s_list_t));+ s_list_init(lxynth_root->gd->list);+ s_thread_mutex_init(&(lxynth_root->gd->mut));+ lxynth_root->gd->active = NULL;++ s_client_init(&(lxynth_root->window));+ s_window_new(lxynth_root->window, WINDOW_MAIN, NULL);+ s_window_set_coor(lxynth_root->window, NO_FORM, 50, 50, 600, 500);++ bpp = lxynth_root->window->surface->bitsperpixel;+ Bpp = lxynth_root->window->surface->bytesperpixel;++ if (bpp == 32) {+ bpp = 24;+ }+ xynth_driver.depth = (bpp << 3) | Bpp;++ s_window_show(lxynth_root->window);+ lxynth_root->tid = s_thread_create(s_client_main, lxynth_root->window);+ s_client_atevent(lxynth_root->window, lxynth_atevent);+ s_client_atexit(lxynth_root->window, lxynth_atexit);+ lxynth_root->running = 1;++ install_timer(20, lxynth_timer, NULL);++ return NULL;+}++static struct graphics_device * lxynth_init_device (void)+{+ char *vbuf;+ lxynth_device_t *wd;+ struct graphics_device *gd;++ DEBUGF ("%s (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__);++ wd = (lxynth_device_t *) s_malloc(sizeof(lxynth_device_t));+ wd->update = (s_rect_t) {-1, -1, -1, -1};+ gd = (struct graphics_device *) s_malloc(sizeof(struct graphics_device));++ wd->title = NULL;+ wd->surface = (s_surface_t *) s_malloc(sizeof(s_surface_t));+ vbuf = (char *) s_malloc(lxynth_root->window->surface->buf.w * lxynth_root->window->surface->buf.h * lxynth_root->window->surface->bytesperpixel);+ s_getsurfacevirtual(wd->surface, lxynth_root->window->surface->buf.w , lxynth_root->window->surface->buf.h, lxynth_root->window->surface->bitsperpixel, vbuf);++ gd->size.x1 = 0;+ gd->size.x2 = wd->surface->width;+ gd->size.y1 = 0;+ gd->size.y2 = wd->surface->height;+ gd->clip.x1 = 0;+ gd->clip.x2 = gd->size.x2;+ gd->clip.y1 = 0;+ gd->clip.y2 = gd->size.y2;++ gd->drv = &xynth_driver;+ gd->driver_data = wd;+ gd->user_data = NULL;++ s_thread_mutex_lock(lxynth_root->gd->mut);+ s_list_add(lxynth_root->gd->list, gd, -1);+ lxynth_root->gd->active = gd;+ s_thread_mutex_unlock(lxynth_root->gd->mut);++ return gd;+}++static void lxynth_shutdown_device (struct graphics_device *dev)+{+ int acc = 0;+ int pos = 0;+ lxynth_device_t *wd;+ struct graphics_device *gd;++ DEBUGF ("%s (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__);++ s_thread_mutex_lock(lxynth_root->gd->mut);+ while (!s_list_eol(lxynth_root->gd->list, pos)) {+ gd = (struct graphics_device *) s_list_get(lxynth_root->gd->list, pos);+ if (gd == dev) {+ s_list_remove(lxynth_root->gd->list, pos);+ if (lxynth_root->gd->list->nb_elt > 0) {+ lxynth_root->gd->active = (struct graphics_device *) s_list_get(lxynth_root->gd->list, 0);+ acc = 1;+ } else {+ lxynth_root->gd->active = NULL;+ }+ break;+ }+ pos++;+ }+ unregister_bottom_half(lxynth_surface_register_update, dev);+ wd = (lxynth_device_t *) dev->driver_data;+ s_free(wd->title);+ s_free(wd->surface->vbuf);+ s_free(wd->surface);+ s_free(wd);+ s_free(dev);+ s_thread_mutex_unlock(lxynth_root->gd->mut);++ if (acc && lxynth_root->running) {+ char *title;+ struct rect r;+ r.x1 = 0;+ r.y1 = 0;+ r.x2 = lxynth_root->window->surface->buf.w;+ r.y2 = lxynth_root->window->surface->buf.h;+ title = strdup(((lxynth_device_t *) lxynth_root->gd->active->driver_data)->title);+ lxynth_set_title(lxynth_root->gd->active, title);+ lxynth_root->gd->active->resize_handler(lxynth_root->gd->active);+ lxynth_root->gd->active->redraw_handler(lxynth_root->gd->active, &r);+ s_free(title);+ }+}++static void lxynth_shutdown_driver (void)+{+ DEBUGF ("%s (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__);++ if (lxynth_root->running) {+ lxynth_root->running = 0;+ s_client_quit(lxynth_root->window);+ s_thread_join(lxynth_root->tid, NULL);+ kill_timer(lxynth_root->timerid);+ }++ while (!s_list_eol(lxynth_root->eventq->list, 0)) {+ s_event_t *event = s_list_get(lxynth_root->eventq->list, 0);+ s_list_remove(lxynth_root->eventq->list, 0);+ s_event_uninit(event);+ }+ s_free(lxynth_root->eventq->list);+ s_thread_mutex_destroy(lxynth_root->eventq->mut);+ s_free(lxynth_root->eventq);++ while (!s_list_eol(lxynth_root->gd->list, 0)) {+ struct graphics_device *gd = s_list_get(lxynth_root->gd->list, 0);+ lxynth_device_t *wd = (lxynth_device_t *) gd->driver_data;+ s_list_remove(lxynth_root->gd->list, 0);+ s_free(wd->title);+ s_free(wd->surface->vbuf);+ s_free(wd->surface);+ s_free(wd);+ s_free(gd);+ }+ s_free(lxynth_root->gd->list);+ s_thread_mutex_destroy(lxynth_root->gd->mut);+ s_free(lxynth_root->gd);++ s_free(lxynth_root);+}++static unsigned char * lxynth_driver_param (void)+{+ DEBUGF ("%s (%s:%d)\n", __FUNCTION__, __FILE__, __LINE__);+ exit(0);+}++static int lxynth_get_empty_bitmap (struct bitmap *dest)+{
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -