mirror of
				https://github.com/asterisk/asterisk.git
				synced 2025-10-31 10:47:18 +00:00 
			
		
		
		
	add support for cropping the keypad image while displaying it.
This way it can contain additional elements (e.g. fonts, buttons, widgets) without having to use a zillion files to store them. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@96988 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
		| @@ -113,6 +113,8 @@ struct gui_info { | ||||
| 	int			outfd;		/* fd for output */ | ||||
| 	SDL_Surface		*keypad;	/* the skin for the keypad */ | ||||
|  | ||||
| 	SDL_Rect		kp_rect;	/* portion of the skin to display - default all */ | ||||
|  | ||||
| 	/* variable-size array mapping keypad regions to functions */ | ||||
| 	int kp_size, kp_used; | ||||
| 	struct keypad_entry *kp; | ||||
| @@ -217,12 +219,12 @@ static void show_frame(struct video_desc *env, int out) | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * Identifier for each region of the main window. | ||||
|  * Identifiers for regions of the main window. | ||||
|  * Values between 0 and 127 correspond to ASCII characters. | ||||
|  * The corresponding strings to be used in the skin comment section | ||||
|  * are defined in gui_key_map. | ||||
|  */ | ||||
| enum pixel_value { | ||||
| enum skin_area { | ||||
| 	/* answer/close functions */ | ||||
| 	KEY_PICK_UP = 128, | ||||
| 	KEY_HANG_UP = 129, | ||||
| @@ -233,12 +235,19 @@ enum pixel_value { | ||||
| 	KEY_LOCALVIDEO = 133, | ||||
| 	KEY_REMOTEVIDEO = 134, | ||||
| 	KEY_WRITEMESSAGE = 135, | ||||
| 	KEY_GUI_CLOSE = 136,		/* close gui */ | ||||
| 	KEY_FLASH = 136, | ||||
| 	KEY_GUI_CLOSE = 199,		/* close gui */ | ||||
|  | ||||
| 	/* regions of the skin - active area, fonts, etc. */ | ||||
| 	KEY_KEYPAD = 200,		/* the keypad - default to the whole image */ | ||||
| 	KEY_FONT = 201,		/* the font */ | ||||
|  | ||||
| 	/* areas outside the keypad - simulated */ | ||||
| 	KEY_OUT_OF_KEYPAD = 251, | ||||
| 	KEY_REM_DPY = 252, | ||||
| 	KEY_LOC_DPY = 253, | ||||
| 	KEY_OUT_OF_KEYPAD = 241, | ||||
| 	KEY_REM_DPY = 242, | ||||
| 	KEY_LOC_DPY = 243, | ||||
| 	KEY_RESET = 253,		/* the 'reset' keyword */ | ||||
| 	KEY_NONE = 254,			/* invalid area */ | ||||
| 	KEY_DIGIT_BACKGROUND = 255,	/* other areas within the keypad */ | ||||
| }; | ||||
|  | ||||
| @@ -782,8 +791,13 @@ static void sdl_setup(struct video_desc *env) | ||||
| 		goto no_sdl; | ||||
|  | ||||
| 	if (gui->keypad) { | ||||
| 		kp_w = gui->keypad->w; | ||||
| 		kp_h = gui->keypad->h; | ||||
| 		if (gui->kp_rect.w > 0 && gui->kp_rect.h > 0) { | ||||
| 			kp_w = gui->kp_rect.w; | ||||
| 			kp_h = gui->kp_rect.h; | ||||
| 		} else { | ||||
| 			kp_w = gui->keypad->w; | ||||
| 			kp_h = gui->keypad->h; | ||||
| 		} | ||||
| 	} | ||||
| #define BORDER	5	/* border around our windows */ | ||||
| 	maxw = env->rem_dpy.w + env->loc_dpy.w + kp_w; | ||||
| @@ -810,11 +824,12 @@ static void sdl_setup(struct video_desc *env) | ||||
| 	 */ | ||||
| 	if (gui->keypad) { | ||||
| 		struct SDL_Rect *dest = &gui->win[WIN_KEYPAD].rect; | ||||
| 		struct SDL_Rect *src = (gui->kp_rect.w > 0 && gui->kp_rect.h > 0) ? & gui->kp_rect : NULL; | ||||
| 		dest->x = 2*BORDER + env->rem_dpy.w; | ||||
| 		dest->y = BORDER; | ||||
| 		dest->w = gui->keypad->w; | ||||
| 		dest->h = gui->keypad->h; | ||||
| 		SDL_BlitSurface(gui->keypad, NULL, gui->screen, dest); | ||||
| 		dest->w = kp_w; | ||||
| 		dest->h = kp_h; | ||||
| 		SDL_BlitSurface(gui->keypad, src, gui->screen, dest); | ||||
| 		SDL_UpdateRects(gui->screen, 1, dest); | ||||
| 	} | ||||
| 	return; | ||||
| @@ -866,14 +881,31 @@ static struct _s_k gui_key_map[] = { | ||||
|         {"HANG_UP",	KEY_HANG_UP }, | ||||
|         {"HANGUP",	KEY_HANG_UP }, | ||||
|         {"MUTE",	KEY_MUTE }, | ||||
|         {"FLASH",	KEY_FLASH }, | ||||
|         {"AUTOANSWER",	KEY_AUTOANSWER }, | ||||
|         {"SENDVIDEO",	KEY_SENDVIDEO }, | ||||
|         {"LOCALVIDEO",	KEY_LOCALVIDEO }, | ||||
|         {"REMOTEVIDEO",	KEY_REMOTEVIDEO }, | ||||
|         {"WRITEMESSAGE", KEY_WRITEMESSAGE }, | ||||
|         {"GUI_CLOSE",	KEY_GUI_CLOSE }, | ||||
|         {"KEYPAD",	KEY_KEYPAD },	/* x0 y0 w h - active area of the keypad */ | ||||
|         {"FONT",	KEY_FONT },	/* x0 yo w h rows cols - location and format of the font */ | ||||
|         {NULL, 0 } }; | ||||
|  | ||||
| static int gui_map_token(const char *s) | ||||
| { | ||||
| 	/* map the string into token to be returned */ | ||||
| 	int i = atoi(s); | ||||
| 	struct _s_k *p; | ||||
| 	if (i > 0 || s[1] == '\0')	/* numbers or single characters */ | ||||
| 		return (i > 9) ? i : s[0]; | ||||
| 	for (p = gui_key_map; p->s; p++) { | ||||
| 		if (!strcasecmp(p->s, s)) | ||||
| 			return p->k; | ||||
| 	} | ||||
| 	return KEY_NONE;	/* not found */ | ||||
| } | ||||
|  | ||||
| /*! \brief read a keypad entry line in the format | ||||
|  *	reset | ||||
|  *	token circle xc yc diameter | ||||
| @@ -887,35 +919,51 @@ static int keypad_cfg_read(struct gui_info *gui, const char *val) | ||||
| { | ||||
| 	struct keypad_entry e; | ||||
| 	char s1[16], s2[16]; | ||||
| 	int i, ret = 0; | ||||
| 	int i, ret = 0; /* default, error */ | ||||
|  | ||||
| 	if (gui == NULL || val == NULL) | ||||
| 		return 0; | ||||
|  | ||||
| 	s1[0] = s2[0] = '\0'; | ||||
| 	bzero(&e, sizeof(e)); | ||||
| 	i = sscanf(val, "%14s %14s %d %d %d %d %d", | ||||
|                 s1, s2, &e.x0, &e.y0, &e.x1, &e.y1, &e.h); | ||||
|  | ||||
| 	e.c = gui_map_token(s1); | ||||
| 	if (e.c == KEY_NONE) | ||||
| 		return 0;	/* nothing found */ | ||||
| 	switch (i) { | ||||
| 	default: | ||||
| 		break; | ||||
| 	case 1:	/* only "reset" is allowed */ | ||||
| 		if (strcasecmp(s1, "reset"))	/* invalid */ | ||||
| 		if (e.c != KEY_RESET) | ||||
| 			break; | ||||
| 		if (gui->kp) { | ||||
| 		if (gui->kp) | ||||
| 			gui->kp_used = 0; | ||||
| 		} | ||||
| 		break; | ||||
| 	case 5: /* token circle xc yc diameter */ | ||||
| 	case 5: | ||||
| 		if (e.c == KEY_KEYPAD) {	/* active keypad area */ | ||||
| 			gui->kp_rect.x = atoi(s2); | ||||
| 			gui->kp_rect.y = e.x0; | ||||
| 			gui->kp_rect.w = e.y0; | ||||
| 			gui->kp_rect.h = e.x1; | ||||
| 			break; | ||||
| 		} | ||||
| 		if (strcasecmp(s2, "circle"))	/* invalid */ | ||||
| 			break; | ||||
| 		/* token circle xc yc diameter */ | ||||
| 		e.h = e.x1; | ||||
| 		e.y1 = e.y0;	/* map radius in x1 y1 */ | ||||
| 		e.x1 = e.x0 + e.h;	/* map radius in x1 y1 */ | ||||
| 		e.x0 = e.x0 - e.h;	/* map radius in x1 y1 */ | ||||
| 		/* fallthrough */ | ||||
|  | ||||
| 	case 7: /* token circle|rect x0 y0 x1 y1 h */ | ||||
| 	case 7: | ||||
| 		if (e.c == KEY_FONT) {	/* font - x0 y0 w h rows cols */ | ||||
| 			ast_log(LOG_WARNING, "font not supported yet\n"); | ||||
| 			break; | ||||
| 		} | ||||
| 		/* token circle|rect x0 y0 x1 y1 h */ | ||||
| 		if (e.x1 < e.x0 || e.h <= 0) { | ||||
| 			ast_log(LOG_WARNING, "error in coordinates\n"); | ||||
| 			e.type = 0; | ||||
| @@ -936,23 +984,6 @@ static int keypad_cfg_read(struct gui_info *gui, const char *val) | ||||
| 	// ast_log(LOG_WARNING, "reading [%s] returns %d %d\n", val, i, ret); | ||||
| 	if (ret == 0) | ||||
| 		return 0; | ||||
| 	/* map the string into token to be returned */ | ||||
| 	i = atoi(s1); | ||||
| 	if (i > 0 || s1[1] == '\0')	/* numbers or single characters */ | ||||
| 		e.c = (i > 9) ? i : s1[0]; | ||||
| 	else { | ||||
| 		struct _s_k *p; | ||||
| 		for (p = gui_key_map; p->s; p++) { | ||||
| 			if (!strcasecmp(p->s, s1)) { | ||||
| 				e.c = p->k; | ||||
| 				break; | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| 	if (e.c == 0) { | ||||
| 		ast_log(LOG_WARNING, "missing token\n"); | ||||
| 		return 0; | ||||
| 	} | ||||
| 	if (gui->kp_size == 0) { | ||||
| 		gui->kp = ast_calloc(10, sizeof(e)); | ||||
| 		if (gui->kp == NULL) { | ||||
|   | ||||
		Reference in New Issue
	
	Block a user