Skip to content
Snippets Groups Projects
sdl_con.c 30.4 KiB
Newer Older
deuce's avatar
deuce committed
												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]));
										}
deuce's avatar
deuce committed
										sdl.UnlockTexture(texture);
										sdl.RenderCopy(renderer, texture, &src, NULL);
deuce's avatar
deuce committed
								}
								sdl.RenderPresent(renderer);
							}
							pthread_mutex_unlock(&win_mutex);
							break;
						case SDL_USEREVENT_SETNAME:
							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"
							);
							sdl.SetWindowIcon(win, sdl_icon);
							pthread_mutex_unlock(&win_mutex);
							free(ev.user.data2);
							break;
						case SDL_USEREVENT_SETTITLE:
							sdl.SetWindowTitle(win, (char *)ev.user.data1);
							pthread_mutex_unlock(&win_mutex);
							free(ev.user.data1);
							break;
						case SDL_USEREVENT_SETVIDMODE:
deuce's avatar
deuce committed
							pthread_mutex_lock(&vstatlock);
							setup_surfaces_locked();
							old_w = cvstat.winwidth;
							old_h = cvstat.winheight;
							pthread_mutex_unlock(&vstatlock);
							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) {
deuce's avatar
deuce committed
									_beginthread(sdl_mouse_thread, 0, NULL);
									pthread_mutex_unlock(&win_mutex);
						case SDL_USEREVENT_GETWINPOS:
							sdl.GetWindowPosition(win, ev.user.data1, ev.user.data2);
							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;
						}
					}
					break;
				}
				case SDL_SYSWMEVENT:			/* ToDo... This is where Copy/Paste needs doing */
deuce's avatar
deuce committed

				/* 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);
}