| 
									
										
										
										
											2011-02-23 10:52:22 +00:00
										 |  |  | /*
 | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  |  * ***** BEGIN GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU General Public License | 
					
						
							|  |  |  |  * as published by the Free Software Foundation; either version 2 | 
					
						
							|  |  |  |  * of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This program is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
					
						
							|  |  |  |  * GNU General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU General Public License | 
					
						
							|  |  |  |  * along with this program; if not, write to the Free Software Foundation, | 
					
						
							|  |  |  |  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * Contributor(s): Campbell Barton | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * ***** END GPL LICENSE BLOCK ***** | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-02-27 20:29:51 +00:00
										 |  |  | /** \file blender/editors/space_info/textview.c
 | 
					
						
							|  |  |  |  *  \ingroup spinfo | 
					
						
							|  |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | #include <math.h>
 | 
					
						
							|  |  |  | #include <string.h>
 | 
					
						
							|  |  |  | #include <sys/stat.h>
 | 
					
						
							|  |  |  | #include <limits.h>
 | 
					
						
							|  |  |  | #include <assert.h>
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "BLF_api.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-07 01:38:32 +00:00
										 |  |  | #include "BLI_math.h"
 | 
					
						
							| 
									
										
										
										
											2011-01-07 18:36:47 +00:00
										 |  |  | #include "BLI_utildefines.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | #include "BIF_gl.h"
 | 
					
						
							|  |  |  | #include "BIF_glutil.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "ED_datafiles.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include "textview.h"
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void console_font_begin(TextViewContext *sc) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	BLF_size(blf_mono_font, sc->lheight - 2, 72); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | typedef struct ConsoleDrawContext { | 
					
						
							|  |  |  | 	int cwidth; | 
					
						
							|  |  |  | 	int lheight; | 
					
						
							|  |  |  | 	int console_width; /* number of characters that fit into the width of the console (fixed width) */ | 
					
						
							|  |  |  | 	int winx; | 
					
						
							|  |  |  | 	int ymin, ymax; | 
					
						
							|  |  |  | 	int *xy; // [2]
 | 
					
						
							|  |  |  | 	int *sel; // [2]
 | 
					
						
							|  |  |  | 	int *pos_pick; // bottom of view == 0, top of file == combine chars, end of line is lower then start. 
 | 
					
						
							|  |  |  | 	int *mval; // [2]
 | 
					
						
							|  |  |  | 	int draw; | 
					
						
							|  |  |  | } ConsoleDrawContext; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | static void console_draw_sel(int sel[2], int xy[2], int str_len_draw, int cwidth, int lheight) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (sel[0] <= str_len_draw && sel[1] >= 0) { | 
					
						
							| 
									
										
										
										
											2012-10-24 05:06:40 +00:00
										 |  |  | 		int sta = max_ii(sel[0], 0); | 
					
						
							|  |  |  | 		int end = min_ii(sel[1], str_len_draw); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		glEnable(GL_POLYGON_STIPPLE); | 
					
						
							|  |  |  | 		glPolygonStipple(stipple_halftone); | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 		glEnable(GL_BLEND); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); | 
					
						
							|  |  |  | 		glColor4ub(255, 255, 255, 96); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 		glRecti(xy[0] + (cwidth * sta), xy[1] - 2 + lheight, xy[0] + (cwidth * end), xy[1] - 2); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		glDisable(GL_POLYGON_STIPPLE); | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 		glDisable(GL_BLEND); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* return 0 if the last line is off the screen
 | 
					
						
							|  |  |  |  * should be able to use this for any string type */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-11 06:35:45 +00:00
										 |  |  | static int console_draw_string(ConsoleDrawContext *cdc, const char *str, int str_len, unsigned char *fg, unsigned char *bg) | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | { | 
					
						
							|  |  |  | #define STEP_SEL(value) cdc->sel[0] += (value); cdc->sel[1] += (value)
 | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	int rct_ofs = cdc->lheight / 4; | 
					
						
							|  |  |  | 	int tot_lines = (str_len / cdc->console_width) + 1; /* total number of lines for wrapping */ | 
					
						
							|  |  |  | 	int y_next = (str_len > cdc->console_width) ? cdc->xy[1] + cdc->lheight * tot_lines : cdc->xy[1] + cdc->lheight; | 
					
						
							|  |  |  | 	const int mono = blf_mono_font; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* just advance the height */ | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	if (cdc->draw == 0) { | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (cdc->pos_pick && (cdc->mval[1] != INT_MAX)) { | 
					
						
							|  |  |  | 			if (cdc->xy[1] <= cdc->mval[1]) { | 
					
						
							|  |  |  | 				if ((y_next >= cdc->mval[1])) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 					int ofs = (int)floor(((float)cdc->mval[0] / (float)cdc->cwidth)); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					/* wrap */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 					if (str_len > cdc->console_width) | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 						ofs += (cdc->console_width * ((int)((((float)(y_next - cdc->mval[1]) / (float)(y_next - cdc->xy[1])) * tot_lines)))); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 	 | 
					
						
							|  |  |  | 					CLAMP(ofs, 0, str_len); | 
					
						
							|  |  |  | 					*cdc->pos_pick += str_len - ofs; | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 				} | 
					
						
							|  |  |  | 				else | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 					*cdc->pos_pick += str_len + 1; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 		cdc->xy[1] = y_next; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		return 1; | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	else if (y_next - cdc->lheight < cdc->ymin) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		/* have not reached the drawable area so don't break */ | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 		cdc->xy[1] = y_next; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* adjust selection even if not drawing */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (cdc->sel[0] != cdc->sel[1]) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			STEP_SEL(-(str_len + 1)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		return 1; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-10-14 19:57:49 +00:00
										 |  |  | 	if (tot_lines > 1) { /* wrap? */ | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 		const int initial_offset = ((tot_lines - 1) * cdc->console_width); | 
					
						
							|  |  |  | 		const char *line_stride = str + initial_offset;  /* advance to the last line and draw it first */ | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		 | 
					
						
							|  |  |  | 		int sel_orig[2]; | 
					
						
							| 
									
										
										
										
											2011-11-07 01:38:32 +00:00
										 |  |  | 		copy_v2_v2_int(sel_orig, cdc->sel); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		/* invert and swap for wrapping */ | 
					
						
							|  |  |  | 		cdc->sel[0] = str_len - sel_orig[1]; | 
					
						
							|  |  |  | 		cdc->sel[1] = str_len - sel_orig[0]; | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (bg) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			glColor3ubv(bg); | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 			glRecti(0, cdc->xy[1] - rct_ofs, cdc->winx, (cdc->xy[1] + (cdc->lheight * tot_lines)) + rct_ofs); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		glColor3ubv(fg); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		/* last part needs no clipping */ | 
					
						
							|  |  |  | 		BLF_position(mono, cdc->xy[0], cdc->xy[1], 0); | 
					
						
							| 
									
										
										
										
											2010-11-11 06:35:45 +00:00
										 |  |  | 		BLF_draw(mono, line_stride, str_len - initial_offset); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (cdc->sel[0] != cdc->sel[1]) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			STEP_SEL(-initial_offset); | 
					
						
							|  |  |  | 			// glColor4ub(255, 0, 0, 96); // debug
 | 
					
						
							|  |  |  | 			console_draw_sel(cdc->sel, cdc->xy, str_len % cdc->console_width, cdc->cwidth, cdc->lheight); | 
					
						
							|  |  |  | 			STEP_SEL(cdc->console_width); | 
					
						
							|  |  |  | 			glColor3ubv(fg); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		cdc->xy[1] += cdc->lheight; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		line_stride -= cdc->console_width; | 
					
						
							|  |  |  | 		 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		for (; line_stride >= str; line_stride -= cdc->console_width) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			BLF_position(mono, cdc->xy[0], cdc->xy[1], 0); | 
					
						
							| 
									
										
										
										
											2010-11-11 06:35:45 +00:00
										 |  |  | 			BLF_draw(mono, line_stride, cdc->console_width); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			if (cdc->sel[0] != cdc->sel[1]) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 				// glColor4ub(0, 255, 0, 96); // debug
 | 
					
						
							|  |  |  | 				console_draw_sel(cdc->sel, cdc->xy, cdc->console_width, cdc->cwidth, cdc->lheight); | 
					
						
							|  |  |  | 				STEP_SEL(cdc->console_width); | 
					
						
							|  |  |  | 				glColor3ubv(fg); | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			cdc->xy[1] += cdc->lheight; | 
					
						
							|  |  |  | 			 | 
					
						
							|  |  |  | 			/* check if were out of view bounds */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			if (cdc->xy[1] > cdc->ymax) | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 				return 0; | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-11-07 01:38:32 +00:00
										 |  |  | 		copy_v2_v2_int(cdc->sel, sel_orig); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		STEP_SEL(-(str_len + 1)); | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	else { /* simple, no wrap */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (bg) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			glColor3ubv(bg); | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 			glRecti(0, cdc->xy[1] - rct_ofs, cdc->winx, cdc->xy[1] + cdc->lheight - rct_ofs); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		glColor3ubv(fg); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		BLF_position(mono, cdc->xy[0], cdc->xy[1], 0); | 
					
						
							| 
									
										
										
										
											2010-11-11 06:35:45 +00:00
										 |  |  | 		BLF_draw(mono, str, str_len); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (cdc->sel[0] != cdc->sel[1]) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			int isel[2]; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 			isel[0] = str_len - cdc->sel[1]; | 
					
						
							|  |  |  | 			isel[1] = str_len - cdc->sel[0]; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// glColor4ub(255, 255, 0, 96); // debug
 | 
					
						
							|  |  |  | 			console_draw_sel(isel, cdc->xy, str_len, cdc->cwidth, cdc->lheight); | 
					
						
							|  |  |  | 			STEP_SEL(-(str_len + 1)); | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		cdc->xy[1] += cdc->lheight; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 		if (cdc->xy[1] > cdc->ymax) | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			return 0; | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return 1; | 
					
						
							|  |  |  | #undef STEP_SEL
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #define CONSOLE_DRAW_MARGIN 4
 | 
					
						
							|  |  |  | #define CONSOLE_DRAW_SCROLL 16
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | int textview_draw(TextViewContext *tvc, int draw, int mval[2], void **mouse_pick, int *pos_pick) | 
					
						
							|  |  |  | { | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	ConsoleDrawContext cdc = {0}; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	int x_orig = CONSOLE_DRAW_MARGIN, y_orig = CONSOLE_DRAW_MARGIN + tvc->lheight / 6; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 	int xy[2], y_prev; | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	int sel[2] = {-1, -1}; /* defaults disabled */ | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 	unsigned char fg[3], bg[3]; | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	const int mono = blf_mono_font; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	console_font_begin(tvc); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	xy[0] = x_orig; xy[1] = y_orig; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (mval[1] != INT_MAX) | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		mval[1] += (tvc->ymin + CONSOLE_DRAW_MARGIN); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (pos_pick) | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		*pos_pick = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	/* constants for the sequencer context */ | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	cdc.cwidth = (int)BLF_fixed_width(mono); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 	assert(cdc.cwidth > 0); | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	cdc.lheight = tvc->lheight; | 
					
						
							|  |  |  | 	cdc.console_width = (tvc->winx - (CONSOLE_DRAW_SCROLL + CONSOLE_DRAW_MARGIN * 2) ) / cdc.cwidth; | 
					
						
							| 
									
										
										
										
											2010-11-26 17:07:31 +00:00
										 |  |  | 	CLAMP(cdc.console_width, 1, INT_MAX); /* avoid divide by zero on small windows */ | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	cdc.winx = tvc->winx - (CONSOLE_DRAW_MARGIN + CONSOLE_DRAW_SCROLL); | 
					
						
							| 
									
										
										
										
											2012-03-24 02:51:46 +00:00
										 |  |  | 	cdc.ymin = tvc->ymin; | 
					
						
							|  |  |  | 	cdc.ymax = tvc->ymax; | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	cdc.xy = xy; | 
					
						
							|  |  |  | 	cdc.sel = sel; | 
					
						
							|  |  |  | 	cdc.pos_pick = pos_pick; | 
					
						
							|  |  |  | 	cdc.mval = mval; | 
					
						
							|  |  |  | 	cdc.draw = draw; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	/* shouldnt be needed */ | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 	tvc->cwidth = cdc.cwidth; | 
					
						
							|  |  |  | 	tvc->console_width = cdc.console_width; | 
					
						
							|  |  |  | 	tvc->iter_index = 0; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (tvc->sel_start != tvc->sel_end) { | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 		sel[0] = tvc->sel_start; | 
					
						
							|  |  |  | 		sel[1] = tvc->sel_end; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 	if (tvc->begin(tvc)) { | 
					
						
							| 
									
										
										
										
											2010-11-11 06:35:45 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 		do { | 
					
						
							| 
									
										
										
										
											2010-11-11 06:35:45 +00:00
										 |  |  | 			const char *ext_line; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 			int ext_len; | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 			int color_flag = 0; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 			y_prev = xy[1]; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			if (draw) | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 				color_flag = tvc->line_color(tvc, fg, bg); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			tvc->line_get(tvc, &ext_line, &ext_len); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			if (!console_draw_string(&cdc, ext_line, ext_len, (color_flag & TVC_LINE_FG) ? fg : NULL, (color_flag & TVC_LINE_BG) ? bg : NULL)) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 				/* when drawing, if we pass v2d->cur.ymax, then quit */ | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 				if (draw) { | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 					break; /* past the y limits */ | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 06:38:07 +00:00
										 |  |  | 			if ((mval[1] != INT_MAX) && (mval[1] >= y_prev && mval[1] <= xy[1])) { | 
					
						
							| 
									
										
										
										
											2012-03-28 11:53:18 +00:00
										 |  |  | 				*mouse_pick = (void *)tvc->iter; | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 				break; | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			tvc->iter_index++; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-03-24 07:52:14 +00:00
										 |  |  | 		} while (tvc->step(tvc)); | 
					
						
							| 
									
										
										
										
											2010-11-11 05:45:55 +00:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	tvc->end(tvc); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	xy[1] += tvc->lheight * 2; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return xy[1] - y_orig; | 
					
						
							|  |  |  | } |