Make repaint by regions
This commit is contained in:
		
							parent
							
								
									ee0af91043
								
							
						
					
					
						commit
						552021d2be
					
				
							
								
								
									
										75
									
								
								src/shell.rs
									
									
									
									
									
								
							
							
						
						
									
										75
									
								
								src/shell.rs
									
									
									
									
									
								
							| @ -145,7 +145,6 @@ impl State { | |||||||
|             _ => self.drawing_area.queue_draw(), |             _ => self.drawing_area.queue_draw(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct UiState { | pub struct UiState { | ||||||
| @ -347,28 +346,16 @@ fn gtk_scroll_event(state: &mut State, ev: &EventScroll) -> Inhibit { | |||||||
| 
 | 
 | ||||||
|     match ev.as_ref().direction { |     match ev.as_ref().direction { | ||||||
|         ScrollDirection::Right => { |         ScrollDirection::Right => { | ||||||
|             mouse_input(state, |             mouse_input(state, "ScrollWheelRight", ev.get_state(), ev.get_position()) | ||||||
|                         "ScrollWheelRight", |  | ||||||
|                         ev.get_state(), |  | ||||||
|                         ev.get_position()) |  | ||||||
|         } |         } | ||||||
|         ScrollDirection::Left => { |         ScrollDirection::Left => { | ||||||
|             mouse_input(state, |             mouse_input(state, "ScrollWheelLeft", ev.get_state(), ev.get_position()) | ||||||
|                         "ScrollWheelLeft", |  | ||||||
|                         ev.get_state(), |  | ||||||
|                         ev.get_position()) |  | ||||||
|         } |         } | ||||||
|         ScrollDirection::Up => { |         ScrollDirection::Up => { | ||||||
|             mouse_input(state, |             mouse_input(state, "ScrollWheelUp", ev.get_state(), ev.get_position()) | ||||||
|                         "ScrollWheelUp", |  | ||||||
|                         ev.get_state(), |  | ||||||
|                         ev.get_position()) |  | ||||||
|         } |         } | ||||||
|         ScrollDirection::Down => { |         ScrollDirection::Down => { | ||||||
|             mouse_input(state, |             mouse_input(state, "ScrollWheelDown", ev.get_state(), ev.get_position()) | ||||||
|                         "ScrollWheelDown", |  | ||||||
|                         ev.get_state(), |  | ||||||
|                         ev.get_position()) |  | ||||||
|         } |         } | ||||||
|         _ => (), |         _ => (), | ||||||
|     } |     } | ||||||
| @ -383,18 +370,12 @@ fn gtk_button_press(shell: &mut State, ui_state: &mut UiState, ev: &EventButton) | |||||||
|     if shell.mouse_enabled { |     if shell.mouse_enabled { | ||||||
|         ui_state.mouse_pressed = true; |         ui_state.mouse_pressed = true; | ||||||
| 
 | 
 | ||||||
|         mouse_input(shell, |         mouse_input(shell, "LeftMouse", ev.get_state(), ev.get_position()); | ||||||
|                     "LeftMouse", |  | ||||||
|                     ev.get_state(), |  | ||||||
|                     ev.get_position()); |  | ||||||
|     } |     } | ||||||
|     Inhibit(false) |     Inhibit(false) | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn mouse_input(shell: &mut State, | fn mouse_input(shell: &mut State, input: &str, state: ModifierType, position: (f64, f64)) { | ||||||
|                input: &str, |  | ||||||
|                state: ModifierType, |  | ||||||
|                position: (f64, f64)) { |  | ||||||
|     if let Some(line_height) = shell.line_height { |     if let Some(line_height) = shell.line_height { | ||||||
|         if let Some(char_width) = shell.char_width { |         if let Some(char_width) = shell.char_width { | ||||||
| 
 | 
 | ||||||
| @ -416,10 +397,7 @@ fn gtk_button_release(ui_state: &mut UiState) -> Inhibit { | |||||||
| 
 | 
 | ||||||
| fn gtk_motion_notify(shell: &mut State, ui_state: &mut UiState, ev: &EventMotion) -> Inhibit { | fn gtk_motion_notify(shell: &mut State, ui_state: &mut UiState, ev: &EventMotion) -> Inhibit { | ||||||
|     if shell.mouse_enabled && ui_state.mouse_pressed { |     if shell.mouse_enabled && ui_state.mouse_pressed { | ||||||
|         mouse_input(shell, |         mouse_input(shell, "LeftDrag", ev.get_state(), ev.get_position()); | ||||||
|                     "LeftDrag", |  | ||||||
|                     ev.get_state(), |  | ||||||
|                     ev.get_position()); |  | ||||||
|     } |     } | ||||||
|     Inhibit(false) |     Inhibit(false) | ||||||
| } | } | ||||||
| @ -459,7 +437,11 @@ fn draw_joined_rect(state: &State, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[inline] | #[inline] | ||||||
| fn get_model_clip(state: &State, line_height: f64, char_width: f64, clip: (f64, f64, f64, f64)) -> ModelRect { | fn get_model_clip(state: &State, | ||||||
|  |                   line_height: f64, | ||||||
|  |                   char_width: f64, | ||||||
|  |                   clip: (f64, f64, f64, f64)) | ||||||
|  |                   -> ModelRect { | ||||||
|     let mut model_clip = |     let mut model_clip = | ||||||
|         ModelRect::from_area(line_height, char_width, clip.0, clip.1, clip.2, clip.3); |         ModelRect::from_area(line_height, char_width, clip.0, clip.1, clip.2, clip.3); | ||||||
|     // in some cases symbols from previous row affect next row
 |     // in some cases symbols from previous row affect next row
 | ||||||
| @ -472,7 +454,11 @@ fn get_model_clip(state: &State, line_height: f64, char_width: f64, clip: (f64, | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[inline] | #[inline] | ||||||
| fn draw_backgound(state: &State, ctx: &cairo::Context, line_height: f64, char_width: f64, model_clip: &ModelRect) { | fn draw_backgound(state: &State, | ||||||
|  |                   ctx: &cairo::Context, | ||||||
|  |                   line_height: f64, | ||||||
|  |                   char_width: f64, | ||||||
|  |                   model_clip: &ModelRect) { | ||||||
|     let line_x = model_clip.left as f64 * char_width; |     let line_x = model_clip.left as f64 * char_width; | ||||||
|     let mut line_y: f64 = model_clip.top as f64 * line_height; |     let mut line_y: f64 = model_clip.top as f64 * line_height; | ||||||
| 
 | 
 | ||||||
| @ -515,24 +501,30 @@ fn draw_backgound(state: &State, ctx: &cairo::Context, line_height: f64, char_wi | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| fn draw(state: &State, ctx: &cairo::Context) { | fn draw(state: &State, ctx: &cairo::Context) { | ||||||
|     ctx.set_source_rgb(state.bg_color.0, state.bg_color.1, state.bg_color.2); |     let layout = pc::create_layout(ctx); | ||||||
|     ctx.paint(); |     let mut desc = state.create_pango_font(); | ||||||
|  |     let mut buf = String::with_capacity(4); | ||||||
|  | 
 | ||||||
|  |     let (row, col) = state.model.get_cursor(); | ||||||
| 
 | 
 | ||||||
|     let line_height = state.line_height.unwrap(); |     let line_height = state.line_height.unwrap(); | ||||||
|     let char_width = state.char_width.unwrap(); |     let char_width = state.char_width.unwrap(); | ||||||
| 
 | 
 | ||||||
|     let model_clip = get_model_clip(state, line_height, char_width, ctx.clip_extents()); |     ctx.set_source_rgb(state.bg_color.0, state.bg_color.1, state.bg_color.2); | ||||||
|  |     ctx.paint(); | ||||||
|  | 
 | ||||||
|  |     let clip_rects = &ctx.copy_clip_rectangle_list().rectangles; | ||||||
|  |     for clip_idx in 0..clip_rects.len() { | ||||||
|  |         let clip = clip_rects.get(clip_idx).unwrap(); | ||||||
|  | 
 | ||||||
|  |         let model_clip = get_model_clip(state, | ||||||
|  |                                         line_height, | ||||||
|  |                                         char_width, | ||||||
|  |                                         (clip.x, clip.y, clip.x + clip.width, clip.y + clip.height)); | ||||||
| 
 | 
 | ||||||
|         let line_x = model_clip.left as f64 * char_width; |         let line_x = model_clip.left as f64 * char_width; | ||||||
|         let mut line_y: f64 = model_clip.top as f64 * line_height; |         let mut line_y: f64 = model_clip.top as f64 * line_height; | ||||||
| 
 | 
 | ||||||
|     let (row, col) = state.model.get_cursor(); |  | ||||||
|     let mut buf = String::with_capacity(4); |  | ||||||
| 
 |  | ||||||
| 
 |  | ||||||
|     let layout = pc::create_layout(ctx); |  | ||||||
|     let mut desc = state.create_pango_font(); |  | ||||||
| 
 |  | ||||||
|         draw_backgound(state, ctx, line_height, char_width, &model_clip); |         draw_backgound(state, ctx, line_height, char_width, &model_clip); | ||||||
| 
 | 
 | ||||||
|         for (line_idx, line) in state.model.clip_model(&model_clip) { |         for (line_idx, line) in state.model.clip_model(&model_clip) { | ||||||
| @ -619,6 +611,7 @@ fn draw(state: &State, ctx: &cairo::Context) { | |||||||
| 
 | 
 | ||||||
|             line_y += line_height; |             line_y += line_height; | ||||||
|         } |         } | ||||||
|  |     } | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[inline] | #[inline] | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user
	 daa
						daa