⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 links-2.1pre19-xynth.diff

📁 CS架构的多平台的GUI系统
💻 DIFF
📖 第 1 页 / 共 3 页
字号:
+		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 + -