Skip to content
Snippets Groups Projects
sdl_con.c 32 KiB
Newer Older
				switch(ev.user.code) {
					case SDL_USEREVENT_QUIT:
						sdl_ufunc_retval=0;
						if (ciolib_reaper)
							exit(0);
						sem_post(&sdl_ufunc_ret);
						return;
					case SDL_USEREVENT_FLUSH:
						pthread_mutex_lock(&win_mutex);
						if (win != NULL) {
							pthread_mutex_lock(&sdl_headlock);
							list = update_list;
							update_list = update_list_tail = NULL;
							pthread_mutex_unlock(&sdl_headlock);
							for (; list; list = old_next) {
								SDL_Rect src;
								SDL_Rect dst;
								int idealw;
								int idealh;

								old_next = list->next;
								if (list->next == NULL) {
									void *pixels;
									int pitch;
									int row;
									int tw, th;

									src.x = 0;
									src.y = 0;
									src.w = list->rect.width;
									src.h = list->rect.height;
									sdl.QueryTexture(texture, NULL, NULL, &tw, &th);
									sdl.LockTexture(texture, &src, &pixels, &pitch);
									if (pitch != list->rect.width * sizeof(list->data[0])) {
										// If this happens, we need to copy a row at a time...
										for (row = 0; row < list->rect.height && row < th; row++) {
											if (pitch < list->rect.width * sizeof(list->data[0]))
												memcpy(pixels, &list->data[list->rect.width * row], pitch);
											else
												memcpy(pixels, &list->data[list->rect.width * row], list->rect.width * sizeof(list->data[0]));
											pixels = (void *)((char*)pixels + pitch);
										}
									}
									else {
										int ch = list->rect.height;
										if (ch > th)
											ch = th;
										memcpy(pixels, list->data, list->rect.width * ch * sizeof(list->data[0]));
									}
									sdl.UnlockTexture(texture);
									dst.x = 0;
									dst.y = 0;
									dst.w = cvstat.winwidth;
									dst.h = cvstat.winheight;
									// Get correct aspect ratio for dst...
									idealw = roundl((long double)dst.h * cvstat.scale_numerator / cvstat.scale_denominator * cvstat.scrnwidth / cvstat.scrnheight);
									idealh = roundl((long double)dst.w * cvstat.scale_denominator / cvstat.scale_numerator * cvstat.scrnheight / cvstat.scrnwidth);
									if (idealw < cvstat.winwidth) {
										dst.x = (cvstat.winwidth - idealw) / 2;
										dst.w = idealw;
									}
									else if(idealh < cvstat.winheight) {
										dst.y = (cvstat.winheight - idealh) / 2;
										dst.h = idealh;
									}
									sdl.RenderCopy(renderer, texture, &src, &dst);
								bitmap_drv_free_rect(list);
							sdl.RenderPresent(renderer);
						}
						pthread_mutex_unlock(&win_mutex);
						break;
					case SDL_USEREVENT_SETNAME:
						pthread_mutex_lock(&win_mutex);
						sdl.SetWindowTitle(win, (char *)ev.user.data1);
						pthread_mutex_unlock(&win_mutex);
						free(ev.user.data1);
						break;
					case SDL_USEREVENT_SETICON:
						if(sdl_icon != NULL)
							sdl.FreeSurface(sdl_icon);
						sdl_icon=sdl.CreateRGBSurfaceFrom(ev.user.data1
								, *(unsigned long *)ev.user.data2
								, *(unsigned long *)ev.user.data2
								, 32
								, *(unsigned long *)ev.user.data2*4
								, *(DWORD *)"\377\0\0\0"
								, *(DWORD *)"\0\377\0\0"
								, *(DWORD *)"\0\0\377\0"
								, *(DWORD *)"\0\0\0\377"
						);
						pthread_mutex_lock(&win_mutex);
						sdl.SetWindowIcon(win, sdl_icon);
						pthread_mutex_unlock(&win_mutex);
						free(ev.user.data2);
						break;
					case SDL_USEREVENT_SETTITLE:
						pthread_mutex_lock(&win_mutex);
						sdl.SetWindowTitle(win, (char *)ev.user.data1);
						pthread_mutex_unlock(&win_mutex);
						free(ev.user.data1);
						break;
					case SDL_USEREVENT_SETVIDMODE:
						pthread_mutex_lock(&vstatlock);
						setup_surfaces_locked();
						pthread_mutex_unlock(&vstatlock);
						sdl_ufunc_retval=0;
						sem_post(&sdl_ufunc_ret);
						break;
					case SDL_USEREVENT_HIDEMOUSE:
						sdl.ShowCursor(SDL_DISABLE);
						break;
					case SDL_USEREVENT_SHOWMOUSE:
						sdl.ShowCursor(SDL_ENABLE);
						break;
					case SDL_USEREVENT_INIT:
						if(!sdl_init_good) {
							if(sdl.WasInit(SDL_INIT_VIDEO)==SDL_INIT_VIDEO) {
								pthread_mutex_lock(&win_mutex);
								_beginthread(sdl_mouse_thread, 0, NULL);
								sdl_init_good=1;
								pthread_mutex_unlock(&win_mutex);
						}
						sdl_ufunc_retval=0;
						sem_post(&sdl_ufunc_ret);
						break;
					case SDL_USEREVENT_GETWINPOS:
						sdl.GetWindowPosition(win, ev.user.data1, ev.user.data2);
						sem_post(&sdl_ufunc_ret);
						break;
					case SDL_USEREVENT_MOUSEPOINTER:
					{
						int cid = INT_MIN;
						SDL_Cursor *oc = curs;
						switch((intptr_t)ev.user.data1) {
							case CIOLIB_MOUSEPTR_ARROW:
								break;	// Default
							case CIOLIB_MOUSEPTR_BAR:
								cid = SDL_SYSTEM_CURSOR_IBEAM;
								break;
						}
						if (cid == INT_MIN) {
							sdl.SetCursor(sdl.GetDefaultCursor());
							curs = NULL;
						}
						else {
							curs = sdl.CreateSystemCursor(cid);
							if (curs == NULL)
								sdl.SetCursor(sdl.GetDefaultCursor());
							else
								sdl.SetCursor(curs);
						if (oc)
							sdl.FreeCursor(oc);
						break;
			case SDL_SYSWMEVENT:			/* ToDo... This is where Copy/Paste needs doing */

			/* Ignore this stuff */
			case SDL_JOYAXISMOTION:
			case SDL_JOYBALLMOTION:
			case SDL_JOYHATMOTION:
			case SDL_JOYBUTTONDOWN:
			case SDL_JOYBUTTONUP:
			default:
				break;
deuce's avatar
deuce committed
	return;
#if defined(__DARWIN__)
	if (initsdl_ret) {
#else
	if(init_sdl_video()) {
		fprintf(stderr,"SDL Video Initialization Failed\n");
	sem_init(&sdl_key_pending, 0, 0);
	sem_init(&sdl_ufunc_ret, 0, 0);
	sem_init(&sdl_ufunc_rec, 0, 0);
	pthread_mutex_init(&sdl_ufunc_mtx, NULL);
	pthread_mutex_init(&sdl_headlock, NULL);
	pthread_mutex_init(&win_mutex, NULL);
	pthread_mutex_init(&sdl_keylock, NULL);

void
sdl_beep(void)
{
        static unsigned char wave[2206];

	if (wave[2205] == 0) {
		xptone_makewave(440, wave, 2205, WAVE_SHAPE_SINE_SAW_HARM);
		wave[2205] = 1;
	}
        xp_play_sample(wave, 2205, TRUE);
}

/* Called from main thread only (Passes Event) */
int sdl_mousepointer(enum ciolib_mouse_ptr type)
{
	sdl_user_func(SDL_USEREVENT_MOUSEPOINTER,type);
	return(0);
}