mirror of
				https://github.com/Swordfish90/cool-retro-term.git
				synced 2025-10-30 22:54:21 +00:00 
			
		
		
		
	Moved engine from yat to konsole and refactored the project. Not everything works yet.
This commit is contained in:
		
							
								
								
									
										5523
									
								
								konsole-qml-plugin/Makefile
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										5523
									
								
								konsole-qml-plugin/Makefile
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										15
									
								
								konsole-qml-plugin/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								konsole-qml-plugin/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | ||||
| this is a repository for shared C++ QML plugin, offering access to | ||||
| terminal sessions. | ||||
|  | ||||
| if you want to add something, please ask the maintainer of this library first to | ||||
| make sure it's a good fit | ||||
|  | ||||
| the current maintainer is: Dmitry Zagnoyko <hiroshidi@gmail.com> | ||||
|  | ||||
| current plugin consist: | ||||
| - KTerminal: offers access to terminal session from qml | ||||
| - KSessions: offers access to pty(s) from C++ layer | ||||
|  | ||||
| Branched from: | ||||
| https://code.launchpad.net/~ubuntu-terminal-dev/ubuntu-terminal-app/plugin | ||||
| At revision 14 | ||||
| @@ -0,0 +1,42 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Black on Light Yellow | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| color  1 255 255 221  1 0  # regular   background color (Light Yellow) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10   0   0   0  0 1  # intensive foreground color | ||||
| color 11 255 255 221  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,104 @@ | ||||
| [Background] | ||||
| Bold=false | ||||
| Color=247,247,214 | ||||
| Transparency=true | ||||
| MaxRandomHue=340 | ||||
|  | ||||
| [BackgroundIntense] | ||||
| Bold=false | ||||
| Color=255,255,221 | ||||
| Transparency=true | ||||
|  | ||||
| [Color0] | ||||
| Bold=false | ||||
| Color=0,0,0 | ||||
| Transparency=false | ||||
|  | ||||
| [Color0Intense] | ||||
| Bold=false | ||||
| Color=104,104,104 | ||||
| Transparency=false | ||||
|  | ||||
| [Color1] | ||||
| Bold=false | ||||
| Color=178,24,24 | ||||
| Transparency=false | ||||
|  | ||||
| [Color1Intense] | ||||
| Bold=false | ||||
| Color=255,84,84 | ||||
| Transparency=false | ||||
|  | ||||
| [Color2] | ||||
| Bold=false | ||||
| Color=24,178,24 | ||||
| Transparency=false | ||||
|  | ||||
| [Color2Intense] | ||||
| Bold=false | ||||
| Color=84,255,84 | ||||
| Transparency=false | ||||
|  | ||||
| [Color3] | ||||
| Bold=false | ||||
| Color=178,104,24 | ||||
| Transparency=false | ||||
|  | ||||
| [Color3Intense] | ||||
| Bold=false | ||||
| Color=255,255,84 | ||||
| Transparency=false | ||||
|  | ||||
| [Color4] | ||||
| Bold=false | ||||
| Color=24,24,178 | ||||
| Transparency=false | ||||
|  | ||||
| [Color4Intense] | ||||
| Bold=false | ||||
| Color=84,84,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Color5] | ||||
| Bold=false | ||||
| Color=178,24,178 | ||||
| Transparency=false | ||||
|  | ||||
| [Color5Intense] | ||||
| Bold=false | ||||
| Color=255,84,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Color6] | ||||
| Bold=false | ||||
| Color=24,178,178 | ||||
| Transparency=false | ||||
|  | ||||
| [Color6Intense] | ||||
| Bold=false | ||||
| Color=84,255,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Color7] | ||||
| Bold=false | ||||
| Color=178,178,178 | ||||
| Transparency=false | ||||
|  | ||||
| [Color7Intense] | ||||
| Bold=false | ||||
| Color=255,255,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Foreground] | ||||
| Bold=false | ||||
| Color=0,0,0 | ||||
| Transparency=false | ||||
|  | ||||
| [ForegroundIntense] | ||||
| Bold=true | ||||
| Color=0,0,0 | ||||
| Transparency=false | ||||
|  | ||||
| [General] | ||||
| Description=Black on Random Light | ||||
| Opacity=1 | ||||
							
								
								
									
										42
									
								
								konsole-qml-plugin/assets/color-schemes/BlackOnWhite.schema
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								konsole-qml-plugin/assets/color-schemes/BlackOnWhite.schema
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Black on White | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| color  1 255 255 255  1 0  # regular   background color (White) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10   0   0   0  0 1  # intensive foreground color | ||||
| color 11 255 255 255  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
							
								
								
									
										103
									
								
								konsole-qml-plugin/assets/color-schemes/DarkPastels.colorscheme
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										103
									
								
								konsole-qml-plugin/assets/color-schemes/DarkPastels.colorscheme
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,103 @@ | ||||
| [Background] | ||||
| Bold=false | ||||
| Color=44,44,44 | ||||
| Transparency=false | ||||
|  | ||||
| [BackgroundIntense] | ||||
| Bold=true | ||||
| Color=44,44,44 | ||||
| Transparency=false | ||||
|  | ||||
| [Color0] | ||||
| Bold=false | ||||
| Color=63,63,63 | ||||
| Transparency=false | ||||
|  | ||||
| [Color0Intense] | ||||
| Bold=true | ||||
| Color=112,144,128 | ||||
| Transparency=false | ||||
|  | ||||
| [Color1] | ||||
| Bold=false | ||||
| Color=112,80,80 | ||||
| Transparency=false | ||||
|  | ||||
| [Color1Intense] | ||||
| Bold=true | ||||
| Color=220,163,163 | ||||
| Transparency=false | ||||
|  | ||||
| [Color2] | ||||
| Bold=false | ||||
| Color=96,180,138 | ||||
| Transparency=false | ||||
|  | ||||
| [Color2Intense] | ||||
| Bold=true | ||||
| Color=114,213,163 | ||||
| Transparency=false | ||||
|  | ||||
| [Color3] | ||||
| Bold=false | ||||
| Color=223,175,143 | ||||
| Transparency=false | ||||
|  | ||||
| [Color3Intense] | ||||
| Bold=true | ||||
| Color=240,223,175 | ||||
| Transparency=false | ||||
|  | ||||
| [Color4] | ||||
| Bold=false | ||||
| Color=154,184,215 | ||||
| Transparency=false | ||||
|  | ||||
| [Color4Intense] | ||||
| Bold=true | ||||
| Color=148,191,243 | ||||
| Transparency=false | ||||
|  | ||||
| [Color5] | ||||
| Bold=false | ||||
| Color=220,140,195 | ||||
| Transparency=false | ||||
|  | ||||
| [Color5Intense] | ||||
| Bold=true | ||||
| Color=236,147,211 | ||||
| Transparency=false | ||||
|  | ||||
| [Color6] | ||||
| Bold=false | ||||
| Color=140,208,211 | ||||
| Transparency=false | ||||
|  | ||||
| [Color6Intense] | ||||
| Bold=true | ||||
| Color=147,224,227 | ||||
| Transparency=false | ||||
|  | ||||
| [Color7] | ||||
| Bold=false | ||||
| Color=220,220,204 | ||||
| Transparency=false | ||||
|  | ||||
| [Color7Intense] | ||||
| Bold=true | ||||
| Color=255,255,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Foreground] | ||||
| Bold=false | ||||
| Color=220,220,204 | ||||
| Transparency=false | ||||
|  | ||||
| [ForegroundIntense] | ||||
| Bold=true | ||||
| Color=220,220,204 | ||||
| Transparency=false | ||||
|  | ||||
| [General] | ||||
| Description=Dark Pastels | ||||
| Opacity=1 | ||||
							
								
								
									
										104
									
								
								konsole-qml-plugin/assets/color-schemes/GreenOnBlack.colorscheme
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								konsole-qml-plugin/assets/color-schemes/GreenOnBlack.colorscheme
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,104 @@ | ||||
|  | ||||
| [Background] | ||||
| Bold=false | ||||
| Color=0,0,0 | ||||
| Transparency=false | ||||
|  | ||||
| [BackgroundIntense] | ||||
| Bold=false | ||||
| Color=0,0,0 | ||||
| Transparency=false | ||||
|  | ||||
| [Color0] | ||||
| Bold=false | ||||
| Color=0,0,0 | ||||
| Transparency=false | ||||
|  | ||||
| [Color0Intense] | ||||
| Bold=false | ||||
| Color=104,104,104 | ||||
| Transparency=false | ||||
|  | ||||
| [Color1] | ||||
| Bold=false | ||||
| Color=250,75,75 | ||||
| Transparency=false | ||||
|  | ||||
| [Color1Intense] | ||||
| Bold=false | ||||
| Color=255,84,84 | ||||
| Transparency=false | ||||
|  | ||||
| [Color2] | ||||
| Bold=false | ||||
| Color=24,178,24 | ||||
| Transparency=false | ||||
|  | ||||
| [Color2Intense] | ||||
| Bold=false | ||||
| Color=84,255,84 | ||||
| Transparency=false | ||||
|  | ||||
| [Color3] | ||||
| Bold=false | ||||
| Color=178,104,24 | ||||
| Transparency=false | ||||
|  | ||||
| [Color3Intense] | ||||
| Bold=false | ||||
| Color=255,255,84 | ||||
| Transparency=false | ||||
|  | ||||
| [Color4] | ||||
| Bold=false | ||||
| Color=92,167,251 | ||||
| Transparency=false | ||||
|  | ||||
| [Color4Intense] | ||||
| Bold=false | ||||
| Color=84,84,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Color5] | ||||
| Bold=false | ||||
| Color=225,30,225 | ||||
| Transparency=false | ||||
|  | ||||
| [Color5Intense] | ||||
| Bold=false | ||||
| Color=255,84,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Color6] | ||||
| Bold=false | ||||
| Color=24,178,178 | ||||
| Transparency=false | ||||
|  | ||||
| [Color6Intense] | ||||
| Bold=false | ||||
| Color=84,255,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Color7] | ||||
| Bold=false | ||||
| Color=178,178,178 | ||||
| Transparency=false | ||||
|  | ||||
| [Color7Intense] | ||||
| Bold=false | ||||
| Color=255,255,255 | ||||
| Transparency=false | ||||
|  | ||||
| [Foreground] | ||||
| Bold=false | ||||
| Color=24,240,24 | ||||
| Transparency=false | ||||
|  | ||||
| [ForegroundIntense] | ||||
| Bold=true | ||||
| Color=24,240,24 | ||||
| Transparency=false | ||||
|  | ||||
| [General] | ||||
| Description=Green on Black | ||||
| Opacity=1 | ||||
							
								
								
									
										100
									
								
								konsole-qml-plugin/assets/color-schemes/Linux.colorscheme
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								konsole-qml-plugin/assets/color-schemes/Linux.colorscheme
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,100 @@ | ||||
| [Background] | ||||
| Bold=false | ||||
| Color=0,0,0 | ||||
|  | ||||
| [BackgroundIntense] | ||||
| Bold=false | ||||
| Color=104,104,104 | ||||
|  | ||||
| [Color0] | ||||
| Bold=false | ||||
| Color=0,0,0 | ||||
|  | ||||
|  | ||||
| [Color0Intense] | ||||
| Bold=false | ||||
| Color=104,104,104 | ||||
|  | ||||
|  | ||||
| [Color1] | ||||
| Bold=false | ||||
| Color=178,24,24 | ||||
|  | ||||
|  | ||||
| [Color1Intense] | ||||
| Bold=false | ||||
| Color=255,84,84 | ||||
|  | ||||
|  | ||||
| [Color2] | ||||
| Bold=false | ||||
| Color=24,178,24 | ||||
|  | ||||
|  | ||||
| [Color2Intense] | ||||
| Bold=false | ||||
| Color=84,255,84 | ||||
|  | ||||
|  | ||||
| [Color3] | ||||
| Bold=false | ||||
| Color=178,104,24 | ||||
|  | ||||
|  | ||||
| [Color3Intense] | ||||
| Bold=false | ||||
| Color=255,255,84 | ||||
|  | ||||
|  | ||||
| [Color4] | ||||
| Bold=false | ||||
| Color=24,24,178 | ||||
|  | ||||
|  | ||||
| [Color4Intense] | ||||
| Bold=false | ||||
| Color=84,84,255 | ||||
|  | ||||
|  | ||||
| [Color5] | ||||
| Bold=false | ||||
| Color=178,24,178 | ||||
|  | ||||
|  | ||||
| [Color5Intense] | ||||
| Bold=false | ||||
| Color=255,84,255 | ||||
|  | ||||
|  | ||||
| [Color6] | ||||
| Bold=false | ||||
| Color=24,178,178 | ||||
|  | ||||
|  | ||||
| [Color6Intense] | ||||
| Bold=false | ||||
| Color=84,255,255 | ||||
|  | ||||
|  | ||||
| [Color7] | ||||
| Bold=false | ||||
| Color=178,178,178 | ||||
|  | ||||
|  | ||||
| [Color7Intense] | ||||
| Bold=false | ||||
| Color=255,255,255 | ||||
|  | ||||
|  | ||||
| [Foreground] | ||||
| Bold=false | ||||
| Color=178,178,178 | ||||
|  | ||||
|  | ||||
| [ForegroundIntense] | ||||
| Bold=false | ||||
| Color=255,255,255 | ||||
|  | ||||
|  | ||||
| [General] | ||||
| Description=Linux Colors | ||||
							
								
								
									
										42
									
								
								konsole-qml-plugin/assets/color-schemes/WhiteOnBlack.schema
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										42
									
								
								konsole-qml-plugin/assets/color-schemes/WhiteOnBlack.schema
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,42 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title White on Black | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 255 255 255  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 1  # intensive foreground color | ||||
| color 11   0   0   0  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,42 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Black on Light Color | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| rcolor 1  30 255      1 0  # regular   background color (Light Color) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10   0   0   0  0 1  # intensive foreground color | ||||
| color 11 255 255 221  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,44 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Marble | ||||
|  | ||||
| image tile Blkmarble.jpg | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 255 255 255  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 1  # intensive foreground color | ||||
| color 11   0   0   0  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,47 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Ugly 1 | ||||
|  | ||||
| # add a wallpaper, if you like. Second word one of { tile,center,full } | ||||
|  | ||||
| image tile /opt/kde/share/wallpapers/dancy_pants.jpg | ||||
|                                                      | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| color  1 255 255 255  1 0  # regular   background color (White) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 255   0   0  0 0  # regular   color 1 Red | ||||
| color  4   0 255   0  0 0  # regular   color 2 Green | ||||
| color  5 255 255   0  0 0  # regular   color 3 Yellow | ||||
| color  6   0   0 255  0 0  # regular   color 4 Blue | ||||
| color  7 255   0 255  0 0  # regular   color 5 Magenta | ||||
| color  8   0 255 255  0 0  # regular   color 6 Cyan | ||||
| color  9 255 255 255  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10   0   0   0  0 1  # intensive foreground color | ||||
| color 11 255 255 255  1 1  # intensive background color | ||||
|  | ||||
| color 12   0   0   0  0 1  # intensive color 0 | ||||
| color 13 255   0   0  0 1  # intensive color 1 | ||||
| color 14   0 255   0  0 1  # intensive color 2 | ||||
| color 15 255 255   0  0 1  # intensive color 3 | ||||
| color 16   0   0 255  0 1  # intensive color 4 | ||||
| color 17 255   0 255  0 1  # intensive color 5 | ||||
| color 18   0 255 255  0 1  # intensive color 6 | ||||
| color 19 255 255 255  0 1  # intensive color 7 | ||||
| @@ -0,0 +1,42 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Green on Black | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0  24 240  24  0 0  # regular   foreground color (Green) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10  24 240  24  0 1  # intensive foreground color | ||||
| color 11   0   0   0  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,49 @@ | ||||
| # linux color schema for konsole | ||||
|  | ||||
| title Green Tint | ||||
|  | ||||
| transparency 0.3 0 150 0 | ||||
|  | ||||
| # FIXME | ||||
| # | ||||
| # The flaw in this schema is that "blick" comes out on the | ||||
| # Linux console as intensive background, really. | ||||
| # Since this is not used in clients you'll hardly notice | ||||
| # it in practice. | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 178 178 178  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 0  # intensive foreground color | ||||
| color 11 104 104 104  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,49 @@ | ||||
| # linux color schema for konsole | ||||
|  | ||||
| title Green Tint with Transparent MC | ||||
|  | ||||
| transparency 0.3 0 150 0 | ||||
|  | ||||
| # FIXME | ||||
| # | ||||
| # The flaw in this schema is that "blick" comes out on the | ||||
| # Linux console as intensive background, really. | ||||
| # Since this is not used in clients you'll hardly notice | ||||
| # it in practice. | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 178 178 178  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6   0   0   0  1 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 0  # intensive foreground color | ||||
| color 11 104 104 104  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,44 @@ | ||||
| # example scheme for konsole | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Paper | ||||
|  | ||||
| image tile Paper01.jpg | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| color  1 255 255 255  1 0  # regular   background color (White) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10   0   0   0  0 1  # intensive foreground color | ||||
| color 11 255 255 255  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,47 @@ | ||||
| # linux color schema for konsole | ||||
|  | ||||
| title Linux Colors | ||||
|  | ||||
| # FIXME | ||||
| # | ||||
| # The flaw in this schema is that "blick" comes out on the | ||||
| # Linux console as intensive background, really. | ||||
| # Since this is not used in clients you'll hardly notice | ||||
| # it in practice. | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 178 178 178  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 0  # intensive foreground color | ||||
| color 11 104 104 104  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
							
								
								
									
										132
									
								
								konsole-qml-plugin/assets/color-schemes/historic/README.Schema
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								konsole-qml-plugin/assets/color-schemes/historic/README.Schema
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| [README.Schema] | ||||
|  | ||||
| The schemata offered in the Options/Schema menu are | ||||
| taken from from configurations files with a *.schema | ||||
| pattern either located in $KDEDIR/share/apps/konsole | ||||
| or ~/.kde/share/apps/konsole. | ||||
|  | ||||
| Schemata allow to configure the color set that konsole | ||||
| uses, together with some more information on rendition | ||||
| processing. | ||||
|  | ||||
| Syntax | ||||
|  | ||||
|   File | ||||
|   :: { [Line] ['#' Comment] '\n' } | ||||
|  | ||||
|   Line | ||||
|   :: "title" Title | ||||
|   :: "image" Usage PathToPictureFile | ||||
|   :: "transparency" Fade Red Green Blue | ||||
|   :: "color" Slot Red Green Blue Transparent Bold | ||||
|   :: "rcolor" Slot Saturation Value Transparent Bold | ||||
|   :: "sysfg" Slot Transparent Bold | ||||
|   :: "sysbg" Slot Transparent Bold | ||||
|  | ||||
| Meaning | ||||
|  | ||||
|   - Title is the text to appear in the Option/Schema menu. | ||||
|     It should be unique among all other schemata therefore. | ||||
|  | ||||
|   - The "image" clause allows to place an image on the | ||||
|     konsole's background. | ||||
|  | ||||
|     - Usage can be either | ||||
|       - "tile"   - the image is tilewise replicated. | ||||
|       - "center" - the image is centered. | ||||
|       - "full"   - the image is stretched to fit the window size. | ||||
|        | ||||
|     - The Path of the picture can both be relative | ||||
|       (to kde wallpapers) or absolute. | ||||
|        | ||||
|     When a schema uses a background image (or transparency) | ||||
|     one has to make at least one color slot transparent to | ||||
|     achive any visible effect. Please read below about the | ||||
|     "Transparent" field in color,sysbg,sysfg. | ||||
|  | ||||
|   - The "transparency" clause picks and uses the background | ||||
|     of the desktop as if it where an image together with | ||||
|     a fade effect. This effect will fade the background | ||||
|     to the specified color. | ||||
|  | ||||
|     The "Fade" is a real value between 0 and 1, indicating | ||||
|     the strength of the fade. A value of 0 will not change | ||||
|     the image, a value of 1 will make it the fade color | ||||
|     everywhere, and in between. This will make the "glas" | ||||
|     of the window be of the color given in the clause and | ||||
|     being more(1) or less(0) intransparent. | ||||
|  | ||||
|   - The remaining clauses (color,sysbg,sysfg) are used | ||||
|     to setup konsoles rendition system. | ||||
|  | ||||
|     To this end, konsole offers 20 color slots. | ||||
|  | ||||
|      Slot  Meaning | ||||
|     -----  -------------------------- | ||||
|         0  regular   foreground color | ||||
|         1  regular   background color | ||||
|       2-9  regular   bgr color 0-7 | ||||
|        10  intensive foreground color | ||||
|        11  intensive background color | ||||
|     12-19  intensive bgr color 0-7 | ||||
|  | ||||
|     The traditional meaning of the "bgr" color codes | ||||
|     has a bitwise interpretation of an additive three | ||||
|     primary color scheme inherited from early EGA | ||||
|     color terminals. | ||||
|  | ||||
|     Color  Bits  Colors | ||||
|     -----  ----  ------- | ||||
|         0   000  Black | ||||
|         1   001  Red | ||||
|         2   010  Green | ||||
|         3   011  Yellow | ||||
|         4   100  Blue | ||||
|         5   101  Magenta | ||||
|         6   110  Cyan | ||||
|         7   111  White | ||||
|  | ||||
|     One may or may not stick to this tradition. | ||||
|     Konsole allows to assign colors freely to slots. | ||||
|  | ||||
|     The slots fall apart into two groups, regular | ||||
|     and intensive colors. The later are used when | ||||
|     BOLD rendition is used by the client. | ||||
|  | ||||
|     Each of the groups have a default fore- and | ||||
|     background color and the said bgr colors. | ||||
|     Normal terminal processing will simply use | ||||
|     the default colors. | ||||
|  | ||||
|     The color desired for a slot is indicated | ||||
|     in the Red Green Blue fields of the color | ||||
|     clause. Use the sysfg or the sysbg clause | ||||
|     to indicate the default fore and background | ||||
|     colors of the desktop. | ||||
|  | ||||
|     To specify randomized color for a slot use | ||||
|     the clause rcolor. The two parameters to it  | ||||
|     being Saturation - the amount of colour,  | ||||
|     and Value, the darkness of the colour. | ||||
|  | ||||
|     To use transparency/images and to simulate | ||||
|     the behavior of the xterm, one can supply | ||||
|     two additional tags to each slot: | ||||
|     - Transparent (0/1) meaning to show the | ||||
|       background picture, if any. | ||||
|     - Bold (0/1) to render characters bold. | ||||
|  | ||||
|  | ||||
| If you know about the escape codes, you might have | ||||
| noticed that intensive and bold rendition are sort | ||||
| of confused. This is inherited by the xterm which | ||||
| konsole is simulating. | ||||
|  | ||||
| One can use the colortest.sh script supplied | ||||
| with the konsole source distribution to test | ||||
| a schema. | ||||
|  | ||||
| The schema installed with konsole are more or | ||||
| less demonstrations and not really beauty, | ||||
| beside the Linux.schema, perhaps, which is | ||||
| made after the VGA colors. | ||||
| @@ -0,0 +1,44 @@ | ||||
| # default scheme for konsole (only here for documentation purposes) | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title Konsole Defaults | ||||
|  | ||||
| # image tile /opt/kde/share/wallpapers/gray2.jpg | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| color  1 255 255 255  1 0  # regular   background color (White) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10   0   0   0  0 1  # intensive foreground color | ||||
| color 11 255 255 255  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,49 @@ | ||||
| # linux color schema for konsole | ||||
|  | ||||
| title Transparent Konsole | ||||
|  | ||||
| transparency 0.35 0 0 0 | ||||
|  | ||||
| # FIXME | ||||
| # | ||||
| # The flaw in this schema is that "blick" comes out on the | ||||
| # Linux console as intensive background, really. | ||||
| # Since this is not used in clients you'll hardly notice | ||||
| # it in practice. | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 178 178 178  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 0  # intensive foreground color | ||||
| color 11 104 104 104  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,51 @@ | ||||
| # linux color schema for konsole | ||||
|  | ||||
| title Transparent for MC | ||||
|  | ||||
| transparency 0.35 0 0 0 | ||||
|  | ||||
| # FIXME | ||||
| # | ||||
| # The flaw in this schema is that "blick" comes out on the | ||||
| # Linux console as intensive background, really. | ||||
| # Since this is not used in clients you'll hardly notice | ||||
| # it in practice. | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 178 178 178  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| #color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  6  0  0 0  1 0  # regular   color 4 Blue | ||||
|  | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 0  # intensive foreground color | ||||
| color 11 104 104 104  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,42 @@ | ||||
| # linux color schema for konsole | ||||
|  | ||||
| title Transparent, Dark Background | ||||
|  | ||||
| transparency 0.75 0 0 0 | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0 255 255 255  0 0  # regular   foreground color (White) | ||||
| color  1   0   0   0  1 0  # regular   background color (Black) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 255 255 255  0 0  # intensive foreground color | ||||
| color 11 104 104 104  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,51 @@ | ||||
| # linux color schema for konsole | ||||
|  | ||||
| title Transparent, Light Background | ||||
|  | ||||
| transparency 0.1 0 0 0 | ||||
|  | ||||
| # This is a schema for very light backgrounds. It makes some | ||||
| # hacks about the colors to make Midnight Commander transparent | ||||
| # and with suitable colors.  | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0  50  50  50  0 0  # regular   foreground color (DarkGray) | ||||
| color  1  200 200 200  1 0  # regular   background color (White) | ||||
|  | ||||
| # color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  2  200 200 200  1 0  # regular   background color (White) | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| #color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  6  0  0 0  1 0  # regular   color 4 Blue | ||||
| # Blue is transparent, to make MC transparent | ||||
|  | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| # color  9 178 178 178  0 0  # regular   color 7 White | ||||
| color  9  50  50  50  0 0  # regular   foreground color (DarkGray) | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10 0   0   0  0 0  # intensive foreground color | ||||
| color 11 255  255  255  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
| @@ -0,0 +1,46 @@ | ||||
| # xterm color schema for konsole | ||||
|  | ||||
| # xterm colors can be configured (almost) like | ||||
| # konsole colors can. This is the uncustomized | ||||
| # xterm schema.  | ||||
| # Please refere to your local xterm setup files | ||||
| # if this schema differs. | ||||
|  | ||||
| title XTerm Colors | ||||
|  | ||||
| # foreground colors ------------------------------- | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| color  1 255 255 255  1 0  # regular   background color (White) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 205   0   0  0 0  # regular   color 1 Red | ||||
| color  4   0 205   0  0 0  # regular   color 2 Green | ||||
| color  5 205 205   0  0 0  # regular   color 3 Yellow | ||||
| color  6   0   0 205  0 0  # regular   color 4 Blue | ||||
| color  7 205   0 205  0 0  # regular   color 5 Magenta | ||||
| color  8   0 205 205  0 0  # regular   color 6 Cyan | ||||
| color  9 229 229 229  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors ------------------------------------------- | ||||
|  | ||||
| # for some strange reason, intensive colors are bold, also. | ||||
|  | ||||
| color 10  77  77  77  0 1  # intensive foreground color | ||||
| color 11 255 255 255  1 1  # intensive background color | ||||
|  | ||||
| color 12  77  77  77  0 1  # intensive color 0 | ||||
| color 13 255   0   0  0 1  # intensive color 1 | ||||
| color 14   0 255   0  0 1  # intensive color 2 | ||||
| color 15 255 255   0  0 1  # intensive color 3 | ||||
| color 16   0   0 255  0 1  # intensive color 4 | ||||
| color 17 255   0 255  0 1  # intensive color 5 | ||||
| color 18   0 255 255  0 1  # intensive color 6 | ||||
| color 19 255 255 255  0 1  # intensive color 7 | ||||
| @@ -0,0 +1,44 @@ | ||||
| # schema that uses system colors | ||||
|  | ||||
| # the title is to appear in the menu. | ||||
|  | ||||
| title System Colors | ||||
|  | ||||
| # image none | ||||
|  | ||||
| # foreground colors | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      |              | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| sysfg  0              0 0  # regular   foreground color (system) | ||||
| sysbg  1              1 0  # regular   background color (system) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 178  24  24  0 0  # regular   color 1 Red | ||||
| color  4  24 178  24  0 0  # regular   color 2 Green | ||||
| color  5 178 104  24  0 0  # regular   color 3 Yellow | ||||
| color  6  24  24 178  0 0  # regular   color 4 Blue | ||||
| color  7 178  24 178  0 0  # regular   color 5 Magenta | ||||
| color  8  24 178 178  0 0  # regular   color 6 Cyan | ||||
| color  9 178 178 178  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors | ||||
|  | ||||
| # instead of changing the colors, we've flaged the text to become bold | ||||
|  | ||||
| color 10   0   0   0  0 1  # intensive foreground color | ||||
| color 11 255 255 255  1 0  # intensive background color | ||||
|  | ||||
| color 12 104 104 104  0 0  # intensive color 0 | ||||
| color 13 255  84  84  0 0  # intensive color 1 | ||||
| color 14  84 255  84  0 0  # intensive color 2 | ||||
| color 15 255 255  84  0 0  # intensive color 3 | ||||
| color 16  84  84 255  0 0  # intensive color 4 | ||||
| color 17 255  84 255  0 0  # intensive color 5 | ||||
| color 18  84 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
							
								
								
									
										40
									
								
								konsole-qml-plugin/assets/color-schemes/historic/vim.schema
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								konsole-qml-plugin/assets/color-schemes/historic/vim.schema
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| # VIM-recommended color schema for konsole | ||||
|  | ||||
| # VIM (VI improved) in "help xiterm" recommends these colors for xterm. | ||||
|  | ||||
| title VIM Colors | ||||
|  | ||||
| # foreground colors ------------------------------- | ||||
|  | ||||
| # note that the default background color is flagged | ||||
| # to become transparent when an image is present. | ||||
|  | ||||
| #   slot    transparent bold | ||||
| #      | red grn blu  | | | ||||
| #      V V--color--V  V V | ||||
|  | ||||
| color  0   0   0   0  0 0  # regular   foreground color (Black) | ||||
| color  1 255 255 255  1 0  # regular   background color (White) | ||||
|  | ||||
| color  2   0   0   0  0 0  # regular   color 0 Black | ||||
| color  3 192   0   0  0 0  # regular   color 1 Red | ||||
| color  4   0 128   0  0 0  # regular   color 2 Green | ||||
| color  5 128 128   0  0 0  # regular   color 3 Yellow | ||||
| color  6   0   0 192  0 0  # regular   color 4 Blue | ||||
| color  7 192   0 192  0 0  # regular   color 5 Magenta | ||||
| color  8   0 128 128  0 0  # regular   color 6 Cyan | ||||
| color  9 192 192 192  0 0  # regular   color 7 White | ||||
|  | ||||
| # intensive colors ------------------------------------------- | ||||
|  | ||||
| color 10  77  77  77  0 1  # intensive foreground color | ||||
| color 11 255 255 255  1 1  # intensive background color | ||||
|  | ||||
| color 12 128 128 128  0 0  # intensive color 0 | ||||
| color 13 255  96  96  0 0  # intensive color 1 | ||||
| color 14   0 255   0  0 0  # intensive color 2 | ||||
| color 15 255 255   0  0 0  # intensive color 3 | ||||
| color 16 128 128 255  0 0  # intensive color 4 | ||||
| color 17 255  64 255  0 0  # intensive color 5 | ||||
| color 18   0 255 255  0 0  # intensive color 6 | ||||
| color 19 255 255 255  0 0  # intensive color 7 | ||||
							
								
								
									
										72
									
								
								konsole-qml-plugin/assets/kb-layouts/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										72
									
								
								konsole-qml-plugin/assets/kb-layouts/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,72 @@ | ||||
| [README.KeyTab] | ||||
|  | ||||
| The keytabs offered in the Options/Keyboard menu are | ||||
| taken from from configurations files with a *.keytab | ||||
| pattern either located in $KDEDIR/share/apps/konsole | ||||
| or ~/.kde/share/apps/konsole. | ||||
|  | ||||
| Keytabs allow to configure the behavior of konsole | ||||
| on keyboard events, especially for functions keys. | ||||
| Please have a look into the README.keyboard file, too. | ||||
|  | ||||
| The syntax is that each entry has the form :  | ||||
|  | ||||
|   "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) | ||||
|  | ||||
| Keynames are those defined in <qnamespace.h> with the | ||||
| "Qt::Key_" prefix removed. | ||||
|  | ||||
| Mode names are:  | ||||
|  | ||||
|   - Shift   : Shift Key pressed | ||||
|   - Alt     : Alt Key pressed | ||||
|   - Control : Control Key pressed | ||||
|  | ||||
|   ( The VT100 emulation has modes that can affect the | ||||
|     sequences emitted by certain keys. These modes are | ||||
|     under control of the client program. | ||||
|    | ||||
|     - Newline     : effects Return and Enter key. | ||||
|     - Application : effects Up and Down key. | ||||
|     - Ansi        : effects Up and Down key (This is for VT52, really). | ||||
|  | ||||
|     Since sending a state to a program that has set the state | ||||
|     itself is positivly wrong and obsolete design, better forget | ||||
|     about this nasty detail. I may well remove this "feature" | ||||
|     in a future clean up round. ) | ||||
|  | ||||
|   A "+" preceeding a Modename means the Key is pressed. | ||||
|   A "-" preceeding a Modename means the Key is not pressed. | ||||
|   If no mode is given it means don't care. | ||||
|  | ||||
|   Note that the combination of Key and Modes (set/reset) | ||||
|   has to be unique. This means, that | ||||
|  | ||||
|     key A + Shift : "A" | ||||
|     key A : "a" | ||||
|  | ||||
|   will not accept the small letter "a" rule as expected, | ||||
|   one has to add a "- Shift" to the last clause. Use | ||||
|   the stdout/stderr dianostics of konsole when modifying | ||||
|   keytabs to find problems like this. | ||||
|  | ||||
| Operations are | ||||
|  | ||||
|   - scrollUpLine   : scroll up   one line in the history log | ||||
|   - scrollUpPage   : scroll up   one page in the history log | ||||
|   - scrollDownLine : scroll down one line in the history log | ||||
|   - scrollDownPage : scroll down one page in the history log | ||||
|   - emitClipboard  : "paste" the current clipboard | ||||
|   - emitSelection  : "paste" the current selection | ||||
|  | ||||
| Strings have the syntax of C strings, | ||||
| one may use the following escapes: | ||||
|  | ||||
|   - \E - escape | ||||
|   - \\ - backslash | ||||
|   - \" - double quote | ||||
|   - \t - tab | ||||
|   - \r - return | ||||
|   - \n - newline | ||||
|   - \b - backspace | ||||
|   - \xHH - where HH are two hex digits | ||||
							
								
								
									
										169
									
								
								konsole-qml-plugin/assets/kb-layouts/default.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								konsole-qml-plugin/assets/kb-layouts/default.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| # [README.default.Keytab] Default Keyboard Table | ||||
| # | ||||
| # To customize your keyboard, copy this file to something | ||||
| # ending with .keytab and change it to meet you needs. | ||||
| # Please read the README.KeyTab and the README.keyboard | ||||
| # in this case. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| keyboard "Default (XFree 4)" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # Note that this particular table is a "risc" version made to | ||||
| # ease customization without bothering with obsolete details. | ||||
| # See VT100.keytab for the more hairy stuff. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| # common keys | ||||
|  | ||||
| key Escape             : "\E" | ||||
|  | ||||
| key Tab   -Shift       : "\t" | ||||
| key Tab   +Shift+Ansi  : "\E[Z" | ||||
| key Tab   +Shift-Ansi  : "\t" | ||||
| key Backtab     +Ansi  : "\E[Z" | ||||
| key Backtab     -Ansi  : "\t" | ||||
|  | ||||
| key Return-Shift-NewLine : "\r" | ||||
| key Return-Shift+NewLine : "\r\n" | ||||
|  | ||||
| key Return+Shift         : "\EOM" | ||||
|  | ||||
| # Backspace and Delete codes are preserving CTRL-H. | ||||
|  | ||||
| key Backspace      : "\x7f" | ||||
|  | ||||
| # Arrow keys in VT52 mode | ||||
| # shift up/down are reserved for scrolling. | ||||
| # shift left/right are reserved for switching between tabs (this is hardcoded). | ||||
|  | ||||
| key Up   -Shift-Ansi : "\EA" | ||||
| key Down -Shift-Ansi : "\EB" | ||||
| key Right-Shift-Ansi : "\EC" | ||||
| key Left -Shift-Ansi : "\ED" | ||||
|  | ||||
| # Arrow keys in ANSI mode with Application - and Normal Cursor Mode) | ||||
|  | ||||
| key Up    -Shift-AnyMod+Ansi+AppCuKeys : "\EOA" | ||||
| key Down  -Shift-AnyMod+Ansi+AppCuKeys : "\EOB" | ||||
| key Right -Shift-AnyMod+Ansi+AppCuKeys : "\EOC" | ||||
| key Left  -Shift-AnyMod+Ansi+AppCuKeys : "\EOD" | ||||
|  | ||||
| key Up    -Shift-AnyMod+Ansi-AppCuKeys : "\E[A" | ||||
| key Down  -Shift-AnyMod+Ansi-AppCuKeys : "\E[B" | ||||
| key Right -Shift-AnyMod+Ansi-AppCuKeys : "\E[C" | ||||
| key Left  -Shift-AnyMod+Ansi-AppCuKeys : "\E[D" | ||||
|  | ||||
| key Up    -Shift+AnyMod+Ansi           : "\E[1;*A" | ||||
| key Down  -Shift+AnyMod+Ansi           : "\E[1;*B" | ||||
| key Right -Shift+AnyMod+Ansi           : "\E[1;*C" | ||||
| key Left  -Shift+AnyMod+Ansi           : "\E[1;*D" | ||||
|  | ||||
| # Keypad keys with NumLock ON | ||||
| # (see "Numeric Keypad" section at http://www.nw.com/nw/WWW/products/wizcon/vt100.html ) | ||||
| # | ||||
| # Not enabled for now because it breaks the keypad in Vim. | ||||
| # | ||||
| #key 0 +KeyPad+AppKeyPad : "\EOp" | ||||
| #key 1 +KeyPad+AppKeyPad : "\EOq" | ||||
| #key 2 +KeyPad+AppKeyPad : "\EOr" | ||||
| #key 3 +KeyPad+AppKeyPad : "\EOs" | ||||
| #key 4 +KeyPad+AppKeyPad : "\EOt" | ||||
| #key 5 +KeyPad+AppKeyPad : "\EOu" | ||||
| #key 6 +KeyPad+AppKeyPad : "\EOv" | ||||
| #key 7 +KeyPad+AppKeyPad : "\EOw" | ||||
| #key 8 +KeyPad+AppKeyPad : "\EOx" | ||||
| #key 9 +KeyPad+AppKeyPad : "\EOy" | ||||
| #key + +KeyPad+AppKeyPad : "\EOl" | ||||
| #key - +KeyPad+AppKeyPad : "\EOm" | ||||
| #key . +KeyPad+AppKeyPad : "\EOn" | ||||
| #key * +KeyPad+AppKeyPad : "\EOM" | ||||
| #key Enter +KeyPad+AppKeyPad : "\r" | ||||
|  | ||||
| # Keypad keys with NumLock Off | ||||
| key Up    -Shift+Ansi+AppCuKeys+KeyPad : "\EOA" | ||||
| key Down  -Shift+Ansi+AppCuKeys+KeyPad : "\EOB" | ||||
| key Right -Shift+Ansi+AppCuKeys+KeyPad : "\EOC" | ||||
| key Left  -Shift+Ansi+AppCuKeys+KeyPad : "\EOD" | ||||
|  | ||||
| key Up    -Shift+Ansi-AppCuKeys+KeyPad : "\E[A" | ||||
| key Down  -Shift+Ansi-AppCuKeys+KeyPad : "\E[B" | ||||
| key Right -Shift+Ansi-AppCuKeys+KeyPad : "\E[C" | ||||
| key Left  -Shift+Ansi-AppCuKeys+KeyPad : "\E[D" | ||||
|  | ||||
| key Home        +AppCuKeys+KeyPad : "\EOH" | ||||
| key End         +AppCuKeys+KeyPad : "\EOF" | ||||
| key Home        -AppCuKeys+KeyPad : "\E[H" | ||||
| key End         -AppCuKeys+KeyPad : "\E[F" | ||||
|  | ||||
| key Insert      +KeyPad  : "\E[2~" | ||||
| key Delete      +KeyPad  : "\E[3~" | ||||
| key Prior -Shift+KeyPad  : "\E[5~" | ||||
| key Next  -Shift+KeyPad  : "\E[6~" | ||||
|  | ||||
| # other grey PC keys | ||||
|  | ||||
| key Enter+NewLine : "\r\n" | ||||
| key Enter-NewLine : "\r" | ||||
|  | ||||
| key Home        -AnyMod-AppCuKeys : "\E[H"   | ||||
| key End         -AnyMod-AppCuKeys : "\E[F"   | ||||
| key Home        -AnyMod+AppCuKeys : "\EOH"   | ||||
| key End         -AnyMod+AppCuKeys : "\EOF"   | ||||
| key Home        +AnyMod           : "\E[1;*H" | ||||
| key End         +AnyMod           : "\E[1;*F" | ||||
|  | ||||
| key Insert      -AnyMod  : "\E[2~" | ||||
| key Delete      -AnyMod  : "\E[3~" | ||||
| key Insert      +AnyMod  : "\E[2;*~" | ||||
| key Delete      +AnyMod  : "\E[3;*~" | ||||
|  | ||||
| key Prior -Shift-AnyMod  : "\E[5~" | ||||
| key Next  -Shift-AnyMod  : "\E[6~" | ||||
| key Prior -Shift+AnyMod  : "\E[5;*~" | ||||
| key Next  -Shift+AnyMod  : "\E[6;*~" | ||||
|  | ||||
| # Function keys | ||||
| key F1  -AnyMod  : "\EOP" | ||||
| key F2  -AnyMod  : "\EOQ" | ||||
| key F3  -AnyMod  : "\EOR" | ||||
| key F4  -AnyMod  : "\EOS" | ||||
| key F5  -AnyMod  : "\E[15~" | ||||
| key F6  -AnyMod  : "\E[17~" | ||||
| key F7  -AnyMod  : "\E[18~" | ||||
| key F8  -AnyMod  : "\E[19~" | ||||
| key F9  -AnyMod  : "\E[20~" | ||||
| key F10 -AnyMod  : "\E[21~" | ||||
| key F11 -AnyMod  : "\E[23~" | ||||
| key F12 -AnyMod  : "\E[24~" | ||||
|  | ||||
| key F1  +AnyMod  : "\EO*P" | ||||
| key F2  +AnyMod  : "\EO*Q" | ||||
| key F3  +AnyMod  : "\EO*R" | ||||
| key F4  +AnyMod  : "\EO*S" | ||||
| key F5  +AnyMod  : "\E[15;*~" | ||||
| key F6  +AnyMod  : "\E[17;*~" | ||||
| key F7  +AnyMod  : "\E[18;*~" | ||||
| key F8  +AnyMod  : "\E[19;*~" | ||||
| key F9  +AnyMod  : "\E[20;*~" | ||||
| key F10 +AnyMod  : "\E[21;*~" | ||||
| key F11 +AnyMod  : "\E[23;*~" | ||||
| key F12 +AnyMod  : "\E[24;*~" | ||||
|  | ||||
| # Work around dead keys | ||||
|  | ||||
| key Space +Control : "\x00" | ||||
|  | ||||
| # Some keys are used by konsole to cause operations. | ||||
| # The scroll* operations refer to the history buffer. | ||||
|  | ||||
| key Up    +Shift-AppScreen  : scrollLineUp | ||||
| key Prior +Shift-AppScreen  : scrollPageUp | ||||
| key Down  +Shift-AppScreen  : scrollLineDown | ||||
| key Next  +Shift-AppScreen  : scrollPageDown | ||||
|  | ||||
| key ScrollLock     : scrollLock | ||||
|  | ||||
							
								
								
									
										133
									
								
								konsole-qml-plugin/assets/kb-layouts/historic/vt100.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										133
									
								
								konsole-qml-plugin/assets/kb-layouts/historic/vt100.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,133 @@ | ||||
| # [vt100.keytab] Konsole Keyboard Table (VT100 keys) | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| keyboard "vt100 (historical)" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # This configuration table allows to customize the | ||||
| # meaning of the keys. | ||||
| # | ||||
| # The syntax is that each entry has the form :  | ||||
| # | ||||
| #   "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) | ||||
| # | ||||
| # Keynames are those defined in <qnamespace.h> with the | ||||
| # "Qt::Key_" removed. (We'd better insert the list here) | ||||
| # | ||||
| # Mode names are :  | ||||
| # | ||||
| # - Shift | ||||
| # - Alt | ||||
| # - Control | ||||
| # | ||||
| #   The VT100 emulation has two modes that can affect the | ||||
| #   sequences emitted by certain keys. These modes are | ||||
| #   under control of the client program. | ||||
| #    | ||||
| # - Newline     : effects Return and Enter key. | ||||
| # - Application : effects Up and Down key. | ||||
| # | ||||
| # - Ansi        : effects Up and Down key (This is for VT52, really). | ||||
| # | ||||
| # Operations are | ||||
| # | ||||
| # - scrollUpLine | ||||
| # - scrollUpPage | ||||
| # - scrollDownLine | ||||
| # - scrollDownPage | ||||
| # | ||||
| # - emitSelection | ||||
| # | ||||
| # If the key is not found here, the text of the | ||||
| # key event as provided by QT is emitted, possibly | ||||
| # preceeded by ESC if the Alt key is pressed. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| key Escape : "\E" | ||||
| key Tab    : "\t" | ||||
|  | ||||
| # VT100 can add an extra \n after return. | ||||
| # The NewLine mode is set by an escape sequence. | ||||
|  | ||||
| key Return-NewLine : "\r"   | ||||
| key Return+NewLine : "\r\n" | ||||
|  | ||||
| # Some desperately try to save the ^H. | ||||
|  | ||||
| key Backspace : "\x7f" | ||||
| key Delete    : "\E[3~" | ||||
|  | ||||
| # These codes are for the VT52 mode of VT100 | ||||
| # The Ansi mode (i.e. VT100 mode) is set by | ||||
| # an escape sequence | ||||
|  | ||||
| key Up   -Shift-Ansi : "\EA" | ||||
| key Down -Shift-Ansi : "\EB" | ||||
| key Right-Shift-Ansi : "\EC" | ||||
| key Left -Shift-Ansi : "\ED" | ||||
|  | ||||
| # VT100 emits a mode bit together | ||||
| # with the arrow keys.The AppCuKeys | ||||
| # mode is set by an escape sequence. | ||||
|  | ||||
| key Up   -Shift+Ansi+AppCuKeys : "\EOA" | ||||
| key Down -Shift+Ansi+AppCuKeys : "\EOB" | ||||
| key Right-Shift+Ansi+AppCuKeys : "\EOC" | ||||
| key Left -Shift+Ansi+AppCuKeys : "\EOD" | ||||
|  | ||||
| key Up   -Shift+Ansi-AppCuKeys : "\E[A" | ||||
| key Down -Shift+Ansi-AppCuKeys : "\E[B" | ||||
| key Right-Shift+Ansi-AppCuKeys : "\E[C" | ||||
| key Left -Shift+Ansi-AppCuKeys : "\E[D" | ||||
|  | ||||
| # function keys (FIXME: make pf1-pf4) | ||||
|  | ||||
| key F1     : "\E[11~" | ||||
| key F2     : "\E[12~" | ||||
| key F3     : "\E[13~" | ||||
| key F4     : "\E[14~" | ||||
| key F5     : "\E[15~" | ||||
|  | ||||
| key F6     : "\E[17~"  | ||||
| key F7     : "\E[18~"  | ||||
| key F8     : "\E[19~"  | ||||
| key F9     : "\E[20~"  | ||||
| key F10    : "\E[21~"  | ||||
| key F11    : "\E[23~"  | ||||
| key F12    : "\E[24~"  | ||||
|  | ||||
| key Home   : "\E[H"   | ||||
| key End    : "\E[F"   | ||||
|  | ||||
| key Prior -Shift : "\E[5~"   | ||||
| key Next  -Shift : "\E[6~"   | ||||
| key Insert-Shift : "\E[2~"   | ||||
|  | ||||
| # Keypad-Enter. See comment on Return above. | ||||
|  | ||||
| key Enter+NewLine : "\r\n" | ||||
| key Enter-NewLine : "\r"   | ||||
|  | ||||
| key Space +Control : "\x00" | ||||
|  | ||||
| # some of keys are used by konsole. | ||||
|  | ||||
| key Up    +Shift   : scrollLineUp | ||||
| key Prior +Shift   : scrollPageUp | ||||
| key Down  +Shift   : scrollLineDown | ||||
| key Next  +Shift   : scrollPageDown | ||||
|  | ||||
| key ScrollLock     : scrollLock | ||||
|  | ||||
|  | ||||
| #---------------------------------------------------------- | ||||
|  | ||||
| # keypad characters as offered by Qt | ||||
| # cannot be recognized as such. | ||||
|  | ||||
| #---------------------------------------------------------- | ||||
|  | ||||
| # Following other strings as emitted by konsole. | ||||
							
								
								
									
										71
									
								
								konsole-qml-plugin/assets/kb-layouts/historic/x11r5.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										71
									
								
								konsole-qml-plugin/assets/kb-layouts/historic/x11r5.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,71 @@ | ||||
| # [x11r5.Keytab] Keyboard Table for X11 R5 | ||||
|  | ||||
| keyboard "XTerm (XFree 3.x.x)" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # Note that this particular table is a "risc" version made to | ||||
| # ease customization without bothering with obsolete details. | ||||
| # See VT100.keytab for the more hairy stuff. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| # common keys | ||||
|  | ||||
| key Escape         : "\E" | ||||
| key Tab            : "\t" | ||||
|  | ||||
| key Return         : "\r" | ||||
|  | ||||
| # Backspace and Delete codes are preserving CTRL-H. | ||||
|  | ||||
| key Backspace      : "\x7f" | ||||
|  | ||||
| # cursor keys | ||||
|  | ||||
| key Up    -Shift   : "\EOA" | ||||
| key Down  -Shift   : "\EOB" | ||||
| key Right -Shift   : "\EOC" | ||||
| key Left  -Shift   : "\EOD" | ||||
|  | ||||
| # other grey PC keys | ||||
|  | ||||
| key Enter          : "\r" | ||||
|  | ||||
| key Home           : "\E[1~" | ||||
| key Insert-Shift   : "\E[2~" | ||||
| key Delete         : "\E[3~" | ||||
| key End            : "\E[4~" | ||||
| key Prior -Shift   : "\E[5~" | ||||
| key Next  -Shift   : "\E[6~" | ||||
|  | ||||
| # function keys | ||||
|  | ||||
| key F1             : "\E[11~" | ||||
| key F2             : "\E[12~" | ||||
| key F3             : "\E[13~" | ||||
| key F4             : "\E[14~" | ||||
| key F5             : "\E[15~" | ||||
| key F6             : "\E[17~" | ||||
| key F7             : "\E[18~" | ||||
| key F8             : "\E[19~" | ||||
| key F9             : "\E[20~" | ||||
| key F10            : "\E[21~" | ||||
| key F11            : "\E[23~" | ||||
| key F12            : "\E[24~" | ||||
|  | ||||
| # Work around dead keys | ||||
|  | ||||
| key Space +Control : "\x00" | ||||
|  | ||||
| # Some keys are used by konsole to cause operations. | ||||
| # The scroll* operations refer to the history buffer. | ||||
|  | ||||
| key Up    +Shift   : scrollLineUp | ||||
| key Prior +Shift   : scrollPageUp | ||||
| key Down  +Shift   : scrollLineDown | ||||
| key Next  +Shift   : scrollPageDown | ||||
|  | ||||
| key ScrollLock     : scrollLock | ||||
|  | ||||
| # keypad characters are not offered differently by Qt. | ||||
							
								
								
									
										164
									
								
								konsole-qml-plugin/assets/kb-layouts/linux.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										164
									
								
								konsole-qml-plugin/assets/kb-layouts/linux.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,164 @@ | ||||
| # [linux.keytab] Konsole Keyboard Table (Linux console keys) | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| # NOT TESTED, MAY NEED SOME CLEANUPS | ||||
| keyboard "Linux console" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # This configuration table allows to customize the | ||||
| # meaning of the keys. | ||||
| # | ||||
| # The syntax is that each entry has the form :  | ||||
| # | ||||
| #   "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) | ||||
| # | ||||
| # Keynames are those defined in <qnamespace.h> with the | ||||
| # "Qt::Key_" removed. (We'd better insert the list here) | ||||
| # | ||||
| # Mode names are :  | ||||
| # | ||||
| # - Shift | ||||
| # - Alt | ||||
| # - Control | ||||
| # | ||||
| #   The VT100 emulation has two modes that can affect the | ||||
| #   sequences emitted by certain keys. These modes are | ||||
| #   under control of the client program. | ||||
| #    | ||||
| # - Newline     : effects Return and Enter key. | ||||
| # - Application : effects Up and Down key. | ||||
| # | ||||
| # - Ansi        : effects Up and Down key (This is for VT52, really). | ||||
| # | ||||
| # Operations are | ||||
| # | ||||
| # - scrollUpLine | ||||
| # - scrollUpPage | ||||
| # - scrollDownLine | ||||
| # - scrollDownPage | ||||
| # | ||||
| # - emitSelection | ||||
| # | ||||
| # If the key is not found here, the text of the | ||||
| # key event as provided by QT is emitted, possibly | ||||
| # preceeded by ESC if the Alt key is pressed. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| key Escape : "\E" | ||||
| key Tab    : "\t" | ||||
|  | ||||
| # VT100 can add an extra \n after return. | ||||
| # The NewLine mode is set by an escape sequence. | ||||
|  | ||||
| key Return-NewLine : "\r"   | ||||
| key Return+NewLine : "\r\n" | ||||
|  | ||||
| # Some desperately try to save the ^H. | ||||
|  | ||||
| key Backspace : "\x7f" | ||||
| key Delete    : "\E[3~" | ||||
|  | ||||
| # These codes are for the VT52 mode of VT100 | ||||
| # The Ansi mode (i.e. VT100 mode) is set by | ||||
| # an escape sequence | ||||
|  | ||||
| key Up   -Shift-Ansi : "\EA" | ||||
| key Down -Shift-Ansi : "\EB" | ||||
| key Right-Shift-Ansi : "\EC" | ||||
| key Left -Shift-Ansi : "\ED" | ||||
|  | ||||
| # VT100 emits a mode bit together | ||||
| # with the arrow keys.The AppCuKeys | ||||
| # mode is set by an escape sequence. | ||||
|  | ||||
| key Up   -Shift+Ansi+AppCuKeys : "\EOA" | ||||
| key Down -Shift+Ansi+AppCuKeys : "\EOB" | ||||
| key Right-Shift+Ansi+AppCuKeys : "\EOC" | ||||
| key Left -Shift+Ansi+AppCuKeys : "\EOD" | ||||
|  | ||||
| key Up   -Shift+Ansi-AppCuKeys : "\E[A" | ||||
| key Down -Shift+Ansi-AppCuKeys : "\E[B" | ||||
| key Right-Shift+Ansi-AppCuKeys : "\E[C" | ||||
| key Left -Shift+Ansi-AppCuKeys : "\E[D" | ||||
|  | ||||
| # linux functions keys F1-F5 differ from xterm | ||||
|  | ||||
| key F1 : "\E[[A"  | ||||
| key F2 : "\E[[B"  | ||||
| key F3 : "\E[[C"  | ||||
| key F4 : "\E[[D"  | ||||
| key F5 : "\E[[E"  | ||||
|  | ||||
| key F6     : "\E[17~"  | ||||
| key F7     : "\E[18~"  | ||||
| key F8     : "\E[19~"  | ||||
| key F9     : "\E[20~"  | ||||
| key F10    : "\E[21~"  | ||||
| key F11    : "\E[23~"  | ||||
| key F12    : "\E[24~"  | ||||
|  | ||||
| key Home   : "\E[1~"   | ||||
| key End    : "\E[4~"   | ||||
|  | ||||
| key Prior -Shift : "\E[5~"   | ||||
| key Next  -Shift : "\E[6~"   | ||||
| key Insert-Shift : "\E[2~"   | ||||
|  | ||||
| # Keypad-Enter. See comment on Return above. | ||||
|  | ||||
| key Enter+NewLine : "\r\n" | ||||
| key Enter-NewLine : "\r"   | ||||
|  | ||||
| key Space +Control : "\x00" | ||||
|  | ||||
| # linux term ctrl seq | ||||
|  | ||||
| key A     +Control : "\x01" | ||||
| key B     +Control : "\x02" | ||||
| key C     +Control : "\x03" | ||||
| key D     +Control : "\x04" | ||||
| key E     +Control : "\x05" | ||||
| key F     +Control : "\x06" | ||||
| key G     +Control : "\x07" | ||||
| key H     +Control : "\x08" | ||||
| key I     +Control : "\x09" | ||||
| key J     +Control : "\x0a" | ||||
| key K     +Control : "\x0b" | ||||
| key L     +Control : "\x0c" | ||||
| key M     +Control : "\x0d" | ||||
| key N     +Control : "\x0e" | ||||
| key O     +Control : "\x0f" | ||||
| key P     +Control : "\x10" | ||||
| key Q     +Control : "\x11" | ||||
| key R     +Control : "\x12" | ||||
| key S     +Control : "\x13" | ||||
| key T     +Control : "\x14" | ||||
| key U     +Control : "\x15" | ||||
| key V     +Control : "\x16" | ||||
| key W     +Control : "\x17" | ||||
| key X     +Control : "\x18" | ||||
| key Y     +Control : "\x19" | ||||
| key Z     +Control : "\x1a" | ||||
|  | ||||
|  | ||||
|  | ||||
| # some of keys are used by konsole. | ||||
|  | ||||
| key Up    +Shift   : scrollLineUp | ||||
| key Prior +Shift   : scrollPageUp | ||||
| key Down  +Shift   : scrollLineDown | ||||
| key Next  +Shift   : scrollPageDown | ||||
|  | ||||
| key ScrollLock     : scrollLock | ||||
|  | ||||
| #---------------------------------------------------------- | ||||
|  | ||||
| # keypad characters as offered by Qt | ||||
| # cannot be recognized as such. | ||||
|  | ||||
| #---------------------------------------------------------- | ||||
|  | ||||
| # Following other strings as emitted by konsole. | ||||
							
								
								
									
										175
									
								
								konsole-qml-plugin/assets/kb-layouts/macbook.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										175
									
								
								konsole-qml-plugin/assets/kb-layouts/macbook.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,175 @@ | ||||
| # [README.default.Keytab] Buildin Keyboard Table | ||||
| # | ||||
| # To customize your keyboard, copy this file to something | ||||
| # ending with .keytab and change it to meet you needs. | ||||
| # Please read the README.KeyTab and the README.keyboard | ||||
| # in this case. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| keyboard "Default (XFree 4)" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # Note that this particular table is a "risc" version made to | ||||
| # ease customization without bothering with obsolete details. | ||||
| # See VT100.keytab for the more hairy stuff. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| # common keys | ||||
|  | ||||
| key Escape             : "\x1b" | ||||
|  | ||||
| #key Control : "^" | ||||
|  | ||||
| key Tab   -Shift       : "\t" | ||||
| key Tab   +Shift+Ansi  : "\E[Z" | ||||
| key Tab   +Shift-Ansi  : "\t" | ||||
| key Backtab     +Ansi  : "\E[Z" | ||||
| key Backtab     -Ansi  : "\t" | ||||
|  | ||||
| key Return-Shift-NewLine : "\r" | ||||
| key Return-Shift+NewLine : "\r\n" | ||||
|  | ||||
| key Return+Shift         : "\EOM" | ||||
|  | ||||
| # Backspace and Delete codes are preserving CTRL-H. | ||||
|  | ||||
| key Backspace      : "\x7f" | ||||
|  | ||||
| # Arrow keys in VT52 mode | ||||
| # shift up/down are reserved for scrolling. | ||||
| # shift left/right are reserved for switching between tabs (this is hardcoded). | ||||
|  | ||||
|  | ||||
| # Command + C | ||||
| # on mac - Control=Command, Meta=Ctrl | ||||
| # do not use Control+C for interrupt signal - it's used for "Copy to clipboard" | ||||
| #key Control +C : "\x03" | ||||
| key Meta +C: "\x03" | ||||
|  | ||||
|  | ||||
| # Arrow keys in ANSI mode with Application - and Normal Cursor Mode) | ||||
|  | ||||
| key Up   -Shift+Ansi-AppCuKeys : "\E[A" | ||||
| key Down -Shift+Ansi-AppCuKeys : "\E[B" | ||||
| key Right-Shift+Ansi-AppCuKeys : "\E[C" | ||||
| key Left -Shift+Ansi-AppCuKeys : "\E[D" | ||||
|  | ||||
| key Up    -Ansi           : "\E[1;*A" | ||||
| key Down  -Ansi           : "\E[1;*B" | ||||
| key Right -Ansi           : "\E[1;*C" | ||||
| key Left  -Ansi           : "\E[1;*D" | ||||
|  | ||||
| #key Up   -Shift-Ansi : "\EA" | ||||
| #key Down -Shift-Ansi : "\EB" | ||||
| #key Right-Shift-Ansi : "\EC" | ||||
| #key Left -Shift-Ansi : "\ED" | ||||
|  | ||||
| #key Up    -Shift-AnyMod+Ansi-AppCuKeys           : "\E[A" | ||||
| #key Down  -Shift-AnyMod+Ansi-AppCuKeys           : "\E[B" | ||||
| #key Right -Shift-AnyMod+Ansi-AppCuKeys           : "\E[C" | ||||
| #key Left  -Shift-AnyMod+Ansi-AppCuKeys           : "\E[D" | ||||
|  | ||||
| #key Up    -Shift-AnyMod+Ansi-AppCuKeys           : "\EOA" | ||||
| #key Down  -Shift-AnyMod+Ansi-AppCuKeys           : "\EOB" | ||||
| #key Right -Shift-AnyMod+Ansi-AppCuKeys           : "\EOC" | ||||
| #key Left  -Shift-AnyMod+Ansi-AppCuKeys           : "\EOD" | ||||
|  | ||||
| #key Up    -Shift-AnyMod+Ansi                     : "\E[1;*A" | ||||
| #key Down  -Shift-AnyMod+Ansi                     : "\E[1;*B" | ||||
| #key Right -Shift-AnyMod+Ansi                     : "\E[1;*C" | ||||
| #key Left  -Shift-AnyMod+Ansi                     : "\E[1;*D" | ||||
|  | ||||
| # other grey PC keys | ||||
|  | ||||
| key Enter+NewLine : "\r\n" | ||||
| key Enter-NewLine : "\r" | ||||
|  | ||||
| key Home        -AnyMod     -AppCuKeys           : "\E[H"   | ||||
| key End         -AnyMod     -AppCuKeys           : "\E[F"   | ||||
| key Home        -AnyMod     +AppCuKeys           : "\EOH"   | ||||
| key End         -AnyMod     +AppCuKeys           : "\EOF"   | ||||
| key Home        +AnyMod                          : "\E[1;*H" | ||||
| key End         +AnyMod                          : "\E[1;*F" | ||||
|  | ||||
| key Insert      -AnyMod                          : "\E[2~" | ||||
| key Delete      -AnyMod                          : "\E[3~" | ||||
| key Insert      +AnyMod                          : "\E[2;*~" | ||||
| key Delete      +AnyMod                          : "\E[3;*~" | ||||
|  | ||||
| key Prior -Shift-AnyMod                          : "\E[5~" | ||||
| key Next  -Shift-AnyMod                          : "\E[6~" | ||||
| key Prior -Shift+AnyMod                          : "\E[5;*~" | ||||
| key Next  -Shift+AnyMod                          : "\E[6;*~" | ||||
|  | ||||
| # Function keys | ||||
| #key F1          -AnyMod                          : "\EOP" | ||||
| #key F2          -AnyMod                          : "\EOQ" | ||||
| #key F3          -AnyMod                          : "\EOR" | ||||
| #key F4          -AnyMod                          : "\EOS" | ||||
| #define ALT_KP_0		"\033Op" | ||||
| #define ALT_KP_1		"\033Oq" | ||||
| #define ALT_KP_2		"\033Or" | ||||
| #define ALT_KP_3		"\033Os" | ||||
| #define ALT_KP_4		"\033Ot" | ||||
| #define ALT_KP_5		"\033Ou" | ||||
| #define ALT_KP_6		"\033Ov" | ||||
| #define ALT_KP_7		"\033Ow" | ||||
| #define ALT_KP_8		"\033Ox" | ||||
| #define ALT_KP_9		"\033Oy" | ||||
|  | ||||
| key F1          -AnyMod                          : "\EOP" | ||||
| key F2          -AnyMod                          : "\EOQ" | ||||
| key F3          -AnyMod                          : "\EOR" | ||||
| key F4          -AnyMod                          : "\EOS" | ||||
| key F5          -AnyMod                          : "\EOT" | ||||
| key F6          -AnyMod                          : "\EOU" | ||||
| key F7          -AnyMod                          : "\EOV" | ||||
| key F8          -AnyMod                          : "\EOW" | ||||
| key F9          -AnyMod                          : "\EOX" | ||||
| key F10			-AnyMod							 : "\EOY" | ||||
|  | ||||
| #key F5          -AnyMod                          : "\E[15~" | ||||
| #key F6          -AnyMod                          : "\E[17~" | ||||
| #key F7          -AnyMod                          : "\E[18~" | ||||
| #key F8          -AnyMod                          : "\E[19~" | ||||
| #key F9          -AnyMod                          : "\E[20~" | ||||
| #key F10         -AnyMod                          : "\E[21~" | ||||
| #key F11         -AnyMod                          : "\E[23~" | ||||
| #key F12         -AnyMod                          : "\E[24~" | ||||
|  | ||||
| #key F1          +AnyMod                          : "\EO*P" | ||||
| #key F2          +AnyMod                          : "\EO*Q" | ||||
| #key F3          +AnyMod                          : "\EO*R" | ||||
| #key F4          +AnyMod                          : "\EO*S" | ||||
| #key F5          +AnyMod                          : "\E[15;*~" | ||||
| #key F6          +AnyMod                          : "\E[17;*~" | ||||
| #key F7          +AnyMod                          : "\E[18;*~" | ||||
| #key F8          +AnyMod                          : "\E[19;*~" | ||||
| #key F9          +AnyMod                          : "\E[20;*~" | ||||
| #key F10         +AnyMod                          : "\E[21;*~" | ||||
| #key F11         +AnyMod                          : "\E[23;*~" | ||||
| #key F12         +AnyMod                          : "\E[24;*~" | ||||
|  | ||||
| # Work around dead keys | ||||
|  | ||||
| key Space +Control : "\x00" | ||||
|  | ||||
| # Some keys are used by konsole to cause operations. | ||||
| # The scroll* operations refer to the history buffer. | ||||
|  | ||||
| key Up    +Shift-AppScreen  : scrollLineUp | ||||
| key Prior +Shift-AppScreen  : scrollPageUp | ||||
| key Down  +Shift-AppScreen  : scrollLineDown | ||||
| key Next  +Shift-AppScreen  : scrollPageDown | ||||
|  | ||||
| #key Up    +Shift  : scrollLineUp | ||||
| #key Prior +Shift  : scrollPageUp | ||||
| #key Down  +Shift  : scrollLineDown | ||||
| #key Next  +Shift  : scrollPageDown | ||||
|  | ||||
| key ScrollLock     : scrollLock | ||||
|  | ||||
| # keypad characters are not offered differently by Qt. | ||||
							
								
								
									
										108
									
								
								konsole-qml-plugin/assets/kb-layouts/solaris.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								konsole-qml-plugin/assets/kb-layouts/solaris.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | ||||
| # [solaris.keytab] Konsole Keyboard Table  | ||||
| #  | ||||
|  | ||||
| keyboard "Solaris console" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # This configuration table allows to customize the | ||||
| # meaning of the keys. | ||||
| # | ||||
| # The syntax is that each entry has the form : | ||||
| # | ||||
| #   "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) | ||||
| # | ||||
| # Keynames are those defined in <qnamespace.h> with the | ||||
| # "Qt::Key_" removed. (We'd better insert the list here) | ||||
| # | ||||
| # Mode names are : | ||||
| # | ||||
| # - Shift | ||||
| # - Alt | ||||
| # - Control | ||||
| # | ||||
| #   The VT100 emulation has two modes that can affect the | ||||
| #   sequences emitted by certain keys. These modes are | ||||
| #   under control of the client program. | ||||
| # | ||||
| # | ||||
| # - Newline     : effects Return and Enter key. | ||||
| # - Application : effects Up and Down key. | ||||
| # | ||||
| # - Ansi        : effects Up and Down key (This is for VT52, really). | ||||
| # | ||||
| # Operations are | ||||
| # | ||||
| # - scrollUpLine | ||||
| # - scrollUpPage | ||||
| # - scrollDownLine | ||||
| # - scrollDownPage | ||||
| # | ||||
| # - emitSelection | ||||
| # | ||||
| # If the key is not found here, the text of the | ||||
| # key event as provided by QT is emitted, possibly | ||||
| # preceeded by ESC if the Alt key is pressed. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| key Escape         : "\E"  | ||||
| key Tab            : "\t"  | ||||
|  | ||||
| key Return-Alt     : "\r"  | ||||
| key Return+Alt     : "\E\r"  | ||||
|  | ||||
| # Backspace and Delete codes are preserving CTRL-H.  | ||||
|   | ||||
| key Backspace      : "\x08"  | ||||
| #key Delete   : "\x7F"  | ||||
|  | ||||
| # cursor keys  | ||||
|  | ||||
| key Up    -Shift   : "\EOA"  | ||||
| key Down  -Shift   : "\EOB"  | ||||
| key Right -Shift   : "\EOC"  | ||||
| key Left  -Shift   : "\EOD"  | ||||
|   | ||||
| # other grey PC keys  | ||||
|   | ||||
| key Enter          : "\r"  | ||||
|   | ||||
| key Home           : "\E[1~"  | ||||
| key Insert-Shift   : "\E[2~"  | ||||
| key Delete         : "\E[3~"  | ||||
| key End            : "\E[4~"  | ||||
| key Prior -Shift   : "\E[5~"  | ||||
| key Next  -Shift   : "\E[6~"  | ||||
|   | ||||
| # function keys  | ||||
|   | ||||
| key F1             : "\E[11~"  | ||||
| key F2             : "\E[12~"  | ||||
| key F3             : "\E[13~"  | ||||
| key F4             : "\E[14~"  | ||||
| key F5             : "\E[15~"  | ||||
| key F6             : "\E[17~"  | ||||
| key F7             : "\E[18~"  | ||||
| key F8             : "\E[19~"  | ||||
| key F9             : "\E[20~"  | ||||
| key F10            : "\E[21~"  | ||||
| key F11            : "\E[23~"  | ||||
| key F12            : "\E[24~"  | ||||
|   | ||||
| # Work around dead keys  | ||||
|   | ||||
| key Space +Control : "\x00"  | ||||
|   | ||||
| # Some keys are used by konsole to cause operations.  | ||||
| # The scroll* operations refer to the history buffer.  | ||||
|  | ||||
| #key Left  +Shift   : prevSession  | ||||
| #key Right +Shift   : nextSession  | ||||
| key Up    +Shift   : scrollLineUp  | ||||
| key Prior +Shift   : scrollPageUp  | ||||
| key Down  +Shift   : scrollLineDown  | ||||
| key Next  +Shift   : scrollPageDown  | ||||
| #key Insert+Shift   : emitSelection  | ||||
|  | ||||
| # keypad characters are not offered differently by Qt. | ||||
							
								
								
									
										168
									
								
								konsole-qml-plugin/assets/kb-layouts/vt420pc.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										168
									
								
								konsole-qml-plugin/assets/kb-layouts/vt420pc.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,168 @@ | ||||
| # | ||||
| # NOTE: This keyboard binding is not installed because it | ||||
| # apparently doesn't work with actual VT420 systems  | ||||
| # (see BUG:170220) | ||||
| # | ||||
| # [vt420pc.keytab] Konsole Keyboard Table (VT420pc keys) | ||||
| # adapted by ferdinand gassauer f.gassauer@aon.at | ||||
| # Nov 2000 | ||||
| # | ||||
| ################################################################ | ||||
| # | ||||
| # The escape sequences emmited by the  | ||||
| # keys Shift+F1 to Shift+F12 might not fit your needs | ||||
| # | ||||
| ################# IMPORTANT NOTICE ############################# | ||||
| # the key bindings (Kcontrol -> look and feel -> keybindgs)  | ||||
| # overrule the settings in this file. The key bindings might be  | ||||
| # changed by the user WITHOUT notification of the maintainer of | ||||
| # the keytab file. Konsole will not work as expected by  | ||||
| # the maintainer of the keytab file. | ||||
| ################################################################ | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| keyboard "DEC VT420 Terminal" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # This configuration table allows to customize the | ||||
| # meaning of the keys. | ||||
| # | ||||
| # The syntax is that each entry has the form :  | ||||
| # | ||||
| #   "key" Keyname { ("+"|"-") Modename } ":" (String|Operation) | ||||
| # | ||||
| # Keynames are those defined in <qnamespace.h> with the | ||||
| # "Qt::Key_" removed. (We'd better insert the list here) | ||||
| # | ||||
| # Mode names are :  | ||||
| # | ||||
| # - Shift | ||||
| # - Alt | ||||
| # - Control | ||||
| # | ||||
| #   The VT100 emulation has two modes that can affect the | ||||
| #   sequences emitted by certain keys. These modes are | ||||
| #   under control of the client program. | ||||
| #    | ||||
| # - Newline     : effects Return and Enter key. | ||||
| # - Application : effects Up and Down key. | ||||
| # | ||||
| # - Ansi        : effects Up and Down key (This is for VT52, really). | ||||
| # | ||||
| # Operations are | ||||
| # | ||||
| # - scrollUpLine | ||||
| # - scrollUpPage | ||||
| # - scrollDownLine | ||||
| # - scrollDownPage | ||||
| # | ||||
| # - emitSelection | ||||
| # | ||||
| # If the key is not found here, the text of the | ||||
| # key event as provided by QT is emitted, possibly | ||||
| # preceeded by ESC if the Alt key is pressed. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| key Escape : "\E" | ||||
| key Tab    : "\t" | ||||
| key Backtab: "\E[Z" | ||||
|  | ||||
| # VT100 can add an extra \n after return. | ||||
| # The NewLine mode is set by an escape sequence. | ||||
|  | ||||
| key Return-NewLine : "\r"   | ||||
| key Return+NewLine : "\r\n" | ||||
|  | ||||
| # Some desperately try to save the ^H. | ||||
| # may be not everyone wants this | ||||
|  | ||||
| key Backspace : "\x08"  # Control H | ||||
| key Delete    : "\x7f" | ||||
|  | ||||
| # These codes are for the VT420pc | ||||
| # The Ansi mode (i.e. VT100 mode) is set by | ||||
| # an escape sequence | ||||
|  | ||||
| key Up   -Shift-Ansi : "\EA" | ||||
| key Down -Shift-Ansi : "\EB" | ||||
| key Right-Shift-Ansi : "\EC" | ||||
| key Left -Shift-Ansi : "\ED" | ||||
|  | ||||
| # VT100 emits a mode bit together | ||||
| # with the arrow keys.The AppCuKeys | ||||
| # mode is set by an escape sequence. | ||||
|  | ||||
| key Up   -Shift+Ansi+AppCuKeys : "\EOA" | ||||
| key Down -Shift+Ansi+AppCuKeys : "\EOB" | ||||
| key Right-Shift+Ansi+AppCuKeys : "\EOC" | ||||
| key Left -Shift+Ansi+AppCuKeys : "\EOD" | ||||
|  | ||||
| key Up   -Shift+Ansi-AppCuKeys : "\E[A" | ||||
| key Down -Shift+Ansi-AppCuKeys : "\E[B" | ||||
| key Right-Shift+Ansi-AppCuKeys : "\E[C" | ||||
| key Left -Shift+Ansi-AppCuKeys : "\E[D" | ||||
|  | ||||
| # function keys  | ||||
|  | ||||
| key F1 -Shift    : "\E[11~"   | ||||
| key F2 -Shift    : "\E[12~" | ||||
| key F3 -Shift    : "\E[13~" | ||||
| key F4 -Shift    : "\E[14~" | ||||
| key F5 -Shift    : "\E[15~" | ||||
| key F6 -Shift    : "\E[17~" | ||||
| key F7 -Shift    : "\E[18~" | ||||
| key F8 -Shift    : "\E[19~" | ||||
| key F9 -Shift    : "\E[20~" | ||||
| key F10-Shift    : "\E[21~" | ||||
| key F11-Shift    : "\E[23~" | ||||
| key F12-Shift    : "\E[24~"   | ||||
| # | ||||
| # Shift F1-F12 | ||||
| # | ||||
| key F1 +Shift    : "\E[11;2~" | ||||
| key F2 +Shift    : "\E[12;2~" | ||||
| key F3 +Shift    : "\E[13;2~" | ||||
| key F4 +Shift    : "\E[14;2~" | ||||
| key F5 +Shift    : "\E[15;2~" | ||||
| key F6 +Shift    : "\E[17;2~"  | ||||
| key F7 +Shift    : "\E[18;2~"  | ||||
| key F8 +Shift    : "\E[19;2~"  | ||||
| key F9 +Shift    : "\E[20;2~"  | ||||
| key F10+Shift    : "\E[21;2~"  | ||||
| key F11+Shift    : "\E[23;2~"  | ||||
| key F12+Shift    : "\E[24;2~"  | ||||
|  | ||||
| key Home   : "\E[H"   | ||||
| key End    : "\E[F"   | ||||
|  | ||||
| key Prior -Shift : "\E[5~"   | ||||
| key Next  -Shift : "\E[6~"   | ||||
| key Insert-Shift : "\E[2~"   | ||||
|  | ||||
| # Keypad-Enter. See comment on Return above. | ||||
|  | ||||
| key Enter+NewLine : "\r\n" | ||||
| key Enter-NewLine : "\r"   | ||||
|  | ||||
| key Space +Control : "\x00" | ||||
|  | ||||
| # some of keys are used by konsole. | ||||
|  | ||||
| key Up    +Shift   : scrollLineUp | ||||
| key Prior +Shift   : scrollPageUp | ||||
| key Down  +Shift   : scrollLineDown | ||||
| key Next  +Shift   : scrollPageDown | ||||
|  | ||||
| key ScrollLock     : scrollLock | ||||
|  | ||||
| #---------------------------------------------------------- | ||||
|  | ||||
| # keypad characters as offered by Qt | ||||
| # cannot be recognized as such. | ||||
|  | ||||
| #---------------------------------------------------------- | ||||
|  | ||||
| # Following other strings as emitted by konsole. | ||||
							
								
								
									
										29
									
								
								konsole-qml-plugin/debian/changelog
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								konsole-qml-plugin/debian/changelog
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,29 @@ | ||||
| konsole-qml-plugin (0.1.2) raring; urgency=low | ||||
|  | ||||
|   * Fixed text display bug (LP:#1182503) | ||||
|  | ||||
|  -- Dmitry Zagnoyko <hiroshidi@gmail.com>  Mon, 10 Jun 2013 09:49:02 +0300 | ||||
|  | ||||
| konsole-qml-plugin (0.1.1) raring; urgency=low | ||||
|  | ||||
|   * Fixed issue with float values of widget size | ||||
|   * Added virtual key event for qml KSession component | ||||
|  | ||||
|  -- Dmitry Zagnoyko <hiroshidi@gmail.com>  Mon, 06 May 2013 20:11:10 +0300 | ||||
|  | ||||
| konsole-qml-plugin (0.1.0ubuntu1~quantal1~test2) quantal; urgency=low | ||||
|  | ||||
|   * Added qml properties for KTerminal | ||||
|   * Fixed visibility sope: removed konsole namespace | ||||
|   * Added qmltypes | ||||
|   * Fixed qml plugin path | ||||
|   * Added KSession class | ||||
|  | ||||
|  -- Dmitry Zagnoyko <hiroshidi@gmail.com>  Sat, 20 Apr 2013 21:44:26 +0300 | ||||
|  | ||||
| konsole-qml-plugin (0.1.0ubuntu1~quantal1~test1) quantal; urgency=low | ||||
|  | ||||
|   * Initial release | ||||
|   * Ported KDE Konsole | ||||
|  | ||||
|  -- Dmitry Zagnoyko <hiroshidi@gmail.com>  Fri, 19 Apr 2013 20:22:12 +0300 | ||||
							
								
								
									
										1
									
								
								konsole-qml-plugin/debian/compat
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								konsole-qml-plugin/debian/compat
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| 9 | ||||
							
								
								
									
										40
									
								
								konsole-qml-plugin/debian/control
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										40
									
								
								konsole-qml-plugin/debian/control
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,40 @@ | ||||
| Source: konsole-qml-plugin | ||||
| Section: libs | ||||
| Priority: optional | ||||
| Maintainer: Ubuntu Developers <ubuntu-devel-discuss@lists.ubuntu.com> | ||||
| Build-Depends: debhelper (>= 9.0.0), | ||||
| #               libgl1-mesa-dev | libgl-dev, | ||||
| #               libgles2-mesa-dev | ||||
|                qtbase5-dev, | ||||
|                qtdeclarative5-dev, | ||||
|                qt5-default, | ||||
| Standards-Version: 3.9.4 | ||||
| Homepage: http://konsole.kde.org/ | ||||
|  | ||||
| Package: qtdeclarative5-konsole-qml-plugin | ||||
| Architecture: any | ||||
| Multi-Arch: same | ||||
| Pre-Depends: ${misc:Pre-Depends} | ||||
| Depends: ${misc:Depends}, ${shlibs:Depends}, | ||||
| Description: KDE Konsole QML plugin - qml terminal plugin  | ||||
|  Originaly, Konsole is a terminal emulator from KDE. This is ported | ||||
|  version and do not require KDE. | ||||
|  . | ||||
|  This package contains the Konsole terminal emulator plugin | ||||
|  for Qt Qml, which offers access to terminal by KTerminal and | ||||
|  KSession elements. KTerminal is used for displaying information | ||||
|  given by KSession. | ||||
|  | ||||
|  | ||||
| #Package: konsole-qml-plugin-dbg | ||||
| #Priority: extra | ||||
| #Architecture: any | ||||
| #Section: debug | ||||
| #Depends: ${misc:Depends} | ||||
| #Description: KDE Konsole QML plugin debugging symbols | ||||
| # Originaly, Konsole is a terminal emulator from KDE. This is ported | ||||
| # version without KDE tails and do not require KDE. | ||||
| # . | ||||
| # This package contains the debugging symbols for the KDE Konsole | ||||
| # QML plugin. | ||||
|  | ||||
							
								
								
									
										50
									
								
								konsole-qml-plugin/debian/copyright
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								konsole-qml-plugin/debian/copyright
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| Format: http://www.debian.org/doc/packaging-manuals/copyright-format/3.0/ | ||||
| Upstream-Name: konsole-qml-plugin | ||||
| Source: | ||||
|  | ||||
| Files: * | ||||
| Copyright: 2013          Dmitry Zagnoyko  <hiroshidi@gmail.com>  | ||||
|            2008                      e_k  <e_k@users.sourceforge.net> | ||||
|            2006-2008       Robert Knight  <robertknight@gmail.com> | ||||
|            2003-2007  Oswald Buddenhagen  <ossi@kde.org> | ||||
| 	   2000            Stephan Kulow  <coolo@kde.org> | ||||
|            1997-1998         Lars Doelle  <lars.doelle@on-line.de> | ||||
| License: GPL-3 | ||||
|  | ||||
| Files: debian/* | ||||
| Copyright: 2013 Dmitry Zagnoyko <hiroshidi@gmail.com>  | ||||
| License: LGPL-3 | ||||
|  | ||||
| License: GPL-3 | ||||
|  This package 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 3 of the License. | ||||
|  . | ||||
|  This package 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, see <http://www.gnu.org/licenses/>. | ||||
|  . | ||||
|  On Debian systems, the complete text of the GNU General | ||||
|  Public License can be found in "/usr/share/common-licenses/GPL-3". | ||||
|  | ||||
| License: LGPL-3 | ||||
|  This package is free software; you can redistribute it and/or | ||||
|  modify it under the terms of the GNU Lesser General Public | ||||
|  License as published by the Free Software Foundation; either | ||||
|  version 3 of the License. | ||||
|  . | ||||
|  This package 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 | ||||
|  Lesser General Public License for more details. | ||||
|  . | ||||
|  You should have received a copy of the GNU General Public License | ||||
|  along with this program. If not, see <http://www.gnu.org/licenses/>. | ||||
|  . | ||||
|  On Debian systems, the complete text of the GNU Lesser General | ||||
|  Public License can be found in "/usr/share/common-licenses/LGPL-3". | ||||
							
								
								
									
										21
									
								
								konsole-qml-plugin/debian/rules
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										21
									
								
								konsole-qml-plugin/debian/rules
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| #!/usr/bin/make -f | ||||
|  | ||||
| # Uncomment this to turn on verbose mode. | ||||
| #export DH_VERBOSE=1 | ||||
|  | ||||
| #export CFLAGS := $(shell dpkg-buildflags --get CFLAGS) $(shell dpkg-buildflags --get CPPFLAGS) | ||||
| #export CXXFLAGS := $(shell dpkg-buildflags --get CXXFLAGS) $(shell dpkg-buildflags --get CPPFLAGS) | ||||
| #export LDFLAGS := $(shell dpkg-buildflags --get LDFLAGS) -Wl,--as-needed | ||||
|  | ||||
| override_dh_auto_configure: | ||||
| 	QT_SELECT=qt5 dh_auto_configure | ||||
|  | ||||
| %: | ||||
| 	dh $@ --list-missing --parallel  | ||||
| # WARN: currently, no pakgage | ||||
| # --dbg-package=konsole-qml-plugin-dbg | ||||
|  | ||||
|  | ||||
| #override_dh_builddeb: | ||||
| #	dh_builddeb -- -Zxz | ||||
|  | ||||
							
								
								
									
										1
									
								
								konsole-qml-plugin/debian/source/format
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								konsole-qml-plugin/debian/source/format
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1 @@ | ||||
| 3.0 (native) | ||||
							
								
								
									
										99
									
								
								konsole-qml-plugin/konsole-qml-plugin.pro
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										99
									
								
								konsole-qml-plugin/konsole-qml-plugin.pro
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,99 @@ | ||||
| ######################################### | ||||
| ##              CONFIGS | ||||
| ######################################### | ||||
|  | ||||
| TEMPLATE = lib | ||||
| CONFIG += qt plugin hide_symbols | ||||
| QT += qml quick widgets | ||||
|  | ||||
| DEFINES += HAVE_POSIX_OPENPT HAVE_SYS_TIME_H HAVE_UPDWTMPX | ||||
|  | ||||
| #MANUALY DEFINED PLATFORM | ||||
| DEFINES += Q_WS_UBUNTU | ||||
|  | ||||
| TARGET = kdekonsole | ||||
| PLUGIN_IMPORT_PATH = org/kde/konsole | ||||
| PLUGIN_ASSETS = $$PWD/assets/* | ||||
|  | ||||
| INSTALL_DIR = ../imports | ||||
|  | ||||
| ######################################### | ||||
| ##              SOURCES | ||||
| ######################################### | ||||
|  | ||||
| SOURCES += \ | ||||
|         $$PWD/src/plugin.cpp \ | ||||
|         $$PWD/src/Pty.cpp \ | ||||
|         $$PWD/src/kptyprocess.cpp \ | ||||
|         $$PWD/src/kptydevice.cpp \ | ||||
|         $$PWD/src/kpty.cpp \ | ||||
|         $$PWD/src/kprocess.cpp \ | ||||
|         $$PWD/src/ShellCommand.cpp \ | ||||
|         $$PWD/src/Vt102Emulation.cpp \ | ||||
|         $$PWD/src/tools.cpp \ | ||||
|         $$PWD/src/Session.cpp \ | ||||
|         $$PWD/src/Screen.cpp \ | ||||
|         $$PWD/src/KeyboardTranslator.cpp \ | ||||
|         $$PWD/src/Emulation.cpp \ | ||||
|         $$PWD/src/History.cpp \ | ||||
|         $$PWD/src/BlockArray.cpp \ | ||||
|         $$PWD/src/TerminalCharacterDecoder.cpp \ | ||||
|         $$PWD/src/konsole_wcwidth.cpp \ | ||||
|         $$PWD/src/ScreenWindow.cpp \ | ||||
|         $$PWD/src/Filter.cpp \ | ||||
|         $$PWD/src/ColorScheme.cpp \ | ||||
|         $$PWD/src/TerminalDisplay.cpp \ | ||||
|         $$PWD/src/ksession.cpp | ||||
|  | ||||
| HEADERS += \ | ||||
|         $$PWD/src/plugin.h \ | ||||
|         $$PWD/src/Pty.h \ | ||||
|         $$PWD/src/kptyprocess.h \ | ||||
|         $$PWD/src/kptydevice.h \ | ||||
|         $$PWD/src/kpty.h \ | ||||
|         $$PWD/src/kpty_p.h \ | ||||
|         $$PWD/src/kprocess.h \ | ||||
|         $$PWD/src/ShellCommand.h \ | ||||
|         $$PWD/src/Vt102Emulation.h \ | ||||
|         $$PWD/src/tools.h \ | ||||
|         $$PWD/src/Session.h \ | ||||
|         $$PWD/src/Screen.h \ | ||||
|         $$PWD/src/KeyboardTranslator.h \ | ||||
|         $$PWD/src/Emulation.h \ | ||||
|         $$PWD/src/Character.h \ | ||||
|         $$PWD/src/History.h \ | ||||
|         $$PWD/src/CharacterColor.h \ | ||||
|         $$PWD/src/BlockArray.h \ | ||||
|         $$PWD/src/TerminalCharacterDecoder.h \ | ||||
|         $$PWD/src/konsole_wcwidth.h \ | ||||
|         $$PWD/src/ScreenWindow.h \ | ||||
|         $$PWD/src/DefaultTranslatorText.h \ | ||||
|         $$PWD/src/LineFont.h \ | ||||
|         $$PWD/src/Filter.h \ | ||||
|         $$PWD/src/ExtendedDefaultTranslator.h \ | ||||
|         $$PWD/src/ColorTables.h \ | ||||
|         $$PWD/src/ColorScheme.h \ | ||||
|         $$PWD/src/TerminalDisplay.h \ | ||||
|         $$PWD/src/ksession.h | ||||
|  | ||||
| OTHER_FILES += \ | ||||
|     $$PWD/src/qmldir \ | ||||
|     $$PWD/src/plugins.qmltypes | ||||
|  | ||||
| MOC_DIR = $$PWD/.moc | ||||
| OBJECTS_DIR = $$PWD/.obj | ||||
|  | ||||
| ######################################### | ||||
| ##              INTALLS | ||||
| ######################################### | ||||
|  | ||||
| target.path = $$INSTALL_DIR/$$PLUGIN_IMPORT_PATH | ||||
|  | ||||
| assets.files += $$PLUGIN_ASSETS | ||||
| assets.path  += $$INSTALL_DIR/$$PLUGIN_IMPORT_PATH | ||||
|  | ||||
| qmldir.files += $$PWD/src/qmldir \ | ||||
|                 $$PWD/src/plugins.qmltypes | ||||
| qmldir.path  += $$INSTALL_DIR/$$PLUGIN_IMPORT_PATH | ||||
|  | ||||
| INSTALLS     += target qmldir assets | ||||
							
								
								
									
										377
									
								
								konsole-qml-plugin/src/BlockArray.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										377
									
								
								konsole-qml-plugin/src/BlockArray.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,377 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|     Copyright (C) 2000 by Stephan Kulow <coolo@kde.org> | ||||
|  | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 | ||||
|  | ||||
|     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. | ||||
|  | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "BlockArray.h" | ||||
|  | ||||
| #include <QtCore> | ||||
|  | ||||
| // System | ||||
| #include <assert.h> | ||||
| #include <sys/mman.h> | ||||
| #include <sys/param.h> | ||||
| #include <unistd.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
|  | ||||
| static int blocksize = 0; | ||||
|  | ||||
| BlockArray::BlockArray() | ||||
|         : size(0), | ||||
|         current(size_t(-1)), | ||||
|         index(size_t(-1)), | ||||
|         lastmap(0), | ||||
|         lastmap_index(size_t(-1)), | ||||
|         lastblock(0), ion(-1), | ||||
|         length(0) | ||||
| { | ||||
|     // lastmap_index = index = current = size_t(-1); | ||||
|     if (blocksize == 0) { | ||||
|         blocksize = ((sizeof(Block) / getpagesize()) + 1) * getpagesize(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|  | ||||
| BlockArray::~BlockArray() | ||||
| { | ||||
|     setHistorySize(0); | ||||
|     assert(!lastblock); | ||||
| } | ||||
|  | ||||
| size_t BlockArray::append(Block * block) | ||||
| { | ||||
|     if (!size) { | ||||
|         return size_t(-1); | ||||
|     } | ||||
|  | ||||
|     ++current; | ||||
|     if (current >= size) { | ||||
|         current = 0; | ||||
|     } | ||||
|  | ||||
|     int rc; | ||||
|     rc = lseek(ion, current * blocksize, SEEK_SET); | ||||
|     if (rc < 0) { | ||||
|         perror("HistoryBuffer::add.seek"); | ||||
|         setHistorySize(0); | ||||
|         return size_t(-1); | ||||
|     } | ||||
|     rc = write(ion, block, blocksize); | ||||
|     if (rc < 0) { | ||||
|         perror("HistoryBuffer::add.write"); | ||||
|         setHistorySize(0); | ||||
|         return size_t(-1); | ||||
|     } | ||||
|  | ||||
|     length++; | ||||
|     if (length > size) { | ||||
|         length = size; | ||||
|     } | ||||
|  | ||||
|     ++index; | ||||
|  | ||||
|     delete block; | ||||
|     return current; | ||||
| } | ||||
|  | ||||
| size_t BlockArray::newBlock() | ||||
| { | ||||
|     if (!size) { | ||||
|         return size_t(-1); | ||||
|     } | ||||
|     append(lastblock); | ||||
|  | ||||
|     lastblock = new Block(); | ||||
|     return index + 1; | ||||
| } | ||||
|  | ||||
| Block * BlockArray::lastBlock() const | ||||
| { | ||||
|     return lastblock; | ||||
| } | ||||
|  | ||||
| bool BlockArray::has(size_t i) const | ||||
| { | ||||
|     if (i == index + 1) { | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     if (i > index) { | ||||
|         return false; | ||||
|     } | ||||
|     if (index - i >= length) { | ||||
|         return false; | ||||
|     } | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| const Block * BlockArray::at(size_t i) | ||||
| { | ||||
|     if (i == index + 1) { | ||||
|         return lastblock; | ||||
|     } | ||||
|  | ||||
|     if (i == lastmap_index) { | ||||
|         return lastmap; | ||||
|     } | ||||
|  | ||||
|     if (i > index) { | ||||
|         qDebug() << "BlockArray::at() i > index\n"; | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
| //     if (index - i >= length) { | ||||
| //         kDebug(1211) << "BlockArray::at() index - i >= length\n"; | ||||
| //         return 0; | ||||
| //     } | ||||
|  | ||||
|     size_t j = i; // (current - (index - i) + (index/size+1)*size) % size ; | ||||
|  | ||||
|     assert(j < size); | ||||
|     unmap(); | ||||
|  | ||||
|     Block * block = (Block *)mmap(0, blocksize, PROT_READ, MAP_PRIVATE, ion, j * blocksize); | ||||
|  | ||||
|     if (block == (Block *)-1) { | ||||
|         perror("mmap"); | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     lastmap = block; | ||||
|     lastmap_index = i; | ||||
|  | ||||
|     return block; | ||||
| } | ||||
|  | ||||
| void BlockArray::unmap() | ||||
| { | ||||
|     if (lastmap) { | ||||
|         int res = munmap((char *)lastmap, blocksize); | ||||
|         if (res < 0) { | ||||
|             perror("munmap"); | ||||
|         } | ||||
|     } | ||||
|     lastmap = 0; | ||||
|     lastmap_index = size_t(-1); | ||||
| } | ||||
|  | ||||
| bool BlockArray::setSize(size_t newsize) | ||||
| { | ||||
|     return setHistorySize(newsize * 1024 / blocksize); | ||||
| } | ||||
|  | ||||
| bool BlockArray::setHistorySize(size_t newsize) | ||||
| { | ||||
| //    kDebug(1211) << "setHistorySize " << size << " " << newsize; | ||||
|  | ||||
|     if (size == newsize) { | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     unmap(); | ||||
|  | ||||
|     if (!newsize) { | ||||
|         delete lastblock; | ||||
|         lastblock = 0; | ||||
|         if (ion >= 0) { | ||||
|             close(ion); | ||||
|         } | ||||
|         ion = -1; | ||||
|         current = size_t(-1); | ||||
|         return true; | ||||
|     } | ||||
|  | ||||
|     if (!size) { | ||||
|         FILE * tmp = tmpfile(); | ||||
|         if (!tmp) { | ||||
|             perror("konsole: cannot open temp file.\n"); | ||||
|         } else { | ||||
|             ion = dup(fileno(tmp)); | ||||
|             if (ion<0) { | ||||
|                 perror("konsole: cannot dup temp file.\n"); | ||||
|                 fclose(tmp); | ||||
|             } | ||||
|         } | ||||
|         if (ion < 0) { | ||||
|             return false; | ||||
|         } | ||||
|  | ||||
|         assert(!lastblock); | ||||
|  | ||||
|         lastblock = new Block(); | ||||
|         size = newsize; | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     if (newsize > size) { | ||||
|         increaseBuffer(); | ||||
|         size = newsize; | ||||
|         return false; | ||||
|     } else { | ||||
|         decreaseBuffer(newsize); | ||||
|         ftruncate(ion, length*blocksize); | ||||
|         size = newsize; | ||||
|  | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void moveBlock(FILE * fion, int cursor, int newpos, char * buffer2) | ||||
| { | ||||
|     int res = fseek(fion, cursor * blocksize, SEEK_SET); | ||||
|     if (res) { | ||||
|         perror("fseek"); | ||||
|     } | ||||
|     res = fread(buffer2, blocksize, 1, fion); | ||||
|     if (res != 1) { | ||||
|         perror("fread"); | ||||
|     } | ||||
|  | ||||
|     res = fseek(fion, newpos * blocksize, SEEK_SET); | ||||
|     if (res) { | ||||
|         perror("fseek"); | ||||
|     } | ||||
|     res = fwrite(buffer2, blocksize, 1, fion); | ||||
|     if (res != 1) { | ||||
|         perror("fwrite"); | ||||
|     } | ||||
|     //    printf("moving block %d to %d\n", cursor, newpos); | ||||
| } | ||||
|  | ||||
| void BlockArray::decreaseBuffer(size_t newsize) | ||||
| { | ||||
|     if (index < newsize) { // still fits in whole | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     int offset = (current - (newsize - 1) + size) % size; | ||||
|  | ||||
|     if (!offset) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // The Block constructor could do somthing in future... | ||||
|     char * buffer1 = new char[blocksize]; | ||||
|  | ||||
|     FILE * fion = fdopen(dup(ion), "w+b"); | ||||
|     if (!fion) { | ||||
|         delete [] buffer1; | ||||
|         perror("fdopen/dup"); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     int firstblock; | ||||
|     if (current <= newsize) { | ||||
|         firstblock = current + 1; | ||||
|     } else { | ||||
|         firstblock = 0; | ||||
|     } | ||||
|  | ||||
|     size_t oldpos; | ||||
|     for (size_t i = 0, cursor=firstblock; i < newsize; i++) { | ||||
|         oldpos = (size + cursor + offset) % size; | ||||
|         moveBlock(fion, oldpos, cursor, buffer1); | ||||
|         if (oldpos < newsize) { | ||||
|             cursor = oldpos; | ||||
|         } else { | ||||
|             cursor++; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     current = newsize - 1; | ||||
|     length = newsize; | ||||
|  | ||||
|     delete [] buffer1; | ||||
|  | ||||
|     fclose(fion); | ||||
|  | ||||
| } | ||||
|  | ||||
| void BlockArray::increaseBuffer() | ||||
| { | ||||
|     if (index < size) { // not even wrapped once | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     int offset = (current + size + 1) % size; | ||||
|     if (!offset) { // no moving needed | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     // The Block constructor could do somthing in future... | ||||
|     char * buffer1 = new char[blocksize]; | ||||
|     char * buffer2 = new char[blocksize]; | ||||
|  | ||||
|     int runs = 1; | ||||
|     int bpr = size; // blocks per run | ||||
|  | ||||
|     if (size % offset == 0) { | ||||
|         bpr = size / offset; | ||||
|         runs = offset; | ||||
|     } | ||||
|  | ||||
|     FILE * fion = fdopen(dup(ion), "w+b"); | ||||
|     if (!fion) { | ||||
|         perror("fdopen/dup"); | ||||
|         delete [] buffer1; | ||||
|         delete [] buffer2; | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     int res; | ||||
|     for (int i = 0; i < runs; i++) { | ||||
|         // free one block in chain | ||||
|         int firstblock = (offset + i) % size; | ||||
|         res = fseek(fion, firstblock * blocksize, SEEK_SET); | ||||
|         if (res) { | ||||
|             perror("fseek"); | ||||
|         } | ||||
|         res = fread(buffer1, blocksize, 1, fion); | ||||
|         if (res != 1) { | ||||
|             perror("fread"); | ||||
|         } | ||||
|         int newpos = 0; | ||||
|         for (int j = 1, cursor=firstblock; j < bpr; j++) { | ||||
|             cursor = (cursor + offset) % size; | ||||
|             newpos = (cursor - offset + size) % size; | ||||
|             moveBlock(fion, cursor, newpos, buffer2); | ||||
|         } | ||||
|         res = fseek(fion, i * blocksize, SEEK_SET); | ||||
|         if (res) { | ||||
|             perror("fseek"); | ||||
|         } | ||||
|         res = fwrite(buffer1, blocksize, 1, fion); | ||||
|         if (res != 1) { | ||||
|             perror("fwrite"); | ||||
|         } | ||||
|     } | ||||
|     current = size - 1; | ||||
|     length = size; | ||||
|  | ||||
|     delete [] buffer1; | ||||
|     delete [] buffer2; | ||||
|  | ||||
|     fclose(fion); | ||||
|  | ||||
| } | ||||
|  | ||||
							
								
								
									
										126
									
								
								konsole-qml-plugin/src/BlockArray.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										126
									
								
								konsole-qml-plugin/src/BlockArray.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,126 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|     Copyright (C) 2000 by Stephan Kulow <coolo@kde.org> | ||||
|  | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef BLOCKARRAY_H | ||||
| #define BLOCKARRAY_H | ||||
|  | ||||
| #include <unistd.h> | ||||
|  | ||||
| //#error Do not use in KDE 2.1 | ||||
|  | ||||
| #define BlockSize (1 << 12) | ||||
| #define ENTRIES   ((BlockSize - sizeof(size_t) ) / sizeof(unsigned char)) | ||||
|  | ||||
| struct Block { | ||||
|     Block() { | ||||
|         size = 0; | ||||
|     } | ||||
|     unsigned char data[ENTRIES]; | ||||
|     size_t size; | ||||
| }; | ||||
|  | ||||
| // /////////////////////////////////////////////////////// | ||||
|  | ||||
| class BlockArray { | ||||
| public: | ||||
|     /** | ||||
|     * Creates a history file for holding | ||||
|     * maximal size blocks. If more blocks | ||||
|     * are requested, then it drops earlier | ||||
|     * added ones. | ||||
|     */ | ||||
|     BlockArray(); | ||||
|  | ||||
|     /// destructor | ||||
|     ~BlockArray(); | ||||
|  | ||||
|     /** | ||||
|     * adds the Block at the end of history. | ||||
|     * This may drop other blocks. | ||||
|     * | ||||
|     * The ownership on the block is transfered. | ||||
|     * An unique index number is returned for accessing | ||||
|     * it later (if not yet dropped then) | ||||
|     * | ||||
|     * Note, that the block may be dropped completely | ||||
|     * if history is turned off. | ||||
|     */ | ||||
|     size_t append(Block * block); | ||||
|  | ||||
|     /** | ||||
|     * gets the block at the index. Function may return | ||||
|     * 0 if the block isn't available any more. | ||||
|     * | ||||
|     * The returned block is strictly readonly as only | ||||
|     * maped in memory - and will be invalid on the next | ||||
|     * operation on this class. | ||||
|     */ | ||||
|     const Block * at(size_t index); | ||||
|  | ||||
|     /** | ||||
|     * reorders blocks as needed. If newsize is null, | ||||
|     * the history is emptied completely. The indices | ||||
|     * returned on append won't change their semantic, | ||||
|     * but they may not be valid after this call. | ||||
|     */ | ||||
|     bool setHistorySize(size_t newsize); | ||||
|  | ||||
|     size_t newBlock(); | ||||
|  | ||||
|     Block * lastBlock() const; | ||||
|  | ||||
|     /** | ||||
|     * Convenient function to set the size in KBytes | ||||
|     * instead of blocks | ||||
|     */ | ||||
|     bool setSize(size_t newsize); | ||||
|  | ||||
|     size_t len() const { | ||||
|         return length; | ||||
|     } | ||||
|  | ||||
|     bool has(size_t index) const; | ||||
|  | ||||
|     size_t getCurrent() const { | ||||
|         return current; | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     void unmap(); | ||||
|     void increaseBuffer(); | ||||
|     void decreaseBuffer(size_t newsize); | ||||
|  | ||||
|     size_t size; | ||||
|     // current always shows to the last inserted block | ||||
|     size_t current; | ||||
|     size_t index; | ||||
|  | ||||
|     Block * lastmap; | ||||
|     size_t lastmap_index; | ||||
|     Block * lastblock; | ||||
|  | ||||
|     int ion; | ||||
|     size_t length; | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										221
									
								
								konsole-qml-plugin/src/Character.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								konsole-qml-plugin/src/Character.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | ||||
| /* | ||||
|     This file is part of Konsole, KDE's terminal. | ||||
|      | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef CHARACTER_H | ||||
| #define CHARACTER_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QHash> | ||||
|  | ||||
| // Local | ||||
| #include "CharacterColor.h" | ||||
|  | ||||
| typedef unsigned char LineProperty; | ||||
|  | ||||
| static const int LINE_DEFAULT        = 0; | ||||
| static const int LINE_WRAPPED          = (1 << 0); | ||||
| static const int LINE_DOUBLEWIDTH      = (1 << 1); | ||||
| static const int LINE_DOUBLEHEIGHT    = (1 << 2); | ||||
|  | ||||
| #define DEFAULT_RENDITION  0 | ||||
| #define RE_BOLD            (1 << 0) | ||||
| #define RE_BLINK           (1 << 1) | ||||
| #define RE_UNDERLINE       (1 << 2) | ||||
| #define RE_REVERSE         (1 << 3) // Screen only | ||||
| #define RE_INTENSIVE       (1 << 3) // Widget only | ||||
| #define RE_CURSOR          (1 << 4) | ||||
| #define RE_EXTENDED_CHAR   (1 << 5) | ||||
|  | ||||
| /** | ||||
|  * A single character in the terminal which consists of a unicode character | ||||
|  * value, foreground and background colors and a set of rendition attributes | ||||
|  * which specify how it should be drawn. | ||||
|  */ | ||||
| class Character | ||||
| { | ||||
| public: | ||||
|   /**  | ||||
|    * Constructs a new character. | ||||
|    * | ||||
|    * @param _c The unicode character value of this character. | ||||
|    * @param _f The foreground color used to draw the character. | ||||
|    * @param _b The color used to draw the character's background. | ||||
|    * @param _r A set of rendition flags which specify how this character is to be drawn. | ||||
|    */ | ||||
|   inline Character(quint16 _c = ' ', | ||||
|             CharacterColor  _f = CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_FORE_COLOR), | ||||
|             CharacterColor  _b = CharacterColor(COLOR_SPACE_DEFAULT,DEFAULT_BACK_COLOR), | ||||
|             quint8  _r = DEFAULT_RENDITION) | ||||
|        : character(_c), rendition(_r), foregroundColor(_f), backgroundColor(_b) {} | ||||
|  | ||||
|   union | ||||
|   { | ||||
|     /** The unicode character value for this character. */ | ||||
|     quint16 character; | ||||
|     /**  | ||||
|      * Experimental addition which allows a single Character instance to contain more than | ||||
|      * one unicode character. | ||||
|      * | ||||
|      * charSequence is a hash code which can be used to look up the unicode | ||||
|      * character sequence in the ExtendedCharTable used to create the sequence. | ||||
|      */ | ||||
|     quint16 charSequence;  | ||||
|   }; | ||||
|  | ||||
|   /** A combination of RENDITION flags which specify options for drawing the character. */ | ||||
|   quint8  rendition; | ||||
|  | ||||
|   /** The foreground color used to draw this character. */ | ||||
|   CharacterColor  foregroundColor;  | ||||
|   /** The color used to draw this character's background. */ | ||||
|   CharacterColor  backgroundColor; | ||||
|  | ||||
|   /**  | ||||
|    * Returns true if this character has a transparent background when | ||||
|    * it is drawn with the specified @p palette. | ||||
|    */ | ||||
|   bool   isTransparent(const ColorEntry* palette) const; | ||||
|   /** | ||||
|    * Returns true if this character should always be drawn in bold when | ||||
|    * it is drawn with the specified @p palette, independent of whether | ||||
|    * or not the character has the RE_BOLD rendition flag.  | ||||
|    */ | ||||
|   ColorEntry::FontWeight fontWeight(const ColorEntry* base) const; | ||||
|    | ||||
|   /**  | ||||
|    * returns true if the format (color, rendition flag) of the compared characters is equal | ||||
|    */ | ||||
|   bool equalsFormat(const Character &other) const; | ||||
|  | ||||
|   /**  | ||||
|    * Compares two characters and returns true if they have the same unicode character value, | ||||
|    * rendition and colors. | ||||
|    */ | ||||
|   friend bool operator == (const Character& a, const Character& b); | ||||
|   /** | ||||
|    * Compares two characters and returns true if they have different unicode character values, | ||||
|    * renditions or colors. | ||||
|    */ | ||||
|   friend bool operator != (const Character& a, const Character& b); | ||||
| }; | ||||
|  | ||||
| inline bool operator == (const Character& a, const Character& b) | ||||
| {  | ||||
|   return a.character == b.character &&  | ||||
|          a.rendition == b.rendition &&  | ||||
|          a.foregroundColor == b.foregroundColor &&  | ||||
|          a.backgroundColor == b.backgroundColor; | ||||
| } | ||||
|  | ||||
| inline bool operator != (const Character& a, const Character& b) | ||||
| { | ||||
|   return    a.character != b.character ||  | ||||
|             a.rendition != b.rendition ||  | ||||
|             a.foregroundColor != b.foregroundColor ||  | ||||
|             a.backgroundColor != b.backgroundColor; | ||||
| } | ||||
|  | ||||
| inline bool Character::isTransparent(const ColorEntry* base) const | ||||
| { | ||||
|   return ((backgroundColor._colorSpace == COLOR_SPACE_DEFAULT) &&  | ||||
|           base[backgroundColor._u+0+(backgroundColor._v?BASE_COLORS:0)].transparent) | ||||
|       || ((backgroundColor._colorSpace == COLOR_SPACE_SYSTEM) &&  | ||||
|           base[backgroundColor._u+2+(backgroundColor._v?BASE_COLORS:0)].transparent); | ||||
| } | ||||
|  | ||||
| inline bool Character::equalsFormat(const Character& other) const | ||||
| { | ||||
|   return  | ||||
|     backgroundColor==other.backgroundColor && | ||||
|     foregroundColor==other.foregroundColor && | ||||
|     rendition==other.rendition; | ||||
| }	 | ||||
|  | ||||
| inline ColorEntry::FontWeight Character::fontWeight(const ColorEntry* base) const | ||||
| { | ||||
|     if (backgroundColor._colorSpace == COLOR_SPACE_DEFAULT) | ||||
|         return base[backgroundColor._u+0+(backgroundColor._v?BASE_COLORS:0)].fontWeight; | ||||
|     else if (backgroundColor._colorSpace == COLOR_SPACE_SYSTEM) | ||||
|         return base[backgroundColor._u+2+(backgroundColor._v?BASE_COLORS:0)].fontWeight; | ||||
|     else | ||||
|         return ColorEntry::UseCurrentFormat; | ||||
| } | ||||
|  | ||||
| extern unsigned short vt100_graphics[32]; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A table which stores sequences of unicode characters, referenced | ||||
|  * by hash keys.  The hash key itself is the same size as a unicode | ||||
|  * character ( ushort ) so that it can occupy the same space in | ||||
|  * a structure. | ||||
|  */ | ||||
| class ExtendedCharTable | ||||
| { | ||||
| public: | ||||
|     /** Constructs a new character table. */ | ||||
|     ExtendedCharTable(); | ||||
|     ~ExtendedCharTable(); | ||||
|  | ||||
|     /** | ||||
|      * Adds a sequences of unicode characters to the table and returns | ||||
|      * a hash code which can be used later to look up the sequence | ||||
|      * using lookupExtendedChar() | ||||
|      * | ||||
|      * If the same sequence already exists in the table, the hash | ||||
|      * of the existing sequence will be returned. | ||||
|      * | ||||
|      * @param unicodePoints An array of unicode character points | ||||
|      * @param length Length of @p unicodePoints | ||||
|      */ | ||||
|     ushort createExtendedChar(ushort* unicodePoints , ushort length); | ||||
|     /** | ||||
|      * Looks up and returns a pointer to a sequence of unicode characters | ||||
|      * which was added to the table using createExtendedChar(). | ||||
|      * | ||||
|      * @param hash The hash key returned by createExtendedChar() | ||||
|      * @param length This variable is set to the length of the  | ||||
|      * character sequence. | ||||
|      * | ||||
|      * @return A unicode character sequence of size @p length. | ||||
|      */ | ||||
|     ushort* lookupExtendedChar(ushort hash , ushort& length) const; | ||||
|  | ||||
|     /** The global ExtendedCharTable instance. */ | ||||
|     static ExtendedCharTable instance; | ||||
| private: | ||||
|     // calculates the hash key of a sequence of unicode points of size 'length' | ||||
|     ushort extendedCharHash(ushort* unicodePoints , ushort length) const; | ||||
|     // tests whether the entry in the table specified by 'hash' matches the  | ||||
|     // character sequence 'unicodePoints' of size 'length' | ||||
|     bool extendedCharMatch(ushort hash , ushort* unicodePoints , ushort length) const; | ||||
|     // internal, maps hash keys to character sequence buffers.  The first ushort | ||||
|     // in each value is the length of the buffer, followed by the ushorts in the buffer | ||||
|     // themselves. | ||||
|     QHash<ushort,ushort*> extendedCharTable; | ||||
| }; | ||||
|  | ||||
|  | ||||
| Q_DECLARE_TYPEINFO(Character, Q_MOVABLE_TYPE); | ||||
|  | ||||
| #endif // CHARACTER_H | ||||
|  | ||||
							
								
								
									
										294
									
								
								konsole-qml-plugin/src/CharacterColor.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										294
									
								
								konsole-qml-plugin/src/CharacterColor.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,294 @@ | ||||
| /* | ||||
|     This file is part of Konsole, KDE's terminal. | ||||
|      | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef CHARACTERCOLOR_H | ||||
| #define CHARACTERCOLOR_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtGui/QColor> | ||||
|  | ||||
| //#include <kdemacros.h> | ||||
| #define KDE_NO_EXPORT | ||||
|  | ||||
| /**  | ||||
|  * An entry in a terminal display's color palette.  | ||||
|  * | ||||
|  * A color palette is an array of 16 ColorEntry instances which map | ||||
|  * system color indexes (from 0 to 15) into actual colors. | ||||
|  * | ||||
|  * Each entry can be set as bold, in which case any text | ||||
|  * drawn using the color should be drawn in bold.   | ||||
|  * | ||||
|  * Each entry can also be transparent, in which case the terminal | ||||
|  * display should avoid drawing the background for any characters | ||||
|  * using the entry as a background. | ||||
|  */ | ||||
| class ColorEntry | ||||
| { | ||||
| public: | ||||
|   /** Specifies the weight to use when drawing text with this color. */ | ||||
|   enum FontWeight  | ||||
|   { | ||||
|     /** Always draw text in this color with a bold weight. */ | ||||
|     Bold, | ||||
|     /** Always draw text in this color with a normal weight. */ | ||||
|     Normal, | ||||
|     /**  | ||||
|      * Use the current font weight set by the terminal application.   | ||||
|      * This is the default behavior. | ||||
|      */ | ||||
|     UseCurrentFormat | ||||
|   }; | ||||
|  | ||||
|   /**  | ||||
|    * Constructs a new color palette entry. | ||||
|    * | ||||
|    * @param c The color value for this entry. | ||||
|    * @param tr Specifies that the color should be transparent when used as a background color. | ||||
|    * @param weight Specifies the font weight to use when drawing text with this color.  | ||||
|    */ | ||||
|   ColorEntry(QColor c, bool tr, FontWeight weight = UseCurrentFormat)  | ||||
|           : color(c), transparent(tr), fontWeight(weight) {} | ||||
|  | ||||
|   /** | ||||
|    * Constructs a new color palette entry with an undefined color, and | ||||
|    * with the transparent and bold flags set to false. | ||||
|    */  | ||||
|   ColorEntry() : transparent(false), fontWeight(UseCurrentFormat) {}  | ||||
|   | ||||
|   /** | ||||
|    * Sets the color, transparency and boldness of this color to those of @p rhs. | ||||
|    */  | ||||
|   void operator=(const ColorEntry& rhs)  | ||||
|   {  | ||||
|        color = rhs.color;  | ||||
|        transparent = rhs.transparent;  | ||||
|        fontWeight = rhs.fontWeight;  | ||||
|   } | ||||
|  | ||||
|   /** The color value of this entry for display. */ | ||||
|   QColor color; | ||||
|  | ||||
|   /**  | ||||
|    * If true character backgrounds using this color should be transparent.  | ||||
|    * This is not applicable when the color is used to render text. | ||||
|    */ | ||||
|   bool   transparent; | ||||
|   /** | ||||
|    * Specifies the font weight to use when drawing text with this color.  | ||||
|    * This is not applicable when the color is used to draw a character's background. | ||||
|    */ | ||||
|   FontWeight fontWeight;         | ||||
| }; | ||||
|  | ||||
|  | ||||
| // Attributed Character Representations /////////////////////////////// | ||||
|  | ||||
| // Colors | ||||
|  | ||||
| #define BASE_COLORS   (2+8) | ||||
| #define INTENSITIES   2 | ||||
| #define TABLE_COLORS  (INTENSITIES*BASE_COLORS) | ||||
|  | ||||
| #define DEFAULT_FORE_COLOR 0 | ||||
| #define DEFAULT_BACK_COLOR 1 | ||||
|  | ||||
| //a standard set of colors using black text on a white background. | ||||
| //defined in TerminalDisplay.cpp | ||||
|  | ||||
| extern const ColorEntry base_color_table[TABLE_COLORS] KDE_NO_EXPORT; | ||||
|  | ||||
| /* CharacterColor is a union of the various color spaces. | ||||
|  | ||||
|    Assignment is as follows: | ||||
|  | ||||
|    Type  - Space        - Values | ||||
|  | ||||
|    0     - Undefined   - u:  0,      v:0        w:0 | ||||
|    1     - Default     - u:  0..1    v:intense  w:0 | ||||
|    2     - System      - u:  0..7    v:intense  w:0 | ||||
|    3     - Index(256)  - u: 16..255  v:0        w:0 | ||||
|    4     - RGB         - u:  0..255  v:0..256   w:0..256 | ||||
|  | ||||
|    Default colour space has two separate colours, namely | ||||
|    default foreground and default background colour. | ||||
| */ | ||||
|  | ||||
| #define COLOR_SPACE_UNDEFINED   0 | ||||
| #define COLOR_SPACE_DEFAULT     1 | ||||
| #define COLOR_SPACE_SYSTEM      2 | ||||
| #define COLOR_SPACE_256         3 | ||||
| #define COLOR_SPACE_RGB         4 | ||||
|  | ||||
| /** | ||||
|  * Describes the color of a single character in the terminal. | ||||
|  */ | ||||
| class CharacterColor | ||||
| { | ||||
|     friend class Character; | ||||
|  | ||||
| public: | ||||
|   /** Constructs a new CharacterColor whoose color and color space are undefined. */ | ||||
|   CharacterColor()  | ||||
|       : _colorSpace(COLOR_SPACE_UNDEFINED),  | ||||
|         _u(0),  | ||||
|         _v(0),  | ||||
|         _w(0)  | ||||
|   {} | ||||
|  | ||||
|   /**  | ||||
|    * Constructs a new CharacterColor using the specified @p colorSpace and with  | ||||
|    * color value @p co | ||||
|    * | ||||
|    * The meaning of @p co depends on the @p colorSpace used. | ||||
|    * | ||||
|    * TODO : Document how @p co relates to @p colorSpace | ||||
|    * | ||||
|    * TODO : Add documentation about available color spaces. | ||||
|    */ | ||||
|   CharacterColor(quint8 colorSpace, int co)  | ||||
|       : _colorSpace(colorSpace),  | ||||
|         _u(0),  | ||||
|         _v(0),  | ||||
|         _w(0) | ||||
|   { | ||||
|     switch (colorSpace) | ||||
|     { | ||||
|         case COLOR_SPACE_DEFAULT: | ||||
|             _u = co & 1; | ||||
|             break; | ||||
|         case COLOR_SPACE_SYSTEM: | ||||
|             _u = co & 7; | ||||
|             _v = (co >> 3) & 1; | ||||
|             break; | ||||
|         case COLOR_SPACE_256:   | ||||
|             _u = co & 255; | ||||
|             break; | ||||
|         case COLOR_SPACE_RGB: | ||||
|             _u = co >> 16; | ||||
|             _v = co >> 8; | ||||
|             _w = co; | ||||
|             break; | ||||
|         default: | ||||
|             _colorSpace = COLOR_SPACE_UNDEFINED; | ||||
|     } | ||||
|   } | ||||
|  | ||||
|   /**  | ||||
|    * Returns true if this character color entry is valid. | ||||
|    */ | ||||
|   bool isValid()  | ||||
|   { | ||||
|         return _colorSpace != COLOR_SPACE_UNDEFINED; | ||||
|   } | ||||
|      | ||||
|   /**  | ||||
|    * Toggles the value of this color between a normal system color and the corresponding intensive | ||||
|    * system color. | ||||
|    *  | ||||
|    * This is only applicable if the color is using the COLOR_SPACE_DEFAULT or COLOR_SPACE_SYSTEM | ||||
|    * color spaces. | ||||
|    */ | ||||
|   void toggleIntensive(); | ||||
|  | ||||
|   /**  | ||||
|    * Returns the color within the specified color @p palette | ||||
|    * | ||||
|    * The @p palette is only used if this color is one of the 16 system colors, otherwise | ||||
|    * it is ignored. | ||||
|    */ | ||||
|   QColor color(const ColorEntry* palette) const; | ||||
|   | ||||
|   /**  | ||||
|    * Compares two colors and returns true if they represent the same color value and | ||||
|    * use the same color space. | ||||
|    */ | ||||
|   friend bool operator == (const CharacterColor& a, const CharacterColor& b); | ||||
|   /** | ||||
|    * Compares two colors and returns true if they represent different color values | ||||
|    * or use different color spaces. | ||||
|    */ | ||||
|   friend bool operator != (const CharacterColor& a, const CharacterColor& b); | ||||
|  | ||||
| private: | ||||
|   quint8 _colorSpace; | ||||
|  | ||||
|   // bytes storing the character color  | ||||
|   quint8 _u;  | ||||
|   quint8 _v;  | ||||
|   quint8 _w;  | ||||
| }; | ||||
|  | ||||
| inline bool operator == (const CharacterColor& a, const CharacterColor& b) | ||||
| {  | ||||
|     return     a._colorSpace == b._colorSpace && | ||||
|             a._u == b._u && | ||||
|             a._v == b._v && | ||||
|             a._w == b._w; | ||||
| } | ||||
| inline bool operator != (const CharacterColor& a, const CharacterColor& b) | ||||
| { | ||||
|     return !operator==(a,b); | ||||
| } | ||||
|  | ||||
| inline const QColor color256(quint8 u, const ColorEntry* base) | ||||
| { | ||||
|   //   0.. 16: system colors | ||||
|   if (u <   8) return base[u+2            ].color; u -= 8; | ||||
|   if (u <   8) return base[u+2+BASE_COLORS].color; u -= 8; | ||||
|  | ||||
|   //  16..231: 6x6x6 rgb color cube | ||||
|   if (u < 216) return QColor(((u/36)%6) ? (40*((u/36)%6)+55) : 0, | ||||
|                              ((u/ 6)%6) ? (40*((u/ 6)%6)+55) : 0, | ||||
|                              ((u/ 1)%6) ? (40*((u/ 1)%6)+55) : 0); u -= 216; | ||||
|    | ||||
|   // 232..255: gray, leaving out black and white | ||||
|   int gray = u*10+8; return QColor(gray,gray,gray); | ||||
| } | ||||
|  | ||||
| inline QColor CharacterColor::color(const ColorEntry* base) const | ||||
| { | ||||
|   switch (_colorSpace) | ||||
|   { | ||||
|     case COLOR_SPACE_DEFAULT: return base[_u+0+(_v?BASE_COLORS:0)].color; | ||||
|     case COLOR_SPACE_SYSTEM: return base[_u+2+(_v?BASE_COLORS:0)].color; | ||||
|     case COLOR_SPACE_256: return color256(_u,base); | ||||
|     case COLOR_SPACE_RGB: return QColor(_u,_v,_w); | ||||
|     case COLOR_SPACE_UNDEFINED: return QColor(); | ||||
|   } | ||||
|  | ||||
|   Q_ASSERT(false); // invalid color space | ||||
|  | ||||
|   return QColor(); | ||||
| } | ||||
|  | ||||
| inline void CharacterColor::toggleIntensive() | ||||
| { | ||||
|   if (_colorSpace == COLOR_SPACE_SYSTEM || _colorSpace == COLOR_SPACE_DEFAULT) | ||||
|   { | ||||
|     _v = !_v; | ||||
|   } | ||||
| } | ||||
|  | ||||
|  | ||||
| #endif // CHARACTERCOLOR_H | ||||
|  | ||||
							
								
								
									
										774
									
								
								konsole-qml-plugin/src/ColorScheme.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										774
									
								
								konsole-qml-plugin/src/ColorScheme.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,774 @@ | ||||
| /* | ||||
|     This source file is part of Konsole, a terminal emulator. | ||||
|  | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "ColorScheme.h" | ||||
| #include "tools.h" | ||||
|  | ||||
| // Qt | ||||
| #include <QtGui/QBrush> | ||||
| #include <QtCore/QFile> | ||||
| #include <QtCore/QFileInfo> | ||||
| #include <QtDebug> | ||||
| #include <QSettings> | ||||
| #include <QDir> | ||||
|  | ||||
|  | ||||
| // KDE | ||||
| //#include <KColorScheme> | ||||
| //#include <KConfig> | ||||
| //#include <KLocale> | ||||
| //#include <KDebug> | ||||
| //#include <KConfigGroup> | ||||
| //#include <KStandardDirs> | ||||
|  | ||||
|  | ||||
| const ColorEntry ColorScheme::defaultTable[TABLE_COLORS] = | ||||
|  // The following are almost IBM standard color codes, with some slight | ||||
|  // gamma correction for the dim colors to compensate for bright X screens. | ||||
|  // It contains the 8 ansiterm/xterm colors in 2 intensities. | ||||
| { | ||||
|     ColorEntry( QColor(0x00,0x00,0x00), 0), ColorEntry( | ||||
| QColor(0xFF,0xFF,0xFF), 1), // Dfore, Dback | ||||
|     ColorEntry( QColor(0x00,0x00,0x00), 0), ColorEntry( | ||||
| QColor(0xB2,0x18,0x18), 0), // Black, Red | ||||
|     ColorEntry( QColor(0x18,0xB2,0x18), 0), ColorEntry( | ||||
| QColor(0xB2,0x68,0x18), 0), // Green, Yellow | ||||
|     ColorEntry( QColor(0x18,0x18,0xB2), 0), ColorEntry( | ||||
| QColor(0xB2,0x18,0xB2), 0), // Blue, Magenta | ||||
|     ColorEntry( QColor(0x18,0xB2,0xB2), 0), ColorEntry( | ||||
| QColor(0xB2,0xB2,0xB2), 0), // Cyan, White | ||||
|     // intensive | ||||
|     ColorEntry( QColor(0x00,0x00,0x00), 0), ColorEntry( | ||||
| QColor(0xFF,0xFF,0xFF), 1), | ||||
|     ColorEntry( QColor(0x68,0x68,0x68), 0), ColorEntry( | ||||
| QColor(0xFF,0x54,0x54), 0), | ||||
|     ColorEntry( QColor(0x54,0xFF,0x54), 0), ColorEntry( | ||||
| QColor(0xFF,0xFF,0x54), 0), | ||||
|     ColorEntry( QColor(0x54,0x54,0xFF), 0), ColorEntry( | ||||
| QColor(0xFF,0x54,0xFF), 0), | ||||
|     ColorEntry( QColor(0x54,0xFF,0xFF), 0), ColorEntry( | ||||
| QColor(0xFF,0xFF,0xFF), 0) | ||||
| }; | ||||
|  | ||||
| const char* const ColorScheme::colorNames[TABLE_COLORS] = | ||||
| { | ||||
|   "Foreground", | ||||
|   "Background", | ||||
|   "Color0", | ||||
|   "Color1", | ||||
|   "Color2", | ||||
|   "Color3", | ||||
|   "Color4", | ||||
|   "Color5", | ||||
|   "Color6", | ||||
|   "Color7", | ||||
|   "ForegroundIntense", | ||||
|   "BackgroundIntense", | ||||
|   "Color0Intense", | ||||
|   "Color1Intense", | ||||
|   "Color2Intense", | ||||
|   "Color3Intense", | ||||
|   "Color4Intense", | ||||
|   "Color5Intense", | ||||
|   "Color6Intense", | ||||
|   "Color7Intense" | ||||
| }; | ||||
| // dummy silently comment out the tr_NOOP | ||||
| #define tr_NOOP | ||||
| const char* const ColorScheme::translatedColorNames[TABLE_COLORS] = | ||||
| { | ||||
|     tr_NOOP("Foreground"), | ||||
|     tr_NOOP("Background"), | ||||
|     tr_NOOP("Color 1"), | ||||
|     tr_NOOP("Color 2"), | ||||
|     tr_NOOP("Color 3"), | ||||
|     tr_NOOP("Color 4"), | ||||
|     tr_NOOP("Color 5"), | ||||
|     tr_NOOP("Color 6"), | ||||
|     tr_NOOP("Color 7"), | ||||
|     tr_NOOP("Color 8"), | ||||
|     tr_NOOP("Foreground (Intense)"), | ||||
|     tr_NOOP("Background (Intense)"), | ||||
|     tr_NOOP("Color 1 (Intense)"), | ||||
|     tr_NOOP("Color 2 (Intense)"), | ||||
|     tr_NOOP("Color 3 (Intense)"), | ||||
|     tr_NOOP("Color 4 (Intense)"), | ||||
|     tr_NOOP("Color 5 (Intense)"), | ||||
|     tr_NOOP("Color 6 (Intense)"), | ||||
|     tr_NOOP("Color 7 (Intense)"), | ||||
|     tr_NOOP("Color 8 (Intense)") | ||||
| }; | ||||
|  | ||||
| ColorScheme::ColorScheme() | ||||
| { | ||||
|     _table = 0; | ||||
|     _randomTable = 0; | ||||
|     _opacity = 1.0; | ||||
| } | ||||
| ColorScheme::ColorScheme(const ColorScheme& other) | ||||
|       : _opacity(other._opacity) | ||||
|        ,_table(0) | ||||
|        ,_randomTable(0) | ||||
| { | ||||
|     setName(other.name()); | ||||
|     setDescription(other.description()); | ||||
|  | ||||
|     if ( other._table != 0 ) | ||||
|     { | ||||
|         for ( int i = 0 ; i < TABLE_COLORS ; i++ ) | ||||
|             setColorTableEntry(i,other._table[i]); | ||||
|     } | ||||
|  | ||||
|     if ( other._randomTable != 0 ) | ||||
|     { | ||||
|         for ( int i = 0 ; i < TABLE_COLORS ; i++ ) | ||||
|         { | ||||
|             const RandomizationRange& range = other._randomTable[i]; | ||||
|             setRandomizationRange(i,range.hue,range.saturation,range.value); | ||||
|         } | ||||
|     } | ||||
| } | ||||
| ColorScheme::~ColorScheme() | ||||
| { | ||||
|     delete[] _table; | ||||
|     delete[] _randomTable; | ||||
| } | ||||
|  | ||||
| void ColorScheme::setDescription(const QString& description) { _description = description; } | ||||
| QString ColorScheme::description() const { return _description; } | ||||
|  | ||||
| void ColorScheme::setName(const QString& name) { _name = name; } | ||||
| QString ColorScheme::name() const { return _name; } | ||||
|  | ||||
| void ColorScheme::setColorTableEntry(int index , const ColorEntry& entry) | ||||
| { | ||||
|     Q_ASSERT( index >= 0 && index < TABLE_COLORS ); | ||||
|  | ||||
|     if ( !_table )  | ||||
|     { | ||||
|         _table = new ColorEntry[TABLE_COLORS]; | ||||
|  | ||||
|         for (int i=0;i<TABLE_COLORS;i++) | ||||
|             _table[i] = defaultTable[i]; | ||||
|     } | ||||
|      | ||||
|     _table[index] = entry;  | ||||
| } | ||||
| ColorEntry ColorScheme::colorEntry(int index , uint randomSeed) const | ||||
| { | ||||
|     Q_ASSERT( index >= 0 && index < TABLE_COLORS ); | ||||
|  | ||||
|     if ( randomSeed != 0 ) | ||||
|         qsrand(randomSeed); | ||||
|  | ||||
|     ColorEntry entry = colorTable()[index]; | ||||
|  | ||||
|     if ( randomSeed != 0 &&  | ||||
|         _randomTable != 0 &&  | ||||
|         !_randomTable[index].isNull() ) | ||||
|     { | ||||
|         const RandomizationRange& range = _randomTable[index]; | ||||
|        | ||||
|  | ||||
|         int hueDifference = range.hue ? (qrand() % range.hue) - range.hue/2 : 0; | ||||
|         int saturationDifference = range.saturation ? (qrand() % range.saturation) - range.saturation/2 : 0; | ||||
|         int  valueDifference = range.value ? (qrand() % range.value) - range.value/2 : 0; | ||||
|  | ||||
|         QColor& color = entry.color; | ||||
|        | ||||
|         int newHue = qAbs( (color.hue() + hueDifference) % MAX_HUE ); | ||||
|         int newValue = qMin( qAbs(color.value() + valueDifference) , 255 ); | ||||
|         int newSaturation = qMin( qAbs(color.saturation() + saturationDifference) , 255 ); | ||||
|  | ||||
|         color.setHsv(newHue,newSaturation,newValue); | ||||
|     } | ||||
|  | ||||
|     return entry; | ||||
| } | ||||
| void ColorScheme::getColorTable(ColorEntry* table , uint randomSeed) const | ||||
| { | ||||
|     for ( int i = 0 ; i < TABLE_COLORS ; i++ ) | ||||
|         table[i] = colorEntry(i,randomSeed); | ||||
| } | ||||
| bool ColorScheme::randomizedBackgroundColor() const | ||||
| { | ||||
|     return _randomTable == 0 ? false : !_randomTable[1].isNull(); | ||||
| } | ||||
| void ColorScheme::setRandomizedBackgroundColor(bool randomize) | ||||
| { | ||||
|     // the hue of the background colour is allowed to be randomly  | ||||
|     // adjusted as much as possible. | ||||
|     // | ||||
|     // the value and saturation are left alone to maintain read-ability | ||||
|     if ( randomize ) | ||||
|     { | ||||
|         setRandomizationRange( 1 /* background color index */ , MAX_HUE , 255 , 0 );  | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         if ( _randomTable ) | ||||
|             setRandomizationRange( 1 /* background color index */ , 0 , 0 , 0 ); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void ColorScheme::setRandomizationRange( int index , quint16 hue , quint8 saturation , | ||||
|                                          quint8 value ) | ||||
| { | ||||
|     Q_ASSERT( hue <= MAX_HUE ); | ||||
|     Q_ASSERT( index >= 0 && index < TABLE_COLORS ); | ||||
|  | ||||
|     if ( _randomTable == 0 ) | ||||
|         _randomTable = new RandomizationRange[TABLE_COLORS]; | ||||
|  | ||||
|     _randomTable[index].hue = hue; | ||||
|     _randomTable[index].value = value; | ||||
|     _randomTable[index].saturation = saturation; | ||||
| } | ||||
|  | ||||
| const ColorEntry* ColorScheme::colorTable() const | ||||
| { | ||||
|     if ( _table ) | ||||
|         return _table; | ||||
|     else | ||||
|         return defaultTable; | ||||
| } | ||||
| QColor ColorScheme::foregroundColor() const | ||||
| { | ||||
|     return colorTable()[0].color; | ||||
| } | ||||
| QColor ColorScheme::backgroundColor() const | ||||
| { | ||||
|     return colorTable()[1].color; | ||||
| } | ||||
| bool ColorScheme::hasDarkBackground() const | ||||
| { | ||||
|     // value can range from 0 - 255, with larger values indicating higher brightness. | ||||
|     // so 127 is in the middle, anything less is deemed 'dark' | ||||
|     return backgroundColor().value() < 127; | ||||
| } | ||||
| void ColorScheme::setOpacity(qreal opacity) { _opacity = opacity; } | ||||
| qreal ColorScheme::opacity() const { return _opacity; } | ||||
|  | ||||
| void ColorScheme::read(const QString & fileName) | ||||
| { | ||||
|     QSettings s(fileName, QSettings::IniFormat); | ||||
|     s.beginGroup("General"); | ||||
|  | ||||
|     _description = s.value("Description", QObject::tr("Un-named Color Scheme")).toString(); | ||||
|     _opacity = s.value("Opacity",qreal(1.0)).toDouble(); | ||||
|     s.endGroup(); | ||||
|  | ||||
|     for (int i=0 ; i < TABLE_COLORS ; i++) | ||||
|     { | ||||
|         readColorEntry(&s, i); | ||||
|     } | ||||
| } | ||||
| #if 0 | ||||
| // implemented upstream - user apps | ||||
| void ColorScheme::read(KConfig& config) | ||||
| { | ||||
|     KConfigGroup configGroup = config.group("General"); | ||||
|  | ||||
|     QString description = configGroup.readEntry("Description", QObject::tr("Un-named Color Scheme")); | ||||
|  | ||||
|     _description = tr(description.toUtf8()); | ||||
|     _opacity = configGroup.readEntry("Opacity",qreal(1.0)); | ||||
|  | ||||
|     for (int i=0 ; i < TABLE_COLORS ; i++) | ||||
|     { | ||||
|         readColorEntry(config,i); | ||||
|     } | ||||
| } | ||||
| void ColorScheme::write(KConfig& config) const | ||||
| { | ||||
|     KConfigGroup configGroup = config.group("General"); | ||||
|  | ||||
|     configGroup.writeEntry("Description",_description); | ||||
|     configGroup.writeEntry("Opacity",_opacity); | ||||
|      | ||||
|     for (int i=0 ; i < TABLE_COLORS ; i++) | ||||
|     { | ||||
|         RandomizationRange random = _randomTable != 0 ? _randomTable[i] : RandomizationRange(); | ||||
|         writeColorEntry(config,colorNameForIndex(i),colorTable()[i],random); | ||||
|     } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| QString ColorScheme::colorNameForIndex(int index)  | ||||
| { | ||||
|     Q_ASSERT( index >= 0 && index < TABLE_COLORS ); | ||||
|  | ||||
|     return QString(colorNames[index]); | ||||
| } | ||||
| QString ColorScheme::translatedColorNameForIndex(int index)  | ||||
| { | ||||
|     Q_ASSERT( index >= 0 && index < TABLE_COLORS ); | ||||
|  | ||||
|     return translatedColorNames[index]; | ||||
| } | ||||
|  | ||||
| void ColorScheme::readColorEntry(QSettings * s , int index) | ||||
| { | ||||
|     s->beginGroup(colorNameForIndex(index)); | ||||
|      | ||||
|     ColorEntry entry; | ||||
|  | ||||
|     QStringList rgbList = s->value("Color", QStringList()).toStringList(); | ||||
|     if (rgbList.count() != 3) | ||||
|     { | ||||
|         Q_ASSERT(0); | ||||
|     } | ||||
|     int r, g, b; | ||||
|     r = rgbList[0].toInt(); | ||||
|     g = rgbList[1].toInt(); | ||||
|     b = rgbList[2].toInt(); | ||||
|     entry.color = QColor(r, g, b); | ||||
|      | ||||
|     entry.transparent = s->value("Transparent",false).toBool(); | ||||
|  | ||||
|     // Deprecated key from KDE 4.0 which set 'Bold' to true to force | ||||
|     // a color to be bold or false to use the current format | ||||
|     // | ||||
|     // TODO - Add a new tri-state key which allows for bold, normal or | ||||
|     // current format | ||||
|     if (s->contains("Bold")) | ||||
|         entry.fontWeight = s->value("Bold",false).toBool() ? ColorEntry::Bold : | ||||
|                                                                  ColorEntry::UseCurrentFormat; | ||||
|  | ||||
|     quint16 hue = s->value("MaxRandomHue",0).toInt(); | ||||
|     quint8 value = s->value("MaxRandomValue",0).toInt(); | ||||
|     quint8 saturation = s->value("MaxRandomSaturation",0).toInt(); | ||||
|  | ||||
|     setColorTableEntry( index , entry ); | ||||
|  | ||||
|     if ( hue != 0 || value != 0 || saturation != 0 ) | ||||
|        setRandomizationRange( index , hue , saturation , value );  | ||||
|  | ||||
|     s->endGroup(); | ||||
| } | ||||
| #if 0 | ||||
| // implemented upstream - user apps | ||||
| void ColorScheme::writeColorEntry(KConfig& config , const QString& colorName, const ColorEntry& entry , const RandomizationRange& random) const | ||||
| { | ||||
|     KConfigGroup configGroup(&config,colorName); | ||||
|  | ||||
|     configGroup.writeEntry("Color",entry.color); | ||||
|     configGroup.writeEntry("Transparency",(bool)entry.transparent); | ||||
|     if (entry.fontWeight != ColorEntry::UseCurrentFormat) | ||||
|     { | ||||
|         configGroup.writeEntry("Bold",entry.fontWeight == ColorEntry::Bold); | ||||
|     } | ||||
|  | ||||
|     // record randomization if this color has randomization or  | ||||
|     // if one of the keys already exists  | ||||
|     if ( !random.isNull() || configGroup.hasKey("MaxRandomHue") ) | ||||
|     { | ||||
|         configGroup.writeEntry("MaxRandomHue",(int)random.hue); | ||||
|         configGroup.writeEntry("MaxRandomValue",(int)random.value); | ||||
|         configGroup.writeEntry("MaxRandomSaturation",(int)random.saturation); | ||||
|     } | ||||
| } | ||||
| #endif | ||||
|  | ||||
| //  | ||||
| // Work In Progress - A color scheme for use on KDE setups for users | ||||
| // with visual disabilities which means that they may have trouble | ||||
| // reading text with the supplied color schemes. | ||||
| // | ||||
| // This color scheme uses only the 'safe' colors defined by the | ||||
| // KColorScheme class.   | ||||
| // | ||||
| // A complication this introduces is that each color provided by  | ||||
| // KColorScheme is defined as a 'background' or 'foreground' color. | ||||
| // Only foreground colors are allowed to be used to render text and  | ||||
| // only background colors are allowed to be used for backgrounds. | ||||
| // | ||||
| // The ColorEntry and TerminalDisplay classes do not currently | ||||
| // support this restriction.   | ||||
| // | ||||
| // Requirements: | ||||
| //  - A color scheme which uses only colors from the KColorScheme class | ||||
| //  - Ability to restrict which colors the TerminalDisplay widget  | ||||
| //    uses as foreground and background color | ||||
| //  - Make use of KGlobalSettings::allowDefaultBackgroundImages() as | ||||
| //    a hint to determine whether this accessible color scheme should  | ||||
| //    be used by default. | ||||
| // | ||||
| // | ||||
| // -- Robert Knight <robertknight@gmail.com> 21/07/2007 | ||||
| // | ||||
| AccessibleColorScheme::AccessibleColorScheme() | ||||
|     : ColorScheme() | ||||
| { | ||||
| #if 0 | ||||
| // It's not finished in konsole and it breaks Qt4 compilation as well | ||||
|     // basic attributes | ||||
|     setName("accessible"); | ||||
|     setDescription(QObject::tr("Accessible Color Scheme")); | ||||
|  | ||||
|     // setup colors | ||||
|     const int ColorRoleCount = 8; | ||||
|  | ||||
|     const KColorScheme colorScheme(QPalette::Active); | ||||
|  | ||||
|     QBrush colors[ColorRoleCount] = | ||||
|     { | ||||
|         colorScheme.foreground( colorScheme.NormalText ), | ||||
|         colorScheme.background( colorScheme.NormalBackground ), | ||||
|  | ||||
|         colorScheme.foreground( colorScheme.InactiveText ), | ||||
|         colorScheme.foreground( colorScheme.ActiveText ), | ||||
|         colorScheme.foreground( colorScheme.LinkText ), | ||||
|         colorScheme.foreground( colorScheme.VisitedText ), | ||||
|         colorScheme.foreground( colorScheme.NegativeText ), | ||||
|         colorScheme.foreground( colorScheme.NeutralText ) | ||||
|     }; | ||||
|  | ||||
|     for ( int i = 0 ; i < TABLE_COLORS ; i++ )  | ||||
|     { | ||||
|         ColorEntry entry; | ||||
|         entry.color = colors[ i % ColorRoleCount ].color(); | ||||
|  | ||||
|         setColorTableEntry( i , entry );  | ||||
|     }    | ||||
| #endif | ||||
| } | ||||
|  | ||||
| KDE3ColorSchemeReader::KDE3ColorSchemeReader( QIODevice* device ) : | ||||
|     _device(device) | ||||
| { | ||||
| } | ||||
| ColorScheme* KDE3ColorSchemeReader::read()  | ||||
| { | ||||
|     Q_ASSERT( _device->openMode() == QIODevice::ReadOnly || | ||||
|               _device->openMode() == QIODevice::ReadWrite  ); | ||||
|  | ||||
|     ColorScheme* scheme = new ColorScheme(); | ||||
|  | ||||
|     QRegExp comment("#.*$"); | ||||
|     while ( !_device->atEnd() ) | ||||
|     { | ||||
|         QString line(_device->readLine()); | ||||
|         line.remove(comment); | ||||
|         line = line.simplified(); | ||||
|  | ||||
|         if ( line.isEmpty() ) | ||||
|             continue; | ||||
|  | ||||
|         if ( line.startsWith(QLatin1String("color")) ) | ||||
|         { | ||||
|             if (!readColorLine(line,scheme)) | ||||
|                 qDebug() << "Failed to read KDE 3 color scheme line" << line; | ||||
|         } | ||||
|         else if ( line.startsWith(QLatin1String("title")) ) | ||||
|         { | ||||
|             if (!readTitleLine(line,scheme)) | ||||
|                 qDebug() << "Failed to read KDE 3 color scheme title line" << line; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             qDebug() << "KDE 3 color scheme contains an unsupported feature, '" << | ||||
|                 line << "'"; | ||||
|         }  | ||||
|     } | ||||
|  | ||||
|     return scheme; | ||||
| } | ||||
| bool KDE3ColorSchemeReader::readColorLine(const QString& line,ColorScheme* scheme) | ||||
| { | ||||
|     QStringList list = line.split(QChar(' ')); | ||||
|  | ||||
|     if (list.count() != 7) | ||||
|         return false; | ||||
|     if (list.first() != "color") | ||||
|         return false; | ||||
|      | ||||
|     int index = list[1].toInt(); | ||||
|     int red = list[2].toInt(); | ||||
|     int green = list[3].toInt(); | ||||
|     int blue = list[4].toInt(); | ||||
|     int transparent = list[5].toInt(); | ||||
|     int bold = list[6].toInt(); | ||||
|  | ||||
|     const int MAX_COLOR_VALUE = 255; | ||||
|  | ||||
|     if(     (index < 0 || index >= TABLE_COLORS ) | ||||
|         ||  (red < 0 || red > MAX_COLOR_VALUE ) | ||||
|         ||  (blue < 0 || blue > MAX_COLOR_VALUE ) | ||||
|         ||  (green < 0 || green > MAX_COLOR_VALUE ) | ||||
|         ||  (transparent != 0 && transparent != 1 ) | ||||
|         ||  (bold != 0 && bold != 1)    ) | ||||
|         return false; | ||||
|  | ||||
|     ColorEntry entry; | ||||
|     entry.color = QColor(red,green,blue); | ||||
|     entry.transparent = ( transparent != 0 ); | ||||
|     entry.fontWeight = ( bold != 0 ) ? ColorEntry::Bold : ColorEntry::UseCurrentFormat; | ||||
|  | ||||
|     scheme->setColorTableEntry(index,entry); | ||||
|     return true; | ||||
| } | ||||
| bool KDE3ColorSchemeReader::readTitleLine(const QString& line,ColorScheme* scheme) | ||||
| { | ||||
|     if( !line.startsWith(QLatin1String("title")) ) | ||||
|         return false; | ||||
|  | ||||
|     int spacePos = line.indexOf(' '); | ||||
|     if( spacePos == -1 ) | ||||
|         return false; | ||||
|  | ||||
|     QString description = line.mid(spacePos+1); | ||||
|  | ||||
|     scheme->setDescription(description.toUtf8()); | ||||
|     return true; | ||||
| } | ||||
| ColorSchemeManager::ColorSchemeManager() | ||||
|     : _haveLoadedAll(false) | ||||
| { | ||||
| } | ||||
| ColorSchemeManager::~ColorSchemeManager() | ||||
| { | ||||
|     QHashIterator<QString,const ColorScheme*> iter(_colorSchemes); | ||||
|     while (iter.hasNext()) | ||||
|     { | ||||
|         iter.next(); | ||||
|         delete iter.value(); | ||||
|     } | ||||
| } | ||||
| void ColorSchemeManager::loadAllColorSchemes() | ||||
| { | ||||
|     qDebug() << "loadAllColorSchemes"; | ||||
|     int success = 0; | ||||
|     int failed = 0; | ||||
|  | ||||
|     QList<QString> nativeColorSchemes = listColorSchemes(); | ||||
|  | ||||
|     QListIterator<QString> nativeIter(nativeColorSchemes); | ||||
|     while ( nativeIter.hasNext() ) | ||||
|     { | ||||
|         if ( loadColorScheme( nativeIter.next() ) ) | ||||
|             success++; | ||||
|         else | ||||
|             failed++; | ||||
|     } | ||||
|  | ||||
|     QList<QString> kde3ColorSchemes = listKDE3ColorSchemes(); | ||||
|     QListIterator<QString> kde3Iter(kde3ColorSchemes); | ||||
|     while ( kde3Iter.hasNext() ) | ||||
|     { | ||||
|         if ( loadKDE3ColorScheme( kde3Iter.next() ) ) | ||||
|             success++; | ||||
|         else | ||||
|             failed++; | ||||
|     } | ||||
|  | ||||
|     if ( failed > 0 ) | ||||
|         qDebug() << "failed to load " << failed << " color schemes."; | ||||
|  | ||||
|     _haveLoadedAll = true; | ||||
| } | ||||
| QList<const ColorScheme*> ColorSchemeManager::allColorSchemes() | ||||
| { | ||||
|     if ( !_haveLoadedAll ) | ||||
|     { | ||||
|         loadAllColorSchemes(); | ||||
|     } | ||||
|  | ||||
|     return _colorSchemes.values(); | ||||
| } | ||||
| bool ColorSchemeManager::loadKDE3ColorScheme(const QString& filePath) | ||||
| { | ||||
|     QFile file(filePath); | ||||
|     if (!filePath.endsWith(QLatin1String(".schema")) || !file.open(QIODevice::ReadOnly)) | ||||
|         return false; | ||||
|  | ||||
|     KDE3ColorSchemeReader reader(&file); | ||||
|     ColorScheme* scheme = reader.read(); | ||||
|     scheme->setName(QFileInfo(file).baseName()); | ||||
|     file.close(); | ||||
|  | ||||
|     if (scheme->name().isEmpty()) | ||||
|     { | ||||
|         qDebug() << "color scheme name is not valid."; | ||||
|         delete scheme; | ||||
|         return false; | ||||
|     } | ||||
|      | ||||
|     QFileInfo info(filePath); | ||||
|  | ||||
|     if ( !_colorSchemes.contains(info.baseName()) ) | ||||
|         _colorSchemes.insert(scheme->name(),scheme); | ||||
|     else | ||||
|     { | ||||
|         qDebug() << "color scheme with name" << scheme->name() << "has already been" << | ||||
|             "found, ignoring."; | ||||
|         delete scheme; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| } | ||||
| #if 0 | ||||
| void ColorSchemeManager::addColorScheme(ColorScheme* scheme)  | ||||
| { | ||||
|     _colorSchemes.insert(scheme->name(),scheme); | ||||
|  | ||||
|     // save changes to disk | ||||
|     QString path = KGlobal::dirs()->saveLocation("data","konsole/") + scheme->name() + ".colorscheme"; | ||||
|     KConfig config(path , KConfig::NoGlobals); | ||||
|  | ||||
|     scheme->write(config); | ||||
| } | ||||
| #endif | ||||
| bool ColorSchemeManager::loadColorScheme(const QString& filePath) | ||||
| { | ||||
|     if ( !filePath.endsWith(QLatin1String(".colorscheme")) || !QFile::exists(filePath) ) | ||||
|         return false; | ||||
|  | ||||
|     QFileInfo info(filePath); | ||||
|      | ||||
|     ColorScheme* scheme = new ColorScheme(); | ||||
|     scheme->setName(info.baseName()); | ||||
|     scheme->read(filePath); | ||||
|  | ||||
|     if (scheme->name().isEmpty())  | ||||
|     { | ||||
|         qDebug() << "Color scheme in" << filePath << "does not have a valid name and was not loaded."; | ||||
|         delete scheme; | ||||
|         return false; | ||||
|     }     | ||||
|  | ||||
|     if ( !_colorSchemes.contains(info.baseName()) ) | ||||
|     { | ||||
|         _colorSchemes.insert(scheme->name(),scheme); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         qDebug() << "color scheme with name" << scheme->name() << "has already been" << | ||||
|             "found, ignoring."; | ||||
|          | ||||
|         delete scheme; | ||||
|     } | ||||
|  | ||||
|     return true;  | ||||
| } | ||||
| QList<QString> ColorSchemeManager::listKDE3ColorSchemes() | ||||
| { | ||||
|     QString dname(get_color_schemes_dir()); | ||||
|     QDir dir(dname); | ||||
|     QStringList filters; | ||||
|     filters << "*.schema"; | ||||
|     dir.setNameFilters(filters); | ||||
|     QStringList list = dir.entryList(filters);  | ||||
|     QStringList ret; | ||||
|     foreach(QString i, list) | ||||
|         ret << dname + "/" + i; | ||||
|     return ret; | ||||
|     //return KGlobal::dirs()->findAllResources("data", | ||||
|     //                                         "konsole/*.schema", | ||||
|     //                                          KStandardDirs::NoDuplicates); | ||||
|     // | ||||
| } | ||||
| QList<QString> ColorSchemeManager::listColorSchemes() | ||||
| { | ||||
|     QString dname(get_color_schemes_dir()); | ||||
|     QDir dir(dname); | ||||
|     QStringList filters; | ||||
|     filters << "*.colorscheme"; | ||||
|     dir.setNameFilters(filters); | ||||
|     QStringList list = dir.entryList(filters); | ||||
|     QStringList ret; | ||||
|     foreach(QString i, list) | ||||
|         ret << dname + "/" + i; | ||||
|     return ret; | ||||
| //    return KGlobal::dirs()->findAllResources("data", | ||||
| //                                             "konsole/*.colorscheme", | ||||
| //                                             KStandardDirs::NoDuplicates); | ||||
| } | ||||
| const ColorScheme ColorSchemeManager::_defaultColorScheme; | ||||
| const ColorScheme* ColorSchemeManager::defaultColorScheme() const | ||||
| { | ||||
|     return &_defaultColorScheme; | ||||
| } | ||||
| bool ColorSchemeManager::deleteColorScheme(const QString& name) | ||||
| { | ||||
|     Q_ASSERT( _colorSchemes.contains(name) ); | ||||
|  | ||||
|     // lookup the path and delete  | ||||
|     QString path = findColorSchemePath(name); | ||||
|     if ( QFile::remove(path) ) | ||||
|     { | ||||
|         _colorSchemes.remove(name); | ||||
|         return true; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         qDebug() << "Failed to remove color scheme -" << path; | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| QString ColorSchemeManager::findColorSchemePath(const QString& name) const | ||||
| { | ||||
| //    QString path = KStandardDirs::locate("data","konsole/"+name+".colorscheme"); | ||||
|     QString path(get_color_schemes_dir() + "/"+ name + ".colorscheme"); | ||||
|     if ( !path.isEmpty() ) | ||||
|        return path;  | ||||
|  | ||||
|     //path = KStandardDirs::locate("data","konsole/"+name+".schema"); | ||||
|     path = get_color_schemes_dir() + "/"+ name + ".schema"; | ||||
|  | ||||
|     return path; | ||||
| } | ||||
| const ColorScheme* ColorSchemeManager::findColorScheme(const QString& name)  | ||||
| { | ||||
|     if ( name.isEmpty() ) | ||||
|         return defaultColorScheme(); | ||||
|  | ||||
|     if ( _colorSchemes.contains(name) ) | ||||
|         return _colorSchemes[name]; | ||||
|     else | ||||
|     { | ||||
|         // look for this color scheme | ||||
|         QString path = findColorSchemePath(name);  | ||||
|         if ( !path.isEmpty() && loadColorScheme(path) ) | ||||
|         { | ||||
|             return findColorScheme(name);  | ||||
|         }  | ||||
|         else  | ||||
|         { | ||||
|             if (!path.isEmpty() && loadKDE3ColorScheme(path)) | ||||
|                 return findColorScheme(name); | ||||
|         } | ||||
|  | ||||
|         qDebug() << "Could not find color scheme - " << name; | ||||
|  | ||||
|         return 0;  | ||||
|     } | ||||
| } | ||||
|  | ||||
| ColorSchemeManager* ColorSchemeManager::theColorSchemeManager = 0; | ||||
| //K_GLOBAL_STATIC( ColorSchemeManager , theColorSchemeManager ) | ||||
| ColorSchemeManager* ColorSchemeManager::instance() | ||||
| { | ||||
|     if (! theColorSchemeManager) | ||||
|         theColorSchemeManager = new ColorSchemeManager(); | ||||
|     return theColorSchemeManager; | ||||
| } | ||||
							
								
								
									
										342
									
								
								konsole-qml-plugin/src/ColorScheme.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										342
									
								
								konsole-qml-plugin/src/ColorScheme.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,342 @@ | ||||
| /* | ||||
|     This source file is part of Konsole, a terminal emulator. | ||||
|  | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef COLORSCHEME_H | ||||
| #define COLORSCHEME_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QHash> | ||||
| #include <QtCore/QList> | ||||
| #include <QtCore/QMetaType> | ||||
| #include <QtCore/QIODevice> | ||||
| #include <QtCore/QSet> | ||||
| #include <QSettings> | ||||
|  | ||||
| // Konsole | ||||
| #include "CharacterColor.h" | ||||
|  | ||||
| class QIODevice; | ||||
| //class KConfig; | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Represents a color scheme for a terminal display.   | ||||
|  * | ||||
|  * The color scheme includes the palette of colors used to draw the text and character backgrounds | ||||
|  * in the display and the opacity level of the display background.  | ||||
|  */ | ||||
| class ColorScheme | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * Constructs a new color scheme which is initialised to the default color set  | ||||
|      * for Konsole. | ||||
|      */ | ||||
|     ColorScheme(); | ||||
|     ColorScheme(const ColorScheme& other); | ||||
|     ~ColorScheme(); | ||||
|  | ||||
|     /** Sets the descriptive name of the color scheme. */ | ||||
|     void setDescription(const QString& description); | ||||
|     /** Returns the descriptive name of the color scheme. */ | ||||
|     QString description() const; | ||||
|  | ||||
|     /** Sets the name of the color scheme */ | ||||
|     void setName(const QString& name); | ||||
|     /** Returns the name of the color scheme */ | ||||
|     QString name() const; | ||||
|  | ||||
| #if 0 | ||||
| // Implemented upstream - in user apps | ||||
|     /** Reads the color scheme from the specified configuration source */ | ||||
|     void read(KConfig& config); | ||||
|     /** Writes the color scheme to the specified configuration source */ | ||||
|     void write(KConfig& config) const; | ||||
| #endif | ||||
|     void read(const QString & filename); | ||||
|  | ||||
|     /** Sets a single entry within the color palette. */ | ||||
|     void setColorTableEntry(int index , const ColorEntry& entry); | ||||
|  | ||||
|     /**  | ||||
|      * Copies the color entries which form the palette for this color scheme | ||||
|      * into @p table.  @p table should be an array with TABLE_COLORS entries. | ||||
|      * | ||||
|      * @param table Array into which the color entries for this color scheme | ||||
|      * are copied. | ||||
|      * @param randomSeed Color schemes may allow certain colors in their | ||||
|      * palette to be randomized.  The seed is used to pick the random color. | ||||
|      */ | ||||
|     void getColorTable(ColorEntry* table, uint randomSeed = 0) const; | ||||
|     | ||||
|     /** | ||||
|      * Retrieves a single color entry from the table. | ||||
|      * | ||||
|      * See getColorTable() | ||||
|      */ | ||||
|     ColorEntry colorEntry(int index , uint randomSeed = 0) const; | ||||
|  | ||||
|     /**  | ||||
|      * Convenience method.  Returns the  | ||||
|      * foreground color for this scheme,  | ||||
|      * this is the primary color used to draw the  | ||||
|      * text in this scheme. | ||||
|      */ | ||||
|     QColor foregroundColor() const; | ||||
|     /** | ||||
|      * Convenience method.  Returns the background color for  | ||||
|      * this scheme, this is the primary color used to  | ||||
|      * draw the terminal background in this scheme. | ||||
|      */ | ||||
|     QColor backgroundColor() const; | ||||
|  | ||||
|     /**  | ||||
|      * Returns true if this color scheme has a dark background. | ||||
|      * The background color is said to be dark if it has a value of less than 127 | ||||
|      * in the HSV color space. | ||||
|      */ | ||||
|     bool hasDarkBackground() const; | ||||
|  | ||||
|     /**  | ||||
|      * Sets the opacity level of the display background. @p opacity ranges | ||||
|      * between 0 (completely transparent background) and 1 (completely | ||||
|      * opaque background). | ||||
|      * | ||||
|      * Defaults to 1. | ||||
|      * | ||||
|      * TODO: More documentation | ||||
|      */ | ||||
|     void setOpacity(qreal opacity); | ||||
|     /**  | ||||
|      * Returns the opacity level for this color scheme, see setOpacity() | ||||
|      * TODO: More documentation | ||||
|      */ | ||||
|     qreal opacity() const; | ||||
|  | ||||
|     /**  | ||||
|      * Enables randomization of the background color.  This will cause | ||||
|      * the palette returned by getColorTable() and colorEntry() to | ||||
|      * be adjusted depending on the value of the random seed argument | ||||
|      * to them. | ||||
|      */  | ||||
|     void setRandomizedBackgroundColor(bool randomize); | ||||
|  | ||||
|     /** Returns true if the background color is randomized. */ | ||||
|     bool randomizedBackgroundColor() const; | ||||
|  | ||||
|     static QString colorNameForIndex(int index); | ||||
|     static QString translatedColorNameForIndex(int index); | ||||
|  | ||||
| private: | ||||
|     // specifies how much a particular color can be randomized by | ||||
|     class RandomizationRange | ||||
|     { | ||||
|     public: | ||||
|         RandomizationRange() : hue(0) , saturation(0) , value(0) {} | ||||
|  | ||||
|         bool isNull() const  | ||||
|         { | ||||
|             return ( hue == 0 && saturation == 0 && value == 0 ); | ||||
|         } | ||||
|  | ||||
|         quint16 hue; | ||||
|         quint8  saturation; | ||||
|         quint8  value; | ||||
|     }; | ||||
|  | ||||
|     // returns the active color table.  if none has been set specifically, | ||||
|     // this is the default color table. | ||||
|     const ColorEntry* colorTable() const; | ||||
|  | ||||
| #if 0 | ||||
| // implemented upstream - user apps | ||||
|     // reads a single colour entry from a KConfig source | ||||
|     // and sets the palette entry at 'index' to the entry read. | ||||
|     void readColorEntry(KConfig& config , int index);  | ||||
|     // writes a single colour entry to a KConfig source | ||||
|     void writeColorEntry(KConfig& config , const QString& colorName, const ColorEntry& entry,const RandomizationRange& range) const; | ||||
| #endif | ||||
|     void readColorEntry(QSettings *s, int index); | ||||
|  | ||||
|     // sets the amount of randomization allowed for a particular color  | ||||
|     // in the palette.  creates the randomization table if  | ||||
|     // it does not already exist | ||||
|     void setRandomizationRange( int index , quint16 hue , quint8 saturation , quint8 value ); | ||||
|  | ||||
|     QString _description; | ||||
|     QString _name; | ||||
|     qreal _opacity; | ||||
|     ColorEntry* _table; // pointer to custom color table or 0 if the default | ||||
|                         // color scheme is being used | ||||
|  | ||||
|  | ||||
|     static const quint16 MAX_HUE = 340; | ||||
|  | ||||
|     RandomizationRange* _randomTable;   // pointer to randomization table or 0 | ||||
|                                         // if no colors in the color scheme support | ||||
|                                         // randomization | ||||
|  | ||||
|     static const char* const colorNames[TABLE_COLORS]; | ||||
|     static const char* const translatedColorNames[TABLE_COLORS]; | ||||
|  | ||||
|     static const ColorEntry defaultTable[]; // table of default color entries | ||||
| }; | ||||
|  | ||||
| /**  | ||||
|  * A color scheme which uses colors from the standard KDE color palette. | ||||
|  * | ||||
|  * This is designed primarily for the benefit of users who are using specially | ||||
|  * designed colors. | ||||
|  * | ||||
|  * TODO Implement and make it the default on systems with specialized KDE | ||||
|  * color schemes. | ||||
|  */ | ||||
| class AccessibleColorScheme : public ColorScheme | ||||
| { | ||||
| public: | ||||
|     AccessibleColorScheme(); | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Reads a color scheme stored in the .schema format used in the KDE 3 incarnation | ||||
|  * of Konsole | ||||
|  * | ||||
|  * Only the basic essentials ( title and color palette entries ) are currently | ||||
|  * supported.  Additional options such as background image and background | ||||
|  * blend colors are ignored. | ||||
|  */ | ||||
| class KDE3ColorSchemeReader | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * Constructs a new reader which reads from the specified device.  | ||||
|      * The device should be open in read-only mode.  | ||||
|      */ | ||||
|     KDE3ColorSchemeReader( QIODevice* device ); | ||||
|  | ||||
|     /**  | ||||
|      * Reads and parses the contents of the .schema file from the input | ||||
|      * device and returns the ColorScheme defined within it. | ||||
|      * | ||||
|      * Returns a null pointer if an error occurs whilst parsing | ||||
|      * the contents of the file. | ||||
|      */ | ||||
|     ColorScheme* read(); | ||||
|  | ||||
| private: | ||||
|     // reads a line from the file specifying a colour palette entry | ||||
|     // format is: color [index] [red] [green] [blue] [transparent] [bold] | ||||
|     bool readColorLine(const QString& line , ColorScheme* scheme); | ||||
|     bool readTitleLine(const QString& line , ColorScheme* scheme); | ||||
|  | ||||
|     QIODevice* _device; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Manages the color schemes available for use by terminal displays. | ||||
|  * See ColorScheme | ||||
|  */ | ||||
| class ColorSchemeManager | ||||
| { | ||||
| public: | ||||
|  | ||||
|     /** | ||||
|      * Constructs a new ColorSchemeManager and loads the list | ||||
|      * of available color schemes. | ||||
|      * | ||||
|      * The color schemes themselves are not loaded until they are first | ||||
|      * requested via a call to findColorScheme() | ||||
|      */ | ||||
|     ColorSchemeManager(); | ||||
|     /** | ||||
|      * Destroys the ColorSchemeManager and saves any modified color schemes to disk. | ||||
|      */ | ||||
|     ~ColorSchemeManager(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the default color scheme for Konsole | ||||
|      */ | ||||
|     const ColorScheme* defaultColorScheme() const; | ||||
|   | ||||
|     /** | ||||
|      * Returns the color scheme with the given name or 0 if no | ||||
|      * scheme with that name exists.  If @p name is empty, the | ||||
|      * default color scheme is returned. | ||||
|      * | ||||
|      * The first time that a color scheme with a particular name is | ||||
|      * requested, the configuration information is loaded from disk. | ||||
|      */ | ||||
|     const ColorScheme* findColorScheme(const QString& name); | ||||
|  | ||||
| #if 0 | ||||
|     /** | ||||
|      * Adds a new color scheme to the manager.  If @p scheme has the same name as | ||||
|      * an existing color scheme, it replaces the existing scheme. | ||||
|      * | ||||
|      * TODO - Ensure the old color scheme gets deleted | ||||
|      */ | ||||
|     void addColorScheme(ColorScheme* scheme); | ||||
| #endif | ||||
|     /** | ||||
|      * Deletes a color scheme.  Returns true on successful deletion or false otherwise.  | ||||
|      */ | ||||
|     bool deleteColorScheme(const QString& name); | ||||
|  | ||||
|     /**  | ||||
|      * Returns a list of the all the available color schemes.  | ||||
|      * This may be slow when first called because all of the color | ||||
|      * scheme resources on disk must be located, read and parsed. | ||||
|      * | ||||
|      * Subsequent calls will be inexpensive.  | ||||
|      */ | ||||
|     QList<const ColorScheme*> allColorSchemes();     | ||||
|  | ||||
|     /** Returns the global color scheme manager instance. */ | ||||
|     static ColorSchemeManager* instance(); | ||||
|  | ||||
| private: | ||||
|     // loads a color scheme from a KDE 4+ .colorscheme file | ||||
|     bool loadColorScheme(const QString& path); | ||||
|     // loads a color scheme from a KDE 3 .schema file | ||||
|     bool loadKDE3ColorScheme(const QString& path); | ||||
|     // returns a list of paths of color schemes in the KDE 4+ .colorscheme file format | ||||
|     QList<QString> listColorSchemes(); | ||||
|     // returns a list of paths of color schemes in the .schema file format | ||||
|     // used in KDE 3 | ||||
|     QList<QString> listKDE3ColorSchemes(); | ||||
|     // loads all of the color schemes | ||||
|     void loadAllColorSchemes(); | ||||
|     // finds the path of a color scheme | ||||
|     QString findColorSchemePath(const QString& name) const; | ||||
|  | ||||
|     QHash<QString,const ColorScheme*> _colorSchemes; | ||||
|     QSet<ColorScheme*> _modifiedSchemes; | ||||
|  | ||||
|     bool _haveLoadedAll; | ||||
|  | ||||
|     static const ColorScheme _defaultColorScheme; | ||||
|  | ||||
|     static ColorSchemeManager * theColorSchemeManager; | ||||
| }; | ||||
|  | ||||
| Q_DECLARE_METATYPE(const ColorScheme*) | ||||
|  | ||||
| #endif //COLORSCHEME_H | ||||
							
								
								
									
										55
									
								
								konsole-qml-plugin/src/ColorTables.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								konsole-qml-plugin/src/ColorTables.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| #ifndef _COLOR_TABLE_H | ||||
| #define _COLOR_TABLE_H | ||||
|  | ||||
| #include "CharacterColor.h" | ||||
|  | ||||
| //using namespace Konsole; | ||||
| #if 0 | ||||
| static const ColorEntry whiteonblack_color_table[TABLE_COLORS] = { | ||||
|     // normal | ||||
|     ColorEntry(QColor(0xFF,0xFF,0xFF), false ), ColorEntry( QColor(0x00,0x00,0x00), true ), // Dfore, Dback | ||||
|     ColorEntry(QColor(0x00,0x00,0x00), false ), ColorEntry( QColor(0xB2,0x18,0x18), false ), // Black, Red | ||||
|     ColorEntry(QColor(0x18,0xB2,0x18), false ), ColorEntry( QColor(0xB2,0x68,0x18), false ), // Green, Yellow | ||||
|     ColorEntry(QColor(0x18,0x18,0xB2), false ), ColorEntry( QColor(0xB2,0x18,0xB2), false ), // Blue, Magenta | ||||
|     ColorEntry(QColor(0x18,0xB2,0xB2), false ), ColorEntry( QColor(0xB2,0xB2,0xB2), false ), // Cyan, White | ||||
|     // intensiv | ||||
|     ColorEntry(QColor(0x00,0x00,0x00), false ), ColorEntry( QColor(0xFF,0xFF,0xFF), true ), | ||||
|     ColorEntry(QColor(0x68,0x68,0x68), false ), ColorEntry( QColor(0xFF,0x54,0x54), false ), | ||||
|     ColorEntry(QColor(0x54,0xFF,0x54), false ), ColorEntry( QColor(0xFF,0xFF,0x54), false ), | ||||
|     ColorEntry(QColor(0x54,0x54,0xFF), false ), ColorEntry( QColor(0xFF,0x54,0xFF), false ), | ||||
|     ColorEntry(QColor(0x54,0xFF,0xFF), false ), ColorEntry( QColor(0xFF,0xFF,0xFF), false ) | ||||
| }; | ||||
|  | ||||
| static const ColorEntry greenonblack_color_table[TABLE_COLORS] = { | ||||
|     ColorEntry(QColor(    24, 240,  24),  false), ColorEntry(QColor(     0,   0,   0),  true), | ||||
|     ColorEntry(QColor(     0,   0,   0),  false), ColorEntry(QColor(   178,  24,  24),  false), | ||||
|     ColorEntry(QColor(    24, 178,  24),  false), ColorEntry(QColor(   178, 104,  24),  false), | ||||
|     ColorEntry(QColor(    24,  24, 178),  false), ColorEntry(QColor(   178,  24, 178),  false), | ||||
|     ColorEntry(QColor(    24, 178, 178),  false), ColorEntry(QColor(   178, 178, 178),  false), | ||||
|     // intensive colors | ||||
|     ColorEntry(QColor(   24, 240,  24),  false ), ColorEntry(QColor(    0,   0,   0),  true ), | ||||
|     ColorEntry(QColor(  104, 104, 104),  false ), ColorEntry(QColor(  255,  84,  84),  false ), | ||||
|     ColorEntry(QColor(   84, 255,  84),  false ), ColorEntry(QColor(  255, 255,  84),  false ), | ||||
|     ColorEntry(QColor(   84,  84, 255),  false ), ColorEntry(QColor(  255,  84, 255),  false ), | ||||
|     ColorEntry(QColor(   84, 255, 255),  false ), ColorEntry(QColor(  255, 255, 255),  false ) | ||||
| }; | ||||
|  | ||||
| static const ColorEntry blackonlightyellow_color_table[TABLE_COLORS] = { | ||||
|     ColorEntry(QColor(  0,   0,   0),  false),  ColorEntry(QColor( 255, 255, 221),  true), | ||||
|     ColorEntry(QColor(  0,   0,   0),  false),  ColorEntry(QColor( 178,  24,  24),  false), | ||||
|     ColorEntry(QColor( 24, 178,  24),  false),  ColorEntry(QColor( 178, 104,  24),  false), | ||||
|     ColorEntry(QColor( 24,  24, 178),  false),  ColorEntry(QColor( 178,  24, 178),  false), | ||||
|     ColorEntry(QColor( 24, 178, 178),  false),  ColorEntry(QColor( 178, 178, 178),  false), | ||||
|     ColorEntry(QColor(  0,   0,   0),  false),  ColorEntry(QColor( 255, 255, 221),  true), | ||||
|     ColorEntry(QColor(104, 104, 104),  false),  ColorEntry(QColor( 255,  84,  84),  false), | ||||
|     ColorEntry(QColor( 84, 255,  84),  false),  ColorEntry(QColor( 255, 255,  84),  false), | ||||
|     ColorEntry(QColor( 84,  84, 255),  false),  ColorEntry(QColor( 255,  84, 255),  false), | ||||
|     ColorEntry(QColor( 84, 255, 255),  false),  ColorEntry(QColor( 255, 255, 255),  false) | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										2
									
								
								konsole-qml-plugin/src/DefaultTranslatorText.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								konsole-qml-plugin/src/DefaultTranslatorText.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| "keyboard \"Fallback Key Translator\"\n" | ||||
| "key Tab : \"\\t\" \0" | ||||
							
								
								
									
										458
									
								
								konsole-qml-plugin/src/Emulation.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										458
									
								
								konsole-qml-plugin/src/Emulation.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,458 @@ | ||||
| /* | ||||
|     Copyright 2007-2008 Robert Knight <robertknight@gmail.com>  | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|     Copyright 1996 by Matthias Ettrich <ettrich@kde.org> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "Emulation.h" | ||||
|  | ||||
| // System | ||||
| #include <assert.h> | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| // Qt | ||||
| #include <QGuiApplication> | ||||
| #include <QtGui/QClipboard> | ||||
| #include <QtCore/QHash> | ||||
| #include <QtGui/QKeyEvent> | ||||
| #include <QtCore/QRegExp> | ||||
| #include <QtCore/QTextStream> | ||||
| #include <QtCore/QThread> | ||||
|  | ||||
| #include <QtCore/QTime> | ||||
|  | ||||
| // KDE | ||||
| //#include <kdebug.h> | ||||
|  | ||||
| // Konsole | ||||
| #include "KeyboardTranslator.h" | ||||
| #include "Screen.h" | ||||
| #include "TerminalCharacterDecoder.h" | ||||
| #include "ScreenWindow.h" | ||||
|  | ||||
| Emulation::Emulation() : | ||||
|   _currentScreen(0), | ||||
|   _codec(0), | ||||
|   _decoder(0), | ||||
|   _keyTranslator(0), | ||||
|   _usesMouse(false) | ||||
| { | ||||
|   // create screens with a default size | ||||
|   _screen[0] = new Screen(40,80); | ||||
|   _screen[1] = new Screen(40,80); | ||||
|   _currentScreen = _screen[0]; | ||||
|  | ||||
|   QObject::connect(&_bulkTimer1, SIGNAL(timeout()), this, SLOT(showBulk()) ); | ||||
|   QObject::connect(&_bulkTimer2, SIGNAL(timeout()), this, SLOT(showBulk()) ); | ||||
|     | ||||
|   // listen for mouse status changes | ||||
|   connect( this , SIGNAL(programUsesMouseChanged(bool)) ,  | ||||
|            SLOT(usesMouseChanged(bool)) ); | ||||
| } | ||||
|  | ||||
| bool Emulation::programUsesMouse() const | ||||
| { | ||||
|     return _usesMouse; | ||||
| } | ||||
|  | ||||
| void Emulation::usesMouseChanged(bool usesMouse) | ||||
| { | ||||
|     _usesMouse = usesMouse; | ||||
| } | ||||
|  | ||||
| ScreenWindow* Emulation::createWindow() | ||||
| { | ||||
|     ScreenWindow* window = new ScreenWindow(); | ||||
|     window->setScreen(_currentScreen); | ||||
|     _windows << window; | ||||
|  | ||||
|     connect(window , SIGNAL(selectionChanged()), | ||||
|             this , SLOT(bufferedUpdate())); | ||||
|  | ||||
|     connect(this , SIGNAL(outputChanged()), | ||||
|             window , SLOT(notifyOutputChanged()) ); | ||||
|     return window; | ||||
| } | ||||
|  | ||||
| Emulation::~Emulation() | ||||
| { | ||||
|   QListIterator<ScreenWindow*> windowIter(_windows); | ||||
|  | ||||
|   while (windowIter.hasNext()) | ||||
|   { | ||||
|     delete windowIter.next(); | ||||
|   } | ||||
|  | ||||
|   delete _screen[0]; | ||||
|   delete _screen[1]; | ||||
|   delete _decoder; | ||||
| } | ||||
|  | ||||
| void Emulation::setScreen(int n) | ||||
| { | ||||
|   Screen *old = _currentScreen; | ||||
|   _currentScreen = _screen[n & 1]; | ||||
|   if (_currentScreen != old)  | ||||
|   { | ||||
|      // tell all windows onto this emulation to switch to the newly active screen | ||||
|      foreach(ScreenWindow* window,_windows) | ||||
|          window->setScreen(_currentScreen); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void Emulation::clearHistory() | ||||
| { | ||||
|     _screen[0]->setScroll( _screen[0]->getScroll() , false ); | ||||
| } | ||||
| void Emulation::setHistory(const HistoryType& t) | ||||
| { | ||||
|   _screen[0]->setScroll(t); | ||||
|  | ||||
|   showBulk(); | ||||
| } | ||||
|  | ||||
| const HistoryType& Emulation::history() const | ||||
| { | ||||
|   return _screen[0]->getScroll(); | ||||
| } | ||||
|  | ||||
| void Emulation::setCodec(const QTextCodec * qtc) | ||||
| { | ||||
|   if (qtc) | ||||
|       _codec = qtc; | ||||
|   else | ||||
|      setCodec(LocaleCodec); | ||||
|  | ||||
|   delete _decoder; | ||||
|   _decoder = _codec->makeDecoder(); | ||||
|  | ||||
|   emit useUtf8Request(utf8()); | ||||
| } | ||||
|  | ||||
| void Emulation::setCodec(EmulationCodec codec) | ||||
| { | ||||
|     if ( codec == Utf8Codec ) | ||||
|         setCodec( QTextCodec::codecForName("utf8") ); | ||||
|     else if ( codec == LocaleCodec ) | ||||
|         setCodec( QTextCodec::codecForLocale() ); | ||||
| } | ||||
|  | ||||
| void Emulation::setKeyBindings(const QString& name) | ||||
| { | ||||
|   _keyTranslator = KeyboardTranslatorManager::instance()->findTranslator(name); | ||||
|   if (!_keyTranslator) | ||||
|   { | ||||
|       _keyTranslator = KeyboardTranslatorManager::instance()->defaultTranslator(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| QString Emulation::keyBindings() const | ||||
| { | ||||
|   return _keyTranslator->name(); | ||||
| } | ||||
|  | ||||
| void Emulation::receiveChar(int c) | ||||
| // process application unicode input to terminal | ||||
| // this is a trivial scanner | ||||
| { | ||||
|   c &= 0xff; | ||||
|   switch (c) | ||||
|   { | ||||
|     case '\b'      : _currentScreen->backspace();                 break; | ||||
|     case '\t'      : _currentScreen->tab();                       break; | ||||
|     case '\n'      : _currentScreen->newLine();                   break; | ||||
|     case '\r'      : _currentScreen->toStartOfLine();             break; | ||||
|     case 0x07      : emit stateSet(NOTIFYBELL); | ||||
|                      break; | ||||
|     default        : _currentScreen->displayCharacter(c);         break; | ||||
|   }; | ||||
| } | ||||
|  | ||||
| void Emulation::sendKeyEvent( QKeyEvent* ev ) | ||||
| { | ||||
|   emit stateSet(NOTIFYNORMAL); | ||||
|    | ||||
|   if (!ev->text().isEmpty()) | ||||
|   { // A block of text | ||||
|     // Note that the text is proper unicode. | ||||
|     // We should do a conversion here | ||||
|     emit sendData(ev->text().toUtf8(),ev->text().length()); | ||||
|   } | ||||
| } | ||||
|  | ||||
| void Emulation::sendString(const char*,int) | ||||
| { | ||||
|     // default implementation does nothing | ||||
| } | ||||
|  | ||||
| void Emulation::sendMouseEvent(int /*buttons*/, int /*column*/, int /*row*/, int /*eventType*/) | ||||
| { | ||||
|     // default implementation does nothing | ||||
| } | ||||
|  | ||||
| /* | ||||
|    We are doing code conversion from locale to unicode first. | ||||
| TODO: Character composition from the old code.  See #96536 | ||||
| */ | ||||
|  | ||||
| void Emulation::receiveData(const char* text, int length) | ||||
| { | ||||
|     emit stateSet(NOTIFYACTIVITY); | ||||
|  | ||||
|     bufferedUpdate(); | ||||
|          | ||||
|     QString unicodeText = _decoder->toUnicode(text,length); | ||||
|  | ||||
|     //send characters to terminal emulator | ||||
|     for (int i=0;i<unicodeText.length();i++) | ||||
|         receiveChar(unicodeText[i].unicode()); | ||||
|  | ||||
|     //look for z-modem indicator | ||||
|     //-- someone who understands more about z-modems that I do may be able to move | ||||
|     //this check into the above for loop? | ||||
|     for (int i=0;i<length;i++) | ||||
|     { | ||||
|         if (text[i] == '\030') | ||||
|         { | ||||
|             if ((length-i-1 > 3) && (strncmp(text+i+1, "B00", 3) == 0)) | ||||
|                 emit zmodemDetected(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| //OLDER VERSION | ||||
| //This version of onRcvBlock was commented out because | ||||
| //    a)  It decoded incoming characters one-by-one, which is slow in the current version of Qt (4.2 tech preview) | ||||
| //    b)  It messed up decoding of non-ASCII characters, with the result that (for example) chinese characters | ||||
| //        were not printed properly. | ||||
| // | ||||
| //There is something about stopping the _decoder if "we get a control code halfway a multi-byte sequence" (see below) | ||||
| //which hasn't been ported into the newer function (above).  Hopefully someone who understands this better | ||||
| //can find an alternative way of handling the check.   | ||||
|  | ||||
|  | ||||
| /*void Emulation::onRcvBlock(const char *s, int len) | ||||
| { | ||||
|   emit notifySessionState(NOTIFYACTIVITY); | ||||
|    | ||||
|   bufferedUpdate(); | ||||
|   for (int i = 0; i < len; i++) | ||||
|   { | ||||
|  | ||||
|     QString result = _decoder->toUnicode(&s[i],1); | ||||
|     int reslen = result.length(); | ||||
|  | ||||
|     // If we get a control code halfway a multi-byte sequence | ||||
|     // we flush the _decoder and continue with the control code. | ||||
|     if ((s[i] < 32) && (s[i] > 0)) | ||||
|     { | ||||
|        // Flush _decoder | ||||
|        while(!result.length()) | ||||
|           result = _decoder->toUnicode(&s[i],1); | ||||
|        reslen = 1; | ||||
|        result.resize(reslen); | ||||
|        result[0] = QChar(s[i]); | ||||
|     } | ||||
|  | ||||
|     for (int j = 0; j < reslen; j++) | ||||
|     { | ||||
|       if (result[j].characterategory() == QChar::Mark_NonSpacing) | ||||
|          _currentScreen->compose(result.mid(j,1)); | ||||
|       else | ||||
|          onRcvChar(result[j].unicode()); | ||||
|     } | ||||
|     if (s[i] == '\030') | ||||
|     { | ||||
|       if ((len-i-1 > 3) && (strncmp(s+i+1, "B00", 3) == 0)) | ||||
|           emit zmodemDetected(); | ||||
|     } | ||||
|   } | ||||
| }*/ | ||||
|  | ||||
| void Emulation::writeToStream( TerminalCharacterDecoder* _decoder ,  | ||||
|                                int startLine , | ||||
|                                int endLine)  | ||||
| { | ||||
|   _currentScreen->writeLinesToStream(_decoder,startLine,endLine); | ||||
| } | ||||
|  | ||||
| int Emulation::lineCount() const | ||||
| { | ||||
|     // sum number of lines currently on _screen plus number of lines in history | ||||
|     return _currentScreen->getLines() + _currentScreen->getHistLines(); | ||||
| } | ||||
|  | ||||
| #define BULK_TIMEOUT1 10 | ||||
| #define BULK_TIMEOUT2 40 | ||||
|  | ||||
| void Emulation::showBulk() | ||||
| { | ||||
|     _bulkTimer1.stop(); | ||||
|     _bulkTimer2.stop(); | ||||
|  | ||||
|     emit outputChanged(); | ||||
|  | ||||
|     _currentScreen->resetScrolledLines(); | ||||
|     _currentScreen->resetDroppedLines(); | ||||
| } | ||||
|  | ||||
| void Emulation::bufferedUpdate() | ||||
| { | ||||
|    _bulkTimer1.setSingleShot(true); | ||||
|    _bulkTimer1.start(BULK_TIMEOUT1); | ||||
|    if (!_bulkTimer2.isActive()) | ||||
|    { | ||||
|       _bulkTimer2.setSingleShot(true); | ||||
|       _bulkTimer2.start(BULK_TIMEOUT2); | ||||
|    } | ||||
| } | ||||
|  | ||||
| char Emulation::eraseChar() const | ||||
| { | ||||
|   return '\b'; | ||||
| } | ||||
|  | ||||
| void Emulation::setImageSize(int lines, int columns) | ||||
| { | ||||
|   if ((lines < 1) || (columns < 1))  | ||||
|     return; | ||||
|  | ||||
|   QSize screenSize[2] = { QSize(_screen[0]->getColumns(), | ||||
|                                 _screen[0]->getLines()), | ||||
|                           QSize(_screen[1]->getColumns(), | ||||
|                                 _screen[1]->getLines()) }; | ||||
|   QSize newSize(columns,lines); | ||||
|  | ||||
|   if (newSize == screenSize[0] && newSize == screenSize[1]) | ||||
|     return;     | ||||
|  | ||||
|   _screen[0]->resizeImage(lines,columns); | ||||
|   _screen[1]->resizeImage(lines,columns); | ||||
|  | ||||
|   emit imageSizeChanged(lines,columns); | ||||
|  | ||||
|   bufferedUpdate(); | ||||
| } | ||||
|  | ||||
| QSize Emulation::imageSize() const | ||||
| { | ||||
|   return QSize(_currentScreen->getColumns(), _currentScreen->getLines()); | ||||
| } | ||||
|  | ||||
| ushort ExtendedCharTable::extendedCharHash(ushort* unicodePoints , ushort length) const | ||||
| { | ||||
|     ushort hash = 0; | ||||
|     for ( ushort i = 0 ; i < length ; i++ ) | ||||
|     { | ||||
|         hash = 31*hash + unicodePoints[i]; | ||||
|     } | ||||
|     return hash; | ||||
| } | ||||
| bool ExtendedCharTable::extendedCharMatch(ushort hash , ushort* unicodePoints , ushort length) const | ||||
| { | ||||
|     ushort* entry = extendedCharTable[hash]; | ||||
|  | ||||
|     // compare given length with stored sequence length ( given as the first ushort in the  | ||||
|     // stored buffer )  | ||||
|     if ( entry == 0 || entry[0] != length )  | ||||
|        return false; | ||||
|     // if the lengths match, each character must be checked.  the stored buffer starts at | ||||
|     // entry[1] | ||||
|     for ( int i = 0 ; i < length ; i++ ) | ||||
|     { | ||||
|         if ( entry[i+1] != unicodePoints[i] ) | ||||
|            return false;  | ||||
|     }  | ||||
|     return true; | ||||
| } | ||||
| ushort ExtendedCharTable::createExtendedChar(ushort* unicodePoints , ushort length) | ||||
| { | ||||
|     // look for this sequence of points in the table | ||||
|     ushort hash = extendedCharHash(unicodePoints,length); | ||||
|  | ||||
|     // check existing entry for match | ||||
|     while ( extendedCharTable.contains(hash) ) | ||||
|     { | ||||
|         if ( extendedCharMatch(hash,unicodePoints,length) ) | ||||
|         { | ||||
|             // this sequence already has an entry in the table,  | ||||
|             // return its hash | ||||
|             return hash; | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             // if hash is already used by another, different sequence of unicode character | ||||
|             // points then try next hash | ||||
|             hash++; | ||||
|         } | ||||
|     }     | ||||
|  | ||||
|      | ||||
|      // add the new sequence to the table and | ||||
|      // return that index | ||||
|     ushort* buffer = new ushort[length+1]; | ||||
|     buffer[0] = length; | ||||
|     for ( int i = 0 ; i < length ; i++ ) | ||||
|        buffer[i+1] = unicodePoints[i];  | ||||
|      | ||||
|     extendedCharTable.insert(hash,buffer); | ||||
|  | ||||
|     return hash; | ||||
| } | ||||
|  | ||||
| ushort* ExtendedCharTable::lookupExtendedChar(ushort hash , ushort& length) const | ||||
| { | ||||
|     // lookup index in table and if found, set the length | ||||
|     // argument and return a pointer to the character sequence | ||||
|  | ||||
|     ushort* buffer = extendedCharTable[hash]; | ||||
|     if ( buffer ) | ||||
|     { | ||||
|         length = buffer[0]; | ||||
|         return buffer+1; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         length = 0; | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| ExtendedCharTable::ExtendedCharTable() | ||||
| { | ||||
| } | ||||
| ExtendedCharTable::~ExtendedCharTable() | ||||
| { | ||||
|     // free all allocated character buffers | ||||
|     QHashIterator<ushort,ushort*> iter(extendedCharTable); | ||||
|     while ( iter.hasNext() ) | ||||
|     { | ||||
|         iter.next(); | ||||
|         delete[] iter.value(); | ||||
|     } | ||||
| } | ||||
|  | ||||
| // global instance | ||||
| ExtendedCharTable ExtendedCharTable::instance; | ||||
|  | ||||
|  | ||||
| //#include "Emulation.moc" | ||||
|  | ||||
							
								
								
									
										467
									
								
								konsole-qml-plugin/src/Emulation.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										467
									
								
								konsole-qml-plugin/src/Emulation.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,467 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|      | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef EMULATION_H | ||||
| #define EMULATION_H | ||||
|  | ||||
| // System | ||||
| #include <stdio.h> | ||||
|  | ||||
| // Qt  | ||||
| #include <QtGui/QKeyEvent> | ||||
| //#include <QPointer> | ||||
| #include <QtCore/QTextCodec> | ||||
| #include <QtCore/QTextStream> | ||||
| #include <QtCore/QTimer> | ||||
|  | ||||
| // Konsole | ||||
| //#include "konsole_export.h" | ||||
| #define KONSOLEPRIVATE_EXPORT | ||||
|  | ||||
| class KeyboardTranslator; | ||||
| class HistoryType; | ||||
| class Screen; | ||||
| class ScreenWindow; | ||||
| class TerminalCharacterDecoder; | ||||
|  | ||||
| /**  | ||||
|  * This enum describes the available states which  | ||||
|  * the terminal emulation may be set to. | ||||
|  * | ||||
|  * These are the values used by Emulation::stateChanged()  | ||||
|  */ | ||||
| enum  | ||||
| {  | ||||
|     /** The emulation is currently receiving user input. */ | ||||
|     NOTIFYNORMAL=0,  | ||||
|     /**  | ||||
|      * The terminal program has triggered a bell event | ||||
|      * to get the user's attention. | ||||
|      */ | ||||
|     NOTIFYBELL=1,  | ||||
|     /**  | ||||
|      * The emulation is currently receiving data from its  | ||||
|      * terminal input. | ||||
|      */ | ||||
|     NOTIFYACTIVITY=2, | ||||
|  | ||||
|     // unused here?  | ||||
|     NOTIFYSILENCE=3  | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Base class for terminal emulation back-ends. | ||||
|  * | ||||
|  * The back-end is responsible for decoding an incoming character stream and  | ||||
|  * producing an output image of characters. | ||||
|  * | ||||
|  * When input from the terminal is received, the receiveData() slot should be called with | ||||
|  * the data which has arrived.  The emulation will process the data and update the  | ||||
|  * screen image accordingly.  The codec used to decode the incoming character stream | ||||
|  * into the unicode characters used internally can be specified using setCodec()  | ||||
|  * | ||||
|  * The size of the screen image can be specified by calling setImageSize() with the  | ||||
|  * desired number of lines and columns.  When new lines are added, old content | ||||
|  * is moved into a history store, which can be set by calling setHistory().  | ||||
|  * | ||||
|  * The screen image can be accessed by creating a ScreenWindow onto this emulation  | ||||
|  * by calling createWindow().  Screen windows provide access to a section of the  | ||||
|  * output.  Each screen window covers the same number of lines and columns as the  | ||||
|  * image size returned by imageSize().  The screen window can be moved up and down | ||||
|  * and provides transparent access to both the current on-screen image and the  | ||||
|  * previous output.  The screen windows emit an outputChanged signal | ||||
|  * when the section of the image they are looking at changes. | ||||
|  * Graphical views can then render the contents of a screen window, listening for notifications | ||||
|  * of output changes from the screen window which they are associated with and updating  | ||||
|  * accordingly.  | ||||
|  * | ||||
|  * The emulation also is also responsible for converting input from the connected views such | ||||
|  * as keypresses and mouse activity into a character string which can be sent | ||||
|  * to the terminal program.  Key presses can be processed by calling the sendKeyEvent() slot, | ||||
|  * while mouse events can be processed using the sendMouseEvent() slot.  When the character | ||||
|  * stream has been produced, the emulation will emit a sendData() signal with a pointer | ||||
|  * to the character buffer.  This data should be fed to the standard input of the terminal | ||||
|  * process.  The translation of key presses into an output character stream is performed | ||||
|  * using a lookup in a set of key bindings which map key sequences to output | ||||
|  * character sequences.  The name of the key bindings set used can be specified using | ||||
|  * setKeyBindings() | ||||
|  * | ||||
|  * The emulation maintains certain state information which changes depending on the  | ||||
|  * input received.  The emulation can be reset back to its starting state by calling  | ||||
|  * reset().   | ||||
|  * | ||||
|  * The emulation also maintains an activity state, which specifies whether | ||||
|  * terminal is currently active ( when data is received ), normal | ||||
|  * ( when the terminal is idle or receiving user input ) or trying | ||||
|  * to alert the user ( also known as a "Bell" event ).  The stateSet() signal | ||||
|  * is emitted whenever the activity state is set.  This can be used to determine | ||||
|  * how long the emulation has been active/idle for and also respond to | ||||
|  * a 'bell' event in different ways. | ||||
|  */ | ||||
| class KONSOLEPRIVATE_EXPORT Emulation : public QObject | ||||
| {  | ||||
| Q_OBJECT | ||||
|  | ||||
| public: | ||||
|   | ||||
|    /** Constructs a new terminal emulation */  | ||||
|    Emulation(); | ||||
|   ~Emulation(); | ||||
|  | ||||
|   /** | ||||
|    * Creates a new window onto the output from this emulation.  The contents | ||||
|    * of the window are then rendered by views which are set to use this window using the | ||||
|    * TerminalDisplay::setScreenWindow() method. | ||||
|    */ | ||||
|   ScreenWindow* createWindow(); | ||||
|  | ||||
|   /** Returns the size of the screen image which the emulation produces */ | ||||
|   QSize imageSize() const; | ||||
|  | ||||
|   /** | ||||
|    * Returns the total number of lines, including those stored in the history. | ||||
|    */  | ||||
|   int lineCount() const; | ||||
|  | ||||
|   /**  | ||||
|    * Sets the history store used by this emulation.  When new lines | ||||
|    * are added to the output, older lines at the top of the screen are transferred to a history | ||||
|    * store.    | ||||
|    * | ||||
|    * The number of lines which are kept and the storage location depend on the  | ||||
|    * type of store. | ||||
|    */ | ||||
|   void setHistory(const HistoryType&); | ||||
|   /** Returns the history store used by this emulation.  See setHistory() */ | ||||
|   const HistoryType& history() const; | ||||
|   /** Clears the history scroll. */ | ||||
|   void clearHistory(); | ||||
|  | ||||
|   /**  | ||||
|    * Copies the output history from @p startLine to @p endLine  | ||||
|    * into @p stream, using @p decoder to convert the terminal | ||||
|    * characters into text.  | ||||
|    * | ||||
|    * @param decoder A decoder which converts lines of terminal characters with  | ||||
|    * appearance attributes into output text.  PlainTextDecoder is the most commonly | ||||
|    * used decoder. | ||||
|    * @param startLine Index of first line to copy | ||||
|    * @param endLine Index of last line to copy | ||||
|    */ | ||||
|   virtual void writeToStream(TerminalCharacterDecoder* decoder,int startLine,int endLine); | ||||
|    | ||||
|   /** Returns the codec used to decode incoming characters.  See setCodec() */ | ||||
|   const QTextCodec* codec() const { return _codec; } | ||||
|   /** Sets the codec used to decode incoming characters.  */ | ||||
|   void setCodec(const QTextCodec*); | ||||
|  | ||||
|   /**  | ||||
|    * Convenience method.   | ||||
|    * Returns true if the current codec used to decode incoming | ||||
|    * characters is UTF-8 | ||||
|    */ | ||||
|   bool utf8() const | ||||
|   { Q_ASSERT(_codec); return _codec->mibEnum() == 106; } | ||||
|    | ||||
|  | ||||
|   /** TODO Document me */ | ||||
|   virtual char eraseChar() const; | ||||
|  | ||||
|   /**  | ||||
|    * Sets the key bindings used to key events | ||||
|    * ( received through sendKeyEvent() ) into character | ||||
|    * streams to send to the terminal. | ||||
|    */ | ||||
|   void setKeyBindings(const QString& name); | ||||
|   /**  | ||||
|    * Returns the name of the emulation's current key bindings. | ||||
|    * See setKeyBindings() | ||||
|    */ | ||||
|   QString keyBindings() const; | ||||
|  | ||||
|   /**  | ||||
|    * Copies the current image into the history and clears the screen. | ||||
|    */ | ||||
|   virtual void clearEntireScreen() =0; | ||||
|  | ||||
|   /** Resets the state of the terminal. */ | ||||
|   virtual void reset() =0; | ||||
|  | ||||
|   /**  | ||||
|    * Returns true if the active terminal program wants | ||||
|    * mouse input events. | ||||
|    * | ||||
|    * The programUsesMouseChanged() signal is emitted when this | ||||
|    * changes. | ||||
|    */ | ||||
|   bool programUsesMouse() const; | ||||
|  | ||||
| public slots:  | ||||
|  | ||||
|   /** Change the size of the emulation's image */ | ||||
|   virtual void setImageSize(int lines, int columns); | ||||
|    | ||||
|   /**  | ||||
|    * Interprets a sequence of characters and sends the result to the terminal. | ||||
|    * This is equivalent to calling sendKeyEvent() for each character in @p text in succession. | ||||
|    */ | ||||
|   virtual void sendText(const QString& text) = 0; | ||||
|  | ||||
|   /**  | ||||
|    * Interprets a key press event and emits the sendData() signal with | ||||
|    * the resulting character stream.  | ||||
|    */ | ||||
|   virtual void sendKeyEvent(QKeyEvent*); | ||||
|   | ||||
|   /**  | ||||
|    * Converts information about a mouse event into an xterm-compatible escape | ||||
|    * sequence and emits the character sequence via sendData() | ||||
|    */ | ||||
|   virtual void sendMouseEvent(int buttons, int column, int line, int eventType); | ||||
|    | ||||
|   /** | ||||
|    * Sends a string of characters to the foreground terminal process.  | ||||
|    * | ||||
|    * @param string The characters to send.   | ||||
|    * @param length Length of @p string or if set to a negative value, @p string will | ||||
|    * be treated as a null-terminated string and its length will be determined automatically. | ||||
|    */ | ||||
|   virtual void sendString(const char* string, int length = -1) = 0; | ||||
|  | ||||
|   /**  | ||||
|    * Processes an incoming stream of characters.  receiveData() decodes the incoming | ||||
|    * character buffer using the current codec(), and then calls receiveChar() for | ||||
|    * each unicode character in the resulting buffer.   | ||||
|    * | ||||
|    * receiveData() also starts a timer which causes the outputChanged() signal | ||||
|    * to be emitted when it expires.  The timer allows multiple updates in quick | ||||
|    * succession to be buffered into a single outputChanged() signal emission. | ||||
|    * | ||||
|    * @param buffer A string of characters received from the terminal program. | ||||
|    * @param len The length of @p buffer | ||||
|    */ | ||||
|   void receiveData(const char* buffer,int len); | ||||
|  | ||||
| signals: | ||||
|  | ||||
|   /**  | ||||
|    * Emitted when a buffer of data is ready to send to the  | ||||
|    * standard input of the terminal. | ||||
|    * | ||||
|    * @param data The buffer of data ready to be sent | ||||
|    * @param len The length of @p data in bytes | ||||
|    */ | ||||
|   void sendData(const char* data,int len); | ||||
|  | ||||
|   /**  | ||||
|    * Requests that sending of input to the emulation | ||||
|    * from the terminal process be suspended or resumed. | ||||
|    * | ||||
|    * @param suspend If true, requests that sending of  | ||||
|    * input from the terminal process' stdout be  | ||||
|    * suspended.  Otherwise requests that sending of | ||||
|    * input be resumed.  | ||||
|    */ | ||||
|   void lockPtyRequest(bool suspend); | ||||
|  | ||||
|   /** | ||||
|    * Requests that the pty used by the terminal process | ||||
|    * be set to UTF 8 mode.   | ||||
|    * | ||||
|    * TODO: More documentation | ||||
|    */ | ||||
|   void useUtf8Request(bool); | ||||
|  | ||||
|   /** | ||||
|    * Emitted when the activity state of the emulation is set. | ||||
|    * | ||||
|    * @param state The new activity state, one of NOTIFYNORMAL, NOTIFYACTIVITY | ||||
|    * or NOTIFYBELL | ||||
|    */ | ||||
|   void stateSet(int state); | ||||
|  | ||||
|   /** TODO Document me */ | ||||
|   void zmodemDetected(); | ||||
|  | ||||
|  | ||||
|   /** | ||||
|    * Requests that the color of the text used | ||||
|    * to represent the tabs associated with this | ||||
|    * emulation be changed.  This is a Konsole-specific | ||||
|    * extension from pre-KDE 4 times. | ||||
|    * | ||||
|    * TODO: Document how the parameter works. | ||||
|    */ | ||||
|   void changeTabTextColorRequest(int color); | ||||
|  | ||||
|   /**  | ||||
|    * This is emitted when the program running in the shell indicates whether or | ||||
|    * not it is interested in mouse events. | ||||
|    * | ||||
|    * @param usesMouse This will be true if the program wants to be informed about | ||||
|    * mouse events or false otherwise. | ||||
|    */ | ||||
|   void programUsesMouseChanged(bool usesMouse); | ||||
|  | ||||
|   /**  | ||||
|    * Emitted when the contents of the screen image change. | ||||
|    * The emulation buffers the updates from successive image changes, | ||||
|    * and only emits outputChanged() at sensible intervals when | ||||
|    * there is a lot of terminal activity. | ||||
|    * | ||||
|    * Normally there is no need for objects other than the screen windows | ||||
|    * created with createWindow() to listen for this signal. | ||||
|    * | ||||
|    * ScreenWindow objects created using createWindow() will emit their | ||||
|    * own outputChanged() signal in response to this signal.  | ||||
|    */ | ||||
|   void outputChanged(); | ||||
|  | ||||
|   /** | ||||
|    * Emitted when the program running in the terminal wishes to update the  | ||||
|    * session's title.  This also allows terminal programs to customize other | ||||
|    * aspects of the terminal emulation display.  | ||||
|    * | ||||
|    * This signal is emitted when the escape sequence "\033]ARG;VALUE\007" | ||||
|    * is received in the input string, where ARG is a number specifying what | ||||
|    * should change and VALUE is a string specifying the new value. | ||||
|    * | ||||
|    * TODO:  The name of this method is not very accurate since this method | ||||
|    * is used to perform a whole range of tasks besides just setting | ||||
|    * the user-title of the session.     | ||||
|    * | ||||
|    * @param title Specifies what to change. | ||||
|    * <ul> | ||||
|    * <li>0 - Set window icon text and session title to @p newTitle</li> | ||||
|    * <li>1 - Set window icon text to @p newTitle</li> | ||||
|    * <li>2 - Set session title to @p newTitle</li> | ||||
|    * <li>11 - Set the session's default background color to @p newTitle, | ||||
|    *         where @p newTitle can be an HTML-style string ("#RRGGBB") or a named | ||||
|    *         color (eg 'red', 'blue').   | ||||
|    *         See http://doc.trolltech.com/4.2/qcolor.html#setNamedColor for more | ||||
|    *         details. | ||||
|    * </li> | ||||
|    * <li>31 - Supposedly treats @p newTitle as a URL and opens it (NOT IMPLEMENTED)</li> | ||||
|    * <li>32 - Sets the icon associated with the session.  @p newTitle is the name  | ||||
|    *    of the icon to use, which can be the name of any icon in the current KDE icon | ||||
|    *    theme (eg: 'konsole', 'kate', 'folder_home')</li> | ||||
|    * </ul> | ||||
|    * @param newTitle Specifies the new title  | ||||
|    */ | ||||
|  | ||||
|   void titleChanged(int title,const QString& newTitle); | ||||
|  | ||||
|   /** | ||||
|    * Emitted when the program running in the terminal changes the | ||||
|    * screen size. | ||||
|    */ | ||||
|   void imageSizeChanged(int lineCount , int columnCount); | ||||
|  | ||||
|   /**  | ||||
|    * Emitted when the terminal program requests to change various properties | ||||
|    * of the terminal display.   | ||||
|    * | ||||
|    * A profile change command occurs when a special escape sequence, followed | ||||
|    * by a string containing a series of name and value pairs is received. | ||||
|    * This string can be parsed using a ProfileCommandParser instance. | ||||
|    * | ||||
|    * @param text A string expected to contain a series of key and value pairs in | ||||
|    * the form:  name=value;name2=value2 ... | ||||
|    */ | ||||
|   void profileChangeCommandReceived(const QString& text); | ||||
|  | ||||
|   /**  | ||||
|    * Emitted when a flow control key combination ( Ctrl+S or Ctrl+Q ) is pressed. | ||||
|    * @param suspendKeyPressed True if Ctrl+S was pressed to suspend output or Ctrl+Q to | ||||
|    * resume output. | ||||
|    */ | ||||
|   void flowControlKeyPressed(bool suspendKeyPressed); | ||||
|  | ||||
| protected: | ||||
|   virtual void setMode(int mode) = 0; | ||||
|   virtual void resetMode(int mode) = 0; | ||||
|     | ||||
|   /**  | ||||
|    * Processes an incoming character.  See receiveData() | ||||
|    * @p ch A unicode character code.  | ||||
|    */ | ||||
|   virtual void receiveChar(int ch); | ||||
|  | ||||
|   /**  | ||||
|    * Sets the active screen.  The terminal has two screens, primary and alternate. | ||||
|    * The primary screen is used by default.  When certain interactive programs such | ||||
|    * as Vim are run, they trigger a switch to the alternate screen. | ||||
|    * | ||||
|    * @param index 0 to switch to the primary screen, or 1 to switch to the alternate screen | ||||
|    */ | ||||
|   void setScreen(int index);  | ||||
|  | ||||
|   enum EmulationCodec | ||||
|   { | ||||
|       LocaleCodec = 0, | ||||
|       Utf8Codec   = 1 | ||||
|   }; | ||||
|   void setCodec(EmulationCodec codec); // codec number, 0 = locale, 1=utf8 | ||||
|  | ||||
|  | ||||
|   QList<ScreenWindow*> _windows; | ||||
|    | ||||
|   Screen* _currentScreen;  // pointer to the screen which is currently active,  | ||||
|                             // this is one of the elements in the screen[] array | ||||
|  | ||||
|   Screen* _screen[2];      // 0 = primary screen ( used by most programs, including the shell | ||||
|                             //                      scrollbars are enabled in this mode ) | ||||
|                             // 1 = alternate      ( used by vi , emacs etc. | ||||
|                             //                      scrollbars are not enabled in this mode ) | ||||
|                              | ||||
|    | ||||
|   //decodes an incoming C-style character stream into a unicode QString using  | ||||
|   //the current text codec.  (this allows for rendering of non-ASCII characters in text files etc.) | ||||
|   const QTextCodec* _codec; | ||||
|   QTextDecoder* _decoder; | ||||
|   const KeyboardTranslator* _keyTranslator; // the keyboard layout | ||||
|  | ||||
| protected slots: | ||||
|   /**  | ||||
|    * Schedules an update of attached views. | ||||
|    * Repeated calls to bufferedUpdate() in close succession will result in only a single update, | ||||
|    * much like the Qt buffered update of widgets.  | ||||
|    */ | ||||
|   void bufferedUpdate(); | ||||
|  | ||||
| private slots:  | ||||
|  | ||||
|   // triggered by timer, causes the emulation to send an updated screen image to each | ||||
|   // view | ||||
|   void showBulk();  | ||||
|  | ||||
|   void usesMouseChanged(bool usesMouse); | ||||
|  | ||||
| private: | ||||
|   bool _usesMouse; | ||||
|   QTimer _bulkTimer1; | ||||
|   QTimer _bulkTimer2; | ||||
|    | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif // ifndef EMULATION_H | ||||
							
								
								
									
										74
									
								
								konsole-qml-plugin/src/ExtendedDefaultTranslator.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										74
									
								
								konsole-qml-plugin/src/ExtendedDefaultTranslator.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,74 @@ | ||||
| "keyboard \"Default (XFree 4)\"" | ||||
| "key Escape             : \"\\E\"" | ||||
| "key Tab   -Shift       : \"\\t\"\n" | ||||
| "key Tab   +Shift+Ansi  : \"\\E[Z\"\n" | ||||
| "key Tab   +Shift-Ansi  : \"\\t\"\n" | ||||
| "key Backtab     +Ansi  : \"\\E[Z\"\n" | ||||
| "key Backtab     -Ansi  : \"\\t\"\n" | ||||
| "key Return-Shift-NewLine : \"\\r\"\n" | ||||
| "key Return-Shift+NewLine : \"\\r\\n\"\n" | ||||
| "key Return+Shift         : \"\\EOM\"\n" | ||||
| "key Backspace      : \"\\x7f\"\n" | ||||
| "key Up   -Shift-Ansi : \"\\EA\"\n" | ||||
| "key Down -Shift-Ansi : \"\\EB\"\n" | ||||
| "key Right-Shift-Ansi : \"\\EC\"\n" | ||||
| "key Left -Shift-Ansi : \"\\ED\"\n" | ||||
| "key Up    -Shift-AnyMod+Ansi+AppCuKeys           : \"\\EOA\"\n" | ||||
| "key Down  -Shift-AnyMod+Ansi+AppCuKeys           : \"\\EOB\"\n" | ||||
| "key Right -Shift-AnyMod+Ansi+AppCuKeys           : \"\\EOC\"\n" | ||||
| "key Left  -Shift-AnyMod+Ansi+AppCuKeys           : \"\\EOD\"\n" | ||||
| "key Up    -Shift-AnyMod+Ansi-AppCuKeys           : \"\\E[A\"\n" | ||||
| "key Down  -Shift-AnyMod+Ansi-AppCuKeys           : \"\\E[B\"\n" | ||||
| "key Right -Shift-AnyMod+Ansi-AppCuKeys           : \"\\E[C\"\n" | ||||
| "key Left  -Shift-AnyMod+Ansi-AppCuKeys           : \"\\E[D\"\n" | ||||
| "key Up    -Shift+AnyMod+Ansi                     : \"\\E[1;*A\"\n" | ||||
| "key Down  -Shift+AnyMod+Ansi                     : \"\\E[1;*B\"\n" | ||||
| "key Right -Shift+AnyMod+Ansi                     : \"\\E[1;*C\"\n" | ||||
| "key Left  -Shift+AnyMod+Ansi                     : \"\\E[1;*D\"\n" | ||||
| "key Enter+NewLine : \"\\r\\n\"\n" | ||||
| "key Enter-NewLine : \"\\r\"\n" | ||||
| "key Home        -AnyMod     -AppCuKeys           : \"\\E[H\"  \n" | ||||
| "key End         -AnyMod     -AppCuKeys           : \"\\E[F\"  \n" | ||||
| "key Home        -AnyMod     +AppCuKeys           : \"\\EOH\"  \n" | ||||
| "key End         -AnyMod     +AppCuKeys           : \"\\EOF\"  \n" | ||||
| "key Home        +AnyMod                          : \"\\E[1;*H\"\n" | ||||
| "key End         +AnyMod                          : \"\\E[1;*F\"\n" | ||||
| "key Insert      -AnyMod                          : \"\\E[2~\"\n" | ||||
| "key Delete      -AnyMod                          : \"\\E[3~\"\n" | ||||
| "key Insert      +AnyMod                          : \"\\E[2;*~\"\n" | ||||
| "key Delete      +AnyMod                          : \"\\E[3;*~\"\n" | ||||
| "key Prior -Shift-AnyMod                          : \"\\E[5~\"\n" | ||||
| "key Next  -Shift-AnyMod                          : \"\\E[6~\"\n" | ||||
| "key Prior -Shift+AnyMod                          : \"\\E[5;*~\"\n" | ||||
| "key Next  -Shift+AnyMod                          : \"\\E[6;*~\"\n" | ||||
| "key F1          -AnyMod                          : \"\\EOP\"\n" | ||||
| "key F2          -AnyMod                          : \"\\EOQ\"\n" | ||||
| "key F3          -AnyMod                          : \"\\EOR\"\n" | ||||
| "key F4          -AnyMod                          : \"\\EOS\"\n" | ||||
| "key F5          -AnyMod                          : \"\\E[15~\"\n" | ||||
| "key F6          -AnyMod                          : \"\\E[17~\"\n" | ||||
| "key F7          -AnyMod                          : \"\\E[18~\"\n" | ||||
| "key F8          -AnyMod                          : \"\\E[19~\"\n" | ||||
| "key F9          -AnyMod                          : \"\\E[20~\"\n" | ||||
| "key F10         -AnyMod                          : \"\\E[21~\"\n" | ||||
| "key F11         -AnyMod                          : \"\\E[23~\"\n" | ||||
| "key F12         -AnyMod                          : \"\\E[24~\"\n" | ||||
| "key F1          +AnyMod                          : \"\\EO*P\"\n" | ||||
| "key F2          +AnyMod                          : \"\\EO*Q\"\n" | ||||
| "key F3          +AnyMod                          : \"\\EO*R\"\n" | ||||
| "key F4          +AnyMod                          : \"\\EO*S\"\n" | ||||
| "key F5          +AnyMod                          : \"\\E[15;*~\"\n" | ||||
| "key F6          +AnyMod                          : \"\\E[17;*~\"\n" | ||||
| "key F7          +AnyMod                          : \"\\E[18;*~\"\n" | ||||
| "key F8          +AnyMod                          : \"\\E[19;*~\"\n" | ||||
| "key F9          +AnyMod                          : \"\\E[20;*~\"\n" | ||||
| "key F10         +AnyMod                          : \"\\E[21;*~\"\n" | ||||
| "key F11         +AnyMod                          : \"\\E[23;*~\"\n" | ||||
| "key F12         +AnyMod                          : \"\\E[24;*~\"\n" | ||||
| "key Space +Control : \"\\x00\"\n" | ||||
| "key Up    +Shift-AppScreen  : scrollLineUp\n" | ||||
| "key Prior +Shift-AppScreen  : scrollPageUp\n" | ||||
| "key Down  +Shift-AppScreen  : scrollLineDown\n" | ||||
| "key Next  +Shift-AppScreen  : scrollPageDown\n" | ||||
| "key ScrollLock     : scrollLock\n" | ||||
| "\0" | ||||
							
								
								
									
										542
									
								
								konsole-qml-plugin/src/Filter.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										542
									
								
								konsole-qml-plugin/src/Filter.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,542 @@ | ||||
| /* | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "Filter.h" | ||||
|  | ||||
| // System | ||||
| #include <iostream> | ||||
|  | ||||
| // Qt | ||||
| #include <QtWidgets/QAction> | ||||
| #include <QtWidgets/QApplication> | ||||
| #include <QtGui/QClipboard> | ||||
| #include <QtCore/QString> | ||||
| #include <QtCore/QTextStream> | ||||
| #include <QtCore/QSharedData> | ||||
| #include <QtCore/QFile> | ||||
| #include <QDesktopServices> | ||||
| #include <QUrl> | ||||
|  | ||||
| // KDE | ||||
| //#include <KLocale> | ||||
| //#include <KRun> | ||||
|  | ||||
| // Konsole | ||||
| #include "TerminalCharacterDecoder.h" | ||||
| #include "konsole_wcwidth.h" | ||||
|  | ||||
|  | ||||
| FilterChain::~FilterChain() | ||||
| { | ||||
|     QMutableListIterator<Filter*> iter(*this); | ||||
|      | ||||
|     while ( iter.hasNext() ) | ||||
|     { | ||||
|         Filter* filter = iter.next(); | ||||
|         iter.remove(); | ||||
|         delete filter; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void FilterChain::addFilter(Filter* filter) | ||||
| { | ||||
|     append(filter); | ||||
| } | ||||
| void FilterChain::removeFilter(Filter* filter) | ||||
| { | ||||
|     removeAll(filter); | ||||
| } | ||||
| bool FilterChain::containsFilter(Filter* filter) | ||||
| { | ||||
|     return contains(filter); | ||||
| } | ||||
| void FilterChain::reset() | ||||
| { | ||||
|     QListIterator<Filter*> iter(*this); | ||||
|     while (iter.hasNext()) | ||||
|         iter.next()->reset(); | ||||
| } | ||||
| void FilterChain::setBuffer(const QString* buffer , const QList<int>* linePositions) | ||||
| { | ||||
|     QListIterator<Filter*> iter(*this); | ||||
|     while (iter.hasNext()) | ||||
|         iter.next()->setBuffer(buffer,linePositions); | ||||
| } | ||||
| void FilterChain::process() | ||||
| { | ||||
|     QListIterator<Filter*> iter(*this); | ||||
|     while (iter.hasNext()) | ||||
|         iter.next()->process(); | ||||
| } | ||||
| void FilterChain::clear() | ||||
| { | ||||
|     QList<Filter*>::clear(); | ||||
| } | ||||
| Filter::HotSpot* FilterChain::hotSpotAt(int line , int column) const | ||||
| { | ||||
|     QListIterator<Filter*> iter(*this); | ||||
|     while (iter.hasNext()) | ||||
|     { | ||||
|         Filter* filter = iter.next(); | ||||
|         Filter::HotSpot* spot = filter->hotSpotAt(line,column); | ||||
|         if ( spot != 0 ) | ||||
|         { | ||||
|             return spot; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| QList<Filter::HotSpot*> FilterChain::hotSpots() const | ||||
| { | ||||
|     QList<Filter::HotSpot*> list; | ||||
|     QListIterator<Filter*> iter(*this); | ||||
|     while (iter.hasNext()) | ||||
|     { | ||||
|         Filter* filter = iter.next(); | ||||
|         list << filter->hotSpots(); | ||||
|     } | ||||
|     return list; | ||||
| } | ||||
| //QList<Filter::HotSpot*> FilterChain::hotSpotsAtLine(int line) const; | ||||
|  | ||||
| TerminalImageFilterChain::TerminalImageFilterChain() | ||||
| : _buffer(0) | ||||
| , _linePositions(0) | ||||
| { | ||||
| } | ||||
|  | ||||
| TerminalImageFilterChain::~TerminalImageFilterChain() | ||||
| { | ||||
|     delete _buffer; | ||||
|     delete _linePositions; | ||||
| } | ||||
|  | ||||
| void TerminalImageFilterChain::setImage(const Character* const image , int lines , int columns, const QVector<LineProperty>& lineProperties) | ||||
| { | ||||
|     if (empty()) | ||||
|         return; | ||||
|  | ||||
|     // reset all filters and hotspots | ||||
|     reset(); | ||||
|  | ||||
|     PlainTextDecoder decoder; | ||||
|     decoder.setTrailingWhitespace(false); | ||||
|      | ||||
|     // setup new shared buffers for the filters to process on | ||||
|     QString* newBuffer = new QString(); | ||||
|     QList<int>* newLinePositions = new QList<int>(); | ||||
|     setBuffer( newBuffer , newLinePositions ); | ||||
|  | ||||
|     // free the old buffers | ||||
|     delete _buffer; | ||||
|     delete _linePositions; | ||||
|  | ||||
|     _buffer = newBuffer; | ||||
|     _linePositions = newLinePositions; | ||||
|  | ||||
|     QTextStream lineStream(_buffer); | ||||
|     decoder.begin(&lineStream); | ||||
|  | ||||
|     for (int i=0 ; i < lines ; i++) | ||||
|     { | ||||
|         _linePositions->append(_buffer->length()); | ||||
|         decoder.decodeLine(image + i*columns,columns,LINE_DEFAULT); | ||||
|  | ||||
|         // pretend that each line ends with a newline character. | ||||
|         // this prevents a link that occurs at the end of one line | ||||
|         // being treated as part of a link that occurs at the start of the next line | ||||
|         // | ||||
|         // the downside is that links which are spread over more than one line are not | ||||
|         // highlighted.   | ||||
|         // | ||||
|         // TODO - Use the "line wrapped" attribute associated with lines in a | ||||
|         // terminal image to avoid adding this imaginary character for wrapped | ||||
|         // lines | ||||
|         if ( !(lineProperties.value(i,LINE_DEFAULT) & LINE_WRAPPED) ) | ||||
|             lineStream << QChar('\n'); | ||||
|     } | ||||
|     decoder.end(); | ||||
| } | ||||
|  | ||||
| Filter::Filter() : | ||||
| _linePositions(0), | ||||
| _buffer(0) | ||||
| { | ||||
| } | ||||
|  | ||||
| Filter::~Filter() | ||||
| { | ||||
|     QListIterator<HotSpot*> iter(_hotspotList); | ||||
|     while (iter.hasNext()) | ||||
|     { | ||||
|         delete iter.next(); | ||||
|     } | ||||
| } | ||||
| void Filter::reset() | ||||
| { | ||||
|     _hotspots.clear(); | ||||
|     _hotspotList.clear(); | ||||
| } | ||||
|  | ||||
| void Filter::setBuffer(const QString* buffer , const QList<int>* linePositions) | ||||
| { | ||||
|     _buffer = buffer; | ||||
|     _linePositions = linePositions; | ||||
| } | ||||
|  | ||||
| void Filter::getLineColumn(int position , int& startLine , int& startColumn) | ||||
| { | ||||
|     Q_ASSERT( _linePositions ); | ||||
|     Q_ASSERT( _buffer ); | ||||
|  | ||||
|  | ||||
|     for (int i = 0 ; i < _linePositions->count() ; i++) | ||||
|     { | ||||
|         int nextLine = 0; | ||||
|  | ||||
|         if ( i == _linePositions->count()-1 ) | ||||
|             nextLine = _buffer->length() + 1; | ||||
|         else | ||||
|             nextLine = _linePositions->value(i+1); | ||||
|  | ||||
|         if ( _linePositions->value(i) <= position && position < nextLine )  | ||||
|         { | ||||
|             startLine = i; | ||||
|             startColumn = string_width(buffer()->mid(_linePositions->value(i),position - _linePositions->value(i))); | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
| } | ||||
|      | ||||
|  | ||||
| /*void Filter::addLine(const QString& text) | ||||
| { | ||||
|     _linePositions << _buffer.length(); | ||||
|     _buffer.append(text); | ||||
| }*/ | ||||
|  | ||||
| const QString* Filter::buffer() | ||||
| { | ||||
|     return _buffer; | ||||
| } | ||||
| Filter::HotSpot::~HotSpot() | ||||
| { | ||||
| } | ||||
| void Filter::addHotSpot(HotSpot* spot) | ||||
| { | ||||
|     _hotspotList << spot; | ||||
|  | ||||
|     for (int line = spot->startLine() ; line <= spot->endLine() ; line++) | ||||
|     { | ||||
|         _hotspots.insert(line,spot); | ||||
|     }     | ||||
| } | ||||
| QList<Filter::HotSpot*> Filter::hotSpots() const | ||||
| { | ||||
|     return _hotspotList; | ||||
| } | ||||
| QList<Filter::HotSpot*> Filter::hotSpotsAtLine(int line) const | ||||
| { | ||||
|     return _hotspots.values(line); | ||||
| } | ||||
|  | ||||
| Filter::HotSpot* Filter::hotSpotAt(int line , int column) const | ||||
| { | ||||
|     QListIterator<HotSpot*> spotIter(_hotspots.values(line)); | ||||
|  | ||||
|     while (spotIter.hasNext()) | ||||
|     { | ||||
|         HotSpot* spot = spotIter.next(); | ||||
|          | ||||
|         if ( spot->startLine() == line && spot->startColumn() > column ) | ||||
|             continue; | ||||
|         if ( spot->endLine() == line && spot->endColumn() < column ) | ||||
|             continue; | ||||
|         | ||||
|         return spot; | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| Filter::HotSpot::HotSpot(int startLine , int startColumn , int endLine , int endColumn) | ||||
|     : _startLine(startLine) | ||||
|     , _startColumn(startColumn) | ||||
|     , _endLine(endLine) | ||||
|     , _endColumn(endColumn) | ||||
|     , _type(NotSpecified) | ||||
| { | ||||
| } | ||||
| QString Filter::HotSpot::tooltip() const | ||||
| { | ||||
|     return QString(); | ||||
| } | ||||
| QList<QAction*> Filter::HotSpot::actions() | ||||
| { | ||||
|     return QList<QAction*>(); | ||||
| } | ||||
| int Filter::HotSpot::startLine() const | ||||
| { | ||||
|     return _startLine; | ||||
| } | ||||
| int Filter::HotSpot::endLine() const | ||||
| { | ||||
|     return _endLine; | ||||
| } | ||||
| int Filter::HotSpot::startColumn() const | ||||
| { | ||||
|     return _startColumn; | ||||
| } | ||||
| int Filter::HotSpot::endColumn() const | ||||
| { | ||||
|     return _endColumn; | ||||
| } | ||||
| Filter::HotSpot::Type Filter::HotSpot::type() const | ||||
| { | ||||
|     return _type; | ||||
| } | ||||
| void Filter::HotSpot::setType(Type type) | ||||
| { | ||||
|     _type = type; | ||||
| } | ||||
|  | ||||
| RegExpFilter::RegExpFilter() | ||||
| { | ||||
| } | ||||
|  | ||||
| RegExpFilter::HotSpot::HotSpot(int startLine,int startColumn,int endLine,int endColumn) | ||||
|     : Filter::HotSpot(startLine,startColumn,endLine,endColumn) | ||||
| { | ||||
|     setType(Marker); | ||||
| } | ||||
|  | ||||
| void RegExpFilter::HotSpot::activate(QObject*) | ||||
| { | ||||
| } | ||||
|  | ||||
| void RegExpFilter::HotSpot::setCapturedTexts(const QStringList& texts) | ||||
| { | ||||
|     _capturedTexts = texts; | ||||
| } | ||||
| QStringList RegExpFilter::HotSpot::capturedTexts() const | ||||
| { | ||||
|     return _capturedTexts; | ||||
| } | ||||
|  | ||||
| void RegExpFilter::setRegExp(const QRegExp& regExp)  | ||||
| { | ||||
|     _searchText = regExp; | ||||
| } | ||||
| QRegExp RegExpFilter::regExp() const | ||||
| { | ||||
|     return _searchText; | ||||
| } | ||||
| /*void RegExpFilter::reset(int) | ||||
| { | ||||
|     _buffer = QString(); | ||||
| }*/ | ||||
| void RegExpFilter::process() | ||||
| { | ||||
|     int pos = 0; | ||||
|     const QString* text = buffer(); | ||||
|  | ||||
|     Q_ASSERT( text ); | ||||
|  | ||||
|     // ignore any regular expressions which match an empty string. | ||||
|     // otherwise the while loop below will run indefinitely | ||||
|     static const QString emptyString(""); | ||||
|     if ( _searchText.exactMatch(emptyString) ) | ||||
|         return; | ||||
|  | ||||
|     while(pos >= 0) | ||||
|     { | ||||
|         pos = _searchText.indexIn(*text,pos); | ||||
|  | ||||
|         if ( pos >= 0 ) | ||||
|         { | ||||
|             int startLine = 0; | ||||
|             int endLine = 0; | ||||
|             int startColumn = 0; | ||||
|             int endColumn = 0; | ||||
|  | ||||
|             getLineColumn(pos,startLine,startColumn); | ||||
|             getLineColumn(pos + _searchText.matchedLength(),endLine,endColumn); | ||||
|  | ||||
|             RegExpFilter::HotSpot* spot = newHotSpot(startLine,startColumn, | ||||
|                                            endLine,endColumn); | ||||
|             spot->setCapturedTexts(_searchText.capturedTexts()); | ||||
|  | ||||
|             addHotSpot( spot );   | ||||
|             pos += _searchText.matchedLength(); | ||||
|  | ||||
|             // if matchedLength == 0, the program will get stuck in an infinite loop | ||||
|             if ( _searchText.matchedLength() == 0 ) | ||||
|                 pos = -1; | ||||
|         } | ||||
|     }     | ||||
| } | ||||
|  | ||||
| RegExpFilter::HotSpot* RegExpFilter::newHotSpot(int startLine,int startColumn, | ||||
|                                                 int endLine,int endColumn) | ||||
| { | ||||
|     return new RegExpFilter::HotSpot(startLine,startColumn, | ||||
|                                                   endLine,endColumn); | ||||
| } | ||||
| RegExpFilter::HotSpot* UrlFilter::newHotSpot(int startLine,int startColumn,int endLine, | ||||
|                                                     int endColumn) | ||||
| { | ||||
|     return new UrlFilter::HotSpot(startLine,startColumn, | ||||
|                                                endLine,endColumn); | ||||
| } | ||||
| UrlFilter::HotSpot::HotSpot(int startLine,int startColumn,int endLine,int endColumn) | ||||
| : RegExpFilter::HotSpot(startLine,startColumn,endLine,endColumn) | ||||
| , _urlObject(new FilterObject(this)) | ||||
| { | ||||
|     setType(Link); | ||||
| } | ||||
| QString UrlFilter::HotSpot::tooltip() const | ||||
| { | ||||
|     QString url = capturedTexts().first(); | ||||
|  | ||||
|     const UrlType kind = urlType(); | ||||
|  | ||||
|     if ( kind == StandardUrl ) | ||||
|         return QString();  | ||||
|     else if ( kind == Email ) | ||||
|         return QString();  | ||||
|     else | ||||
|         return QString(); | ||||
| } | ||||
| UrlFilter::HotSpot::UrlType UrlFilter::HotSpot::urlType() const | ||||
| { | ||||
|     QString url = capturedTexts().first(); | ||||
|      | ||||
|     if ( FullUrlRegExp.exactMatch(url) ) | ||||
|         return StandardUrl; | ||||
|     else if ( EmailAddressRegExp.exactMatch(url) ) | ||||
|         return Email; | ||||
|     else | ||||
|         return Unknown; | ||||
| } | ||||
|  | ||||
| void UrlFilter::HotSpot::activate(QObject* object) | ||||
| { | ||||
|     QString url = capturedTexts().first(); | ||||
|  | ||||
|     const UrlType kind = urlType(); | ||||
|  | ||||
|     const QString& actionName = object ? object->objectName() : QString(); | ||||
|  | ||||
|     if ( actionName == "copy-action" ) | ||||
|     { | ||||
|         QApplication::clipboard()->setText(url); | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     if ( !object || actionName == "open-action" ) | ||||
|     { | ||||
|         if ( kind == StandardUrl ) | ||||
|         { | ||||
|             // if the URL path does not include the protocol ( eg. "www.kde.org" ) then | ||||
|             // prepend http:// ( eg. "www.kde.org" --> "http://www.kde.org" ) | ||||
|             if (!url.contains("://")) | ||||
|             { | ||||
|                 url.prepend("http://"); | ||||
|             } | ||||
|         }  | ||||
|         else if ( kind == Email ) | ||||
|         { | ||||
|             url.prepend("mailto:"); | ||||
|         } | ||||
|      | ||||
|         QDesktopServices::openUrl(QUrl(url)); | ||||
|         //new KRun(url,QApplication::activeWindow()); | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Note:  Altering these regular expressions can have a major effect on the performance of the filters  | ||||
| // used for finding URLs in the text, especially if they are very general and could match very long | ||||
| // pieces of text. | ||||
| // Please be careful when altering them. | ||||
|  | ||||
| //regexp matches: | ||||
| // full url:   | ||||
| // protocolname:// or www. followed by anything other than whitespaces, <, >, ' or ", and ends before whitespaces, <, >, ', ", ], !, comma and dot | ||||
| const QRegExp UrlFilter::FullUrlRegExp("(www\\.(?!\\.)|[a-z][a-z0-9+.-]*://)[^\\s<>'\"]+[^!,\\.\\s<>'\"\\]]"); | ||||
| // email address: | ||||
| // [word chars, dots or dashes]@[word chars, dots or dashes].[word chars] | ||||
| const QRegExp UrlFilter::EmailAddressRegExp("\\b(\\w|\\.|-)+@(\\w|\\.|-)+\\.\\w+\\b"); | ||||
|  | ||||
| // matches full url or email address | ||||
| const QRegExp UrlFilter::CompleteUrlRegExp('('+FullUrlRegExp.pattern()+'|'+ | ||||
|                                             EmailAddressRegExp.pattern()+')'); | ||||
|  | ||||
| UrlFilter::UrlFilter() | ||||
| { | ||||
|     setRegExp( CompleteUrlRegExp ); | ||||
| } | ||||
| UrlFilter::HotSpot::~HotSpot() | ||||
| { | ||||
|     delete _urlObject; | ||||
| } | ||||
| void FilterObject::activated() | ||||
| { | ||||
|     _filter->activate(sender()); | ||||
| } | ||||
| QList<QAction*> UrlFilter::HotSpot::actions() | ||||
| { | ||||
|     QList<QAction*> list; | ||||
|  | ||||
|     const UrlType kind = urlType(); | ||||
|  | ||||
|     QAction* openAction = new QAction(_urlObject); | ||||
|     QAction* copyAction = new QAction(_urlObject);; | ||||
|  | ||||
|     Q_ASSERT( kind == StandardUrl || kind == Email ); | ||||
|  | ||||
|     if ( kind == StandardUrl ) | ||||
|     { | ||||
|         openAction->setText(QObject::tr("Open Link")); | ||||
|         copyAction->setText(QObject::tr("Copy Link Address")); | ||||
|     } | ||||
|     else if ( kind == Email ) | ||||
|     { | ||||
|         openAction->setText(QObject::tr("Send Email To...")); | ||||
|         copyAction->setText(QObject::tr("Copy Email Address")); | ||||
|     } | ||||
|  | ||||
|     // object names are set here so that the hotspot performs the | ||||
|     // correct action when activated() is called with the triggered | ||||
|     // action passed as a parameter. | ||||
|     openAction->setObjectName( QLatin1String("open-action" )); | ||||
|     copyAction->setObjectName( QLatin1String("copy-action" )); | ||||
|  | ||||
|     QObject::connect( openAction , SIGNAL(triggered()) , _urlObject , SLOT(activated()) ); | ||||
|     QObject::connect( copyAction , SIGNAL(triggered()) , _urlObject , SLOT(activated()) ); | ||||
|  | ||||
|     list << openAction; | ||||
|     list << copyAction; | ||||
|  | ||||
|     return list;  | ||||
| } | ||||
|  | ||||
| //#include "Filter.moc" | ||||
							
								
								
									
										380
									
								
								konsole-qml-plugin/src/Filter.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										380
									
								
								konsole-qml-plugin/src/Filter.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,380 @@ | ||||
| /* | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef FILTER_H | ||||
| #define FILTER_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtWidgets/QAction> | ||||
| #include <QtCore/QList> | ||||
| #include <QtCore/QObject> | ||||
| #include <QtCore/QStringList> | ||||
| #include <QtCore/QHash> | ||||
| #include <QtCore/QRegExp> | ||||
|  | ||||
| // Local | ||||
| #include "Character.h" | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A filter processes blocks of text looking for certain patterns (such as URLs or keywords from a list) | ||||
|  * and marks the areas which match the filter's patterns as 'hotspots'. | ||||
|  * | ||||
|  * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ), | ||||
|  * and an action.  When the user performs some activity such as a mouse-click in a hotspot area ( the exact | ||||
|  * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's | ||||
|  * activate() method should be called.  Depending on the type of hotspot this will trigger a suitable response. | ||||
|  * | ||||
|  * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser. | ||||
|  * Hotspots may have more than one action, in which case the list of actions can be obtained using the  | ||||
|  * actions() method. | ||||
|  * | ||||
|  * Different subclasses of filter will return different types of hotspot. | ||||
|  * Subclasses must reimplement the process() method to examine a block of text and identify sections of interest. | ||||
|  * When processing the text they should create instances of Filter::HotSpot subclasses for sections of interest | ||||
|  * and add them to the filter's list of hotspots using addHotSpot() | ||||
|  */ | ||||
| class Filter | ||||
| { | ||||
| public: | ||||
|     /** | ||||
|     * Represents an area of text which matched the pattern a particular filter has been looking for. | ||||
|     * | ||||
|     * Each hotspot has a type identifier associated with it ( such as a link or a highlighted section ), | ||||
|     * and an action.  When the user performs some activity such as a mouse-click in a hotspot area ( the exact | ||||
|     * action will depend on what is displaying the block of text which the filter is processing ), the hotspot's | ||||
|     * activate() method should be called.  Depending on the type of hotspot this will trigger a suitable response. | ||||
|     * | ||||
|     * For example, if a hotspot represents a URL then a suitable action would be opening that URL in a web browser. | ||||
|     * Hotspots may have more than one action, in which case the list of actions can be obtained using the  | ||||
|     * actions() method.  These actions may then be displayed in a popup menu or toolbar for example.  | ||||
|     */ | ||||
|     class HotSpot | ||||
|     { | ||||
|     public: | ||||
|        /**  | ||||
|         * Constructs a new hotspot which covers the area from (@p startLine,@p startColumn) to (@p endLine,@p endColumn) | ||||
|         * in a block of text. | ||||
|         */ | ||||
|        HotSpot(int startLine , int startColumn , int endLine , int endColumn); | ||||
|        virtual ~HotSpot(); | ||||
|  | ||||
|        enum Type | ||||
|        { | ||||
|             // the type of the hotspot is not specified | ||||
|             NotSpecified, | ||||
|             // this hotspot represents a clickable link | ||||
|             Link, | ||||
|             // this hotspot represents a marker | ||||
|             Marker | ||||
|        };  | ||||
|  | ||||
|        /** Returns the line when the hotspot area starts */ | ||||
|        int startLine() const; | ||||
|        /** Returns the line where the hotspot area ends */ | ||||
|        int endLine() const; | ||||
|        /** Returns the column on startLine() where the hotspot area starts */ | ||||
|        int startColumn() const; | ||||
|        /** Returns the column on endLine() where the hotspot area ends */ | ||||
|        int endColumn() const; | ||||
|        /**  | ||||
|         * Returns the type of the hotspot.  This is usually used as a hint for views on how to represent | ||||
|         * the hotspot graphically.  eg.  Link hotspots are typically underlined when the user mouses over them | ||||
|         */ | ||||
|        Type type() const; | ||||
|        /**  | ||||
|         * Causes the an action associated with a hotspot to be triggered.  | ||||
|         * | ||||
|         * @param object The object which caused the hotspot to be triggered.  This is | ||||
|         * typically null ( in which case the default action should be performed ) or | ||||
|         * one of the objects from the actions() list.  In which case the associated | ||||
|         * action should be performed.  | ||||
|         */ | ||||
|        virtual void activate(QObject* object = 0) = 0;  | ||||
|        /**  | ||||
|         * Returns a list of actions associated with the hotspot which can be used in a  | ||||
|         * menu or toolbar  | ||||
|         */ | ||||
|        virtual QList<QAction*> actions(); | ||||
|  | ||||
|        /**  | ||||
|         * Returns the text of a tooltip to be shown when the mouse moves over the hotspot, or | ||||
|         * an empty string if there is no tooltip associated with this hotspot. | ||||
|         * | ||||
|         * The default implementation returns an empty string.  | ||||
|         */ | ||||
|        virtual QString tooltip() const; | ||||
|  | ||||
|     protected: | ||||
|        /** Sets the type of a hotspot.  This should only be set once */ | ||||
|        void setType(Type type); | ||||
|  | ||||
|     private: | ||||
|        int    _startLine; | ||||
|        int    _startColumn; | ||||
|        int    _endLine; | ||||
|        int    _endColumn; | ||||
|        Type _type; | ||||
|      | ||||
|     }; | ||||
|  | ||||
|     /** Constructs a new filter. */ | ||||
|     Filter(); | ||||
|     virtual ~Filter(); | ||||
|  | ||||
|     /** Causes the filter to process the block of text currently in its internal buffer */ | ||||
|     virtual void process() = 0; | ||||
|  | ||||
|     /**  | ||||
|      * Empties the filters internal buffer and resets the line count back to 0. | ||||
|      * All hotspots are deleted.  | ||||
|      */ | ||||
|     void reset(); | ||||
|  | ||||
|     /** Adds a new line of text to the filter and increments the line count */ | ||||
|     //void addLine(const QString& string); | ||||
|  | ||||
|     /** Returns the hotspot which covers the given @p line and @p column, or 0 if no hotspot covers that area */ | ||||
|     HotSpot* hotSpotAt(int line , int column) const; | ||||
|  | ||||
|     /** Returns the list of hotspots identified by the filter */ | ||||
|     QList<HotSpot*> hotSpots() const; | ||||
|  | ||||
|     /** Returns the list of hotspots identified by the filter which occur on a given line */ | ||||
|     QList<HotSpot*> hotSpotsAtLine(int line) const; | ||||
|  | ||||
|     /**  | ||||
|      * TODO: Document me | ||||
|      */ | ||||
|     void setBuffer(const QString* buffer , const QList<int>* linePositions); | ||||
|  | ||||
| protected: | ||||
|     /** Adds a new hotspot to the list */ | ||||
|     void addHotSpot(HotSpot*); | ||||
|     /** Returns the internal buffer */ | ||||
|     const QString* buffer(); | ||||
|     /** Converts a character position within buffer() to a line and column */ | ||||
|     void getLineColumn(int position , int& startLine , int& startColumn); | ||||
|  | ||||
| private: | ||||
|     QMultiHash<int,HotSpot*> _hotspots; | ||||
|     QList<HotSpot*> _hotspotList; | ||||
|      | ||||
|     const QList<int>* _linePositions; | ||||
|     const QString* _buffer; | ||||
| }; | ||||
|  | ||||
| /**  | ||||
|  * A filter which searches for sections of text matching a regular expression and creates a new RegExpFilter::HotSpot  | ||||
|  * instance for them. | ||||
|  * | ||||
|  * Subclasses can reimplement newHotSpot() to return custom hotspot types when matches for the regular expression | ||||
|  * are found.  | ||||
|  */ | ||||
| class RegExpFilter : public Filter | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * Type of hotspot created by RegExpFilter.  The capturedTexts() method can be used to find the text | ||||
|      * matched by the filter's regular expression. | ||||
|      */ | ||||
|     class HotSpot : public Filter::HotSpot | ||||
|     { | ||||
|     public: | ||||
|         HotSpot(int startLine, int startColumn, int endLine , int endColumn); | ||||
|         virtual void activate(QObject* object = 0); | ||||
|  | ||||
|         /** Sets the captured texts associated with this hotspot */ | ||||
|         void setCapturedTexts(const QStringList& texts); | ||||
|         /** Returns the texts found by the filter when matching the filter's regular expression */ | ||||
|         QStringList capturedTexts() const; | ||||
|     private: | ||||
|         QStringList _capturedTexts; | ||||
|     }; | ||||
|  | ||||
|     /** Constructs a new regular expression filter */ | ||||
|     RegExpFilter(); | ||||
|  | ||||
|     /**  | ||||
|      * Sets the regular expression which the filter searches for in blocks of text.  | ||||
|      * | ||||
|      * Regular expressions which match the empty string are treated as not matching | ||||
|      * anything.  | ||||
|      */ | ||||
|     void setRegExp(const QRegExp& text); | ||||
|     /** Returns the regular expression which the filter searches for in blocks of text */ | ||||
|     QRegExp regExp() const; | ||||
|  | ||||
|     /**  | ||||
|      * Reimplemented to search the filter's text buffer for text matching regExp()  | ||||
|      * | ||||
|      * If regexp matches the empty string, then process() will return immediately | ||||
|      * without finding results.  | ||||
|      */ | ||||
|     virtual void process(); | ||||
|  | ||||
| protected: | ||||
|     /**  | ||||
|      * Called when a match for the regular expression is encountered.  Subclasses should reimplement this | ||||
|      * to return custom hotspot types | ||||
|      */ | ||||
|     virtual RegExpFilter::HotSpot* newHotSpot(int startLine,int startColumn, | ||||
|                                     int endLine,int endColumn); | ||||
|  | ||||
| private: | ||||
|     QRegExp _searchText; | ||||
| }; | ||||
|  | ||||
| class FilterObject; | ||||
|  | ||||
| /** A filter which matches URLs in blocks of text */ | ||||
| class UrlFilter : public RegExpFilter  | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * Hotspot type created by UrlFilter instances.  The activate() method opens a web browser  | ||||
|      * at the given URL when called. | ||||
|      */ | ||||
|     class HotSpot : public RegExpFilter::HotSpot  | ||||
|     { | ||||
|     public: | ||||
|         HotSpot(int startLine,int startColumn,int endLine,int endColumn); | ||||
|         virtual ~HotSpot(); | ||||
|  | ||||
|         virtual QList<QAction*> actions(); | ||||
|  | ||||
|         /**  | ||||
|          * Open a web browser at the current URL.  The url itself can be determined using | ||||
|          * the capturedTexts() method. | ||||
|          */ | ||||
|         virtual void activate(QObject* object = 0); | ||||
|  | ||||
|         virtual QString tooltip() const; | ||||
|     private: | ||||
|         enum UrlType | ||||
|         { | ||||
|             StandardUrl, | ||||
|             Email, | ||||
|             Unknown | ||||
|         }; | ||||
|         UrlType urlType() const; | ||||
|  | ||||
|         FilterObject* _urlObject; | ||||
|     }; | ||||
|  | ||||
|     UrlFilter(); | ||||
|  | ||||
| protected: | ||||
|     virtual RegExpFilter::HotSpot* newHotSpot(int,int,int,int); | ||||
|  | ||||
| private: | ||||
|      | ||||
|     static const QRegExp FullUrlRegExp; | ||||
|     static const QRegExp EmailAddressRegExp; | ||||
|  | ||||
|     // combined OR of FullUrlRegExp and EmailAddressRegExp | ||||
|     static const QRegExp CompleteUrlRegExp;  | ||||
| }; | ||||
|  | ||||
| class FilterObject : public QObject | ||||
| { | ||||
| Q_OBJECT | ||||
| public: | ||||
|     FilterObject(Filter::HotSpot* filter) : _filter(filter) {} | ||||
| private slots: | ||||
|     void activated(); | ||||
| private: | ||||
|     Filter::HotSpot* _filter; | ||||
| }; | ||||
|  | ||||
| /**  | ||||
|  * A chain which allows a group of filters to be processed as one.  | ||||
|  * The chain owns the filters added to it and deletes them when the chain itself is destroyed. | ||||
|  * | ||||
|  * Use addFilter() to add a new filter to the chain.   | ||||
|  * When new text to be filtered arrives, use addLine() to add each additional | ||||
|  * line of text which needs to be processed and then after adding the last line, use | ||||
|  * process() to cause each filter in the chain to process the text. | ||||
|  * | ||||
|  * After processing a block of text, the reset() method can be used to set the filter chain's | ||||
|  * internal cursor back to the first line. | ||||
|  * | ||||
|  * The hotSpotAt() method will return the first hotspot which covers a given position. | ||||
|  * | ||||
|  * The hotSpots() and hotSpotsAtLine() method return all of the hotspots in the text and on | ||||
|  * a given line respectively. | ||||
|  */ | ||||
| class FilterChain : protected QList<Filter*> | ||||
| { | ||||
| public: | ||||
|     virtual ~FilterChain(); | ||||
|  | ||||
|     /** Adds a new filter to the chain.  The chain will delete this filter when it is destroyed */ | ||||
|     void addFilter(Filter* filter); | ||||
|     /** Removes a filter from the chain.  The chain will no longer delete the filter when destroyed */ | ||||
|     void removeFilter(Filter* filter); | ||||
|     /** Returns true if the chain contains @p filter */ | ||||
|     bool containsFilter(Filter* filter); | ||||
|     /** Removes all filters from the chain */ | ||||
|     void clear(); | ||||
|  | ||||
|     /** Resets each filter in the chain */ | ||||
|     void reset(); | ||||
|     /** | ||||
|      * Processes each filter in the chain  | ||||
|      */ | ||||
|     void process(); | ||||
|  | ||||
|     /** Sets the buffer for each filter in the chain to process. */ | ||||
|     void setBuffer(const QString* buffer , const QList<int>* linePositions);  | ||||
|  | ||||
|     /** Returns the first hotspot which occurs at @p line, @p column or 0 if no hotspot was found */ | ||||
|     Filter::HotSpot* hotSpotAt(int line , int column) const; | ||||
|     /** Returns a list of all the hotspots in all the chain's filters */ | ||||
|     QList<Filter::HotSpot*> hotSpots() const; | ||||
|     /** Returns a list of all hotspots at the given line in all the chain's filters */ | ||||
|     QList<Filter::HotSpot> hotSpotsAtLine(int line) const; | ||||
|  | ||||
| }; | ||||
|  | ||||
| /** A filter chain which processes character images from terminal displays */ | ||||
| class TerminalImageFilterChain : public FilterChain | ||||
| { | ||||
| public: | ||||
|     TerminalImageFilterChain(); | ||||
|     virtual ~TerminalImageFilterChain(); | ||||
|  | ||||
|     /** | ||||
|      * Set the current terminal image to @p image. | ||||
|      * | ||||
|      * @param image The terminal image | ||||
|      * @param lines The number of lines in the terminal image | ||||
|      * @param columns The number of columns in the terminal image | ||||
|      * @param lineProperties The line properties to set for image | ||||
|      */ | ||||
|     void setImage(const Character* const image , int lines , int columns, | ||||
|                   const QVector<LineProperty>& lineProperties);   | ||||
|  | ||||
| private: | ||||
|     QString* _buffer; | ||||
|     QList<int>* _linePositions; | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif //FILTER_H | ||||
							
								
								
									
										986
									
								
								konsole-qml-plugin/src/History.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										986
									
								
								konsole-qml-plugin/src/History.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,986 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "History.h" | ||||
|  | ||||
| // System | ||||
| #include <iostream> | ||||
| #include <stdlib.h> | ||||
| #include <assert.h> | ||||
| #include <stdio.h> | ||||
| #include <sys/types.h> | ||||
| #include <sys/mman.h> | ||||
| #include <unistd.h> | ||||
| #include <errno.h> | ||||
|  | ||||
| #include <QtDebug> | ||||
|  | ||||
| // KDE | ||||
| //#include <kde_file.h> | ||||
| //#include <kdebug.h> | ||||
|  | ||||
| // Reasonable line size | ||||
| #define LINE_SIZE    1024 | ||||
| #define KDE_lseek lseek | ||||
|  | ||||
|  | ||||
| /* | ||||
|    An arbitrary long scroll. | ||||
|  | ||||
|    One can modify the scroll only by adding either cells | ||||
|    or newlines, but access it randomly. | ||||
|  | ||||
|    The model is that of an arbitrary wide typewriter scroll | ||||
|    in that the scroll is a serie of lines and each line is | ||||
|    a serie of cells with no overwriting permitted. | ||||
|  | ||||
|    The implementation provides arbitrary length and numbers | ||||
|    of cells and line/column indexed read access to the scroll | ||||
|    at constant costs. | ||||
|  | ||||
| KDE4: Can we use QTemporaryFile here, instead of KTempFile? | ||||
|  | ||||
| FIXME: some complain about the history buffer comsuming the | ||||
|        memory of their machines. This problem is critical | ||||
|        since the history does not behave gracefully in cases | ||||
|        where the memory is used up completely. | ||||
|  | ||||
|        I put in a workaround that should handle it problem | ||||
|        now gracefully. I'm not satisfied with the solution. | ||||
|  | ||||
| FIXME: Terminating the history is not properly indicated | ||||
|        in the menu. We should throw a signal. | ||||
|  | ||||
| FIXME: There is noticeable decrease in speed, also. Perhaps, | ||||
|        there whole feature needs to be revisited therefore. | ||||
|        Disadvantage of a more elaborated, say block-oriented | ||||
|        scheme with wrap around would be it's complexity. | ||||
| */ | ||||
|  | ||||
| //FIXME: tempory replacement for tmpfile | ||||
| //       this is here one for debugging purpose. | ||||
|  | ||||
| //#define tmpfile xTmpFile | ||||
|  | ||||
| // History File /////////////////////////////////////////// | ||||
|  | ||||
| /* | ||||
|   A Row(X) data type which allows adding elements to the end. | ||||
| */ | ||||
|  | ||||
| HistoryFile::HistoryFile() | ||||
|   : ion(-1), | ||||
|     length(0), | ||||
|     fileMap(0) | ||||
| { | ||||
|   if (tmpFile.open()) | ||||
|   {  | ||||
|     tmpFile.setAutoRemove(true); | ||||
|     ion = tmpFile.handle(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| HistoryFile::~HistoryFile() | ||||
| { | ||||
|     if (fileMap) | ||||
|         unmap(); | ||||
| } | ||||
|  | ||||
| //TODO:  Mapping the entire file in will cause problems if the history file becomes exceedingly large, | ||||
| //(ie. larger than available memory).  HistoryFile::map() should only map in sections of the file at a time, | ||||
| //to avoid this. | ||||
| void HistoryFile::map() | ||||
| { | ||||
|     assert( fileMap == 0 ); | ||||
|  | ||||
|     fileMap = (char*)mmap( 0 , length , PROT_READ , MAP_PRIVATE , ion , 0 ); | ||||
|  | ||||
|     //if mmap'ing fails, fall back to the read-lseek combination | ||||
|     if ( fileMap == MAP_FAILED ) | ||||
|     { | ||||
|             readWriteBalance = 0;  | ||||
|             fileMap = 0; | ||||
|             qDebug() << __FILE__ << __LINE__ << ": mmap'ing history failed.  errno = " << errno; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void HistoryFile::unmap() | ||||
| { | ||||
|     int result = munmap( fileMap , length ); | ||||
|     assert( result == 0 ); Q_UNUSED( result ); | ||||
|  | ||||
|     fileMap = 0; | ||||
| } | ||||
|  | ||||
| bool HistoryFile::isMapped() | ||||
| { | ||||
|     return (fileMap != 0); | ||||
| } | ||||
|  | ||||
| void HistoryFile::add(const unsigned char* bytes, int len) | ||||
| { | ||||
|   if ( fileMap ) | ||||
|           unmap(); | ||||
|          | ||||
|   readWriteBalance++; | ||||
|  | ||||
|   int rc = 0; | ||||
|  | ||||
|   rc = KDE_lseek(ion,length,SEEK_SET); if (rc < 0) { perror("HistoryFile::add.seek"); return; } | ||||
|   rc = write(ion,bytes,len);       if (rc < 0) { perror("HistoryFile::add.write"); return; } | ||||
|   length += rc; | ||||
| } | ||||
|  | ||||
| void HistoryFile::get(unsigned char* bytes, int len, int loc) | ||||
| { | ||||
|   //count number of get() calls vs. number of add() calls.   | ||||
|   //If there are many more get() calls compared with add()  | ||||
|   //calls (decided by using MAP_THRESHOLD) then mmap the log | ||||
|   //file to improve performance. | ||||
|   readWriteBalance--; | ||||
|   if ( !fileMap && readWriteBalance < MAP_THRESHOLD ) | ||||
|           map(); | ||||
|  | ||||
|   if ( fileMap ) | ||||
|   { | ||||
|     for (int i=0;i<len;i++) | ||||
|             bytes[i]=fileMap[loc+i]; | ||||
|   } | ||||
|   else | ||||
|   {     | ||||
|       int rc = 0; | ||||
|  | ||||
|       if (loc < 0 || len < 0 || loc + len > length) | ||||
|         fprintf(stderr,"getHist(...,%d,%d): invalid args.\n",len,loc); | ||||
|       rc = KDE_lseek(ion,loc,SEEK_SET); if (rc < 0) { perror("HistoryFile::get.seek"); return; } | ||||
|       rc = read(ion,bytes,len);     if (rc < 0) { perror("HistoryFile::get.read"); return; } | ||||
|   } | ||||
| } | ||||
|  | ||||
| int HistoryFile::len() | ||||
| { | ||||
|   return length; | ||||
| } | ||||
|  | ||||
|  | ||||
| // History Scroll abstract base class ////////////////////////////////////// | ||||
|  | ||||
|  | ||||
| HistoryScroll::HistoryScroll(HistoryType* t) | ||||
|   : m_histType(t) | ||||
| { | ||||
| } | ||||
|  | ||||
| HistoryScroll::~HistoryScroll() | ||||
| { | ||||
|   delete m_histType; | ||||
| } | ||||
|  | ||||
| bool HistoryScroll::hasScroll() | ||||
| { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| // History Scroll File ////////////////////////////////////// | ||||
|  | ||||
| /*  | ||||
|    The history scroll makes a Row(Row(Cell)) from | ||||
|    two history buffers. The index buffer contains | ||||
|    start of line positions which refere to the cells | ||||
|    buffer. | ||||
|  | ||||
|    Note that index[0] addresses the second line | ||||
|    (line #1), while the first line (line #0) starts | ||||
|    at 0 in cells. | ||||
| */ | ||||
|  | ||||
| HistoryScrollFile::HistoryScrollFile(const QString &logFileName) | ||||
|   : HistoryScroll(new HistoryTypeFile(logFileName)), | ||||
|   m_logFileName(logFileName) | ||||
| { | ||||
| } | ||||
|  | ||||
| HistoryScrollFile::~HistoryScrollFile() | ||||
| { | ||||
| } | ||||
|   | ||||
| int HistoryScrollFile::getLines() | ||||
| { | ||||
|   return index.len() / sizeof(int); | ||||
| } | ||||
|  | ||||
| int HistoryScrollFile::getLineLen(int lineno) | ||||
| { | ||||
|   return (startOfLine(lineno+1) - startOfLine(lineno)) / sizeof(Character); | ||||
| } | ||||
|  | ||||
| bool HistoryScrollFile::isWrappedLine(int lineno) | ||||
| { | ||||
|   if (lineno>=0 && lineno <= getLines()) { | ||||
|     unsigned char flag; | ||||
|     lineflags.get((unsigned char*)&flag,sizeof(unsigned char),(lineno)*sizeof(unsigned char)); | ||||
|     return flag; | ||||
|   } | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| int HistoryScrollFile::startOfLine(int lineno) | ||||
| { | ||||
|   if (lineno <= 0) return 0; | ||||
|   if (lineno <= getLines()) | ||||
|     {  | ||||
|      | ||||
|     if (!index.isMapped()) | ||||
|             index.map(); | ||||
|      | ||||
|     int res; | ||||
|     index.get((unsigned char*)&res,sizeof(int),(lineno-1)*sizeof(int)); | ||||
|     return res; | ||||
|     } | ||||
|   return cells.len(); | ||||
| } | ||||
|  | ||||
| void HistoryScrollFile::getCells(int lineno, int colno, int count, Character res[]) | ||||
| { | ||||
|   cells.get((unsigned char*)res,count*sizeof(Character),startOfLine(lineno)+colno*sizeof(Character)); | ||||
| } | ||||
|  | ||||
| void HistoryScrollFile::addCells(const Character text[], int count) | ||||
| { | ||||
|   cells.add((unsigned char*)text,count*sizeof(Character)); | ||||
| } | ||||
|  | ||||
| void HistoryScrollFile::addLine(bool previousWrapped) | ||||
| { | ||||
|   if (index.isMapped()) | ||||
|           index.unmap(); | ||||
|  | ||||
|   int locn = cells.len(); | ||||
|   index.add((unsigned char*)&locn,sizeof(int)); | ||||
|   unsigned char flags = previousWrapped ? 0x01 : 0x00; | ||||
|   lineflags.add((unsigned char*)&flags,sizeof(unsigned char)); | ||||
| } | ||||
|  | ||||
|  | ||||
| // History Scroll Buffer ////////////////////////////////////// | ||||
| HistoryScrollBuffer::HistoryScrollBuffer(unsigned int maxLineCount) | ||||
|   : HistoryScroll(new HistoryTypeBuffer(maxLineCount)) | ||||
|    ,_historyBuffer() | ||||
|    ,_maxLineCount(0) | ||||
|    ,_usedLines(0) | ||||
|    ,_head(0) | ||||
| { | ||||
|   setMaxNbLines(maxLineCount); | ||||
| } | ||||
|  | ||||
| HistoryScrollBuffer::~HistoryScrollBuffer() | ||||
| { | ||||
|     delete[] _historyBuffer; | ||||
| } | ||||
|  | ||||
| void HistoryScrollBuffer::addCellsVector(const QVector<Character>& cells) | ||||
| { | ||||
|     _head++; | ||||
|     if ( _usedLines < _maxLineCount ) | ||||
|         _usedLines++; | ||||
|  | ||||
|     if ( _head >= _maxLineCount ) | ||||
|     { | ||||
|         _head = 0; | ||||
|     } | ||||
|  | ||||
|     _historyBuffer[bufferIndex(_usedLines-1)] = cells; | ||||
|     _wrappedLine[bufferIndex(_usedLines-1)] = false; | ||||
| } | ||||
| void HistoryScrollBuffer::addCells(const Character a[], int count) | ||||
| { | ||||
|   HistoryLine newLine(count); | ||||
|   qCopy(a,a+count,newLine.begin()); | ||||
|  | ||||
|   addCellsVector(newLine); | ||||
| } | ||||
|  | ||||
| void HistoryScrollBuffer::addLine(bool previousWrapped) | ||||
| { | ||||
|     _wrappedLine[bufferIndex(_usedLines-1)] = previousWrapped; | ||||
| } | ||||
|  | ||||
| int HistoryScrollBuffer::getLines() | ||||
| { | ||||
|     return _usedLines; | ||||
| } | ||||
|  | ||||
| int HistoryScrollBuffer::getLineLen(int lineNumber) | ||||
| { | ||||
|   Q_ASSERT( lineNumber >= 0 && lineNumber < _maxLineCount ); | ||||
|  | ||||
|   if ( lineNumber < _usedLines ) | ||||
|   { | ||||
|     return _historyBuffer[bufferIndex(lineNumber)].size(); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     return 0; | ||||
|   } | ||||
| } | ||||
|  | ||||
| bool HistoryScrollBuffer::isWrappedLine(int lineNumber) | ||||
| { | ||||
|   Q_ASSERT( lineNumber >= 0 && lineNumber < _maxLineCount ); | ||||
|      | ||||
|   if (lineNumber < _usedLines) | ||||
|   { | ||||
|     //kDebug() << "Line" << lineNumber << "wrapped is" << _wrappedLine[bufferIndex(lineNumber)]; | ||||
|     return _wrappedLine[bufferIndex(lineNumber)]; | ||||
|   } | ||||
|   else | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void HistoryScrollBuffer::getCells(int lineNumber, int startColumn, int count, Character buffer[]) | ||||
| { | ||||
|   if ( count == 0 ) return; | ||||
|  | ||||
|   Q_ASSERT( lineNumber < _maxLineCount ); | ||||
|  | ||||
|   if (lineNumber >= _usedLines)  | ||||
|   { | ||||
|     memset(buffer, 0, count * sizeof(Character)); | ||||
|     return; | ||||
|   } | ||||
|    | ||||
|   const HistoryLine& line = _historyBuffer[bufferIndex(lineNumber)]; | ||||
|  | ||||
|   //kDebug() << "startCol " << startColumn; | ||||
|   //kDebug() << "line.size() " << line.size(); | ||||
|   //kDebug() << "count " << count; | ||||
|  | ||||
|   Q_ASSERT( startColumn <= line.size() - count ); | ||||
|      | ||||
|   memcpy(buffer, line.constData() + startColumn , count * sizeof(Character)); | ||||
| } | ||||
|  | ||||
| void HistoryScrollBuffer::setMaxNbLines(unsigned int lineCount) | ||||
| { | ||||
|     HistoryLine* oldBuffer = _historyBuffer; | ||||
|     HistoryLine* newBuffer = new HistoryLine[lineCount]; | ||||
|      | ||||
|     for ( int i = 0 ; i < qMin(_usedLines,(int)lineCount) ; i++ ) | ||||
|     { | ||||
|         newBuffer[i] = oldBuffer[bufferIndex(i)]; | ||||
|     } | ||||
|      | ||||
|     _usedLines = qMin(_usedLines,(int)lineCount); | ||||
|     _maxLineCount = lineCount; | ||||
|     _head = ( _usedLines == _maxLineCount ) ? 0 : _usedLines-1; | ||||
|  | ||||
|     _historyBuffer = newBuffer; | ||||
|     delete[] oldBuffer; | ||||
|  | ||||
|     _wrappedLine.resize(lineCount); | ||||
|     dynamic_cast<HistoryTypeBuffer*>(m_histType)->m_nbLines = lineCount; | ||||
| } | ||||
|  | ||||
| int HistoryScrollBuffer::bufferIndex(int lineNumber) | ||||
| { | ||||
|     Q_ASSERT( lineNumber >= 0 ); | ||||
|     Q_ASSERT( lineNumber < _maxLineCount ); | ||||
|     Q_ASSERT( (_usedLines == _maxLineCount) || lineNumber <= _head ); | ||||
|  | ||||
|     if ( _usedLines == _maxLineCount ) | ||||
|     { | ||||
|         return (_head+lineNumber+1) % _maxLineCount; | ||||
|     } | ||||
|     else | ||||
|     {    | ||||
|         return lineNumber; | ||||
|     } | ||||
| } | ||||
|  | ||||
|  | ||||
| // History Scroll None ////////////////////////////////////// | ||||
|  | ||||
| HistoryScrollNone::HistoryScrollNone() | ||||
|   : HistoryScroll(new HistoryTypeNone()) | ||||
| { | ||||
| } | ||||
|  | ||||
| HistoryScrollNone::~HistoryScrollNone() | ||||
| { | ||||
| } | ||||
|  | ||||
| bool HistoryScrollNone::hasScroll() | ||||
| { | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| int  HistoryScrollNone::getLines() | ||||
| { | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| int  HistoryScrollNone::getLineLen(int) | ||||
| { | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| bool HistoryScrollNone::isWrappedLine(int /*lineno*/) | ||||
| { | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| void HistoryScrollNone::getCells(int, int, int, Character []) | ||||
| { | ||||
| } | ||||
|  | ||||
| void HistoryScrollNone::addCells(const Character [], int) | ||||
| { | ||||
| } | ||||
|  | ||||
| void HistoryScrollNone::addLine(bool) | ||||
| { | ||||
| } | ||||
|  | ||||
| // History Scroll BlockArray ////////////////////////////////////// | ||||
|  | ||||
| HistoryScrollBlockArray::HistoryScrollBlockArray(size_t size) | ||||
|   : HistoryScroll(new HistoryTypeBlockArray(size)) | ||||
| { | ||||
|   m_blockArray.setHistorySize(size); // nb. of lines. | ||||
| } | ||||
|  | ||||
| HistoryScrollBlockArray::~HistoryScrollBlockArray() | ||||
| { | ||||
| } | ||||
|  | ||||
| int  HistoryScrollBlockArray::getLines() | ||||
| { | ||||
|   return m_lineLengths.count(); | ||||
| } | ||||
|  | ||||
| int  HistoryScrollBlockArray::getLineLen(int lineno) | ||||
| { | ||||
|     if ( m_lineLengths.contains(lineno) ) | ||||
|         return m_lineLengths[lineno]; | ||||
|     else | ||||
|         return 0; | ||||
| } | ||||
|  | ||||
| bool HistoryScrollBlockArray::isWrappedLine(int /*lineno*/) | ||||
| { | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| void HistoryScrollBlockArray::getCells(int lineno, int colno, | ||||
|                                        int count, Character res[]) | ||||
| { | ||||
|   if (!count) return; | ||||
|  | ||||
|   const Block *b = m_blockArray.at(lineno); | ||||
|  | ||||
|   if (!b) { | ||||
|     memset(res, 0, count * sizeof(Character)); // still better than random data | ||||
|     return; | ||||
|   } | ||||
|  | ||||
|   assert(((colno + count) * sizeof(Character)) < ENTRIES); | ||||
|   memcpy(res, b->data + (colno * sizeof(Character)), count * sizeof(Character)); | ||||
| } | ||||
|  | ||||
| void HistoryScrollBlockArray::addCells(const Character a[], int count) | ||||
| { | ||||
|   Block *b = m_blockArray.lastBlock(); | ||||
|    | ||||
|   if (!b) return; | ||||
|  | ||||
|   // put cells in block's data | ||||
|   assert((count * sizeof(Character)) < ENTRIES); | ||||
|  | ||||
|   memset(b->data, 0, ENTRIES); | ||||
|  | ||||
|   memcpy(b->data, a, count * sizeof(Character)); | ||||
|   b->size = count * sizeof(Character); | ||||
|  | ||||
|   size_t res = m_blockArray.newBlock(); | ||||
|   assert (res > 0); | ||||
|   Q_UNUSED( res ); | ||||
|  | ||||
|   m_lineLengths.insert(m_blockArray.getCurrent(), count); | ||||
| } | ||||
|  | ||||
| void HistoryScrollBlockArray::addLine(bool) | ||||
| { | ||||
| } | ||||
|  | ||||
| //////////////////////////////////////////////////////////////// | ||||
| // Compact History Scroll ////////////////////////////////////// | ||||
| //////////////////////////////////////////////////////////////// | ||||
| void* CompactHistoryBlock::allocate ( size_t length ) | ||||
| { | ||||
|  Q_ASSERT ( length > 0 ); | ||||
|   if ( tail-blockStart+length > blockLength ) | ||||
|     return NULL; | ||||
|  | ||||
|   void* block = tail; | ||||
|   tail += length; | ||||
|   //kDebug() << "allocated " << length << " bytes at address " << block; | ||||
|   allocCount++; | ||||
|   return block; | ||||
| } | ||||
|  | ||||
| void CompactHistoryBlock::deallocate ( ) | ||||
| { | ||||
|   allocCount--; | ||||
|   Q_ASSERT ( allocCount >= 0 ); | ||||
| } | ||||
|  | ||||
| void* CompactHistoryBlockList::allocate(size_t size) | ||||
| { | ||||
|   CompactHistoryBlock* block; | ||||
|   if ( list.isEmpty() || list.last()->remaining() < size) | ||||
|   { | ||||
|     block = new CompactHistoryBlock(); | ||||
|     list.append ( block ); | ||||
|     //kDebug() << "new block created, remaining " << block->remaining() << "number of blocks=" << list.size(); | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     block = list.last(); | ||||
|     //kDebug() << "old block used, remaining " << block->remaining(); | ||||
|   } | ||||
|   return block->allocate(size); | ||||
| } | ||||
|  | ||||
| void CompactHistoryBlockList::deallocate(void* ptr) | ||||
| { | ||||
|   Q_ASSERT( !list.isEmpty()); | ||||
|    | ||||
|   int i=0;   | ||||
|   CompactHistoryBlock *block = list.at(i); | ||||
|   while ( i<list.size() && !block->contains(ptr) ) | ||||
|   {  | ||||
|     i++; | ||||
|     block=list.at(i); | ||||
|   } | ||||
|  | ||||
|   Q_ASSERT( i<list.size() ); | ||||
|    | ||||
|   block->deallocate(); | ||||
|  | ||||
|   if (!block->isInUse()) | ||||
|   { | ||||
|     list.removeAt(i); | ||||
|     delete block; | ||||
|     //kDebug() << "block deleted, new size = " << list.size(); | ||||
|   } | ||||
| } | ||||
|  | ||||
| CompactHistoryBlockList::~CompactHistoryBlockList() | ||||
| { | ||||
|   qDeleteAll ( list.begin(), list.end() ); | ||||
|   list.clear(); | ||||
| } | ||||
|  | ||||
| void* CompactHistoryLine::operator new (size_t size, CompactHistoryBlockList& blockList) | ||||
| { | ||||
|   return blockList.allocate(size); | ||||
| } | ||||
|  | ||||
| CompactHistoryLine::CompactHistoryLine ( const TextLine& line, CompactHistoryBlockList& bList )  | ||||
|   : blockList(bList), | ||||
|     formatLength(0) | ||||
| { | ||||
|   length=line.size(); | ||||
|        | ||||
|   if (line.size() > 0) { | ||||
|     formatLength=1; | ||||
|     int k=1; | ||||
|    | ||||
|     // count number of different formats in this text line | ||||
|     Character c = line[0]; | ||||
|     while ( k<length ) | ||||
|     { | ||||
|       if ( !(line[k].equalsFormat(c))) | ||||
|       { | ||||
|         formatLength++; // format change detected | ||||
|         c=line[k]; | ||||
|       } | ||||
|       k++; | ||||
|     } | ||||
|    | ||||
|     //kDebug() << "number of different formats in string: " << formatLength; | ||||
|     formatArray = (CharacterFormat*) blockList.allocate(sizeof(CharacterFormat)*formatLength); | ||||
|     Q_ASSERT (formatArray!=NULL); | ||||
|     text = (quint16*) blockList.allocate(sizeof(quint16)*line.size()); | ||||
|     Q_ASSERT (text!=NULL); | ||||
|    | ||||
|     length=line.size(); | ||||
|     formatLength=formatLength; | ||||
|     wrapped=false; | ||||
|    | ||||
|     // record formats and their positions in the format array | ||||
|     c=line[0]; | ||||
|     formatArray[0].setFormat ( c ); | ||||
|     formatArray[0].startPos=0;                        // there's always at least 1 format (for the entire line, unless a change happens) | ||||
|    | ||||
|     k=1;                                              // look for possible format changes | ||||
|     int j=1; | ||||
|     while ( k<length && j<formatLength ) | ||||
|     { | ||||
|       if (!(line[k].equalsFormat(c))) | ||||
|       { | ||||
|         c=line[k]; | ||||
|         formatArray[j].setFormat(c); | ||||
|         formatArray[j].startPos=k; | ||||
|         //kDebug() << "format entry " << j << " at pos " << formatArray[j].startPos << " " << &(formatArray[j].startPos) ; | ||||
|         j++; | ||||
|       } | ||||
|       k++; | ||||
|     } | ||||
|    | ||||
|     // copy character values | ||||
|     for ( int i=0; i<line.size(); i++ ) | ||||
|     { | ||||
|       text[i]=line[i].character; | ||||
|       //kDebug() << "char " << i << " at mem " << &(text[i]); | ||||
|     } | ||||
|   } | ||||
|   //kDebug() << "line created, length " << length << " at " << &(length); | ||||
| } | ||||
|  | ||||
| CompactHistoryLine::~CompactHistoryLine() | ||||
| { | ||||
|   //kDebug() << "~CHL"; | ||||
|   if (length>0) { | ||||
|     blockList.deallocate(text); | ||||
|     blockList.deallocate(formatArray); | ||||
|   } | ||||
|   blockList.deallocate(this);   | ||||
| } | ||||
|  | ||||
| void CompactHistoryLine::getCharacter ( int index, Character &r ) | ||||
| { | ||||
|   Q_ASSERT ( index < length ); | ||||
|   int formatPos=0; | ||||
|   while ( ( formatPos+1 ) < formatLength && index >= formatArray[formatPos+1].startPos ) | ||||
|     formatPos++; | ||||
|  | ||||
|   r.character=text[index]; | ||||
|   r.rendition = formatArray[formatPos].rendition; | ||||
|   r.foregroundColor = formatArray[formatPos].fgColor; | ||||
|   r.backgroundColor = formatArray[formatPos].bgColor; | ||||
| } | ||||
|  | ||||
| void CompactHistoryLine::getCharacters ( Character* array, int length, int startColumn ) | ||||
| { | ||||
|   Q_ASSERT ( startColumn >= 0 && length >= 0 ); | ||||
|   Q_ASSERT ( startColumn+length <= ( int ) getLength() ); | ||||
|  | ||||
|   for ( int i=startColumn; i<length+startColumn; i++ ) | ||||
|   { | ||||
|     getCharacter ( i, array[i-startColumn] ); | ||||
|   } | ||||
| } | ||||
|  | ||||
| CompactHistoryScroll::CompactHistoryScroll ( unsigned int maxLineCount ) | ||||
|     : HistoryScroll ( new CompactHistoryType ( maxLineCount ) ) | ||||
|     ,lines() | ||||
|     ,blockList() | ||||
| { | ||||
|   //kDebug() << "scroll of length " << maxLineCount << " created"; | ||||
|   setMaxNbLines ( maxLineCount ); | ||||
| } | ||||
|  | ||||
| CompactHistoryScroll::~CompactHistoryScroll() | ||||
| { | ||||
|   qDeleteAll ( lines.begin(), lines.end() ); | ||||
|   lines.clear(); | ||||
| } | ||||
|  | ||||
| void CompactHistoryScroll::addCellsVector ( const TextLine& cells ) | ||||
| { | ||||
|   CompactHistoryLine *line; | ||||
|   line = new(blockList) CompactHistoryLine ( cells, blockList ); | ||||
|  | ||||
|   if ( lines.size() > ( int ) _maxLineCount ) | ||||
|   { | ||||
|     delete lines.takeAt ( 0 ); | ||||
|   } | ||||
|   lines.append ( line ); | ||||
| } | ||||
|  | ||||
| void CompactHistoryScroll::addCells ( const Character a[], int count ) | ||||
| { | ||||
|   TextLine newLine ( count ); | ||||
|   qCopy ( a,a+count,newLine.begin() ); | ||||
|   addCellsVector ( newLine ); | ||||
| } | ||||
|  | ||||
| void CompactHistoryScroll::addLine ( bool previousWrapped ) | ||||
| { | ||||
|   CompactHistoryLine *line = lines.last(); | ||||
|   //kDebug() << "last line at address " << line; | ||||
|   line->setWrapped(previousWrapped); | ||||
| } | ||||
|  | ||||
| int CompactHistoryScroll::getLines() | ||||
| { | ||||
|   return lines.size(); | ||||
| } | ||||
|  | ||||
| int CompactHistoryScroll::getLineLen ( int lineNumber ) | ||||
| { | ||||
|   Q_ASSERT ( lineNumber >= 0 && lineNumber < lines.size() ); | ||||
|   CompactHistoryLine* line = lines[lineNumber]; | ||||
|   //kDebug() << "request for line at address " << line; | ||||
|   return line->getLength(); | ||||
| } | ||||
|  | ||||
|  | ||||
| void CompactHistoryScroll::getCells ( int lineNumber, int startColumn, int count, Character buffer[] ) | ||||
| { | ||||
|   if ( count == 0 ) return; | ||||
|   Q_ASSERT ( lineNumber < lines.size() ); | ||||
|   CompactHistoryLine* line = lines[lineNumber]; | ||||
|   Q_ASSERT ( startColumn >= 0 ); | ||||
|   Q_ASSERT ( (unsigned int)startColumn <= line->getLength() - count ); | ||||
|   line->getCharacters ( buffer, count, startColumn ); | ||||
| } | ||||
|  | ||||
| void CompactHistoryScroll::setMaxNbLines ( unsigned int lineCount ) | ||||
| { | ||||
|   _maxLineCount = lineCount; | ||||
|  | ||||
|   while (lines.size() > (int) lineCount) { | ||||
|     delete lines.takeAt(0); | ||||
|   } | ||||
|   //kDebug() << "set max lines to: " << _maxLineCount; | ||||
| } | ||||
|  | ||||
| bool CompactHistoryScroll::isWrappedLine ( int lineNumber ) | ||||
| { | ||||
|   Q_ASSERT ( lineNumber < lines.size() ); | ||||
|   return lines[lineNumber]->isWrapped(); | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // History Types | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| HistoryType::HistoryType() | ||||
| { | ||||
| } | ||||
|  | ||||
| HistoryType::~HistoryType() | ||||
| { | ||||
| } | ||||
|  | ||||
| ////////////////////////////// | ||||
|  | ||||
| HistoryTypeNone::HistoryTypeNone() | ||||
| { | ||||
| } | ||||
|  | ||||
| bool HistoryTypeNone::isEnabled() const | ||||
| { | ||||
|   return false; | ||||
| } | ||||
|  | ||||
| HistoryScroll* HistoryTypeNone::scroll(HistoryScroll *old) const | ||||
| { | ||||
|   delete old; | ||||
|   return new HistoryScrollNone(); | ||||
| } | ||||
|  | ||||
| int HistoryTypeNone::maximumLineCount() const | ||||
| { | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| ////////////////////////////// | ||||
|  | ||||
| HistoryTypeBlockArray::HistoryTypeBlockArray(size_t size) | ||||
|   : m_size(size) | ||||
| { | ||||
| } | ||||
|  | ||||
| bool HistoryTypeBlockArray::isEnabled() const | ||||
| { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| int HistoryTypeBlockArray::maximumLineCount() const | ||||
| { | ||||
|   return m_size; | ||||
| } | ||||
|  | ||||
| HistoryScroll* HistoryTypeBlockArray::scroll(HistoryScroll *old) const | ||||
| { | ||||
|   delete old; | ||||
|   return new HistoryScrollBlockArray(m_size); | ||||
| } | ||||
|  | ||||
|  | ||||
| ////////////////////////////// | ||||
|  | ||||
| HistoryTypeBuffer::HistoryTypeBuffer(unsigned int nbLines) | ||||
|   : m_nbLines(nbLines) | ||||
| { | ||||
| } | ||||
|  | ||||
| bool HistoryTypeBuffer::isEnabled() const | ||||
| { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| int HistoryTypeBuffer::maximumLineCount() const | ||||
| { | ||||
|   return m_nbLines; | ||||
| } | ||||
|  | ||||
| HistoryScroll* HistoryTypeBuffer::scroll(HistoryScroll *old) const | ||||
| { | ||||
|   if (old) | ||||
|   { | ||||
|     HistoryScrollBuffer *oldBuffer = dynamic_cast<HistoryScrollBuffer*>(old); | ||||
|     if (oldBuffer) | ||||
|     { | ||||
|        oldBuffer->setMaxNbLines(m_nbLines); | ||||
|        return oldBuffer; | ||||
|     } | ||||
|  | ||||
|     HistoryScroll *newScroll = new HistoryScrollBuffer(m_nbLines); | ||||
|     int lines = old->getLines(); | ||||
|     int startLine = 0; | ||||
|     if (lines > (int) m_nbLines) | ||||
|        startLine = lines - m_nbLines; | ||||
|  | ||||
|     Character line[LINE_SIZE]; | ||||
|     for(int i = startLine; i < lines; i++) | ||||
|     { | ||||
|        int size = old->getLineLen(i); | ||||
|        if (size > LINE_SIZE) | ||||
|        { | ||||
|           Character *tmp_line = new Character[size]; | ||||
|           old->getCells(i, 0, size, tmp_line); | ||||
|           newScroll->addCells(tmp_line, size); | ||||
|           newScroll->addLine(old->isWrappedLine(i)); | ||||
|           delete [] tmp_line; | ||||
|        } | ||||
|        else | ||||
|        { | ||||
|           old->getCells(i, 0, size, line); | ||||
|           newScroll->addCells(line, size); | ||||
|           newScroll->addLine(old->isWrappedLine(i)); | ||||
|        } | ||||
|     } | ||||
|     delete old; | ||||
|     return newScroll; | ||||
|   } | ||||
|   return new HistoryScrollBuffer(m_nbLines); | ||||
| } | ||||
|  | ||||
| ////////////////////////////// | ||||
|  | ||||
| HistoryTypeFile::HistoryTypeFile(const QString& fileName) | ||||
|   : m_fileName(fileName) | ||||
| { | ||||
| } | ||||
|  | ||||
| bool HistoryTypeFile::isEnabled() const | ||||
| { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| const QString& HistoryTypeFile::getFileName() const | ||||
| { | ||||
|   return m_fileName; | ||||
| } | ||||
|  | ||||
| HistoryScroll* HistoryTypeFile::scroll(HistoryScroll *old) const | ||||
| { | ||||
|   if (dynamic_cast<HistoryFile *>(old))  | ||||
|      return old; // Unchanged. | ||||
|  | ||||
|   HistoryScroll *newScroll = new HistoryScrollFile(m_fileName); | ||||
|  | ||||
|   Character line[LINE_SIZE]; | ||||
|   int lines = (old != 0) ? old->getLines() : 0; | ||||
|   for(int i = 0; i < lines; i++) | ||||
|   { | ||||
|      int size = old->getLineLen(i); | ||||
|      if (size > LINE_SIZE) | ||||
|      { | ||||
|         Character *tmp_line = new Character[size]; | ||||
|         old->getCells(i, 0, size, tmp_line); | ||||
|         newScroll->addCells(tmp_line, size); | ||||
|         newScroll->addLine(old->isWrappedLine(i)); | ||||
|         delete [] tmp_line; | ||||
|      } | ||||
|      else | ||||
|      { | ||||
|         old->getCells(i, 0, size, line); | ||||
|         newScroll->addCells(line, size); | ||||
|         newScroll->addLine(old->isWrappedLine(i)); | ||||
|      } | ||||
|   } | ||||
|  | ||||
|   delete old; | ||||
|   return newScroll;  | ||||
| } | ||||
|  | ||||
| int HistoryTypeFile::maximumLineCount() const | ||||
| { | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| ////////////////////////////// | ||||
|  | ||||
| CompactHistoryType::CompactHistoryType ( unsigned int nbLines ) | ||||
|     : m_nbLines ( nbLines ) | ||||
| { | ||||
| } | ||||
|  | ||||
| bool CompactHistoryType::isEnabled() const | ||||
| { | ||||
|   return true; | ||||
| } | ||||
|  | ||||
| int CompactHistoryType::maximumLineCount() const | ||||
| { | ||||
|   return m_nbLines; | ||||
| } | ||||
|  | ||||
| HistoryScroll* CompactHistoryType::scroll ( HistoryScroll *old ) const | ||||
| { | ||||
|   if ( old ) | ||||
|   { | ||||
|     CompactHistoryScroll *oldBuffer = dynamic_cast<CompactHistoryScroll*> ( old ); | ||||
|     if ( oldBuffer ) | ||||
|     { | ||||
|       oldBuffer->setMaxNbLines ( m_nbLines ); | ||||
|       return oldBuffer; | ||||
|     } | ||||
|     delete old; | ||||
|   } | ||||
|   return new CompactHistoryScroll ( m_nbLines ); | ||||
| } | ||||
							
								
								
									
										490
									
								
								konsole-qml-plugin/src/History.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										490
									
								
								konsole-qml-plugin/src/History.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,490 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef TEHISTORY_H | ||||
| #define TEHISTORY_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QBitRef> | ||||
| #include <QtCore/QHash> | ||||
| #include <QtCore/QVector> | ||||
| #include <QTemporaryFile> | ||||
|  | ||||
| // KDE | ||||
| //#include <ktemporaryfile.h> | ||||
|  | ||||
| // Konsole | ||||
| #include "BlockArray.h" | ||||
| #include "Character.h" | ||||
|  | ||||
| // map | ||||
| #include <sys/mman.h> | ||||
|  | ||||
|  | ||||
| #if 1 | ||||
| /* | ||||
|    An extendable tmpfile(1) based buffer. | ||||
| */ | ||||
|  | ||||
| class HistoryFile | ||||
| { | ||||
| public: | ||||
|   HistoryFile(); | ||||
|   virtual ~HistoryFile(); | ||||
|  | ||||
|   virtual void add(const unsigned char* bytes, int len); | ||||
|   virtual void get(unsigned char* bytes, int len, int loc); | ||||
|   virtual int  len(); | ||||
|  | ||||
|   //mmaps the file in read-only mode | ||||
|   void map(); | ||||
|   //un-mmaps the file | ||||
|   void unmap(); | ||||
|   //returns true if the file is mmap'ed | ||||
|   bool isMapped(); | ||||
|  | ||||
|  | ||||
| private: | ||||
|   int  ion; | ||||
|   int  length; | ||||
|   QTemporaryFile tmpFile; | ||||
|  | ||||
|   //pointer to start of mmap'ed file data, or 0 if the file is not mmap'ed | ||||
|   char* fileMap; | ||||
|   | ||||
|   //incremented whenver 'add' is called and decremented whenever | ||||
|   //'get' is called. | ||||
|   //this is used to detect when a large number of lines are being read and processed from the history | ||||
|   //and automatically mmap the file for better performance (saves the overhead of many lseek-read calls). | ||||
|   int readWriteBalance; | ||||
|  | ||||
|   //when readWriteBalance goes below this threshold, the file will be mmap'ed automatically | ||||
|   static const int MAP_THRESHOLD = -1000; | ||||
| }; | ||||
| #endif | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // Abstract base class for file and buffer versions | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| class HistoryType; | ||||
|  | ||||
| class HistoryScroll | ||||
| { | ||||
| public: | ||||
|   HistoryScroll(HistoryType*); | ||||
|  virtual ~HistoryScroll(); | ||||
|  | ||||
|   virtual bool hasScroll(); | ||||
|  | ||||
|   // access to history | ||||
|   virtual int  getLines() = 0; | ||||
|   virtual int  getLineLen(int lineno) = 0; | ||||
|   virtual void getCells(int lineno, int colno, int count, Character res[]) = 0; | ||||
|   virtual bool isWrappedLine(int lineno) = 0; | ||||
|  | ||||
|   // backward compatibility (obsolete) | ||||
|   Character   getCell(int lineno, int colno) { Character res; getCells(lineno,colno,1,&res); return res; } | ||||
|  | ||||
|   // adding lines. | ||||
|   virtual void addCells(const Character a[], int count) = 0; | ||||
|   // convenience method - this is virtual so that subclasses can take advantage | ||||
|   // of QVector's implicit copying | ||||
|   virtual void addCellsVector(const QVector<Character>& cells) | ||||
|   { | ||||
|     addCells(cells.data(),cells.size()); | ||||
|   } | ||||
|  | ||||
|   virtual void addLine(bool previousWrapped=false) = 0; | ||||
|  | ||||
|   // | ||||
|   // FIXME:  Passing around constant references to HistoryType instances | ||||
|   // is very unsafe, because those references will no longer | ||||
|   // be valid if the history scroll is deleted. | ||||
|   // | ||||
|   const HistoryType& getType() { return *m_histType; } | ||||
|  | ||||
| protected: | ||||
|   HistoryType* m_histType; | ||||
|  | ||||
| }; | ||||
|  | ||||
| #if 1 | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // File-based history (e.g. file log, no limitation in length) | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| class HistoryScrollFile : public HistoryScroll | ||||
| { | ||||
| public: | ||||
|   HistoryScrollFile(const QString &logFileName); | ||||
|   virtual ~HistoryScrollFile(); | ||||
|  | ||||
|   virtual int  getLines(); | ||||
|   virtual int  getLineLen(int lineno); | ||||
|   virtual void getCells(int lineno, int colno, int count, Character res[]); | ||||
|   virtual bool isWrappedLine(int lineno); | ||||
|  | ||||
|   virtual void addCells(const Character a[], int count); | ||||
|   virtual void addLine(bool previousWrapped=false); | ||||
|  | ||||
| private: | ||||
|   int startOfLine(int lineno); | ||||
|  | ||||
|   QString m_logFileName; | ||||
|   HistoryFile index; // lines Row(int) | ||||
|   HistoryFile cells; // text  Row(Character) | ||||
|   HistoryFile lineflags; // flags Row(unsigned char) | ||||
| }; | ||||
|  | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // Buffer-based history (limited to a fixed nb of lines) | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| class HistoryScrollBuffer : public HistoryScroll | ||||
| { | ||||
| public: | ||||
|   typedef QVector<Character> HistoryLine; | ||||
|  | ||||
|   HistoryScrollBuffer(unsigned int maxNbLines = 1000); | ||||
|   virtual ~HistoryScrollBuffer(); | ||||
|  | ||||
|   virtual int  getLines(); | ||||
|   virtual int  getLineLen(int lineno); | ||||
|   virtual void getCells(int lineno, int colno, int count, Character res[]); | ||||
|   virtual bool isWrappedLine(int lineno); | ||||
|  | ||||
|   virtual void addCells(const Character a[], int count); | ||||
|   virtual void addCellsVector(const QVector<Character>& cells); | ||||
|   virtual void addLine(bool previousWrapped=false); | ||||
|  | ||||
|   void setMaxNbLines(unsigned int nbLines); | ||||
|   unsigned int maxNbLines() { return _maxLineCount; } | ||||
|    | ||||
|  | ||||
| private: | ||||
|   int bufferIndex(int lineNumber); | ||||
|  | ||||
|   HistoryLine* _historyBuffer; | ||||
|   QBitArray _wrappedLine; | ||||
|   int _maxLineCount; | ||||
|   int _usedLines;   | ||||
|   int _head; | ||||
|    | ||||
|   //QVector<histline*> m_histBuffer; | ||||
|   //QBitArray m_wrappedLine; | ||||
|   //unsigned int m_maxNbLines; | ||||
|   //unsigned int m_nbLines; | ||||
|   //unsigned int m_arrayIndex; | ||||
|   //bool         m_buffFilled; | ||||
| }; | ||||
|  | ||||
| /*class HistoryScrollBufferV2 : public HistoryScroll | ||||
| { | ||||
| public: | ||||
|   virtual int  getLines(); | ||||
|   virtual int  getLineLen(int lineno); | ||||
|   virtual void getCells(int lineno, int colno, int count, Character res[]); | ||||
|   virtual bool isWrappedLine(int lineno); | ||||
|  | ||||
|   virtual void addCells(const Character a[], int count); | ||||
|   virtual void addCells(const QVector<Character>& cells); | ||||
|   virtual void addLine(bool previousWrapped=false); | ||||
|  | ||||
| };*/ | ||||
|  | ||||
| #endif | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // Nothing-based history (no history :-) | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| class HistoryScrollNone : public HistoryScroll | ||||
| { | ||||
| public: | ||||
|   HistoryScrollNone(); | ||||
|   virtual ~HistoryScrollNone(); | ||||
|  | ||||
|   virtual bool hasScroll(); | ||||
|  | ||||
|   virtual int  getLines(); | ||||
|   virtual int  getLineLen(int lineno); | ||||
|   virtual void getCells(int lineno, int colno, int count, Character res[]); | ||||
|   virtual bool isWrappedLine(int lineno); | ||||
|  | ||||
|   virtual void addCells(const Character a[], int count); | ||||
|   virtual void addLine(bool previousWrapped=false); | ||||
| }; | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // BlockArray-based history | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| class HistoryScrollBlockArray : public HistoryScroll | ||||
| { | ||||
| public: | ||||
|   HistoryScrollBlockArray(size_t size); | ||||
|   virtual ~HistoryScrollBlockArray(); | ||||
|  | ||||
|   virtual int  getLines(); | ||||
|   virtual int  getLineLen(int lineno); | ||||
|   virtual void getCells(int lineno, int colno, int count, Character res[]); | ||||
|   virtual bool isWrappedLine(int lineno); | ||||
|  | ||||
|   virtual void addCells(const Character a[], int count); | ||||
|   virtual void addLine(bool previousWrapped=false); | ||||
|  | ||||
| protected: | ||||
|   BlockArray m_blockArray; | ||||
|   QHash<int,size_t> m_lineLengths; | ||||
| }; | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // History using compact storage | ||||
| // This implementation uses a list of fixed-sized blocks | ||||
| // where history lines are allocated in (avoids heap fragmentation) | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| typedef QVector<Character> TextLine; | ||||
|  | ||||
| class CharacterFormat | ||||
| { | ||||
| public: | ||||
|   bool equalsFormat(const CharacterFormat &other) const { | ||||
|     return other.rendition==rendition && other.fgColor==fgColor && other.bgColor==bgColor; | ||||
|   } | ||||
|  | ||||
|   bool equalsFormat(const Character &c) const { | ||||
|     return c.rendition==rendition && c.foregroundColor==fgColor && c.backgroundColor==bgColor; | ||||
|   } | ||||
|  | ||||
|   void setFormat(const Character& c) { | ||||
|     rendition=c.rendition; | ||||
|     fgColor=c.foregroundColor; | ||||
|     bgColor=c.backgroundColor; | ||||
|   } | ||||
|  | ||||
|   CharacterColor fgColor, bgColor; | ||||
|   quint16 startPos; | ||||
|   quint8 rendition; | ||||
| }; | ||||
|  | ||||
| class CompactHistoryBlock | ||||
| { | ||||
| public: | ||||
|    | ||||
|   CompactHistoryBlock(){ | ||||
|     blockLength = 4096*64; // 256kb | ||||
|     head = (quint8*) mmap(0, blockLength, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0); | ||||
|     //head = (quint8*) malloc(blockLength); | ||||
|     Q_ASSERT(head != MAP_FAILED); | ||||
|     tail = blockStart = head; | ||||
|     allocCount=0; | ||||
|   } | ||||
|    | ||||
|   virtual ~CompactHistoryBlock(){ | ||||
|     //free(blockStart); | ||||
|     munmap(blockStart, blockLength); | ||||
|   } | ||||
|    | ||||
|   virtual unsigned int remaining(){ return blockStart+blockLength-tail;} | ||||
|   virtual unsigned  length() { return blockLength; } | ||||
|   virtual void* allocate(size_t length); | ||||
|   virtual bool contains(void *addr) {return addr>=blockStart && addr<(blockStart+blockLength);} | ||||
|   virtual void deallocate(); | ||||
|   virtual bool isInUse(){ return allocCount!=0; } ; | ||||
|  | ||||
| private: | ||||
|   size_t blockLength; | ||||
|   quint8* head; | ||||
|   quint8* tail; | ||||
|   quint8* blockStart; | ||||
|   int allocCount; | ||||
| }; | ||||
|  | ||||
| class CompactHistoryBlockList { | ||||
| public: | ||||
|   CompactHistoryBlockList() {}; | ||||
|   ~CompactHistoryBlockList(); | ||||
|  | ||||
|   void *allocate( size_t size ); | ||||
|   void deallocate(void *); | ||||
|   int length() {return list.size();} | ||||
| private: | ||||
|   QList<CompactHistoryBlock*> list; | ||||
| }; | ||||
|  | ||||
| class CompactHistoryLine | ||||
| { | ||||
| public: | ||||
|   CompactHistoryLine(const TextLine&, CompactHistoryBlockList& blockList); | ||||
|   virtual ~CompactHistoryLine(); | ||||
|  | ||||
|   // custom new operator to allocate memory from custom pool instead of heap | ||||
|   static void *operator new( size_t size, CompactHistoryBlockList& blockList); | ||||
|   static void operator delete( void *) { /* do nothing, deallocation from pool is done in destructor*/ } ; | ||||
|  | ||||
|   virtual void getCharacters(Character* array, int length, int startColumn) ; | ||||
|   virtual void getCharacter(int index, Character &r) ; | ||||
|   virtual bool isWrapped() const {return wrapped;}; | ||||
|   virtual void setWrapped(bool isWrapped) { wrapped=isWrapped;}; | ||||
|   virtual unsigned int getLength() const {return length;}; | ||||
|  | ||||
| protected: | ||||
|   CompactHistoryBlockList& blockList; | ||||
|   CharacterFormat* formatArray; | ||||
|   quint16 length; | ||||
|   quint16* text; | ||||
|   quint16 formatLength; | ||||
|   bool wrapped; | ||||
| }; | ||||
|  | ||||
| class CompactHistoryScroll : public HistoryScroll | ||||
| { | ||||
|   typedef QList<CompactHistoryLine*> HistoryArray; | ||||
|  | ||||
| public: | ||||
|   CompactHistoryScroll(unsigned int maxNbLines = 1000); | ||||
|   virtual ~CompactHistoryScroll(); | ||||
|  | ||||
|   virtual int  getLines(); | ||||
|   virtual int  getLineLen(int lineno); | ||||
|   virtual void getCells(int lineno, int colno, int count, Character res[]); | ||||
|   virtual bool isWrappedLine(int lineno); | ||||
|  | ||||
|   virtual void addCells(const Character a[], int count); | ||||
|   virtual void addCellsVector(const TextLine& cells); | ||||
|   virtual void addLine(bool previousWrapped=false); | ||||
|  | ||||
|   void setMaxNbLines(unsigned int nbLines); | ||||
|   unsigned int maxNbLines() const { return _maxLineCount; } | ||||
|  | ||||
| private: | ||||
|   bool hasDifferentColors(const TextLine& line) const; | ||||
|   HistoryArray lines; | ||||
|   CompactHistoryBlockList blockList; | ||||
|    | ||||
|   unsigned int _maxLineCount; | ||||
| }; | ||||
|  | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
| // History type | ||||
| ////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| class HistoryType | ||||
| { | ||||
| public: | ||||
|   HistoryType(); | ||||
|   virtual ~HistoryType(); | ||||
|  | ||||
|   /** | ||||
|    * Returns true if the history is enabled ( can store lines of output ) | ||||
|    * or false otherwise.  | ||||
|    */ | ||||
|   virtual bool isEnabled()           const = 0; | ||||
|   /** | ||||
|    * Returns true if the history size is unlimited. | ||||
|    */ | ||||
|   bool isUnlimited() const { return maximumLineCount() == 0; } | ||||
|   /** | ||||
|    * Returns the maximum number of lines which this history type | ||||
|    * can store or 0 if the history can store an unlimited number of lines. | ||||
|    */ | ||||
|   virtual int maximumLineCount()    const = 0; | ||||
|  | ||||
|   virtual HistoryScroll* scroll(HistoryScroll *) const = 0; | ||||
| }; | ||||
|  | ||||
| class HistoryTypeNone : public HistoryType | ||||
| { | ||||
| public: | ||||
|   HistoryTypeNone(); | ||||
|  | ||||
|   virtual bool isEnabled() const; | ||||
|   virtual int maximumLineCount() const; | ||||
|  | ||||
|   virtual HistoryScroll* scroll(HistoryScroll *) const; | ||||
| }; | ||||
|  | ||||
| class HistoryTypeBlockArray : public HistoryType | ||||
| { | ||||
| public: | ||||
|   HistoryTypeBlockArray(size_t size); | ||||
|    | ||||
|   virtual bool isEnabled() const; | ||||
|   virtual int maximumLineCount() const; | ||||
|  | ||||
|   virtual HistoryScroll* scroll(HistoryScroll *) const; | ||||
|  | ||||
| protected: | ||||
|   size_t m_size; | ||||
| }; | ||||
|  | ||||
| #if 1  | ||||
| class HistoryTypeFile : public HistoryType | ||||
| { | ||||
| public: | ||||
|   HistoryTypeFile(const QString& fileName=QString()); | ||||
|  | ||||
|   virtual bool isEnabled() const; | ||||
|   virtual const QString& getFileName() const; | ||||
|   virtual int maximumLineCount() const; | ||||
|  | ||||
|   virtual HistoryScroll* scroll(HistoryScroll *) const; | ||||
|  | ||||
| protected: | ||||
|   QString m_fileName; | ||||
| }; | ||||
|  | ||||
|  | ||||
| class HistoryTypeBuffer : public HistoryType | ||||
| { | ||||
|     friend class HistoryScrollBuffer; | ||||
|  | ||||
| public: | ||||
|   HistoryTypeBuffer(unsigned int nbLines); | ||||
|     | ||||
|   virtual bool isEnabled() const; | ||||
|   virtual int maximumLineCount() const; | ||||
|    | ||||
|   virtual HistoryScroll* scroll(HistoryScroll *) const; | ||||
|  | ||||
| protected: | ||||
|   unsigned int m_nbLines; | ||||
| }; | ||||
|  | ||||
| class CompactHistoryType : public HistoryType | ||||
| { | ||||
| public: | ||||
|   CompactHistoryType(unsigned int size); | ||||
|    | ||||
|   virtual bool isEnabled() const; | ||||
|   virtual int maximumLineCount() const; | ||||
|  | ||||
|   virtual HistoryScroll* scroll(HistoryScroll *) const; | ||||
|  | ||||
| protected: | ||||
|   unsigned int m_nbLines; | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif | ||||
|  | ||||
|  | ||||
| #endif // TEHISTORY_H | ||||
							
								
								
									
										892
									
								
								konsole-qml-plugin/src/KeyboardTranslator.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										892
									
								
								konsole-qml-plugin/src/KeyboardTranslator.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,892 @@ | ||||
| /* | ||||
|     This source file is part of Konsole, a terminal emulator. | ||||
|  | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "KeyboardTranslator.h" | ||||
|  | ||||
| // System | ||||
| #include <ctype.h> | ||||
| #include <stdio.h> | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QBuffer> | ||||
| #include <QtCore/QFile> | ||||
| #include <QtCore/QFileInfo> | ||||
| #include <QtCore/QTextStream> | ||||
| #include <QtGui/QKeySequence> | ||||
| #include <QDir> | ||||
| #include <QtDebug> | ||||
|  | ||||
| #include "tools.h" | ||||
|  | ||||
| // KDE | ||||
| //#include <KDebug> | ||||
| //#include <KLocale> | ||||
| //#include <KStandardDirs> | ||||
|  | ||||
|  | ||||
| const QByteArray KeyboardTranslatorManager::defaultTranslatorText( | ||||
| "keyboard \"Fallback Key Translator\"\n" | ||||
| "key Tab : \"\\t\"" | ||||
| ); | ||||
|  | ||||
| KeyboardTranslatorManager::KeyboardTranslatorManager() | ||||
|     : _haveLoadedAll(false) | ||||
| { | ||||
| } | ||||
| KeyboardTranslatorManager::~KeyboardTranslatorManager() | ||||
| { | ||||
|     qDeleteAll(_translators); | ||||
| } | ||||
| QString KeyboardTranslatorManager::findTranslatorPath(const QString& name) | ||||
| { | ||||
|     return QString(get_kb_layout_dir() + name + ".keytab"); | ||||
|     //return KGlobal::dirs()->findResource("data","konsole/"+name+".keytab"); | ||||
| } | ||||
|  | ||||
| void KeyboardTranslatorManager::findTranslators() | ||||
| { | ||||
|     QDir dir(get_kb_layout_dir()); | ||||
|     QStringList filters; | ||||
|     filters << "*.keytab"; | ||||
|     dir.setNameFilters(filters); | ||||
|     QStringList list = dir.entryList(filters); | ||||
|     list = dir.entryList(filters); | ||||
| //    QStringList list = KGlobal::dirs()->findAllResources("data", | ||||
| //                                                         "konsole/*.keytab", | ||||
| //                                                        KStandardDirs::NoDuplicates); | ||||
|  | ||||
|     // add the name of each translator to the list and associated | ||||
|     // the name with a null pointer to indicate that the translator | ||||
|     // has not yet been loaded from disk | ||||
|     QStringListIterator listIter(list); | ||||
|     while (listIter.hasNext()) | ||||
|     { | ||||
|         QString translatorPath = listIter.next(); | ||||
|  | ||||
|         QString name = QFileInfo(translatorPath).baseName(); | ||||
|         | ||||
|         if ( !_translators.contains(name) )  | ||||
|             _translators.insert(name,0); | ||||
|     } | ||||
|  | ||||
|     _haveLoadedAll = true; | ||||
| } | ||||
|  | ||||
| const KeyboardTranslator* KeyboardTranslatorManager::findTranslator(const QString& name) | ||||
| { | ||||
|     if ( name.isEmpty() ) | ||||
|         return defaultTranslator(); | ||||
|  | ||||
|     if ( _translators.contains(name) && _translators[name] != 0 ) | ||||
|         return _translators[name]; | ||||
|  | ||||
|     KeyboardTranslator* translator = loadTranslator(name); | ||||
|  | ||||
|     if ( translator != 0 ) | ||||
|         _translators[name] = translator; | ||||
|     else if ( !name.isEmpty() ) | ||||
|         qDebug() << "Unable to load translator" << name; | ||||
|  | ||||
|     return translator; | ||||
| } | ||||
|  | ||||
| bool KeyboardTranslatorManager::saveTranslator(const KeyboardTranslator* translator) | ||||
| { | ||||
| qDebug() << "KeyboardTranslatorManager::saveTranslator" << "unimplemented"; | ||||
| Q_UNUSED(translator); | ||||
| #if 0 | ||||
|     const QString path = KGlobal::dirs()->saveLocation("data","konsole/")+translator->name() | ||||
|            +".keytab"; | ||||
|  | ||||
|     //kDebug() << "Saving translator to" << path; | ||||
|  | ||||
|     QFile destination(path); | ||||
|     if (!destination.open(QIODevice::WriteOnly | QIODevice::Text)) | ||||
|     { | ||||
|         qDebug() << "Unable to save keyboard translation:"  | ||||
|                    << destination.errorString(); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     { | ||||
|         KeyboardTranslatorWriter writer(&destination); | ||||
|         writer.writeHeader(translator->description()); | ||||
|      | ||||
|         QListIterator<KeyboardTranslator::Entry> iter(translator->entries()); | ||||
|         while ( iter.hasNext() ) | ||||
|             writer.writeEntry(iter.next()); | ||||
|     } | ||||
|  | ||||
|     destination.close(); | ||||
| #endif | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| KeyboardTranslator* KeyboardTranslatorManager::loadTranslator(const QString& name) | ||||
| { | ||||
|     const QString& path = findTranslatorPath(name); | ||||
|  | ||||
|     QFile source(path);  | ||||
|     if (name.isEmpty() || !source.open(QIODevice::ReadOnly | QIODevice::Text)) | ||||
|         return 0; | ||||
|  | ||||
|     return loadTranslator(&source,name); | ||||
| } | ||||
|  | ||||
| const KeyboardTranslator* KeyboardTranslatorManager::defaultTranslator() | ||||
| { | ||||
|     // Try to find the default.keytab file if it exists, otherwise | ||||
|     // fall back to the hard-coded one | ||||
|     const KeyboardTranslator* translator = findTranslator("default"); | ||||
|     if (!translator) | ||||
|     { | ||||
|         QBuffer textBuffer; | ||||
|         textBuffer.setData(defaultTranslatorText); | ||||
|         textBuffer.open(QIODevice::ReadOnly); | ||||
|         translator = loadTranslator(&textBuffer,"fallback"); | ||||
|     } | ||||
|     return translator; | ||||
| } | ||||
|  | ||||
| KeyboardTranslator* KeyboardTranslatorManager::loadTranslator(QIODevice* source,const QString& name) | ||||
| { | ||||
|     KeyboardTranslator* translator = new KeyboardTranslator(name); | ||||
|     KeyboardTranslatorReader reader(source); | ||||
|     translator->setDescription( reader.description() ); | ||||
|     while ( reader.hasNextEntry() ) | ||||
|         translator->addEntry(reader.nextEntry()); | ||||
|  | ||||
|     source->close(); | ||||
|  | ||||
|     if ( !reader.parseError() ) | ||||
|     { | ||||
|         return translator; | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         delete translator; | ||||
|         return 0; | ||||
|     } | ||||
| } | ||||
|  | ||||
| KeyboardTranslatorWriter::KeyboardTranslatorWriter(QIODevice* destination) | ||||
| : _destination(destination) | ||||
| { | ||||
|     Q_ASSERT( destination && destination->isWritable() ); | ||||
|  | ||||
|     _writer = new QTextStream(_destination); | ||||
| } | ||||
| KeyboardTranslatorWriter::~KeyboardTranslatorWriter() | ||||
| { | ||||
|     delete _writer; | ||||
| } | ||||
| void KeyboardTranslatorWriter::writeHeader( const QString& description ) | ||||
| { | ||||
|     *_writer << "keyboard \"" << description << '\"' << '\n'; | ||||
| } | ||||
| void KeyboardTranslatorWriter::writeEntry( const KeyboardTranslator::Entry& entry ) | ||||
| { | ||||
|     QString result; | ||||
|     if ( entry.command() != KeyboardTranslator::NoCommand ) | ||||
|         result = entry.resultToString(); | ||||
|     else | ||||
|         result = '\"' + entry.resultToString() + '\"'; | ||||
|  | ||||
|     *_writer << "key " << entry.conditionToString() << " : " << result << '\n'; | ||||
| } | ||||
|  | ||||
|  | ||||
| // each line of the keyboard translation file is one of: | ||||
| // | ||||
| // - keyboard "name" | ||||
| // - key KeySequence : "characters" | ||||
| // - key KeySequence : CommandName | ||||
| // | ||||
| // KeySequence begins with the name of the key ( taken from the Qt::Key enum ) | ||||
| // and is followed by the keyboard modifiers and state flags ( with + or - in front | ||||
| // of each modifier or flag to indicate whether it is required ).  All keyboard modifiers | ||||
| // and flags are optional, if a particular modifier or state is not specified it is  | ||||
| // assumed not to be a part of the sequence.  The key sequence may contain whitespace | ||||
| // | ||||
| // eg:  "key Up+Shift : scrollLineUp" | ||||
| //      "key Next-Shift : "\E[6~" | ||||
| // | ||||
| // (lines containing only whitespace are ignored, parseLine assumes that comments have | ||||
| // already been removed) | ||||
| // | ||||
|  | ||||
| KeyboardTranslatorReader::KeyboardTranslatorReader( QIODevice* source ) | ||||
|     : _source(source) | ||||
|     , _hasNext(false) | ||||
| { | ||||
|    // read input until we find the description | ||||
|    while ( _description.isEmpty() && !source->atEnd() ) | ||||
|    { | ||||
|         QList<Token> tokens = tokenize( QString(source->readLine()) ); | ||||
|         if ( !tokens.isEmpty() && tokens.first().type == Token::TitleKeyword ) | ||||
|             _description = tokens[1].text.toUtf8(); | ||||
|    } | ||||
|    // read first entry (if any) | ||||
|    readNext(); | ||||
| } | ||||
| void KeyboardTranslatorReader::readNext()  | ||||
| { | ||||
|     // find next entry | ||||
|     while ( !_source->atEnd() ) | ||||
|     { | ||||
|         const QList<Token>& tokens = tokenize( QString(_source->readLine()) ); | ||||
|         if ( !tokens.isEmpty() && tokens.first().type == Token::KeyKeyword ) | ||||
|         { | ||||
|             KeyboardTranslator::States flags = KeyboardTranslator::NoState; | ||||
|             KeyboardTranslator::States flagMask = KeyboardTranslator::NoState; | ||||
|             Qt::KeyboardModifiers modifiers = Qt::NoModifier; | ||||
|             Qt::KeyboardModifiers modifierMask = Qt::NoModifier; | ||||
|  | ||||
|             int keyCode = Qt::Key_unknown; | ||||
|  | ||||
|             decodeSequence(tokens[1].text.toLower(), | ||||
|                            keyCode, | ||||
|                            modifiers, | ||||
|                            modifierMask, | ||||
|                            flags, | ||||
|                            flagMask);  | ||||
|  | ||||
|             KeyboardTranslator::Command command = KeyboardTranslator::NoCommand; | ||||
|             QByteArray text; | ||||
|  | ||||
|             // get text or command | ||||
|             if ( tokens[2].type == Token::OutputText ) | ||||
|             { | ||||
|                 text = tokens[2].text.toLocal8Bit(); | ||||
|             } | ||||
|             else if ( tokens[2].type == Token::Command ) | ||||
|             { | ||||
|                 // identify command | ||||
|                 if (!parseAsCommand(tokens[2].text,command)) | ||||
|                     qDebug() << "Command" << tokens[2].text << "not understood."; | ||||
|             } | ||||
|  | ||||
|             KeyboardTranslator::Entry newEntry; | ||||
|             newEntry.setKeyCode( keyCode ); | ||||
|             newEntry.setState( flags ); | ||||
|             newEntry.setStateMask( flagMask ); | ||||
|             newEntry.setModifiers( modifiers ); | ||||
|             newEntry.setModifierMask( modifierMask ); | ||||
|             newEntry.setText( text ); | ||||
|             newEntry.setCommand( command ); | ||||
|  | ||||
|             _nextEntry = newEntry; | ||||
|  | ||||
|             _hasNext = true; | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|     }  | ||||
|  | ||||
|     _hasNext = false; | ||||
| } | ||||
|  | ||||
| bool KeyboardTranslatorReader::parseAsCommand(const QString& text,KeyboardTranslator::Command& command)  | ||||
| { | ||||
|     if ( text.compare("erase",Qt::CaseInsensitive) == 0 ) | ||||
|         command = KeyboardTranslator::EraseCommand; | ||||
|     else if ( text.compare("scrollpageup",Qt::CaseInsensitive) == 0 ) | ||||
|         command = KeyboardTranslator::ScrollPageUpCommand; | ||||
|     else if ( text.compare("scrollpagedown",Qt::CaseInsensitive) == 0 ) | ||||
|         command = KeyboardTranslator::ScrollPageDownCommand; | ||||
|     else if ( text.compare("scrolllineup",Qt::CaseInsensitive) == 0 ) | ||||
|         command = KeyboardTranslator::ScrollLineUpCommand; | ||||
|     else if ( text.compare("scrolllinedown",Qt::CaseInsensitive) == 0 ) | ||||
|         command = KeyboardTranslator::ScrollLineDownCommand; | ||||
|     else if ( text.compare("scrolllock",Qt::CaseInsensitive) == 0 ) | ||||
|         command = KeyboardTranslator::ScrollLockCommand; | ||||
|     else | ||||
|         return false; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool KeyboardTranslatorReader::decodeSequence(const QString& text, | ||||
|                                               int& keyCode, | ||||
|                                               Qt::KeyboardModifiers& modifiers, | ||||
|                                               Qt::KeyboardModifiers& modifierMask, | ||||
|                                               KeyboardTranslator::States& flags, | ||||
|                                               KeyboardTranslator::States& flagMask) | ||||
| { | ||||
|     bool isWanted = true;  | ||||
|     bool endOfItem = false; | ||||
|     QString buffer; | ||||
|  | ||||
|     Qt::KeyboardModifiers tempModifiers = modifiers; | ||||
|     Qt::KeyboardModifiers tempModifierMask = modifierMask; | ||||
|     KeyboardTranslator::States tempFlags = flags; | ||||
|     KeyboardTranslator::States tempFlagMask = flagMask; | ||||
|  | ||||
|     for ( int i = 0 ; i < text.count() ; i++ ) | ||||
|     { | ||||
|         const QChar& ch = text[i]; | ||||
|         bool isFirstLetter = i == 0; | ||||
|         bool isLastLetter = ( i == text.count()-1 ); | ||||
|         endOfItem = true; | ||||
|         if ( ch.isLetterOrNumber() ) | ||||
|         { | ||||
|             endOfItem = false; | ||||
|             buffer.append(ch); | ||||
|         } else if ( isFirstLetter ) | ||||
|         { | ||||
|             buffer.append(ch); | ||||
|         } | ||||
|  | ||||
|         if ( (endOfItem || isLastLetter) && !buffer.isEmpty() ) | ||||
|         { | ||||
|             Qt::KeyboardModifier itemModifier = Qt::NoModifier; | ||||
|             int itemKeyCode = 0; | ||||
|             KeyboardTranslator::State itemFlag = KeyboardTranslator::NoState; | ||||
|  | ||||
|             if ( parseAsModifier(buffer,itemModifier) ) | ||||
|             { | ||||
|                 tempModifierMask |= itemModifier; | ||||
|  | ||||
|                 if ( isWanted ) | ||||
|                     tempModifiers |= itemModifier; | ||||
|             } | ||||
|             else if ( parseAsStateFlag(buffer,itemFlag) ) | ||||
|             { | ||||
|                 tempFlagMask |= itemFlag; | ||||
|  | ||||
|                 if ( isWanted ) | ||||
|                     tempFlags |= itemFlag; | ||||
|             } | ||||
|             else if ( parseAsKeyCode(buffer,itemKeyCode) ) | ||||
|                 keyCode = itemKeyCode; | ||||
|             else | ||||
|                 qDebug() << "Unable to parse key binding item:" << buffer; | ||||
|  | ||||
|             buffer.clear(); | ||||
|         } | ||||
|  | ||||
|         // check if this is a wanted / not-wanted flag and update the  | ||||
|         // state ready for the next item | ||||
|         if ( ch == '+' ) | ||||
|            isWanted = true; | ||||
|         else if ( ch == '-' ) | ||||
|            isWanted = false;  | ||||
|     }  | ||||
|  | ||||
|     modifiers = tempModifiers; | ||||
|     modifierMask = tempModifierMask; | ||||
|     flags = tempFlags; | ||||
|     flagMask = tempFlagMask; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool KeyboardTranslatorReader::parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier) | ||||
| { | ||||
|     if ( item == "shift" ) | ||||
|         modifier = Qt::ShiftModifier; | ||||
|     else if ( item == "ctrl" || item == "control" ) | ||||
|         modifier = Qt::ControlModifier; | ||||
|     else if ( item == "alt" ) | ||||
|         modifier = Qt::AltModifier; | ||||
|     else if ( item == "meta" ) | ||||
|         modifier = Qt::MetaModifier; | ||||
|     else if ( item == "keypad" ) | ||||
|         modifier = Qt::KeypadModifier; | ||||
|     else | ||||
|         return false; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
| bool KeyboardTranslatorReader::parseAsStateFlag(const QString& item , KeyboardTranslator::State& flag) | ||||
| { | ||||
|     if ( item == "appcukeys" || item == "appcursorkeys" ) | ||||
|         flag = KeyboardTranslator::CursorKeysState; | ||||
|     else if ( item == "ansi" ) | ||||
|         flag = KeyboardTranslator::AnsiState; | ||||
|     else if ( item == "newline" ) | ||||
|         flag = KeyboardTranslator::NewLineState; | ||||
|     else if ( item == "appscreen" ) | ||||
|         flag = KeyboardTranslator::AlternateScreenState; | ||||
|     else if ( item == "anymod" || item == "anymodifier" ) | ||||
|         flag = KeyboardTranslator::AnyModifierState; | ||||
|     else if ( item == "appkeypad" ) | ||||
|         flag = KeyboardTranslator::ApplicationKeypadState; | ||||
|     else | ||||
|         return false; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
| bool KeyboardTranslatorReader::parseAsKeyCode(const QString& item , int& keyCode) | ||||
| { | ||||
|     QKeySequence sequence = QKeySequence::fromString(item); | ||||
|     if ( !sequence.isEmpty() ) | ||||
|     { | ||||
|         keyCode = sequence[0]; | ||||
|  | ||||
|         if ( sequence.count() > 1 ) | ||||
|         { | ||||
|             qDebug() << "Unhandled key codes in sequence: " << item; | ||||
|         } | ||||
|     } | ||||
|     // additional cases implemented for backwards compatibility with KDE 3 | ||||
|     else if ( item == "prior" ) | ||||
|         keyCode = Qt::Key_PageUp; | ||||
|     else if ( item == "next" ) | ||||
|         keyCode = Qt::Key_PageDown; | ||||
|     else | ||||
|         return false; | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| QString KeyboardTranslatorReader::description() const | ||||
| { | ||||
|     return _description; | ||||
| } | ||||
| bool KeyboardTranslatorReader::hasNextEntry() | ||||
| { | ||||
|     return _hasNext; | ||||
| } | ||||
| KeyboardTranslator::Entry KeyboardTranslatorReader::createEntry( const QString& condition ,  | ||||
|                                                                  const QString& result ) | ||||
| { | ||||
|     QString entryString("keyboard \"temporary\"\nkey "); | ||||
|     entryString.append(condition); | ||||
|     entryString.append(" : "); | ||||
|  | ||||
|     // if 'result' is the name of a command then the entry result will be that command, | ||||
|     // otherwise the result will be treated as a string to echo when the key sequence | ||||
|     // specified by 'condition' is pressed | ||||
|     KeyboardTranslator::Command command; | ||||
|     if (parseAsCommand(result,command)) | ||||
|         entryString.append(result); | ||||
|     else | ||||
|         entryString.append('\"' + result + '\"'); | ||||
|  | ||||
|     QByteArray array = entryString.toUtf8(); | ||||
|     QBuffer buffer(&array); | ||||
|     buffer.open(QIODevice::ReadOnly); | ||||
|     KeyboardTranslatorReader reader(&buffer); | ||||
|  | ||||
|     KeyboardTranslator::Entry entry; | ||||
|     if ( reader.hasNextEntry() ) | ||||
|         entry = reader.nextEntry(); | ||||
|  | ||||
|     return entry; | ||||
| } | ||||
|  | ||||
| KeyboardTranslator::Entry KeyboardTranslatorReader::nextEntry()  | ||||
| { | ||||
|     Q_ASSERT( _hasNext ); | ||||
|     KeyboardTranslator::Entry entry = _nextEntry; | ||||
|     readNext(); | ||||
|     return entry; | ||||
| } | ||||
| bool KeyboardTranslatorReader::parseError() | ||||
| { | ||||
|     return false; | ||||
| } | ||||
| QList<KeyboardTranslatorReader::Token> KeyboardTranslatorReader::tokenize(const QString& line) | ||||
| { | ||||
|     QString text = line; | ||||
|  | ||||
|     // remove comments  | ||||
|     bool inQuotes = false; | ||||
|     int commentPos = -1; | ||||
|     for (int i=text.length()-1;i>=0;i--) | ||||
|     { | ||||
|         QChar ch = text[i]; | ||||
|         if (ch == '\"') | ||||
|             inQuotes = !inQuotes; | ||||
|         else if (ch == '#' && !inQuotes) | ||||
|             commentPos = i; | ||||
|     } | ||||
|     if (commentPos != -1) | ||||
|         text.remove(commentPos,text.length()); | ||||
|  | ||||
|     text = text.simplified(); | ||||
|     | ||||
|     // title line: keyboard "title" | ||||
|     static QRegExp title("keyboard\\s+\"(.*)\""); | ||||
|     // key line: key KeySequence : "output" | ||||
|     // key line: key KeySequence : command | ||||
|     static QRegExp key("key\\s+([\\w\\+\\s\\-\\*\\.]+)\\s*:\\s*(\"(.*)\"|\\w+)"); | ||||
|  | ||||
|     QList<Token> list; | ||||
|     if ( text.isEmpty() )  | ||||
|     { | ||||
|         return list; | ||||
|     } | ||||
|  | ||||
|     if ( title.exactMatch(text) ) | ||||
|     { | ||||
|         Token titleToken = { Token::TitleKeyword , QString() }; | ||||
|         Token textToken = { Token::TitleText , title.capturedTexts()[1] }; | ||||
|      | ||||
|         list << titleToken << textToken; | ||||
|     } | ||||
|     else if  ( key.exactMatch(text) ) | ||||
|     { | ||||
|         Token keyToken = { Token::KeyKeyword , QString() }; | ||||
|         Token sequenceToken = { Token::KeySequence , key.capturedTexts()[1].remove(' ') }; | ||||
|  | ||||
|         list << keyToken << sequenceToken; | ||||
|  | ||||
|         if ( key.capturedTexts()[3].isEmpty() ) | ||||
|         { | ||||
|             // capturedTexts()[2] is a command | ||||
|             Token commandToken = { Token::Command , key.capturedTexts()[2] }; | ||||
|             list << commandToken;     | ||||
|         }    | ||||
|         else | ||||
|         { | ||||
|             // capturedTexts()[3] is the output string | ||||
|            Token outputToken = { Token::OutputText , key.capturedTexts()[3] }; | ||||
|            list << outputToken; | ||||
|         }     | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         qDebug() << "Line in keyboard translator file could not be understood:" << text; | ||||
|     } | ||||
|  | ||||
|     return list; | ||||
| } | ||||
|  | ||||
| QList<QString> KeyboardTranslatorManager::allTranslators()  | ||||
| { | ||||
|     if ( !_haveLoadedAll ) | ||||
|     { | ||||
|         findTranslators(); | ||||
|     } | ||||
|  | ||||
|     return _translators.keys(); | ||||
| } | ||||
|  | ||||
| KeyboardTranslator::Entry::Entry() | ||||
| : _keyCode(0) | ||||
| , _modifiers(Qt::NoModifier) | ||||
| , _modifierMask(Qt::NoModifier) | ||||
| , _state(NoState) | ||||
| , _stateMask(NoState) | ||||
| , _command(NoCommand) | ||||
| { | ||||
| } | ||||
|  | ||||
| bool KeyboardTranslator::Entry::operator==(const Entry& rhs) const | ||||
| { | ||||
|     return _keyCode == rhs._keyCode && | ||||
|            _modifiers == rhs._modifiers && | ||||
|            _modifierMask == rhs._modifierMask && | ||||
|            _state == rhs._state && | ||||
|            _stateMask == rhs._stateMask && | ||||
|            _command == rhs._command && | ||||
|            _text == rhs._text; | ||||
| } | ||||
|  | ||||
| bool KeyboardTranslator::Entry::matches(int keyCode ,  | ||||
|                                         Qt::KeyboardModifiers modifiers, | ||||
|                                         States testState) const | ||||
| { | ||||
|     if ( _keyCode != keyCode ) | ||||
|         return false; | ||||
|  | ||||
|     if ( (modifiers & _modifierMask) != (_modifiers & _modifierMask) )  | ||||
|         return false; | ||||
|  | ||||
|     // if modifiers is non-zero, the 'any modifier' state is implicit | ||||
|     if ( modifiers != 0 ) | ||||
|         testState |= AnyModifierState; | ||||
|  | ||||
|     if ( (testState & _stateMask) != (_state & _stateMask) ) | ||||
|         return false; | ||||
|  | ||||
|     // special handling for the 'Any Modifier' state, which checks for the presence of  | ||||
|     // any or no modifiers.  In this context, the 'keypad' modifier does not count. | ||||
|     bool anyModifiersSet = modifiers != 0 && modifiers != Qt::KeypadModifier; | ||||
|     bool wantAnyModifier = _state & KeyboardTranslator::AnyModifierState; | ||||
|     if ( _stateMask & KeyboardTranslator::AnyModifierState ) | ||||
|     { | ||||
|         if ( wantAnyModifier != anyModifiersSet ) | ||||
|            return false; | ||||
|     } | ||||
|      | ||||
|     return true; | ||||
| } | ||||
| QByteArray KeyboardTranslator::Entry::escapedText(bool expandWildCards,Qt::KeyboardModifiers modifiers) const | ||||
| { | ||||
|     QByteArray result(text(expandWildCards,modifiers)); | ||||
|  | ||||
|     for ( int i = 0 ; i < result.count() ; i++ ) | ||||
|     { | ||||
|         char ch = result[i]; | ||||
|         char replacement = 0; | ||||
|  | ||||
|         switch ( ch ) | ||||
|         { | ||||
|             case 27 : replacement = 'E'; break; | ||||
|             case 8  : replacement = 'b'; break; | ||||
|             case 12 : replacement = 'f'; break; | ||||
|             case 9  : replacement = 't'; break; | ||||
|             case 13 : replacement = 'r'; break; | ||||
|             case 10 : replacement = 'n'; break; | ||||
|             default: | ||||
|                 // any character which is not printable is replaced by an equivalent | ||||
|                 // \xhh escape sequence (where 'hh' are the corresponding hex digits) | ||||
|                 if ( !QChar(ch).isPrint() ) | ||||
|                     replacement = 'x'; | ||||
|         } | ||||
|  | ||||
|         if ( replacement == 'x' ) | ||||
|         { | ||||
|             result.replace(i,1,"\\x"+QByteArray(1,ch).toHex());  | ||||
|         } else if ( replacement != 0 ) | ||||
|         { | ||||
|             result.remove(i,1); | ||||
|             result.insert(i,'\\'); | ||||
|             result.insert(i+1,replacement); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return result; | ||||
| } | ||||
| QByteArray KeyboardTranslator::Entry::unescape(const QByteArray& input) const | ||||
| { | ||||
|     QByteArray result(input); | ||||
|  | ||||
|     for ( int i = 0 ; i < result.count()-1 ; i++ ) | ||||
|     { | ||||
|  | ||||
|         QByteRef ch = result[i]; | ||||
|         if ( ch == '\\' ) | ||||
|         { | ||||
|            char replacement[2] = {0,0}; | ||||
|            int charsToRemove = 2; | ||||
|            bool escapedChar = true; | ||||
|  | ||||
|            switch ( result[i+1] ) | ||||
|            { | ||||
|               case 'E' : replacement[0] = 27; break; | ||||
|               case 'b' : replacement[0] = 8 ; break; | ||||
|               case 'f' : replacement[0] = 12; break; | ||||
|               case 't' : replacement[0] = 9 ; break; | ||||
|               case 'r' : replacement[0] = 13; break; | ||||
|               case 'n' : replacement[0] = 10; break; | ||||
|               case 'x' : | ||||
|                  { | ||||
|                     // format is \xh or \xhh where 'h' is a hexadecimal | ||||
|                     // digit from 0-9 or A-F which should be replaced | ||||
|                     // with the corresponding character value | ||||
|                     char hexDigits[3] = {0}; | ||||
|  | ||||
|                     if ( (i < result.count()-2) && isxdigit(result[i+2]) ) | ||||
|                             hexDigits[0] = result[i+2]; | ||||
|                     if ( (i < result.count()-3) && isxdigit(result[i+3]) ) | ||||
|                             hexDigits[1] = result[i+3]; | ||||
|  | ||||
|                     unsigned charValue = 0; | ||||
|                     sscanf(hexDigits,"%x",&charValue); | ||||
|  | ||||
|                     replacement[0] = (char)charValue;  | ||||
|                     charsToRemove = 2 + strlen(hexDigits); | ||||
|                   } | ||||
|               break; | ||||
|               default: | ||||
|                   escapedChar = false; | ||||
|            } | ||||
|  | ||||
|            if ( escapedChar ) | ||||
|                result.replace(i,charsToRemove,replacement); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| void KeyboardTranslator::Entry::insertModifier( QString& item , int modifier ) const | ||||
| { | ||||
|     if ( !(modifier & _modifierMask) ) | ||||
|         return; | ||||
|  | ||||
|     if ( modifier & _modifiers ) | ||||
|         item += '+'; | ||||
|     else | ||||
|         item += '-'; | ||||
|  | ||||
|     if ( modifier == Qt::ShiftModifier ) | ||||
|         item += "Shift"; | ||||
|     else if ( modifier == Qt::ControlModifier ) | ||||
|         item += "Ctrl"; | ||||
|     else if ( modifier == Qt::AltModifier ) | ||||
|         item += "Alt"; | ||||
|     else if ( modifier == Qt::MetaModifier ) | ||||
|         item += "Meta"; | ||||
|     else if ( modifier == Qt::KeypadModifier ) | ||||
|         item += "KeyPad"; | ||||
| } | ||||
| void KeyboardTranslator::Entry::insertState( QString& item , int state ) const | ||||
| { | ||||
|     if ( !(state & _stateMask) ) | ||||
|         return; | ||||
|  | ||||
|     if ( state & _state ) | ||||
|         item += '+' ; | ||||
|     else | ||||
|         item += '-' ; | ||||
|  | ||||
|     if ( state == KeyboardTranslator::AlternateScreenState ) | ||||
|         item += "AppScreen"; | ||||
|     else if ( state == KeyboardTranslator::NewLineState ) | ||||
|         item += "NewLine"; | ||||
|     else if ( state == KeyboardTranslator::AnsiState ) | ||||
|         item += "Ansi"; | ||||
|     else if ( state == KeyboardTranslator::CursorKeysState ) | ||||
|         item += "AppCursorKeys"; | ||||
|     else if ( state == KeyboardTranslator::AnyModifierState ) | ||||
|         item += "AnyModifier"; | ||||
|     else if ( state == KeyboardTranslator::ApplicationKeypadState ) | ||||
|         item += "AppKeypad"; | ||||
| } | ||||
| QString KeyboardTranslator::Entry::resultToString(bool expandWildCards,Qt::KeyboardModifiers modifiers) const | ||||
| { | ||||
|     if ( !_text.isEmpty() ) | ||||
|         return escapedText(expandWildCards,modifiers); | ||||
|     else if ( _command == EraseCommand ) | ||||
|         return "Erase"; | ||||
|     else if ( _command == ScrollPageUpCommand ) | ||||
|         return "ScrollPageUp"; | ||||
|     else if ( _command == ScrollPageDownCommand ) | ||||
|         return "ScrollPageDown"; | ||||
|     else if ( _command == ScrollLineUpCommand ) | ||||
|         return "ScrollLineUp"; | ||||
|     else if ( _command == ScrollLineDownCommand ) | ||||
|         return "ScrollLineDown"; | ||||
|     else if ( _command == ScrollLockCommand ) | ||||
|         return "ScrollLock"; | ||||
|  | ||||
|     return QString(); | ||||
| } | ||||
| QString KeyboardTranslator::Entry::conditionToString() const | ||||
| { | ||||
|     QString result = QKeySequence(_keyCode).toString(); | ||||
|  | ||||
|     insertModifier( result , Qt::ShiftModifier ); | ||||
|     insertModifier( result , Qt::ControlModifier ); | ||||
|     insertModifier( result , Qt::AltModifier ); | ||||
|     insertModifier( result , Qt::MetaModifier ); | ||||
|     insertModifier( result , Qt::KeypadModifier ); | ||||
|  | ||||
|     insertState( result , KeyboardTranslator::AlternateScreenState ); | ||||
|     insertState( result , KeyboardTranslator::NewLineState ); | ||||
|     insertState( result , KeyboardTranslator::AnsiState ); | ||||
|     insertState( result , KeyboardTranslator::CursorKeysState ); | ||||
|     insertState( result , KeyboardTranslator::AnyModifierState ); | ||||
|     insertState( result , KeyboardTranslator::ApplicationKeypadState ); | ||||
|  | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| KeyboardTranslator::KeyboardTranslator(const QString& name) | ||||
| : _name(name) | ||||
| { | ||||
| } | ||||
|  | ||||
| void KeyboardTranslator::setDescription(const QString& description)  | ||||
| { | ||||
|     _description = description; | ||||
| } | ||||
| QString KeyboardTranslator::description() const | ||||
| { | ||||
|     return _description; | ||||
| } | ||||
| void KeyboardTranslator::setName(const QString& name) | ||||
| { | ||||
|     _name = name; | ||||
| } | ||||
| QString KeyboardTranslator::name() const | ||||
| { | ||||
|     return _name; | ||||
| } | ||||
|  | ||||
| QList<KeyboardTranslator::Entry> KeyboardTranslator::entries() const | ||||
| { | ||||
|     return _entries.values(); | ||||
| } | ||||
|  | ||||
| void KeyboardTranslator::addEntry(const Entry& entry) | ||||
| { | ||||
|     const int keyCode = entry.keyCode(); | ||||
|     _entries.insert(keyCode,entry); | ||||
| } | ||||
| void KeyboardTranslator::replaceEntry(const Entry& existing , const Entry& replacement) | ||||
| { | ||||
|     if ( !existing.isNull() ) | ||||
|         _entries.remove(existing.keyCode(),existing); | ||||
|     _entries.insert(replacement.keyCode(),replacement); | ||||
| } | ||||
| void KeyboardTranslator::removeEntry(const Entry& entry) | ||||
| { | ||||
|     _entries.remove(entry.keyCode(),entry); | ||||
| } | ||||
| KeyboardTranslator::Entry KeyboardTranslator::findEntry(int keyCode, Qt::KeyboardModifiers modifiers, States state) const | ||||
| { | ||||
|     foreach(const Entry& entry, _entries.values(keyCode)) | ||||
|     { | ||||
|         if ( entry.matches(keyCode,modifiers,state) ) | ||||
|             return entry; | ||||
|     } | ||||
|     return Entry(); // entry not found | ||||
| } | ||||
| void KeyboardTranslatorManager::addTranslator(KeyboardTranslator* translator) | ||||
| { | ||||
|     _translators.insert(translator->name(),translator); | ||||
|  | ||||
|     if ( !saveTranslator(translator) ) | ||||
|         qDebug() << "Unable to save translator" << translator->name() | ||||
|                    << "to disk."; | ||||
| } | ||||
| bool KeyboardTranslatorManager::deleteTranslator(const QString& name) | ||||
| { | ||||
|     Q_ASSERT( _translators.contains(name) ); | ||||
|  | ||||
|     // locate and delete | ||||
|     QString path = findTranslatorPath(name); | ||||
|     if ( QFile::remove(path) ) | ||||
|     { | ||||
|         _translators.remove(name); | ||||
|         return true;  | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         qDebug() << "Failed to remove translator - " << path; | ||||
|         return false; | ||||
|     } | ||||
| } | ||||
| //K_GLOBAL_STATIC( KeyboardTranslatorManager , theKeyboardTranslatorManager ) | ||||
| KeyboardTranslatorManager* KeyboardTranslatorManager::theKeyboardTranslatorManager = 0; | ||||
| KeyboardTranslatorManager* KeyboardTranslatorManager::instance() | ||||
| { | ||||
|     if (! theKeyboardTranslatorManager) | ||||
|         theKeyboardTranslatorManager = new KeyboardTranslatorManager(); | ||||
|     return theKeyboardTranslatorManager; | ||||
| } | ||||
							
								
								
									
										584
									
								
								konsole-qml-plugin/src/KeyboardTranslator.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										584
									
								
								konsole-qml-plugin/src/KeyboardTranslator.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,584 @@ | ||||
| /* | ||||
|     This source file is part of Konsole, a terminal emulator. | ||||
|  | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef KEYBOARDTRANSLATOR_H | ||||
| #define KEYBOARDTRANSLATOR_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QHash> | ||||
| #include <QtCore/QList> | ||||
| #include <QtGui/QKeySequence> | ||||
| #include <QtCore/QMetaType> | ||||
| #include <QtCore/QVarLengthArray> | ||||
|  | ||||
| // Konsole | ||||
| //#include "konsole_export.h" | ||||
| #define KONSOLEPRIVATE_EXPORT | ||||
|  | ||||
| class QIODevice; | ||||
| class QTextStream; | ||||
|  | ||||
|  | ||||
| /**  | ||||
|  * A convertor which maps between key sequences pressed by the user and the | ||||
|  * character strings which should be sent to the terminal and commands | ||||
|  * which should be invoked when those character sequences are pressed. | ||||
|  * | ||||
|  * Konsole supports multiple keyboard translators, allowing the user to | ||||
|  * specify the character sequences which are sent to the terminal | ||||
|  * when particular key sequences are pressed. | ||||
|  * | ||||
|  * A key sequence is defined as a key code, associated keyboard modifiers | ||||
|  * (Shift,Ctrl,Alt,Meta etc.) and state flags which indicate the state | ||||
|  * which the terminal must be in for the key sequence to apply. | ||||
|  */ | ||||
| class KeyboardTranslator | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * The meaning of a particular key sequence may depend upon the state which | ||||
|      * the terminal emulation is in.  Therefore findEntry() may return a different | ||||
|      * Entry depending upon the state flags supplied. | ||||
|      * | ||||
|      * This enum describes the states which may be associated with with a particular | ||||
|      * entry in the keyboard translation entry. | ||||
|      */ | ||||
|     enum State | ||||
|     { | ||||
|         /** Indicates that no special state is active */ | ||||
|         NoState = 0, | ||||
|         /** | ||||
|          * TODO More documentation | ||||
|          */ | ||||
|         NewLineState = 1, | ||||
|         /**  | ||||
|          * Indicates that the terminal is in 'Ansi' mode. | ||||
|          * TODO: More documentation | ||||
|          */ | ||||
|         AnsiState = 2, | ||||
|         /** | ||||
|          * TODO More documentation | ||||
|          */ | ||||
|         CursorKeysState = 4, | ||||
|         /** | ||||
|          * Indicates that the alternate screen ( typically used by interactive programs | ||||
|          * such as screen or vim ) is active  | ||||
|          */ | ||||
|         AlternateScreenState = 8, | ||||
|         /** Indicates that any of the modifier keys is active. */  | ||||
|         AnyModifierState = 16, | ||||
|         /** Indicates that the numpad is in application mode. */ | ||||
|         ApplicationKeypadState = 32 | ||||
|     }; | ||||
|     Q_DECLARE_FLAGS(States,State) | ||||
|  | ||||
|     /** | ||||
|      * This enum describes commands which are associated with particular key sequences. | ||||
|      */ | ||||
|     enum Command | ||||
|     { | ||||
|         /** Indicates that no command is associated with this command sequence */ | ||||
|         NoCommand = 0, | ||||
|         /** TODO Document me */ | ||||
|         SendCommand = 1, | ||||
|         /** Scroll the terminal display up one page */ | ||||
|         ScrollPageUpCommand = 2, | ||||
|         /** Scroll the terminal display down one page */ | ||||
|         ScrollPageDownCommand = 4, | ||||
|         /** Scroll the terminal display up one line */ | ||||
|         ScrollLineUpCommand = 8, | ||||
|         /** Scroll the terminal display down one line */ | ||||
|         ScrollLineDownCommand = 16, | ||||
|         /** Toggles scroll lock mode */ | ||||
|         ScrollLockCommand = 32, | ||||
|         /** Echos the operating system specific erase character. */ | ||||
|         EraseCommand = 64 | ||||
|     }; | ||||
|     Q_DECLARE_FLAGS(Commands,Command) | ||||
|  | ||||
|     /** | ||||
|      * Represents an association between a key sequence pressed by the user | ||||
|      * and the character sequence and commands associated with it for a particular | ||||
|      * KeyboardTranslator. | ||||
|      */ | ||||
|     class Entry | ||||
|     { | ||||
|     public: | ||||
|         /**  | ||||
|          * Constructs a new entry for a keyboard translator. | ||||
|          */ | ||||
|         Entry(); | ||||
|  | ||||
|         /**  | ||||
|          * Returns true if this entry is null. | ||||
|          * This is true for newly constructed entries which have no properties set.  | ||||
|          */ | ||||
|         bool isNull() const; | ||||
|  | ||||
|         /** Returns the commands associated with this entry */ | ||||
|         Command command() const; | ||||
|         /** Sets the command associated with this entry. */ | ||||
|         void setCommand(Command command); | ||||
|  | ||||
|         /**  | ||||
|          * Returns the character sequence associated with this entry, optionally replacing  | ||||
|          * wildcard '*' characters with numbers to indicate the keyboard modifiers being pressed. | ||||
|          * | ||||
|          * TODO: The numbers used to replace '*' characters are taken from the Konsole/KDE 3 code. | ||||
|          * Document them.  | ||||
|          * | ||||
|          * @param expandWildCards Specifies whether wild cards (occurrences of the '*' character) in | ||||
|          * the entry should be replaced with a number to indicate the modifier keys being pressed.  | ||||
|          * | ||||
|          * @param modifiers The keyboard modifiers being pressed. | ||||
|          */ | ||||
|         QByteArray text(bool expandWildCards = false, | ||||
|                         Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; | ||||
|  | ||||
|         /** Sets the character sequence associated with this entry */ | ||||
|         void setText(const QByteArray& text); | ||||
|  | ||||
|         /**  | ||||
|          * Returns the character sequence associated with this entry, | ||||
|          * with any non-printable characters replaced with escape sequences. | ||||
|          * | ||||
|          * eg. \\E for Escape, \\t for tab, \\n for new line. | ||||
|          * | ||||
|          * @param expandWildCards See text() | ||||
|          * @param modifiers See text() | ||||
|          */ | ||||
|         QByteArray escapedText(bool expandWildCards = false, | ||||
|                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; | ||||
|  | ||||
|         /** Returns the character code ( from the Qt::Key enum ) associated with this entry */ | ||||
|         int keyCode() const; | ||||
|         /** Sets the character code associated with this entry */ | ||||
|         void setKeyCode(int keyCode); | ||||
|  | ||||
|         /**  | ||||
|          * Returns a bitwise-OR of the enabled keyboard modifiers associated with this entry.  | ||||
|          * If a modifier is set in modifierMask() but not in modifiers(), this means that the entry | ||||
|          * only matches when that modifier is NOT pressed. | ||||
|          * | ||||
|          * If a modifier is not set in modifierMask() then the entry matches whether the modifier | ||||
|          * is pressed or not.  | ||||
|          */ | ||||
|         Qt::KeyboardModifiers modifiers() const; | ||||
|  | ||||
|         /** Returns the keyboard modifiers which are valid in this entry.  See modifiers() */ | ||||
|         Qt::KeyboardModifiers modifierMask() const; | ||||
|  | ||||
|         /** See modifiers() */ | ||||
|         void setModifiers( Qt::KeyboardModifiers modifiers ); | ||||
|         /** See modifierMask() and modifiers() */ | ||||
|         void setModifierMask( Qt::KeyboardModifiers modifiers ); | ||||
|  | ||||
|         /**  | ||||
|          * Returns a bitwise-OR of the enabled state flags associated with this entry.  | ||||
|          * If flag is set in stateMask() but not in state(), this means that the entry only  | ||||
|          * matches when the terminal is NOT in that state. | ||||
|          * | ||||
|          * If a state is not set in stateMask() then the entry matches whether the terminal | ||||
|          * is in that state or not.  | ||||
|          */ | ||||
|         States state() const; | ||||
|  | ||||
|         /** Returns the state flags which are valid in this entry.  See state() */ | ||||
|         States stateMask() const; | ||||
|  | ||||
|         /** See state() */ | ||||
|         void setState( States state ); | ||||
|         /** See stateMask() */ | ||||
|         void setStateMask( States mask ); | ||||
|  | ||||
|         /**  | ||||
|          * Returns the key code and modifiers associated with this entry  | ||||
|          * as a QKeySequence | ||||
|          */ | ||||
|         //QKeySequence keySequence() const; | ||||
|  | ||||
|         /**  | ||||
|          * Returns this entry's conditions ( ie. its key code, modifier and state criteria ) | ||||
|          * as a string. | ||||
|          */ | ||||
|         QString conditionToString() const; | ||||
|  | ||||
|         /** | ||||
|          * Returns this entry's result ( ie. its command or character sequence ) | ||||
|          * as a string. | ||||
|          * | ||||
|          * @param expandWildCards See text() | ||||
|          * @param modifiers See text() | ||||
|          */ | ||||
|         QString resultToString(bool expandWildCards = false, | ||||
|                                Qt::KeyboardModifiers modifiers = Qt::NoModifier) const; | ||||
|  | ||||
|         /**  | ||||
|          * Returns true if this entry matches the given key sequence, specified | ||||
|          * as a combination of @p keyCode , @p modifiers and @p state. | ||||
|          */ | ||||
|         bool matches( int keyCode ,  | ||||
|                       Qt::KeyboardModifiers modifiers ,  | ||||
|                       States flags ) const; | ||||
|  | ||||
|         bool operator==(const Entry& rhs) const; | ||||
|         | ||||
|     private: | ||||
|         void insertModifier( QString& item , int modifier ) const; | ||||
|         void insertState( QString& item , int state ) const; | ||||
|         QByteArray unescape(const QByteArray& text) const; | ||||
|  | ||||
|         int _keyCode; | ||||
|         Qt::KeyboardModifiers _modifiers; | ||||
|         Qt::KeyboardModifiers _modifierMask; | ||||
|         States _state; | ||||
|         States _stateMask; | ||||
|  | ||||
|         Command _command; | ||||
|         QByteArray _text; | ||||
|     }; | ||||
|  | ||||
|     /** Constructs a new keyboard translator with the given @p name */ | ||||
|     KeyboardTranslator(const QString& name); | ||||
|     | ||||
|     //KeyboardTranslator(const KeyboardTranslator& other); | ||||
|  | ||||
|     /** Returns the name of this keyboard translator */ | ||||
|     QString name() const; | ||||
|  | ||||
|     /** Sets the name of this keyboard translator */ | ||||
|     void setName(const QString& name); | ||||
|  | ||||
|     /** Returns the descriptive name of this keyboard translator */ | ||||
|     QString description() const; | ||||
|  | ||||
|     /** Sets the descriptive name of this keyboard translator */ | ||||
|     void setDescription(const QString& description); | ||||
|  | ||||
|     /** | ||||
|      * Looks for an entry in this keyboard translator which matches the given | ||||
|      * key code, keyboard modifiers and state flags. | ||||
|      *  | ||||
|      * Returns the matching entry if found or a null Entry otherwise ( ie. | ||||
|      * entry.isNull() will return true ) | ||||
|      * | ||||
|      * @param keyCode A key code from the Qt::Key enum | ||||
|      * @param modifiers A combination of modifiers | ||||
|      * @param state Optional flags which specify the current state of the terminal | ||||
|      */ | ||||
|     Entry findEntry(int keyCode ,  | ||||
|                     Qt::KeyboardModifiers modifiers ,  | ||||
|                     States state = NoState) const; | ||||
|  | ||||
|     /**  | ||||
|      * Adds an entry to this keyboard translator's table.  Entries can be looked up according | ||||
|      * to their key sequence using findEntry() | ||||
|      */ | ||||
|     void addEntry(const Entry& entry); | ||||
|  | ||||
|     /** | ||||
|      * Replaces an entry in the translator.  If the @p existing entry is null, | ||||
|      * then this is equivalent to calling addEntry(@p replacement) | ||||
|      */ | ||||
|     void replaceEntry(const Entry& existing , const Entry& replacement); | ||||
|  | ||||
|     /** | ||||
|      * Removes an entry from the table. | ||||
|      */ | ||||
|     void removeEntry(const Entry& entry); | ||||
|  | ||||
|     /** Returns a list of all entries in the translator. */ | ||||
|     QList<Entry> entries() const; | ||||
|  | ||||
| private: | ||||
|  | ||||
|     QMultiHash<int,Entry> _entries; // entries in this keyboard translation, | ||||
|                                                  // entries are indexed according to | ||||
|                                                  // their keycode | ||||
|     QString _name; | ||||
|     QString _description; | ||||
| }; | ||||
| Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::States) | ||||
| Q_DECLARE_OPERATORS_FOR_FLAGS(KeyboardTranslator::Commands) | ||||
|  | ||||
| /**  | ||||
|  * Parses the contents of a Keyboard Translator (.keytab) file and  | ||||
|  * returns the entries found in it. | ||||
|  * | ||||
|  * Usage example: | ||||
|  * | ||||
|  * @code | ||||
|  *  QFile source( "/path/to/keytab" ); | ||||
|  *  source.open( QIODevice::ReadOnly ); | ||||
|  * | ||||
|  *  KeyboardTranslator* translator = new KeyboardTranslator( "name-of-translator" ); | ||||
|  * | ||||
|  *  KeyboardTranslatorReader reader(source); | ||||
|  *  while ( reader.hasNextEntry() ) | ||||
|  *      translator->addEntry(reader.nextEntry()); | ||||
|  * | ||||
|  *  source.close(); | ||||
|  * | ||||
|  *  if ( !reader.parseError() ) | ||||
|  *  { | ||||
|  *      // parsing succeeded, do something with the translator | ||||
|  *  }  | ||||
|  *  else | ||||
|  *  { | ||||
|  *      // parsing failed | ||||
|  *  } | ||||
|  * @endcode | ||||
|  */ | ||||
| class KeyboardTranslatorReader | ||||
| { | ||||
| public: | ||||
|     /** Constructs a new reader which parses the given @p source */ | ||||
|     KeyboardTranslatorReader( QIODevice* source ); | ||||
|  | ||||
|     /**  | ||||
|      * Returns the description text.  | ||||
|      * TODO: More documentation  | ||||
|      */ | ||||
|     QString description() const; | ||||
|  | ||||
|     /** Returns true if there is another entry in the source stream */ | ||||
|     bool hasNextEntry(); | ||||
|     /** Returns the next entry found in the source stream */ | ||||
|     KeyboardTranslator::Entry nextEntry();  | ||||
|  | ||||
|     /**  | ||||
|      * Returns true if an error occurred whilst parsing the input or | ||||
|      * false if no error occurred. | ||||
|      */ | ||||
|     bool parseError(); | ||||
|  | ||||
|     /** | ||||
|      * Parses a condition and result string for a translator entry | ||||
|      * and produces a keyboard translator entry. | ||||
|      * | ||||
|      * The condition and result strings are in the same format as in   | ||||
|      */ | ||||
|     static KeyboardTranslator::Entry createEntry( const QString& condition , | ||||
|                                                   const QString& result ); | ||||
| private: | ||||
|     struct Token | ||||
|     { | ||||
|         enum Type | ||||
|         { | ||||
|             TitleKeyword, | ||||
|             TitleText, | ||||
|             KeyKeyword, | ||||
|             KeySequence, | ||||
|             Command, | ||||
|             OutputText | ||||
|         }; | ||||
|         Type type; | ||||
|         QString text; | ||||
|     }; | ||||
|     QList<Token> tokenize(const QString&); | ||||
|     void readNext(); | ||||
|     bool decodeSequence(const QString& ,  | ||||
|                                 int& keyCode, | ||||
|                                 Qt::KeyboardModifiers& modifiers, | ||||
|                                 Qt::KeyboardModifiers& modifierMask, | ||||
|                                 KeyboardTranslator::States& state, | ||||
|                                 KeyboardTranslator::States& stateFlags); | ||||
|  | ||||
|     static bool parseAsModifier(const QString& item , Qt::KeyboardModifier& modifier); | ||||
|     static bool parseAsStateFlag(const QString& item , KeyboardTranslator::State& state); | ||||
|     static bool parseAsKeyCode(const QString& item , int& keyCode); | ||||
|        static bool parseAsCommand(const QString& text , KeyboardTranslator::Command& command); | ||||
|  | ||||
|     QIODevice* _source; | ||||
|     QString _description; | ||||
|     KeyboardTranslator::Entry _nextEntry; | ||||
|     bool _hasNext; | ||||
| }; | ||||
|  | ||||
| /** Writes a keyboard translation to disk. */ | ||||
| class KeyboardTranslatorWriter | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * Constructs a new writer which saves data into @p destination. | ||||
|      * The caller is responsible for closing the device when writing is complete. | ||||
|      */ | ||||
|     KeyboardTranslatorWriter(QIODevice* destination); | ||||
|     ~KeyboardTranslatorWriter(); | ||||
|  | ||||
|     /**  | ||||
|      * Writes the header for the keyboard translator.  | ||||
|      * @param description Description of the keyboard translator.  | ||||
|      */ | ||||
|     void writeHeader( const QString& description ); | ||||
|     /** Writes a translator entry. */ | ||||
|     void writeEntry( const KeyboardTranslator::Entry& entry );  | ||||
|  | ||||
| private: | ||||
|     QIODevice* _destination;   | ||||
|     QTextStream* _writer; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Manages the keyboard translations available for use by terminal sessions, | ||||
|  * see KeyboardTranslator. | ||||
|  */ | ||||
| class KONSOLEPRIVATE_EXPORT KeyboardTranslatorManager | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * Constructs a new KeyboardTranslatorManager and loads the list of | ||||
|      * available keyboard translations. | ||||
|      * | ||||
|      * The keyboard translations themselves are not loaded until they are | ||||
|      * first requested via a call to findTranslator() | ||||
|      */ | ||||
|     KeyboardTranslatorManager(); | ||||
|     ~KeyboardTranslatorManager(); | ||||
|  | ||||
|     /** | ||||
|      * Adds a new translator.  If a translator with the same name  | ||||
|      * already exists, it will be replaced by the new translator. | ||||
|      * | ||||
|      * TODO: More documentation. | ||||
|      */ | ||||
|     void addTranslator(KeyboardTranslator* translator); | ||||
|  | ||||
|     /** | ||||
|      * Deletes a translator.  Returns true on successful deletion or false otherwise. | ||||
|      * | ||||
|      * TODO: More documentation | ||||
|      */ | ||||
|     bool deleteTranslator(const QString& name); | ||||
|  | ||||
|     /** Returns the default translator for Konsole. */ | ||||
|     const KeyboardTranslator* defaultTranslator(); | ||||
|  | ||||
|     /**  | ||||
|      * Returns the keyboard translator with the given name or 0 if no translator | ||||
|      * with that name exists. | ||||
|      * | ||||
|      * The first time that a translator with a particular name is requested, | ||||
|      * the on-disk .keyboard file is loaded and parsed.   | ||||
|      */ | ||||
|     const KeyboardTranslator* findTranslator(const QString& name); | ||||
|     /** | ||||
|      * Returns a list of the names of available keyboard translators. | ||||
|      * | ||||
|      * The first time this is called, a search for available  | ||||
|      * translators is started. | ||||
|      */ | ||||
|     QList<QString> allTranslators(); | ||||
|  | ||||
|     /** Returns the global KeyboardTranslatorManager instance. */ | ||||
|    static KeyboardTranslatorManager* instance(); | ||||
|  | ||||
| private: | ||||
|     static const QByteArray defaultTranslatorText; | ||||
|      | ||||
|     void findTranslators(); // locate the available translators | ||||
|     KeyboardTranslator* loadTranslator(const QString& name); // loads the translator  | ||||
|                                                              // with the given name | ||||
|     KeyboardTranslator* loadTranslator(QIODevice* device,const QString& name); | ||||
|  | ||||
|     bool saveTranslator(const KeyboardTranslator* translator); | ||||
|     QString findTranslatorPath(const QString& name); | ||||
|      | ||||
|     QHash<QString,KeyboardTranslator*> _translators; // maps translator-name -> KeyboardTranslator | ||||
|                                                      // instance | ||||
|     bool _haveLoadedAll; | ||||
|  | ||||
|     static KeyboardTranslatorManager * theKeyboardTranslatorManager; | ||||
| }; | ||||
|  | ||||
| inline int KeyboardTranslator::Entry::keyCode() const { return _keyCode; } | ||||
| inline void KeyboardTranslator::Entry::setKeyCode(int keyCode) { _keyCode = keyCode; } | ||||
|  | ||||
| inline void KeyboardTranslator::Entry::setModifiers( Qt::KeyboardModifiers modifier )  | ||||
| {  | ||||
|     _modifiers = modifier; | ||||
| } | ||||
| inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifiers() const { return _modifiers; } | ||||
|  | ||||
| inline void  KeyboardTranslator::Entry::setModifierMask( Qt::KeyboardModifiers mask )  | ||||
| {  | ||||
|    _modifierMask = mask;  | ||||
| } | ||||
| inline Qt::KeyboardModifiers KeyboardTranslator::Entry::modifierMask() const { return _modifierMask; } | ||||
|  | ||||
| inline bool KeyboardTranslator::Entry::isNull() const | ||||
| { | ||||
|     return ( *this == Entry() ); | ||||
| } | ||||
|  | ||||
| inline void KeyboardTranslator::Entry::setCommand( Command command ) | ||||
| {  | ||||
|     _command = command;  | ||||
| } | ||||
| inline KeyboardTranslator::Command KeyboardTranslator::Entry::command() const { return _command; } | ||||
|  | ||||
| inline void KeyboardTranslator::Entry::setText( const QByteArray& text ) | ||||
| {  | ||||
|     _text = unescape(text); | ||||
| } | ||||
| inline int oneOrZero(int value) | ||||
| { | ||||
|     return value ? 1 : 0; | ||||
| } | ||||
| inline QByteArray KeyboardTranslator::Entry::text(bool expandWildCards,Qt::KeyboardModifiers modifiers) const  | ||||
| { | ||||
|     QByteArray expandedText = _text; | ||||
|      | ||||
|     if (expandWildCards) | ||||
|     { | ||||
|         int modifierValue = 1; | ||||
|         modifierValue += oneOrZero(modifiers & Qt::ShiftModifier); | ||||
|         modifierValue += oneOrZero(modifiers & Qt::AltModifier)     << 1; | ||||
|         modifierValue += oneOrZero(modifiers & Qt::ControlModifier) << 2; | ||||
|  | ||||
|         for (int i=0;i<_text.length();i++)  | ||||
|         { | ||||
|             if (expandedText[i] == '*') | ||||
|                 expandedText[i] = '0' + modifierValue; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return expandedText;  | ||||
| } | ||||
|  | ||||
| inline void KeyboardTranslator::Entry::setState( States state ) | ||||
| {  | ||||
|     _state = state;  | ||||
| } | ||||
| inline KeyboardTranslator::States KeyboardTranslator::Entry::state() const { return _state; } | ||||
|  | ||||
| inline void KeyboardTranslator::Entry::setStateMask( States stateMask ) | ||||
| {  | ||||
|     _stateMask = stateMask;  | ||||
| } | ||||
| inline KeyboardTranslator::States KeyboardTranslator::Entry::stateMask() const { return _stateMask; } | ||||
|  | ||||
|  | ||||
| Q_DECLARE_METATYPE(KeyboardTranslator::Entry) | ||||
| Q_DECLARE_METATYPE(const KeyboardTranslator*) | ||||
|  | ||||
| #endif // KEYBOARDTRANSLATOR_H | ||||
|  | ||||
							
								
								
									
										21
									
								
								konsole-qml-plugin/src/LineFont.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								konsole-qml-plugin/src/LineFont.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,21 @@ | ||||
| // WARNING: Autogenerated by "fontembedder ./linefont.src". | ||||
| // You probably do not want to hand-edit this! | ||||
|  | ||||
| static const quint32 LineChars[] = { | ||||
|     0x00007c00, 0x000fffe0, 0x00421084, 0x00e739ce, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
|     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00427000, 0x004e7380, 0x00e77800, 0x00ef7bc0, | ||||
|     0x00421c00, 0x00439ce0, 0x00e73c00, 0x00e7bde0, 0x00007084, 0x000e7384, 0x000079ce, 0x000f7bce, | ||||
|     0x00001c84, 0x00039ce4, 0x00003dce, 0x0007bdee, 0x00427084, 0x004e7384, 0x004279ce, 0x00e77884, | ||||
|     0x00e779ce, 0x004f7bce, 0x00ef7bc4, 0x00ef7bce, 0x00421c84, 0x00439ce4, 0x00423dce, 0x00e73c84, | ||||
|     0x00e73dce, 0x0047bdee, 0x00e7bde4, 0x00e7bdee, 0x00427c00, 0x0043fce0, 0x004e7f80, 0x004fffe0, | ||||
|     0x004fffe0, 0x00e7fde0, 0x006f7fc0, 0x00efffe0, 0x00007c84, 0x0003fce4, 0x000e7f84, 0x000fffe4, | ||||
|     0x00007dce, 0x0007fdee, 0x000f7fce, 0x000fffee, 0x00427c84, 0x0043fce4, 0x004e7f84, 0x004fffe4, | ||||
|     0x00427dce, 0x00e77c84, 0x00e77dce, 0x0047fdee, 0x004e7fce, 0x00e7fde4, 0x00ef7f84, 0x004fffee, | ||||
|     0x00efffe4, 0x00e7fdee, 0x00ef7fce, 0x00efffee, 0x00000000, 0x00000000, 0x00000000, 0x00000000, | ||||
|     0x000f83e0, 0x00a5294a, 0x004e1380, 0x00a57800, 0x00ad0bc0, 0x004390e0, 0x00a53c00, 0x00a5a1e0, | ||||
|     0x000e1384, 0x0000794a, 0x000f0b4a, 0x000390e4, 0x00003d4a, 0x0007a16a, 0x004e1384, 0x00a5694a, | ||||
|     0x00ad2b4a, 0x004390e4, 0x00a52d4a, 0x00a5a16a, 0x004f83e0, 0x00a57c00, 0x00ad83e0, 0x000f83e4, | ||||
|     0x00007d4a, 0x000f836a, 0x004f93e4, 0x00a57d4a, 0x00ad836a, 0x00000000, 0x00000000, 0x00000000, | ||||
|     0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00001c00, 0x00001084, 0x00007000, 0x00421000, | ||||
|     0x00039ce0, 0x000039ce, 0x000e7380, 0x00e73800, 0x000e7f80, 0x00e73884, 0x0003fce0, 0x004239ce | ||||
| }; | ||||
							
								
								
									
										786
									
								
								konsole-qml-plugin/src/LineFont.src
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										786
									
								
								konsole-qml-plugin/src/LineFont.src
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,786 @@ | ||||
| #2500: single horizontal line | ||||
| 2500 | ||||
|       | ||||
|       | ||||
| ----- | ||||
|       | ||||
|       | ||||
|  | ||||
| #2501: triple horizontal line | ||||
| 2501 | ||||
|       | ||||
| ----- | ||||
| ----- | ||||
| ----- | ||||
|       | ||||
|  | ||||
| #2502: single vertical line | ||||
| 2502 | ||||
|   |   | ||||
|   |   | ||||
|   |   | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| #2503: triple vertical line | ||||
| 2503 | ||||
|  |||  | ||||
|  |||  | ||||
|  |||  | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| #2504-250B are dashed - not handled | ||||
|  | ||||
| #250C: top-left corner (lines on bottom + right) | ||||
| 250C | ||||
|       | ||||
|       | ||||
|   .-- | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| #250D: as above, but top line triple-width | ||||
| 250D | ||||
|       | ||||
|   .-- | ||||
|   .-- | ||||
|   |-- | ||||
|   |   | ||||
|  | ||||
| #250E: now the vert line triple-width | ||||
| 250E | ||||
|       | ||||
|       | ||||
|  ..-- | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| #250F: and now both lines triple-width | ||||
| 250F | ||||
|       | ||||
|  .___ | ||||
|  |.-- | ||||
|  ||._ | ||||
|  |||  | ||||
|  | ||||
| #2510: top-right corner | ||||
| 2510 | ||||
|       | ||||
|       | ||||
| --.   | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| 2511 | ||||
|       | ||||
| ==.   | ||||
| ==.   | ||||
| ==|   | ||||
|   |  | ||||
|  | ||||
| 2512 | ||||
|       | ||||
|       | ||||
| ==..  | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| 2513 | ||||
|       | ||||
| ===.  | ||||
| ==.|  | ||||
| =.||  | ||||
|  |||  | ||||
|  | ||||
| #2514: bottom-left corner | ||||
| 2514 | ||||
|   |   | ||||
|   |   | ||||
|   .== | ||||
|       | ||||
|       | ||||
|  | ||||
| 2515 | ||||
|   |   | ||||
|   |== | ||||
|   |== | ||||
|   === | ||||
|       | ||||
|  | ||||
|  | ||||
| 2516 | ||||
|  |||  | ||||
|  |||  | ||||
|  |.== | ||||
|       | ||||
|       | ||||
|  | ||||
| 2517 | ||||
|  |||  | ||||
|  ||.= | ||||
|  |.== | ||||
|  .=== | ||||
|       | ||||
|  | ||||
| #2518: bottm-right corner | ||||
| 2518 | ||||
|   |   | ||||
|   |   | ||||
| ==.   | ||||
|       | ||||
|       | ||||
|  | ||||
| 2519 | ||||
|   |   | ||||
| ==|   | ||||
| ==|   | ||||
| ===   | ||||
|       | ||||
|  | ||||
|  | ||||
| 251A | ||||
|  |||  | ||||
|  |||  | ||||
| ====  | ||||
|       | ||||
|       | ||||
|  | ||||
| 251B | ||||
|  |||  | ||||
| =.||  | ||||
| ==.|  | ||||
| ===.  | ||||
|       | ||||
|  | ||||
| #251C: Join of vertical line and one from the right | ||||
| 251C | ||||
|   |   | ||||
|   |   | ||||
|   |== | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| 251D | ||||
|   |   | ||||
|   |== | ||||
|   |== | ||||
|   |== | ||||
|   |   | ||||
|  | ||||
| 251E | ||||
|  |||  | ||||
|  |||  | ||||
|  ||== | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| 251F | ||||
|   |   | ||||
|   |   | ||||
|  ||== | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
|  | ||||
| 2520 | ||||
|  |||  | ||||
|  |||  | ||||
|  ||== | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| 2521 | ||||
|  |||  | ||||
|  |||= | ||||
|  ||== | ||||
|  .|== | ||||
|   |   | ||||
|  | ||||
| 2522 | ||||
|   |   | ||||
|  .|== | ||||
|  ||== | ||||
|  |||= | ||||
|  |||  | ||||
|  | ||||
| 2523 | ||||
|  |||  | ||||
|  ||.= | ||||
|  ||== | ||||
|  ||.= | ||||
|  |||  | ||||
|  | ||||
| #2524: Join of vertical line and one from the left | ||||
| 2524 | ||||
|   |   | ||||
|   |   | ||||
| ==|   | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| 2525 | ||||
|   |   | ||||
| ==|   | ||||
| ==|   | ||||
| ==|   | ||||
|   |   | ||||
|  | ||||
| 2526 | ||||
|  |||  | ||||
|  |||  | ||||
| ==+|  | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| 2527 | ||||
|   |   | ||||
|   |   | ||||
| ==+|  | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| 2528 | ||||
|  |||  | ||||
|  |||  | ||||
| ==+|  | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| 2529 | ||||
|  |||  | ||||
| =+||  | ||||
| ==+|  | ||||
| ===+  | ||||
|   |   | ||||
|  | ||||
| 252A | ||||
|   |   | ||||
| =+||  | ||||
| ==+|  | ||||
| ===+  | ||||
|  |||  | ||||
|  | ||||
| 252B | ||||
|  ||| | ||||
| =+||  | ||||
| ==+|  | ||||
| =+||  | ||||
|  ||| | ||||
|  | ||||
| #252C: horizontal line joined to from below | ||||
| 252C | ||||
|       | ||||
|       | ||||
| ===== | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| 252D | ||||
|       | ||||
| ===   | ||||
| ==|== | ||||
| ==|   | ||||
|   |   | ||||
|  | ||||
| 252E | ||||
|       | ||||
|   === | ||||
| ==|== | ||||
|   |== | ||||
|   |   | ||||
|  | ||||
| 252F | ||||
|       | ||||
| ==+== | ||||
| ==|== | ||||
| ==|== | ||||
|   |   | ||||
|  | ||||
| 2530 | ||||
|       | ||||
| ===== | ||||
| ===== | ||||
| ==|== | ||||
|   |   | ||||
|  | ||||
| 2531 | ||||
|       | ||||
| ===|  | ||||
| ==||= | ||||
| =|||  | ||||
|  |||  | ||||
|  | ||||
| 2532 | ||||
|       | ||||
|  |=== | ||||
| =||== | ||||
|  ||== | ||||
|  ||   | ||||
|  | ||||
| 2533 | ||||
|       | ||||
| ===== | ||||
| ==|== | ||||
| =+|+= | ||||
|  |||  | ||||
|  | ||||
| #2534: bottom line, connected to from top | ||||
| 2534 | ||||
|   | | ||||
|   | | ||||
| ===== | ||||
|       | ||||
|       | ||||
|  | ||||
| 2535 | ||||
|   | | ||||
| ==| | ||||
| ===== | ||||
| ===   | ||||
|      | ||||
|  | ||||
| 2536 | ||||
|   | | ||||
|   |== | ||||
| ===== | ||||
|   === | ||||
|       | ||||
|  | ||||
| 2537 | ||||
|   | | ||||
| ==|== | ||||
| ===== | ||||
| ===== | ||||
|       | ||||
|  | ||||
| 2538 | ||||
|  ||| | ||||
|  ||| | ||||
| ===== | ||||
|       | ||||
|       | ||||
|  | ||||
| 2539 | ||||
|  ||| | ||||
| ==|| | ||||
| ===== | ||||
| ===|  | ||||
|      | ||||
|  | ||||
|  | ||||
| 253A | ||||
|  ||| | ||||
|  ||== | ||||
| =|=== | ||||
|  |=== | ||||
|       | ||||
|  | ||||
| 253B | ||||
|  ||| | ||||
| ==|== | ||||
| ===== | ||||
| ===== | ||||
|       | ||||
|  | ||||
| #253C: vertical + horizontal lines intersecting | ||||
| 253C | ||||
|   |   | ||||
|   |   | ||||
| ===== | ||||
|   |   | ||||
|   | | ||||
|  | ||||
| 253D | ||||
|   |   | ||||
| ==|   | ||||
| ===== | ||||
| ==|   | ||||
|   | | ||||
|  | ||||
| 253E | ||||
|   |   | ||||
|   |== | ||||
| ===== | ||||
|   |== | ||||
|   | | ||||
|  | ||||
| 253F | ||||
|   |   | ||||
| ==|== | ||||
| ===== | ||||
| ==|== | ||||
|   | | ||||
|  | ||||
| 2540 | ||||
|  |||  | ||||
|  |||  | ||||
| ===== | ||||
|   |   | ||||
|   | | ||||
|  | ||||
| 2541 | ||||
|   |   | ||||
|   |   | ||||
| ===== | ||||
|  |||  | ||||
|  ||| | ||||
|  | ||||
| 2542 | ||||
|  |||  | ||||
|  |||  | ||||
| ===== | ||||
|  |||  | ||||
|  ||| | ||||
|  | ||||
| 2543 | ||||
|  |||  | ||||
| =||| | ||||
| ===== | ||||
| ==|+  | ||||
|   | | ||||
|  | ||||
| 2544 | ||||
|  |||  | ||||
|  ||== | ||||
| ===== | ||||
|   |== | ||||
|   | | ||||
|  | ||||
| 2545 | ||||
|   | | ||||
| ==|+  | ||||
| ===== | ||||
| =||| | ||||
|  |||  | ||||
|  | ||||
| 2546 | ||||
|   | | ||||
|   |== | ||||
| ===== | ||||
|  ||== | ||||
|  |||  | ||||
|  | ||||
| 2547 | ||||
|  |||  | ||||
| =|||= | ||||
| ===== | ||||
| =|||= | ||||
|   |  | ||||
|  | ||||
| 2548 | ||||
|   |   | ||||
| =|||= | ||||
| ===== | ||||
| =|||= | ||||
|  ||| | ||||
|  | ||||
| 2549 | ||||
|  |||  | ||||
| =|||  | ||||
| ===== | ||||
| =|||  | ||||
|  ||| | ||||
|  | ||||
| 254A | ||||
|  |||  | ||||
|  |||= | ||||
| ===== | ||||
|  |||= | ||||
|  ||| | ||||
|  | ||||
| 254B | ||||
|  |||  | ||||
| =|||= | ||||
| ===== | ||||
| =|||= | ||||
|  ||| | ||||
|  | ||||
| #254C-254F are dashed | ||||
| 2550 | ||||
|       | ||||
| _____ | ||||
|       | ||||
| _____ | ||||
|       | ||||
|  | ||||
| 2551 | ||||
|  | |  | ||||
|  | | | ||||
|  | | | ||||
|  | | | ||||
|  | | | ||||
|  | ||||
| 2552 | ||||
|       | ||||
|   |-- | ||||
|   | | ||||
|   |-- | ||||
|   | | ||||
|  | ||||
| 2553 | ||||
|       | ||||
|       | ||||
|  ---- | ||||
|  | |  | ||||
|  | |  | ||||
|  | ||||
| 2554 | ||||
|       | ||||
|  +--- | ||||
|  | | ||||
|  + +- | ||||
|  | | | ||||
|  | ||||
| 2555 | ||||
|       | ||||
| --+ | ||||
|   |   | ||||
| --+   | ||||
|   |   | ||||
|  | ||||
| 2556 | ||||
|      | ||||
|      | ||||
| -+-+ | ||||
|  | | | ||||
|  | | | ||||
|  | ||||
| 2557 | ||||
|       | ||||
| ---+  | ||||
|    |  | ||||
| -+ | | ||||
|  | | | ||||
|  | ||||
| 2558 | ||||
|   | | ||||
|   +-- | ||||
|   | | ||||
|   +-- | ||||
|  | ||||
| 2559 | ||||
|  | |  | ||||
|  | |  | ||||
|  +-+- | ||||
|       | ||||
|       | ||||
|  | ||||
| 255A | ||||
|  | |  | ||||
|  | +- | ||||
|  |    | ||||
|  +--- | ||||
|       | ||||
|  | ||||
| 255B | ||||
|   |   | ||||
| --+   | ||||
|   |  | ||||
| --+   | ||||
|       | ||||
|  | ||||
| 255C | ||||
|  | |  | ||||
|  | |  | ||||
| -+-+  | ||||
|      | ||||
|  | ||||
| 255D | ||||
|  | |  | ||||
| -+ |  | ||||
|    | | ||||
| ---+ | ||||
|      | ||||
|  | ||||
| 255E | ||||
|   | | ||||
|   +-- | ||||
|   | | ||||
|   +-- | ||||
|   | | ||||
|  | ||||
| 255F | ||||
|  | | | ||||
|  | | | ||||
|  | +- | ||||
|  | | | ||||
|  | | | ||||
|  | ||||
| 2560 | ||||
|  | | | ||||
|  | +- | ||||
|  | | | ||||
|  | +- | ||||
|  | | | ||||
|  | ||||
| 2561 | ||||
|   | | ||||
| --+ | ||||
|   | | ||||
| --+ | ||||
|   | | ||||
|  | ||||
| 2562 | ||||
|  | |  | ||||
|  | | | ||||
| -+ + | ||||
|  | | | ||||
|  | | | ||||
|  | ||||
| 2563 | ||||
|  | | | ||||
| -+ | | ||||
|    | | ||||
| -+ | | ||||
|  | | | ||||
|  | ||||
| 2564 | ||||
|       | ||||
| ----- | ||||
|       | ||||
| --+-- | ||||
|   | | ||||
|  | ||||
| 2565 | ||||
|       | ||||
|       | ||||
| -+-+- | ||||
|  | |  | ||||
|  | | | ||||
|  | ||||
| 2566 | ||||
|       | ||||
| ----- | ||||
|       | ||||
| -+ +- | ||||
|  | | | ||||
|  | ||||
| 2567 | ||||
|   |   | ||||
| --+-- | ||||
|       | ||||
| ----- | ||||
|       | ||||
|  | ||||
| 2568 | ||||
|  | |  | ||||
|  | |  | ||||
| -+-+- | ||||
|       | ||||
|       | ||||
|  | ||||
| 2569 | ||||
|  | |  | ||||
| -+ +- | ||||
|       | ||||
| ----- | ||||
|       | ||||
|  | ||||
| 256A | ||||
|   |   | ||||
| --+-- | ||||
|   |   | ||||
| --+-- | ||||
|   | | ||||
|  | ||||
| 256B | ||||
|  | |  | ||||
|  | |  | ||||
| -+-+- | ||||
|  | |  | ||||
|  | |  | ||||
|  | ||||
| 256C | ||||
|  | |  | ||||
| -+ +- | ||||
|  | ||||
| -+ +- | ||||
|  | |  | ||||
|  | ||||
| #256F-2570 are curly, | ||||
| #2571-2573 are slashes and X | ||||
|  | ||||
| 2574 | ||||
|       | ||||
|       | ||||
| ___   | ||||
|       | ||||
|       | ||||
|  | ||||
| 2575 | ||||
|   |   | ||||
|   |   | ||||
|   |   | ||||
|       | ||||
|      | ||||
|  | ||||
| 2576 | ||||
|       | ||||
|       | ||||
|   ___ | ||||
|       | ||||
|       | ||||
|  | ||||
| 2577 | ||||
|       | ||||
|      | ||||
|   |   | ||||
|   |   | ||||
|   |   | ||||
|  | ||||
| 2578 | ||||
|       | ||||
| ___   | ||||
| ___   | ||||
| ___   | ||||
|       | ||||
|  | ||||
| 2579 | ||||
|  |||  | ||||
|  |||  | ||||
|  |||  | ||||
|       | ||||
|      | ||||
|  | ||||
| 257A | ||||
|       | ||||
|   ___ | ||||
|   ___ | ||||
|   ___ | ||||
|       | ||||
|  | ||||
| 257B | ||||
|       | ||||
|      | ||||
|  |||  | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| 257C | ||||
|       | ||||
|   ___ | ||||
| _____ | ||||
|   ___ | ||||
|       | ||||
|  | ||||
| 257D | ||||
|   |   | ||||
|   |   | ||||
|  |||  | ||||
|  |||  | ||||
|  |||  | ||||
|  | ||||
| 257E | ||||
|       | ||||
| ___   | ||||
| _____ | ||||
| ___   | ||||
|       | ||||
|  | ||||
| 257F | ||||
|  |||  | ||||
|  |||  | ||||
|  |||  | ||||
|   |   | ||||
|   |   | ||||
							
								
								
									
										310
									
								
								konsole-qml-plugin/src/Pty.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										310
									
								
								konsole-qml-plugin/src/Pty.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,310 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "Pty.h" | ||||
|  | ||||
| // System | ||||
| #include <sys/types.h> | ||||
| #include <sys/stat.h> | ||||
| #include <unistd.h> | ||||
| #include <errno.h> | ||||
| #include <termios.h> | ||||
| #include <signal.h> | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QStringList> | ||||
|  | ||||
| #include "kpty.h" | ||||
| #include "kptydevice.h" | ||||
|  | ||||
|  | ||||
| void Pty::setWindowSize(int lines, int cols) | ||||
| { | ||||
|   _windowColumns = cols; | ||||
|   _windowLines = lines; | ||||
|  | ||||
|   if (pty()->masterFd() >= 0) | ||||
|     pty()->setWinSize(lines, cols); | ||||
| } | ||||
| QSize Pty::windowSize() const | ||||
| { | ||||
|     return QSize(_windowColumns,_windowLines); | ||||
| } | ||||
|  | ||||
| void Pty::setFlowControlEnabled(bool enable) | ||||
| { | ||||
|   _xonXoff = enable; | ||||
|  | ||||
|   if (pty()->masterFd() >= 0) | ||||
|   { | ||||
|     struct ::termios ttmode; | ||||
|     pty()->tcGetAttr(&ttmode); | ||||
|     if (!enable) | ||||
|       ttmode.c_iflag &= ~(IXOFF | IXON); | ||||
|     else | ||||
|       ttmode.c_iflag |= (IXOFF | IXON); | ||||
|     if (!pty()->tcSetAttr(&ttmode)) | ||||
|       qWarning() << "Unable to set terminal attributes."; | ||||
|   } | ||||
| } | ||||
| bool Pty::flowControlEnabled() const | ||||
| { | ||||
|     if (pty()->masterFd() >= 0) | ||||
|     { | ||||
|         struct ::termios ttmode; | ||||
|         pty()->tcGetAttr(&ttmode); | ||||
|         return ttmode.c_iflag & IXOFF && | ||||
|                ttmode.c_iflag & IXON; | ||||
|     }   | ||||
|     qWarning() << "Unable to get flow control status, terminal not connected."; | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void Pty::setUtf8Mode(bool enable) | ||||
| { | ||||
| #ifdef IUTF8 // XXX not a reasonable place to check it. | ||||
|   _utf8 = enable; | ||||
|  | ||||
|   if (pty()->masterFd() >= 0) | ||||
|   { | ||||
|     struct ::termios ttmode; | ||||
|     pty()->tcGetAttr(&ttmode); | ||||
|     if (!enable) | ||||
|       ttmode.c_iflag &= ~IUTF8; | ||||
|     else | ||||
|       ttmode.c_iflag |= IUTF8; | ||||
|     if (!pty()->tcSetAttr(&ttmode)) | ||||
|       qWarning() << "Unable to set terminal attributes."; | ||||
|   } | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void Pty::setErase(char erase) | ||||
| { | ||||
|   _eraseChar = erase; | ||||
|    | ||||
|   if (pty()->masterFd() >= 0) | ||||
|   { | ||||
|     struct ::termios ttmode; | ||||
|     pty()->tcGetAttr(&ttmode); | ||||
|     ttmode.c_cc[VERASE] = erase; | ||||
|     if (!pty()->tcSetAttr(&ttmode)) | ||||
|       qWarning() << "Unable to set terminal attributes."; | ||||
|   } | ||||
| } | ||||
|  | ||||
| char Pty::erase() const | ||||
| { | ||||
|     if (pty()->masterFd() >= 0) | ||||
|     { | ||||
|         struct ::termios ttyAttributes; | ||||
|         pty()->tcGetAttr(&ttyAttributes); | ||||
|         return ttyAttributes.c_cc[VERASE]; | ||||
|     } | ||||
|  | ||||
|     return _eraseChar; | ||||
| } | ||||
|  | ||||
| void Pty::addEnvironmentVariables(const QStringList& environment) | ||||
| { | ||||
|     QListIterator<QString> iter(environment); | ||||
|     while (iter.hasNext()) | ||||
|     { | ||||
|         QString pair = iter.next(); | ||||
|  | ||||
|         // split on the first '=' character | ||||
|         int pos = pair.indexOf('='); | ||||
|          | ||||
|         if ( pos >= 0 ) | ||||
|         { | ||||
|             QString variable = pair.left(pos); | ||||
|             QString value = pair.mid(pos+1); | ||||
|  | ||||
|             setEnv(variable,value); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| int Pty::start(const QString& program,  | ||||
|                const QStringList& programArguments,  | ||||
|                const QStringList& environment,  | ||||
|                ulong winid,  | ||||
|                bool addToUtmp | ||||
|                //const QString& dbusService, | ||||
|                //const QString& dbusSession | ||||
|                ) | ||||
| { | ||||
|   clearProgram(); | ||||
|  | ||||
|   // For historical reasons, the first argument in programArguments is the  | ||||
|   // name of the program to execute, so create a list consisting of all | ||||
|   // but the first argument to pass to setProgram() | ||||
|   Q_ASSERT(programArguments.count() >= 1); | ||||
|   setProgram(program.toLatin1(),programArguments.mid(1)); | ||||
|  | ||||
|   addEnvironmentVariables(environment); | ||||
|  | ||||
|   setEnv("WINDOWID", QString::number(winid)); | ||||
|  | ||||
|   // unless the LANGUAGE environment variable has been set explicitly | ||||
|   // set it to a null string | ||||
|   // this fixes the problem where KCatalog sets the LANGUAGE environment | ||||
|   // variable during the application's startup to something which | ||||
|   // differs from LANG,LC_* etc. and causes programs run from | ||||
|   // the terminal to display messages in the wrong language | ||||
|   // | ||||
|   // this can happen if LANG contains a language which KDE | ||||
|   // does not have a translation for | ||||
|   // | ||||
|   // BR:149300 | ||||
|   setEnv("LANGUAGE",QString(),false /* do not overwrite existing value if any */); | ||||
|  | ||||
|   setUseUtmp(addToUtmp); | ||||
|  | ||||
|   struct ::termios ttmode; | ||||
|   pty()->tcGetAttr(&ttmode); | ||||
|   if (!_xonXoff) | ||||
|     ttmode.c_iflag &= ~(IXOFF | IXON); | ||||
|   else | ||||
|     ttmode.c_iflag |= (IXOFF | IXON); | ||||
| #ifdef IUTF8 // XXX not a reasonable place to check it. | ||||
|   if (!_utf8) | ||||
|     ttmode.c_iflag &= ~IUTF8; | ||||
|   else | ||||
|     ttmode.c_iflag |= IUTF8; | ||||
| #endif | ||||
|  | ||||
|   if (_eraseChar != 0) | ||||
|       ttmode.c_cc[VERASE] = _eraseChar; | ||||
|    | ||||
|   if (!pty()->tcSetAttr(&ttmode)) | ||||
|     qWarning() << "Unable to set terminal attributes."; | ||||
|    | ||||
|   pty()->setWinSize(_windowLines, _windowColumns); | ||||
|  | ||||
|   KProcess::start(); | ||||
|  | ||||
|   if (!waitForStarted()) | ||||
|       return -1; | ||||
|  | ||||
|   return 0; | ||||
| } | ||||
|  | ||||
| void Pty::setWriteable(bool writeable) | ||||
| { | ||||
|   struct stat sbuf; | ||||
|   stat(pty()->ttyName(), &sbuf); | ||||
|   if (writeable) | ||||
|     chmod(pty()->ttyName(), sbuf.st_mode | S_IWGRP); | ||||
|   else | ||||
|     chmod(pty()->ttyName(), sbuf.st_mode & ~(S_IWGRP|S_IWOTH)); | ||||
| } | ||||
|  | ||||
| Pty::Pty(int masterFd, QObject* parent) | ||||
|     : KPtyProcess(masterFd,parent) | ||||
| { | ||||
|     init(); | ||||
| } | ||||
| Pty::Pty(QObject* parent) | ||||
|     : KPtyProcess(parent) | ||||
| { | ||||
|     init(); | ||||
| } | ||||
| void Pty::init() | ||||
| { | ||||
|   _windowColumns = 0; | ||||
|   _windowLines = 0; | ||||
|   _eraseChar = 0; | ||||
|   _xonXoff = true; | ||||
|   _utf8 =true; | ||||
|  | ||||
|   connect(pty(), SIGNAL(readyRead()) , this , SLOT(dataReceived())); | ||||
|   setPtyChannels(KPtyProcess::AllChannels); | ||||
| } | ||||
|  | ||||
| Pty::~Pty() | ||||
| { | ||||
| } | ||||
|  | ||||
| void Pty::sendData(const char* data, int length) | ||||
| { | ||||
|   if (!length) | ||||
|       return; | ||||
|    | ||||
|   if (!pty()->write(data,length))  | ||||
|   { | ||||
|     qWarning() << "Pty::doSendJobs - Could not send input data to terminal process."; | ||||
|     return; | ||||
|   } | ||||
| } | ||||
|  | ||||
| void Pty::dataReceived()  | ||||
| { | ||||
|      QByteArray data = pty()->readAll(); | ||||
|     emit receivedData(data.constData(),data.count()); | ||||
| } | ||||
|  | ||||
| void Pty::lockPty(bool lock) | ||||
| { | ||||
|     Q_UNUSED(lock); | ||||
|  | ||||
| // TODO: Support for locking the Pty | ||||
|   //if (lock) | ||||
|     //suspend(); | ||||
|   //else | ||||
|     //resume(); | ||||
| } | ||||
|  | ||||
| int Pty::foregroundProcessGroup() const | ||||
| { | ||||
|     int pid = tcgetpgrp(pty()->masterFd()); | ||||
|  | ||||
|     if ( pid != -1 ) | ||||
|     { | ||||
|         return pid; | ||||
|     }  | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
| void Pty::setupChildProcess() | ||||
| { | ||||
|     KPtyProcess::setupChildProcess(); | ||||
|      | ||||
|     // reset all signal handlers | ||||
|     // this ensures that terminal applications respond to  | ||||
|     // signals generated via key sequences such as Ctrl+C | ||||
|     // (which sends SIGINT) | ||||
|     struct sigaction action; | ||||
|     sigemptyset(&action.sa_mask); | ||||
|     action.sa_handler = SIG_DFL; | ||||
|     action.sa_flags = 0; | ||||
|     for (int signal=1;signal < NSIG; signal++) | ||||
|         sigaction(signal,&action,0L); | ||||
| } | ||||
							
								
								
									
										206
									
								
								konsole-qml-plugin/src/Pty.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										206
									
								
								konsole-qml-plugin/src/Pty.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,206 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|     This file is part of Konsole, KDE's terminal emulator.  | ||||
|      | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef PTY_H | ||||
| #define PTY_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QStringList> | ||||
| #include <QtCore/QVector> | ||||
| #include <QtCore/QList> | ||||
| #include <QtCore/QSize> | ||||
|  | ||||
| // KDE | ||||
| #include "kptyprocess.h" | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * The Pty class is used to start the terminal process,  | ||||
|  * send data to it, receive data from it and manipulate  | ||||
|  * various properties of the pseudo-teletype interface | ||||
|  * used to communicate with the process. | ||||
|  * | ||||
|  * To use this class, construct an instance and connect | ||||
|  * to the sendData slot and receivedData signal to | ||||
|  * send data to or receive data from the process. | ||||
|  * | ||||
|  * To start the terminal process, call the start() method | ||||
|  * with the program name and appropriate arguments.  | ||||
|  */ | ||||
| class Pty: public KPtyProcess | ||||
| { | ||||
| Q_OBJECT | ||||
|  | ||||
|   public: | ||||
|      | ||||
|     /**  | ||||
|      * Constructs a new Pty. | ||||
|      *  | ||||
|      * Connect to the sendData() slot and receivedData() signal to prepare | ||||
|      * for sending and receiving data from the terminal process. | ||||
|      * | ||||
|      * To start the terminal process, call the run() method with the  | ||||
|      * name of the program to start and appropriate arguments. | ||||
|      */ | ||||
|     explicit Pty(QObject* parent = 0); | ||||
|  | ||||
|     /**  | ||||
|      * Construct a process using an open pty master. | ||||
|      * See KPtyProcess::KPtyProcess() | ||||
|      */ | ||||
|     explicit Pty(int ptyMasterFd, QObject* parent = 0); | ||||
|  | ||||
|     ~Pty(); | ||||
|  | ||||
|     /** | ||||
|      * Starts the terminal process.   | ||||
|      * | ||||
|      * Returns 0 if the process was started successfully or non-zero | ||||
|      * otherwise. | ||||
|      * | ||||
|      * @param program Path to the program to start | ||||
|      * @param arguments Arguments to pass to the program being started | ||||
|      * @param environment A list of key=value pairs which will be added | ||||
|      * to the environment for the new process.  At the very least this | ||||
|      * should include an assignment for the TERM environment variable. | ||||
|      * @param winid Specifies the value of the WINDOWID environment variable | ||||
|      * in the process's environment. | ||||
|      * @param addToUtmp Specifies whether a utmp entry should be created for | ||||
|      * the pty used.  See K3Process::setUsePty()  | ||||
|      * @param dbusService Specifies the value of the KONSOLE_DBUS_SERVICE  | ||||
|      * environment variable in the process's environment. | ||||
|      * @param dbusSession Specifies the value of the KONSOLE_DBUS_SESSION | ||||
|      * environment variable in the process's environment.  | ||||
|      */ | ||||
|     int start( const QString& program,  | ||||
|                const QStringList& arguments,  | ||||
|                const QStringList& environment,  | ||||
|                ulong winid,  | ||||
|                bool addToUtmp | ||||
|              ); | ||||
|  | ||||
|     /** TODO: Document me */ | ||||
|     void setWriteable(bool writeable); | ||||
|  | ||||
|     /**  | ||||
|      * Enables or disables Xon/Xoff flow control.  The flow control setting | ||||
|      * may be changed later by a terminal application, so flowControlEnabled() | ||||
|      * may not equal the value of @p on in the previous call to setFlowControlEnabled() | ||||
|      */ | ||||
|     void setFlowControlEnabled(bool on); | ||||
|  | ||||
|     /** Queries the terminal state and returns true if Xon/Xoff flow control is enabled. */ | ||||
|     bool flowControlEnabled() const; | ||||
|  | ||||
|     /**  | ||||
|      * Sets the size of the window (in lines and columns of characters)  | ||||
|      * used by this teletype. | ||||
|      */ | ||||
|     void setWindowSize(int lines, int cols); | ||||
|      | ||||
|     /** Returns the size of the window used by this teletype.  See setWindowSize() */ | ||||
|     QSize windowSize() const; | ||||
|  | ||||
|     /** TODO Document me */ | ||||
|     void setErase(char erase); | ||||
|  | ||||
|     /** */ | ||||
|     char erase() const; | ||||
|  | ||||
|     /** | ||||
|      * Returns the process id of the teletype's current foreground | ||||
|      * process.  This is the process which is currently reading | ||||
|      * input sent to the terminal via. sendData() | ||||
|      * | ||||
|      * If there is a problem reading the foreground process group, | ||||
|      * 0 will be returned. | ||||
|      */ | ||||
|     int foregroundProcessGroup() const; | ||||
|     | ||||
|   public slots: | ||||
|  | ||||
|     /** | ||||
|      * Put the pty into UTF-8 mode on systems which support it. | ||||
|      */ | ||||
|     void setUtf8Mode(bool on); | ||||
|  | ||||
|     /** | ||||
|      * Suspend or resume processing of data from the standard  | ||||
|      * output of the terminal process. | ||||
|      * | ||||
|      * See K3Process::suspend() and K3Process::resume() | ||||
|      * | ||||
|      * @param lock If true, processing of output is suspended, | ||||
|      * otherwise processing is resumed. | ||||
|      */ | ||||
|     void lockPty(bool lock); | ||||
|      | ||||
|     /**  | ||||
|      * Sends data to the process currently controlling the  | ||||
|      * teletype ( whose id is returned by foregroundProcessGroup() ) | ||||
|      * | ||||
|      * @param buffer Pointer to the data to send. | ||||
|      * @param length Length of @p buffer. | ||||
|      */ | ||||
|     void sendData(const char* buffer, int length); | ||||
|  | ||||
|   signals: | ||||
|  | ||||
|     /** | ||||
|      * Emitted when a new block of data is received from | ||||
|      * the teletype. | ||||
|      * | ||||
|      * @param buffer Pointer to the data received. | ||||
|      * @param length Length of @p buffer | ||||
|      */ | ||||
|     void receivedData(const char* buffer, int length); | ||||
|     | ||||
|   protected: | ||||
|       void setupChildProcess(); | ||||
|  | ||||
|   private slots: | ||||
|     // called when data is received from the terminal process  | ||||
|     void dataReceived();  | ||||
|      | ||||
|   private: | ||||
|       void init(); | ||||
|  | ||||
|     // takes a list of key=value pairs and adds them | ||||
|     // to the environment for the process | ||||
|     void addEnvironmentVariables(const QStringList& environment); | ||||
|  | ||||
|     int  _windowColumns;  | ||||
|     int  _windowLines; | ||||
|     char _eraseChar; | ||||
|     bool _xonXoff; | ||||
|     bool _utf8; | ||||
| }; | ||||
|  | ||||
| #endif // PTY_H | ||||
							
								
								
									
										1360
									
								
								konsole-qml-plugin/src/Screen.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1360
									
								
								konsole-qml-plugin/src/Screen.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										672
									
								
								konsole-qml-plugin/src/Screen.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										672
									
								
								konsole-qml-plugin/src/Screen.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,672 @@ | ||||
| /* | ||||
|     This file is part of Konsole, KDE's terminal. | ||||
|  | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef SCREEN_H | ||||
| #define SCREEN_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QRect> | ||||
| #include <QtCore/QTextStream> | ||||
| #include <QtCore/QVarLengthArray> | ||||
|  | ||||
| // Konsole | ||||
| #include "Character.h" | ||||
| #include "History.h" | ||||
|  | ||||
| #define MODE_Origin    0 | ||||
| #define MODE_Wrap      1 | ||||
| #define MODE_Insert    2 | ||||
| #define MODE_Screen    3 | ||||
| #define MODE_Cursor    4 | ||||
| #define MODE_NewLine   5 | ||||
| #define MODES_SCREEN   6 | ||||
|  | ||||
|  | ||||
| class TerminalCharacterDecoder; | ||||
|  | ||||
| /** | ||||
|     \brief An image of characters with associated attributes. | ||||
|  | ||||
|     The terminal emulation ( Emulation ) receives a serial stream of | ||||
|     characters from the program currently running in the terminal. | ||||
|     From this stream it creates an image of characters which is ultimately | ||||
|     rendered by the display widget ( TerminalDisplay ).  Some types of emulation | ||||
|     may have more than one screen image.  | ||||
|  | ||||
|     getImage() is used to retrieve the currently visible image | ||||
|     which is then used by the display widget to draw the output from the | ||||
|     terminal.  | ||||
|  | ||||
|     The number of lines of output history which are kept in addition to the current | ||||
|     screen image depends on the history scroll being used to store the output.   | ||||
|     The scroll is specified using setScroll() | ||||
|     The output history can be retrieved using writeToStream() | ||||
|  | ||||
|     The screen image has a selection associated with it, specified using  | ||||
|     setSelectionStart() and setSelectionEnd().  The selected text can be retrieved | ||||
|     using selectedText().  When getImage() is used to retrieve the visible image, | ||||
|     characters which are part of the selection have their colours inverted.    | ||||
| */ | ||||
| class Screen | ||||
| { | ||||
| public: | ||||
|     /** Construct a new screen image of size @p lines by @p columns. */ | ||||
|     Screen(int lines, int columns); | ||||
|     ~Screen(); | ||||
|  | ||||
|     // VT100/2 Operations  | ||||
|     // Cursor Movement | ||||
|      | ||||
|     /**  | ||||
|      * Move the cursor up by @p n lines.  The cursor will stop at the  | ||||
|      * top margin. | ||||
|      */ | ||||
|     void cursorUp(int n); | ||||
|     /**  | ||||
|      * Move the cursor down by @p n lines.  The cursor will stop at the | ||||
|      * bottom margin. | ||||
|      */ | ||||
|     void cursorDown(int n); | ||||
|     /**  | ||||
|      * Move the cursor to the left by @p n columns. | ||||
|      * The cursor will stop at the first column. | ||||
|      */ | ||||
|     void cursorLeft(int n); | ||||
|     /**  | ||||
|      * Move the cursor to the right by @p n columns. | ||||
|      * The cursor will stop at the right-most column. | ||||
|      */ | ||||
|     void cursorRight(int n); | ||||
|     /** Position the cursor on line @p y. */ | ||||
|     void setCursorY(int y); | ||||
|     /** Position the cursor at column @p x. */ | ||||
|     void setCursorX(int x); | ||||
|     /** Position the cursor at line @p y, column @p x. */ | ||||
|     void setCursorYX(int y, int x); | ||||
|     /** | ||||
|      * Sets the margins for scrolling the screen. | ||||
|      * | ||||
|      * @param topLine The top line of the new scrolling margin.  | ||||
|      * @param bottomLine The bottom line of the new scrolling margin.  | ||||
|      */ | ||||
|     void setMargins(int topLine , int bottomLine); | ||||
|     /** Returns the top line of the scrolling region. */  | ||||
|     int topMargin() const; | ||||
|     /** Returns the bottom line of the scrolling region. */ | ||||
|     int bottomMargin() const; | ||||
|  | ||||
|     /**  | ||||
|      * Resets the scrolling margins back to the top and bottom lines | ||||
|      * of the screen. | ||||
|      */ | ||||
|     void setDefaultMargins(); | ||||
|      | ||||
|     /**  | ||||
|      * Moves the cursor down one line, if the MODE_NewLine mode  | ||||
|      * flag is enabled then the cursor is returned to the leftmost | ||||
|      * column first. | ||||
|      * | ||||
|      * Equivalent to NextLine() if the MODE_NewLine flag is set | ||||
|      * or index() otherwise.  | ||||
|      */ | ||||
|     void newLine(); | ||||
|     /** | ||||
|      * Moves the cursor down one line and positions it at the beginning | ||||
|      * of the line.  Equivalent to calling Return() followed by index() | ||||
|      */ | ||||
|     void nextLine(); | ||||
|  | ||||
|     /**  | ||||
|      * Move the cursor down one line.  If the cursor is on the bottom | ||||
|      * line of the scrolling region (as returned by bottomMargin()) the | ||||
|      * scrolling region is scrolled up by one line instead. | ||||
|      */ | ||||
|     void index(); | ||||
|     /** | ||||
|      * Move the cursor up one line.  If the cursor is on the top line | ||||
|      * of the scrolling region (as returned by topMargin()) the scrolling | ||||
|      * region is scrolled down by one line instead. | ||||
|      */ | ||||
|     void reverseIndex(); | ||||
|      | ||||
|     /**  | ||||
|      * Scroll the scrolling region of the screen up by @p n lines.  | ||||
|      * The scrolling region is initially the whole screen, but can be changed  | ||||
|      * using setMargins() | ||||
|      */  | ||||
|     void scrollUp(int n); | ||||
|     /** | ||||
|      * Scroll the scrolling region of the screen down by @p n lines. | ||||
|      * The scrolling region is initially the whole screen, but can be changed | ||||
|      * using setMargins() | ||||
|      */ | ||||
|     void scrollDown(int n); | ||||
|     /**  | ||||
|      * Moves the cursor to the beginning of the current line.  | ||||
|      * Equivalent to setCursorX(0) | ||||
|      */ | ||||
|     void toStartOfLine(); | ||||
|     /**  | ||||
|      * Moves the cursor one column to the left and erases the character | ||||
|      * at the new cursor position. | ||||
|      */ | ||||
|     void backspace(); | ||||
|     /** Moves the cursor @p n tab-stops to the right. */ | ||||
|     void tab(int n = 1); | ||||
|     /** Moves the cursor @p n tab-stops to the left. */ | ||||
|     void backtab(int n); | ||||
|      | ||||
|     // Editing | ||||
|      | ||||
|     /**  | ||||
|      * Erase @p n characters beginning from the current cursor position.  | ||||
|      * This is equivalent to over-writing @p n characters starting with the current | ||||
|      * cursor position with spaces. | ||||
|      * If @p n is 0 then one character is erased.  | ||||
|      */ | ||||
|     void eraseChars(int n); | ||||
|     /**  | ||||
|      * Delete @p n characters beginning from the current cursor position.  | ||||
|      * If @p n is 0 then one character is deleted.  | ||||
|      */ | ||||
|     void deleteChars(int n); | ||||
|     /** | ||||
|      * Insert @p n blank characters beginning from the current cursor position. | ||||
|      * The position of the cursor is not altered.   | ||||
|      * If @p n is 0 then one character is inserted. | ||||
|      */ | ||||
|     void insertChars(int n); | ||||
|     /**  | ||||
|      * Removes @p n lines beginning from the current cursor position. | ||||
|      * The position of the cursor is not altered. | ||||
|      * If @p n is 0 then one line is removed. | ||||
|      */ | ||||
|     void deleteLines(int n); | ||||
|     /** | ||||
|      * Inserts @p lines beginning from the current cursor position. | ||||
|      * The position of the cursor is not altered. | ||||
|      * If @p n is 0 then one line is inserted. | ||||
|      */ | ||||
|     void insertLines(int n); | ||||
|     /** Clears all the tab stops. */ | ||||
|     void clearTabStops(); | ||||
|     /**  Sets or removes a tab stop at the cursor's current column. */  | ||||
|     void changeTabStop(bool set); | ||||
|     | ||||
|     /** Resets (clears) the specified screen @p mode. */ | ||||
|     void resetMode(int mode); | ||||
|     /** Sets (enables) the specified screen @p mode. */ | ||||
|     void setMode(int mode); | ||||
|     /**  | ||||
|      * Saves the state of the specified screen @p mode.  It can be restored | ||||
|      * using restoreMode() | ||||
|      */ | ||||
|     void saveMode(int mode); | ||||
|     /** Restores the state of a screen @p mode saved by calling saveMode() */ | ||||
|     void restoreMode(int mode); | ||||
|     /** Returns whether the specified screen @p mode is enabled or not .*/ | ||||
|     bool getMode(int mode) const; | ||||
|     | ||||
|     /**  | ||||
|      * Saves the current position and appearance (text color and style) of the cursor.  | ||||
|      * It can be restored by calling restoreCursor()  | ||||
|      */  | ||||
|     void saveCursor(); | ||||
|     /** Restores the position and appearance of the cursor.  See saveCursor() */ | ||||
|     void restoreCursor(); | ||||
|     | ||||
|     /** Clear the whole screen, moving the current screen contents into the history first. */  | ||||
|     void clearEntireScreen(); | ||||
|     /**  | ||||
|      * Clear the area of the screen from the current cursor position to the end of  | ||||
|      * the screen. | ||||
|      */ | ||||
|     void clearToEndOfScreen(); | ||||
|     /** | ||||
|      * Clear the area of the screen from the current cursor position to the start | ||||
|      * of the screen. | ||||
|      */ | ||||
|     void clearToBeginOfScreen(); | ||||
|     /** Clears the whole of the line on which the cursor is currently positioned. */ | ||||
|     void clearEntireLine(); | ||||
|     /** Clears from the current cursor position to the end of the line. */ | ||||
|     void clearToEndOfLine(); | ||||
|     /** Clears from the current cursor position to the beginning of the line. */ | ||||
|     void clearToBeginOfLine(); | ||||
|      | ||||
|     /** Fills the entire screen with the letter 'E' */ | ||||
|     void helpAlign(); | ||||
|         | ||||
|     /**  | ||||
|      * Enables the given @p rendition flag.  Rendition flags control the appearance  | ||||
|      * of characters on the screen. | ||||
|      * | ||||
|      * @see Character::rendition | ||||
|      */   | ||||
|     void setRendition(int rendition); | ||||
|     /** | ||||
|      * Disables the given @p rendition flag.  Rendition flags control the appearance | ||||
|      * of characters on the screen. | ||||
|      * | ||||
|      * @see Character::rendition | ||||
|      */ | ||||
|     void resetRendition(int rendition); | ||||
|      | ||||
|     /**  | ||||
|      * Sets the cursor's foreground color. | ||||
|      * @param space The color space used by the @p color argument | ||||
|      * @param color The new foreground color.  The meaning of this depends on | ||||
|      * the color @p space used. | ||||
|      * | ||||
|      * @see CharacterColor | ||||
|      */ | ||||
|     void setForeColor(int space, int color); | ||||
|     /** | ||||
|      * Sets the cursor's background color. | ||||
|      * @param space The color space used by the @p color argumnet. | ||||
|      * @param color The new background color.  The meaning of this depends on | ||||
|      * the color @p space used. | ||||
|      * | ||||
|      * @see CharacterColor | ||||
|      */ | ||||
|     void setBackColor(int space, int color); | ||||
|     /**  | ||||
|      * Resets the cursor's color back to the default and sets the  | ||||
|      * character's rendition flags back to the default settings. | ||||
|      */ | ||||
|     void setDefaultRendition(); | ||||
|      | ||||
|     /** Returns the column which the cursor is positioned at. */ | ||||
|     int  getCursorX() const; | ||||
|     /** Returns the line which the cursor is positioned on. */ | ||||
|     int  getCursorY() const; | ||||
|     | ||||
|     /** Clear the entire screen and move the cursor to the home position. | ||||
|      * Equivalent to calling clearEntireScreen() followed by home(). | ||||
|      */ | ||||
|     void clear(); | ||||
|     /**  | ||||
|      * Sets the position of the cursor to the 'home' position at the top-left | ||||
|      * corner of the screen (0,0)  | ||||
|      */ | ||||
|     void home(); | ||||
|     /** | ||||
|      * Resets the state of the screen.  This resets the various screen modes | ||||
|      * back to their default states.  The cursor style and colors are reset | ||||
|      * (as if setDefaultRendition() had been called) | ||||
|      * | ||||
|      * <ul> | ||||
|      * <li>Line wrapping is enabled.</li> | ||||
|      * <li>Origin mode is disabled.</li> | ||||
|      * <li>Insert mode is disabled.</li> | ||||
|      * <li>Cursor mode is enabled.  TODO Document me</li> | ||||
|      * <li>Screen mode is disabled. TODO Document me</li> | ||||
|      * <li>New line mode is disabled.  TODO Document me</li> | ||||
|      * </ul> | ||||
|      * | ||||
|      * If @p clearScreen is true then the screen contents are erased entirely,  | ||||
|      * otherwise they are unaltered. | ||||
|      */ | ||||
|     void reset(bool clearScreen = true); | ||||
|     | ||||
|     /**  | ||||
|      * Displays a new character at the current cursor position.  | ||||
|      *  | ||||
|      * If the cursor is currently positioned at the right-edge of the screen and | ||||
|      * line wrapping is enabled then the character is added at the start of a new  | ||||
|      * line below the current one. | ||||
|      * | ||||
|      * If the MODE_Insert screen mode is currently enabled then the character  | ||||
|      * is inserted at the current cursor position, otherwise it will replace the  | ||||
|      * character already at the current cursor position.   | ||||
|      */  | ||||
|     void displayCharacter(unsigned short c); | ||||
|      | ||||
|     // Do composition with last shown character FIXME: Not implemented yet for KDE 4 | ||||
|     void compose(const QString& compose); | ||||
|      | ||||
|     /**  | ||||
|      * Resizes the image to a new fixed size of @p new_lines by @p new_columns.   | ||||
|      * In the case that @p new_columns is smaller than the current number of columns, | ||||
|      * existing lines are not truncated.  This prevents characters from being lost | ||||
|      * if the terminal display is resized smaller and then larger again. | ||||
|      * | ||||
|      * The top and bottom margins are reset to the top and bottom of the new  | ||||
|      * screen size.  Tab stops are also reset and the current selection is | ||||
|      * cleared. | ||||
|      */ | ||||
|     void resizeImage(int new_lines, int new_columns); | ||||
|      | ||||
|     /** | ||||
|      * Returns the current screen image.   | ||||
|      * The result is an array of Characters of size [getLines()][getColumns()] which | ||||
|      * must be freed by the caller after use. | ||||
|      * | ||||
|      * @param dest Buffer to copy the characters into | ||||
|      * @param size Size of @p dest in Characters | ||||
|      * @param startLine Index of first line to copy | ||||
|      * @param endLine Index of last line to copy | ||||
|      */ | ||||
|     void getImage( Character* dest , int size , int startLine , int endLine ) const; | ||||
|  | ||||
|     /**  | ||||
|      * Returns the additional attributes associated with lines in the image. | ||||
|      * The most important attribute is LINE_WRAPPED which specifies that the  | ||||
|      * line is wrapped, | ||||
|      * other attributes control the size of characters in the line. | ||||
|      */ | ||||
|     QVector<LineProperty> getLineProperties( int startLine , int endLine ) const; | ||||
|      | ||||
|  | ||||
|     /** Return the number of lines. */ | ||||
|     int getLines() const    | ||||
|     { return lines; } | ||||
|     /** Return the number of columns. */ | ||||
|     int getColumns() const  | ||||
|     { return columns; } | ||||
|     /** Return the number of lines in the history buffer. */ | ||||
|     int getHistLines() const; | ||||
|     /**  | ||||
|      * Sets the type of storage used to keep lines in the history.  | ||||
|      * If @p copyPreviousScroll is true then the contents of the previous  | ||||
|      * history buffer are copied into the new scroll. | ||||
|      */ | ||||
|     void setScroll(const HistoryType& , bool copyPreviousScroll = true); | ||||
|     /** Returns the type of storage used to keep lines in the history. */ | ||||
|     const HistoryType& getScroll() const; | ||||
|     /**  | ||||
|      * Returns true if this screen keeps lines that are scrolled off the screen | ||||
|      * in a history buffer. | ||||
|      */ | ||||
|     bool hasScroll() const; | ||||
|  | ||||
|     /**  | ||||
|      * Sets the start of the selection. | ||||
|      * | ||||
|      * @param column The column index of the first character in the selection. | ||||
|      * @param line The line index of the first character in the selection. | ||||
|      * @param blockSelectionMode True if the selection is in column mode. | ||||
|      */ | ||||
|     void setSelectionStart(const int column, const int line, const bool blockSelectionMode); | ||||
|      | ||||
|     /** | ||||
|      * Sets the end of the current selection. | ||||
|      * | ||||
|      * @param column The column index of the last character in the selection. | ||||
|      * @param line The line index of the last character in the selection.  | ||||
|      */  | ||||
|     void setSelectionEnd(const int column, const int line); | ||||
|     | ||||
|     /** | ||||
|      * Retrieves the start of the selection or the cursor position if there | ||||
|      * is no selection. | ||||
|      */ | ||||
|     void getSelectionStart(int& column , int& line) const; | ||||
|      | ||||
|     /** | ||||
|      * Retrieves the end of the selection or the cursor position if there | ||||
|      * is no selection. | ||||
|      */ | ||||
|     void getSelectionEnd(int& column , int& line) const; | ||||
|  | ||||
|     /** Clears the current selection */ | ||||
|     void clearSelection(); | ||||
|  | ||||
|     /**  | ||||
|       *  Returns true if the character at (@p column, @p line) is part of the | ||||
|       *  current selection.  | ||||
|       */  | ||||
|     bool isSelected(const int column,const int line) const; | ||||
|  | ||||
|     /**  | ||||
|      * Convenience method.  Returns the currently selected text.  | ||||
|      * @param preserveLineBreaks Specifies whether new line characters should  | ||||
|      * be inserted into the returned text at the end of each terminal line. | ||||
|      */ | ||||
|     QString selectedText(bool preserveLineBreaks) const; | ||||
|          | ||||
|     /** | ||||
|      * Copies part of the output to a stream. | ||||
|      * | ||||
|      * @param decoder A decoder which converts terminal characters into text | ||||
|      * @param fromLine The first line in the history to retrieve | ||||
|      * @param toLine The last line in the history to retrieve | ||||
|      */ | ||||
|     void writeLinesToStream(TerminalCharacterDecoder* decoder, int fromLine, int toLine) const; | ||||
|  | ||||
|     /** | ||||
|      * Copies the selected characters, set using @see setSelBeginXY and @see setSelExtentXY | ||||
|      * into a stream. | ||||
|      * | ||||
|      * @param decoder A decoder which converts terminal characters into text.   | ||||
|      * PlainTextDecoder is the most commonly used decoder which converts characters  | ||||
|      * into plain text with no formatting. | ||||
|      * @param preserveLineBreaks Specifies whether new line characters should  | ||||
|      * be inserted into the returned text at the end of each terminal line.  | ||||
|      */ | ||||
|     void writeSelectionToStream(TerminalCharacterDecoder* decoder , bool | ||||
|                                 preserveLineBreaks = true) const; | ||||
|  | ||||
|     /** | ||||
|      * Checks if the text between from and to is inside the current | ||||
|      * selection. If this is the case, the selection is cleared. The | ||||
|      * from and to are coordinates in the current viewable window. | ||||
|      * The loc(x,y) macro can be used to generate these values from a | ||||
|      * column,line pair. | ||||
|      * | ||||
|      * @param from The start of the area to check. | ||||
|      * @param to The end of the area to check | ||||
|      */ | ||||
|     void checkSelection(int from, int to); | ||||
|  | ||||
|     /**  | ||||
|      * Sets or clears an attribute of the current line. | ||||
|      *  | ||||
|      * @param property The attribute to set or clear | ||||
|      * Possible properties are: | ||||
|      * LINE_WRAPPED:     Specifies that the line is wrapped. | ||||
|      * LINE_DOUBLEWIDTH: Specifies that the characters in the current line | ||||
|      *                   should be double the normal width. | ||||
|      * LINE_DOUBLEHEIGHT:Specifies that the characters in the current line  | ||||
|      *                   should be double the normal height. | ||||
|      *                   Double-height lines are formed of two lines containing the same characters, | ||||
|      *                   with both having the LINE_DOUBLEHEIGHT attribute. | ||||
|      *                   This allows other parts of the code to work on the | ||||
|      *                   assumption that all lines are the same height. | ||||
|      * | ||||
|      * @param enable true to apply the attribute to the current line or false to remove it | ||||
|      */ | ||||
|     void setLineProperty(LineProperty property , bool enable); | ||||
|  | ||||
|     /**  | ||||
|      * Returns the number of lines that the image has been scrolled up or down by, | ||||
|      * since the last call to resetScrolledLines(). | ||||
|      * | ||||
|      * a positive return value indicates that the image has been scrolled up, | ||||
|      * a negative return value indicates that the image has been scrolled down.  | ||||
|      */ | ||||
|     int scrolledLines() const; | ||||
|  | ||||
|     /** | ||||
|      * Returns the region of the image which was last scrolled. | ||||
|      * | ||||
|      * This is the area of the image from the top margin to the  | ||||
|      * bottom margin when the last scroll occurred. | ||||
|      */ | ||||
|     QRect lastScrolledRegion() const; | ||||
|  | ||||
|     /**  | ||||
|      * Resets the count of the number of lines that the image has been scrolled up or down by, | ||||
|      * see scrolledLines() | ||||
|      */ | ||||
|     void resetScrolledLines(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the number of lines of output which have been | ||||
|      * dropped from the history since the last call | ||||
|      * to resetDroppedLines() | ||||
|      * | ||||
|      * If the history is not unlimited then it will drop | ||||
|      * the oldest lines of output if new lines are added when | ||||
|      * it is full.   | ||||
|      */ | ||||
|     int droppedLines() const; | ||||
|  | ||||
|     /** | ||||
|      * Resets the count of the number of lines dropped from | ||||
|      * the history. | ||||
|      */ | ||||
|     void resetDroppedLines(); | ||||
|  | ||||
|     /**  | ||||
|       * Fills the buffer @p dest with @p count instances of the default (ie. blank) | ||||
|       * Character style. | ||||
|       */ | ||||
|     static void fillWithDefaultChar(Character* dest, int count); | ||||
|  | ||||
| private:  | ||||
|  | ||||
|     //copies a line of text from the screen or history into a stream using a  | ||||
|     //specified character decoder.  Returns the number of lines actually copied, | ||||
|     //which may be less than 'count' if (start+count) is more than the number of characters on | ||||
|     //the line  | ||||
|     // | ||||
|     //line - the line number to copy, from 0 (the earliest line in the history) up to  | ||||
|     //         history->getLines() + lines - 1 | ||||
|     //start - the first column on the line to copy | ||||
|     //count - the number of characters on the line to copy | ||||
|     //decoder - a decoder which converts terminal characters (an Character array) into text | ||||
|     //appendNewLine - if true a new line character (\n) is appended to the end of the line | ||||
|     int  copyLineToStream(int line,  | ||||
|                           int start,  | ||||
|                           int count,  | ||||
|                           TerminalCharacterDecoder* decoder, | ||||
|                           bool appendNewLine, | ||||
|                           bool preserveLineBreaks) const; | ||||
|      | ||||
|     //fills a section of the screen image with the character 'c' | ||||
|     //the parameters are specified as offsets from the start of the screen image. | ||||
|     //the loc(x,y) macro can be used to generate these values from a column,line pair. | ||||
|     void clearImage(int loca, int loce, char c); | ||||
|  | ||||
|     //move screen image between 'sourceBegin' and 'sourceEnd' to 'dest'. | ||||
|     //the parameters are specified as offsets from the start of the screen image. | ||||
|     //the loc(x,y) macro can be used to generate these values from a column,line pair. | ||||
|     // | ||||
|     //NOTE: moveImage() can only move whole lines | ||||
|     void moveImage(int dest, int sourceBegin, int sourceEnd); | ||||
|     // scroll up 'i' lines in current region, clearing the bottom 'i' lines  | ||||
|     void scrollUp(int from, int i); | ||||
|     // scroll down 'i' lines in current region, clearing the top 'i' lines | ||||
|     void scrollDown(int from, int i); | ||||
|  | ||||
|     void addHistLine(); | ||||
|  | ||||
|     void initTabStops(); | ||||
|  | ||||
|     void updateEffectiveRendition(); | ||||
|     void reverseRendition(Character& p) const; | ||||
|  | ||||
|     bool isSelectionValid() const; | ||||
|     // copies text from 'startIndex' to 'endIndex' to a stream | ||||
|     // startIndex and endIndex are positions generated using the loc(x,y) macro | ||||
|     void writeToStream(TerminalCharacterDecoder* decoder, int startIndex,  | ||||
|                        int endIndex, bool preserveLineBreaks = true) const; | ||||
|     // copies 'count' lines from the screen buffer into 'dest', | ||||
|     // starting from 'startLine', where 0 is the first line in the screen buffer | ||||
|     void copyFromScreen(Character* dest, int startLine, int count) const; | ||||
|     // copies 'count' lines from the history buffer into 'dest', | ||||
|     // starting from 'startLine', where 0 is the first line in the history | ||||
|     void copyFromHistory(Character* dest, int startLine, int count) const; | ||||
|  | ||||
|  | ||||
|     // screen image ---------------- | ||||
|     int lines; | ||||
|     int columns; | ||||
|  | ||||
|     typedef QVector<Character> ImageLine;      // [0..columns] | ||||
|     ImageLine*          screenLines;    // [lines] | ||||
|  | ||||
|     int _scrolledLines; | ||||
|     QRect _lastScrolledRegion; | ||||
|  | ||||
|     int _droppedLines; | ||||
|  | ||||
|     QVarLengthArray<LineProperty,64> lineProperties;     | ||||
|      | ||||
|     // history buffer --------------- | ||||
|     HistoryScroll* history; | ||||
|      | ||||
|     // cursor location | ||||
|     int cuX; | ||||
|     int cuY; | ||||
|  | ||||
|     // cursor color and rendition info | ||||
|     CharacterColor currentForeground; | ||||
|     CharacterColor currentBackground; | ||||
|     quint8 currentRendition;  | ||||
|  | ||||
|     // margins ---------------- | ||||
|     int _topMargin; | ||||
|     int _bottomMargin; | ||||
|  | ||||
|     // states ---------------- | ||||
|     int currentModes[MODES_SCREEN]; | ||||
|     int savedModes[MODES_SCREEN]; | ||||
|  | ||||
|     // ---------------------------- | ||||
|  | ||||
|     QBitArray tabStops; | ||||
|  | ||||
|     // selection ------------------- | ||||
|     int selBegin; // The first location selected. | ||||
|     int selTopLeft;    // TopLeft Location. | ||||
|     int selBottomRight;    // Bottom Right Location. | ||||
|     bool blockSelectionMode;  // Column selection mode | ||||
|  | ||||
|     // effective colors and rendition ------------ | ||||
|     CharacterColor effectiveForeground; // These are derived from | ||||
|     CharacterColor effectiveBackground; // the cu_* variables above | ||||
|     quint8 effectiveRendition;          // to speed up operation | ||||
|  | ||||
|     class SavedState   | ||||
|     { | ||||
|     public: | ||||
|         SavedState() | ||||
|         : cursorColumn(0),cursorLine(0),rendition(0) {} | ||||
|  | ||||
|         int cursorColumn; | ||||
|         int cursorLine; | ||||
|         quint8 rendition; | ||||
|         CharacterColor foreground; | ||||
|         CharacterColor background; | ||||
|     }; | ||||
|     SavedState savedState; | ||||
|          | ||||
|     // last position where we added a character | ||||
|     int lastPos; | ||||
|  | ||||
|     static Character defaultChar; | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif // SCREEN_H | ||||
							
								
								
									
										292
									
								
								konsole-qml-plugin/src/ScreenWindow.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										292
									
								
								konsole-qml-plugin/src/ScreenWindow.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,292 @@ | ||||
| /* | ||||
|     Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "ScreenWindow.h" | ||||
|  | ||||
| // Qt | ||||
| #include <QtDebug> | ||||
|  | ||||
| // Konsole | ||||
| #include "Screen.h" | ||||
|  | ||||
| ScreenWindow::ScreenWindow(QObject* parent) | ||||
|     : QObject(parent) | ||||
|     , _windowBuffer(0) | ||||
|     , _windowBufferSize(0) | ||||
|     , _bufferNeedsUpdate(true) | ||||
|     , _windowLines(1) | ||||
|     , _currentLine(0) | ||||
|     , _trackOutput(true) | ||||
|     , _scrollCount(0) | ||||
| { | ||||
| } | ||||
| ScreenWindow::~ScreenWindow() | ||||
| { | ||||
|     delete[] _windowBuffer; | ||||
| } | ||||
| void ScreenWindow::setScreen(Screen* screen) | ||||
| { | ||||
|     Q_ASSERT( screen ); | ||||
|  | ||||
|     _screen = screen; | ||||
| } | ||||
|  | ||||
| Screen* ScreenWindow::screen() const | ||||
| { | ||||
|     return _screen; | ||||
| } | ||||
|  | ||||
| Character* ScreenWindow::getImage() | ||||
| { | ||||
|     // reallocate internal buffer if the window size has changed | ||||
|     int size = windowLines() * windowColumns(); | ||||
|     if (_windowBuffer == 0 || _windowBufferSize != size)  | ||||
|     { | ||||
|         delete[] _windowBuffer; | ||||
|         _windowBufferSize = size; | ||||
|         _windowBuffer = new Character[size]; | ||||
|         _bufferNeedsUpdate = true; | ||||
|     } | ||||
|  | ||||
|      if (!_bufferNeedsUpdate) | ||||
|         return _windowBuffer; | ||||
|   | ||||
|     _screen->getImage(_windowBuffer,size, | ||||
|                       currentLine(),endWindowLine()); | ||||
|  | ||||
|     // this window may look beyond the end of the screen, in which  | ||||
|     // case there will be an unused area which needs to be filled | ||||
|     // with blank characters | ||||
|     fillUnusedArea(); | ||||
|  | ||||
|     _bufferNeedsUpdate = false; | ||||
|     return _windowBuffer; | ||||
| } | ||||
|  | ||||
| void ScreenWindow::fillUnusedArea() | ||||
| { | ||||
|     int screenEndLine = _screen->getHistLines() + _screen->getLines() - 1; | ||||
|     int windowEndLine = currentLine() + windowLines() - 1; | ||||
|  | ||||
|     int unusedLines = windowEndLine - screenEndLine; | ||||
|     int charsToFill = unusedLines * windowColumns(); | ||||
|  | ||||
|     Screen::fillWithDefaultChar(_windowBuffer + _windowBufferSize - charsToFill,charsToFill);  | ||||
| } | ||||
|  | ||||
| // return the index of the line at the end of this window, or if this window  | ||||
| // goes beyond the end of the screen, the index of the line at the end | ||||
| // of the screen. | ||||
| // | ||||
| // when passing a line number to a Screen method, the line number should | ||||
| // never be more than endWindowLine() | ||||
| // | ||||
| int ScreenWindow::endWindowLine() const | ||||
| { | ||||
|     return qMin(currentLine() + windowLines() - 1, | ||||
|                 lineCount() - 1); | ||||
| } | ||||
| QVector<LineProperty> ScreenWindow::getLineProperties() | ||||
| { | ||||
|     QVector<LineProperty> result = _screen->getLineProperties(currentLine(),endWindowLine()); | ||||
|      | ||||
|     if (result.count() != windowLines()) | ||||
|         result.resize(windowLines()); | ||||
|  | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| QString ScreenWindow::selectedText( bool preserveLineBreaks ) const | ||||
| { | ||||
|     return _screen->selectedText( preserveLineBreaks ); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::getSelectionStart( int& column , int& line ) | ||||
| { | ||||
|     _screen->getSelectionStart(column,line); | ||||
|     line -= currentLine(); | ||||
| } | ||||
| void ScreenWindow::getSelectionEnd( int& column , int& line ) | ||||
| { | ||||
|     _screen->getSelectionEnd(column,line); | ||||
|     line -= currentLine(); | ||||
| } | ||||
| void ScreenWindow::setSelectionStart( int column , int line , bool columnMode ) | ||||
| { | ||||
|     _screen->setSelectionStart( column , qMin(line + currentLine(),endWindowLine())  , columnMode); | ||||
|      | ||||
|     _bufferNeedsUpdate = true; | ||||
|     emit selectionChanged(); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::setSelectionEnd( int column , int line ) | ||||
| { | ||||
|     _screen->setSelectionEnd( column , qMin(line + currentLine(),endWindowLine()) ); | ||||
|  | ||||
|     _bufferNeedsUpdate = true; | ||||
|     emit selectionChanged(); | ||||
| } | ||||
|  | ||||
| bool ScreenWindow::isSelected( int column , int line ) | ||||
| { | ||||
|     return _screen->isSelected( column , qMin(line + currentLine(),endWindowLine()) ); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::clearSelection() | ||||
| { | ||||
|     _screen->clearSelection(); | ||||
|  | ||||
|     emit selectionChanged(); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::setWindowLines(int lines) | ||||
| { | ||||
|     Q_ASSERT(lines > 0); | ||||
|     _windowLines = lines; | ||||
| } | ||||
| int ScreenWindow::windowLines() const | ||||
| { | ||||
|     return _windowLines;         | ||||
| } | ||||
|  | ||||
| int ScreenWindow::windowColumns() const | ||||
| { | ||||
|     return _screen->getColumns(); | ||||
| } | ||||
|  | ||||
| int ScreenWindow::lineCount() const | ||||
| { | ||||
|     return _screen->getHistLines() + _screen->getLines(); | ||||
| } | ||||
|  | ||||
| int ScreenWindow::columnCount() const | ||||
| { | ||||
|     return _screen->getColumns(); | ||||
| } | ||||
|  | ||||
| QPoint ScreenWindow::cursorPosition() const | ||||
| { | ||||
|     QPoint position; | ||||
|      | ||||
|     position.setX( _screen->getCursorX() ); | ||||
|     position.setY( _screen->getCursorY() ); | ||||
|  | ||||
|     return position;  | ||||
| } | ||||
|  | ||||
| int ScreenWindow::currentLine() const | ||||
| { | ||||
|     return qBound(0,_currentLine,lineCount()-windowLines()); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::scrollBy( RelativeScrollMode mode , int amount ) | ||||
| { | ||||
|     if ( mode == ScrollLines ) | ||||
|     { | ||||
|         scrollTo( currentLine() + amount ); | ||||
|     } | ||||
|     else if ( mode == ScrollPages ) | ||||
|     { | ||||
|         scrollTo( currentLine() + amount * ( windowLines() / 2 ) );  | ||||
|     } | ||||
| } | ||||
|  | ||||
| bool ScreenWindow::atEndOfOutput() const | ||||
| { | ||||
|     return currentLine() == (lineCount()-windowLines()); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::scrollTo( int line ) | ||||
| { | ||||
|     int maxCurrentLineNumber = lineCount() - windowLines(); | ||||
|     line = qBound(0,line,maxCurrentLineNumber); | ||||
|  | ||||
|     const int delta = line - _currentLine; | ||||
|     _currentLine = line; | ||||
|  | ||||
|     // keep track of number of lines scrolled by, | ||||
|     // this can be reset by calling resetScrollCount() | ||||
|     _scrollCount += delta; | ||||
|  | ||||
|     _bufferNeedsUpdate = true; | ||||
|  | ||||
|     emit scrolled(_currentLine); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::setTrackOutput(bool trackOutput) | ||||
| { | ||||
|     _trackOutput = trackOutput; | ||||
| } | ||||
|  | ||||
| bool ScreenWindow::trackOutput() const | ||||
| { | ||||
|     return _trackOutput; | ||||
| } | ||||
|  | ||||
| int ScreenWindow::scrollCount() const | ||||
| { | ||||
|     return _scrollCount; | ||||
| } | ||||
|  | ||||
| void ScreenWindow::resetScrollCount()  | ||||
| { | ||||
|     _scrollCount = 0; | ||||
| } | ||||
|  | ||||
| QRect ScreenWindow::scrollRegion() const | ||||
| { | ||||
|     bool equalToScreenSize = windowLines() == _screen->getLines(); | ||||
|  | ||||
|     if ( atEndOfOutput() && equalToScreenSize ) | ||||
|         return _screen->lastScrolledRegion(); | ||||
|     else | ||||
|         return QRect(0,0,windowColumns(),windowLines()); | ||||
| } | ||||
|  | ||||
| void ScreenWindow::notifyOutputChanged() | ||||
| { | ||||
|     // move window to the bottom of the screen and update scroll count | ||||
|     // if this window is currently tracking the bottom of the screen | ||||
|     if ( _trackOutput ) | ||||
|     {  | ||||
|         _scrollCount -= _screen->scrolledLines(); | ||||
|         _currentLine = qMax(0,_screen->getHistLines() - (windowLines()-_screen->getLines())); | ||||
|     } | ||||
|     else | ||||
|     { | ||||
|         // if the history is not unlimited then it may  | ||||
|         // have run out of space and dropped the oldest | ||||
|         // lines of output - in this case the screen | ||||
|         // window's current line number will need to  | ||||
|         // be adjusted - otherwise the output will scroll | ||||
|         _currentLine = qMax(0,_currentLine -  | ||||
|                               _screen->droppedLines()); | ||||
|  | ||||
|         // ensure that the screen window's current position does | ||||
|         // not go beyond the bottom of the screen | ||||
|         _currentLine = qMin( _currentLine , _screen->getHistLines() ); | ||||
|     } | ||||
|  | ||||
|     _bufferNeedsUpdate = true; | ||||
|  | ||||
|     emit outputChanged();  | ||||
| } | ||||
|  | ||||
| //#include "ScreenWindow.moc" | ||||
							
								
								
									
										257
									
								
								konsole-qml-plugin/src/ScreenWindow.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										257
									
								
								konsole-qml-plugin/src/ScreenWindow.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,257 @@ | ||||
| /* | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef SCREENWINDOW_H | ||||
| #define SCREENWINDOW_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QObject> | ||||
| #include <QtCore/QPoint> | ||||
| #include <QtCore/QRect> | ||||
|  | ||||
| // Konsole | ||||
| #include "Character.h" | ||||
|  | ||||
|  | ||||
| class Screen; | ||||
|  | ||||
| /** | ||||
|  * Provides a window onto a section of a terminal screen.  A terminal widget can then render | ||||
|  * the contents of the window and use the window to change the terminal screen's selection  | ||||
|  * in response to mouse or keyboard input. | ||||
|  * | ||||
|  * A new ScreenWindow for a terminal session can be created by calling Emulation::createWindow() | ||||
|  * | ||||
|  * Use the scrollTo() method to scroll the window up and down on the screen. | ||||
|  * Use the getImage() method to retrieve the character image which is currently visible in the window. | ||||
|  * | ||||
|  * setTrackOutput() controls whether the window moves to the bottom of the associated screen when new | ||||
|  * lines are added to it. | ||||
|  * | ||||
|  * Whenever the output from the underlying screen is changed, the notifyOutputChanged() slot should | ||||
|  * be called.  This in turn will update the window's position and emit the outputChanged() signal | ||||
|  * if necessary. | ||||
|  */ | ||||
| class ScreenWindow : public QObject | ||||
| { | ||||
| Q_OBJECT | ||||
|  | ||||
| public: | ||||
|     /**  | ||||
|      * Constructs a new screen window with the given parent. | ||||
|      * A screen must be specified by calling setScreen() before calling getImage() or getLineProperties(). | ||||
|      * | ||||
|      * You should not call this constructor directly, instead use the Emulation::createWindow() method | ||||
|      * to create a window on the emulation which you wish to view.  This allows the emulation | ||||
|      * to notify the window when the associated screen has changed and synchronize selection updates | ||||
|      * between all views on a session. | ||||
|      */ | ||||
|     ScreenWindow(QObject* parent = 0); | ||||
|     virtual ~ScreenWindow(); | ||||
|  | ||||
|     /** Sets the screen which this window looks onto */ | ||||
|     void setScreen(Screen* screen); | ||||
|     /** Returns the screen which this window looks onto */ | ||||
|     Screen* screen() const; | ||||
|  | ||||
|     /**  | ||||
|      * Returns the image of characters which are currently visible through this window | ||||
|      * onto the screen. | ||||
|      * | ||||
|      * The returned buffer is managed by the ScreenWindow instance and does not need to be | ||||
|      * deleted by the caller. | ||||
|      */ | ||||
|     Character* getImage(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the line attributes associated with the lines of characters which | ||||
|      * are currently visible through this window | ||||
|      */ | ||||
|     QVector<LineProperty> getLineProperties(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the number of lines which the region of the window | ||||
|      * specified by scrollRegion() has been scrolled by since the last call  | ||||
|      * to resetScrollCount().  scrollRegion() is in most cases the  | ||||
|      * whole window, but will be a smaller area in, for example, applications | ||||
|      * which provide split-screen facilities. | ||||
|      * | ||||
|      * This is not guaranteed to be accurate, but allows views to optimize | ||||
|      * rendering by reducing the amount of costly text rendering that | ||||
|      * needs to be done when the output is scrolled.  | ||||
|      */ | ||||
|     int scrollCount() const; | ||||
|  | ||||
|     /** | ||||
|      * Resets the count of scrolled lines returned by scrollCount() | ||||
|      */ | ||||
|     void resetScrollCount(); | ||||
|  | ||||
|     /** | ||||
|      * Returns the area of the window which was last scrolled, this is  | ||||
|      * usually the whole window area. | ||||
|      * | ||||
|      * Like scrollCount(), this is not guaranteed to be accurate, | ||||
|      * but allows views to optimize rendering. | ||||
|      */ | ||||
|     QRect scrollRegion() const; | ||||
|  | ||||
|     /**  | ||||
|      * Sets the start of the selection to the given @p line and @p column within  | ||||
|      * the window. | ||||
|      */ | ||||
|     void setSelectionStart( int column , int line , bool columnMode ); | ||||
|     /** | ||||
|      * Sets the end of the selection to the given @p line and @p column within | ||||
|      * the window. | ||||
|      */ | ||||
|     void setSelectionEnd( int column , int line );  | ||||
|     /** | ||||
|      * Retrieves the start of the selection within the window. | ||||
|      */ | ||||
|     void getSelectionStart( int& column , int& line ); | ||||
|     /** | ||||
|      * Retrieves the end of the selection within the window. | ||||
|      */ | ||||
|     void getSelectionEnd( int& column , int& line ); | ||||
|     /** | ||||
|      * Returns true if the character at @p line , @p column is part of the selection. | ||||
|      */ | ||||
|     bool isSelected( int column , int line ); | ||||
|     /**  | ||||
|      * Clears the current selection | ||||
|      */ | ||||
|     void clearSelection(); | ||||
|  | ||||
|     /** Sets the number of lines in the window */ | ||||
|     void setWindowLines(int lines); | ||||
|     /** Returns the number of lines in the window */ | ||||
|     int windowLines() const; | ||||
|     /** Returns the number of columns in the window */ | ||||
|     int windowColumns() const; | ||||
|      | ||||
|     /** Returns the total number of lines in the screen */ | ||||
|     int lineCount() const; | ||||
|     /** Returns the total number of columns in the screen */ | ||||
|     int columnCount() const; | ||||
|  | ||||
|     /** Returns the index of the line which is currently at the top of this window */ | ||||
|     int currentLine() const; | ||||
|  | ||||
|     /**  | ||||
|      * Returns the position of the cursor  | ||||
|      * within the window. | ||||
|      */ | ||||
|     QPoint cursorPosition() const; | ||||
|  | ||||
|     /**  | ||||
|      * Convenience method. Returns true if the window is currently at the bottom | ||||
|      * of the screen. | ||||
|      */ | ||||
|     bool atEndOfOutput() const; | ||||
|  | ||||
|     /** Scrolls the window so that @p line is at the top of the window */ | ||||
|     void scrollTo( int line ); | ||||
|  | ||||
|     /** Describes the units which scrollBy() moves the window by. */ | ||||
|     enum RelativeScrollMode | ||||
|     { | ||||
|         /** Scroll the window down by a given number of lines. */ | ||||
|         ScrollLines, | ||||
|         /**  | ||||
|          * Scroll the window down by a given number of pages, where | ||||
|          * one page is windowLines() lines | ||||
|          */ | ||||
|         ScrollPages | ||||
|     }; | ||||
|  | ||||
|     /**  | ||||
|      * Scrolls the window relative to its current position on the screen. | ||||
|      * | ||||
|      * @param mode Specifies whether @p amount refers to the number of lines or the number | ||||
|      * of pages to scroll.     | ||||
|      * @param amount The number of lines or pages ( depending on @p mode ) to scroll by.  If | ||||
|      * this number is positive, the view is scrolled down.  If this number is negative, the view | ||||
|      * is scrolled up. | ||||
|      */ | ||||
|     void scrollBy( RelativeScrollMode mode , int amount ); | ||||
|  | ||||
|     /**  | ||||
|      * Specifies whether the window should automatically move to the bottom | ||||
|      * of the screen when new output is added. | ||||
|      * | ||||
|      * If this is set to true, the window will be moved to the bottom of the associated screen ( see  | ||||
|      * screen() ) when the notifyOutputChanged() method is called. | ||||
|      */ | ||||
|     void setTrackOutput(bool trackOutput); | ||||
|     /**  | ||||
|      * Returns whether the window automatically moves to the bottom of the screen as | ||||
|      * new output is added.  See setTrackOutput() | ||||
|      */ | ||||
|     bool trackOutput() const; | ||||
|  | ||||
|     /** | ||||
|      * Returns the text which is currently selected. | ||||
|      * | ||||
|      * @param preserveLineBreaks See Screen::selectedText() | ||||
|      */ | ||||
|     QString selectedText( bool preserveLineBreaks ) const; | ||||
|  | ||||
| public slots: | ||||
|     /**  | ||||
|      * Notifies the window that the contents of the associated terminal screen have changed. | ||||
|      * This moves the window to the bottom of the screen if trackOutput() is true and causes | ||||
|      * the outputChanged() signal to be emitted. | ||||
|      */ | ||||
|     void notifyOutputChanged(); | ||||
|  | ||||
| signals: | ||||
|     /** | ||||
|      * Emitted when the contents of the associated terminal screen (see screen()) changes.  | ||||
|      */ | ||||
|     void outputChanged(); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when the screen window is scrolled to a different position. | ||||
|      *  | ||||
|      * @param line The line which is now at the top of the window. | ||||
|      */ | ||||
|     void scrolled(int line); | ||||
|  | ||||
|     /** Emitted when the selection is changed. */ | ||||
|     void selectionChanged(); | ||||
|  | ||||
| private: | ||||
|     int endWindowLine() const; | ||||
|     void fillUnusedArea(); | ||||
|  | ||||
|     Screen* _screen; // see setScreen() , screen() | ||||
|     Character* _windowBuffer; | ||||
|     int _windowBufferSize; | ||||
|     bool _bufferNeedsUpdate; | ||||
|  | ||||
|     int  _windowLines; | ||||
|     int  _currentLine; // see scrollTo() , currentLine() | ||||
|     bool _trackOutput; // see setTrackOutput() , trackOutput()  | ||||
|     int  _scrollCount; // count of lines which the window has been scrolled by since | ||||
|                        // the last call to resetScrollCount() | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif // SCREENWINDOW_H | ||||
							
								
								
									
										1064
									
								
								konsole-qml-plugin/src/Session.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1064
									
								
								konsole-qml-plugin/src/Session.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										626
									
								
								konsole-qml-plugin/src/Session.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										626
									
								
								konsole-qml-plugin/src/Session.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,626 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|  | ||||
|     Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> | ||||
|     Copyright (C) 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     Rewritten for QT4     by e_k      <e_k at users.sourceforge.net>, Copyright (C) 2008 | ||||
|     Rewritten for QT5/QML by Dmitry Zagnoyko   <hiroshidi@gmail.com>, Copyright (C) 2013 | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef SESSION_H | ||||
| #define SESSION_H | ||||
|  | ||||
|  | ||||
| #include <QStringList> | ||||
|  | ||||
| #include <QtCore/QTimer> | ||||
| #include <QtGui/QWindow> | ||||
|  | ||||
| #include "History.h" | ||||
|  | ||||
| class KProcess; | ||||
|  | ||||
|  | ||||
| class Emulation; | ||||
| class Pty; | ||||
| class KTerminalDisplay; | ||||
| //class ZModemDialog; | ||||
|  | ||||
| /** | ||||
|  * Represents a terminal session consisting of a pseudo-teletype and a terminal emulation. | ||||
|  * The pseudo-teletype (or PTY) handles I/O between the terminal process and Konsole. | ||||
|  * The terminal emulation ( Emulation and subclasses ) processes the output stream from the | ||||
|  * PTY and produces a character image which is then shown on views connected to the session. | ||||
|  * | ||||
|  * Each Session can be connected to one or more views by using the addView() method. | ||||
|  * The attached views can then display output from the program running in the terminal | ||||
|  * or send input to the program in the terminal in the form of keypresses and mouse | ||||
|  * activity. | ||||
|  */ | ||||
| class Session : public QObject { | ||||
|     Q_OBJECT | ||||
|  | ||||
| public: | ||||
|     Q_PROPERTY(QString name READ nameTitle) | ||||
|     Q_PROPERTY(int processId READ processId) | ||||
|     Q_PROPERTY(QString keyBindings READ keyBindings WRITE setKeyBindings) | ||||
|     Q_PROPERTY(QSize size READ size WRITE setSize) | ||||
|  | ||||
|     /** | ||||
|      * Constructs a new session. | ||||
|      * | ||||
|      * To start the terminal process, call the run() method, | ||||
|      * after specifying the program and arguments | ||||
|      * using setProgram() and setArguments() | ||||
|      * | ||||
|      * If no program or arguments are specified explicitly, the Session | ||||
|      * falls back to using the program specified in the SHELL environment | ||||
|      * variable. | ||||
|      */ | ||||
|     Session(); | ||||
|     ~Session(); | ||||
|  | ||||
|     /** | ||||
|      * Returns true if the session is currently running.  This will be true | ||||
|      * after run() has been called successfully. | ||||
|      */ | ||||
|     bool isRunning() const; | ||||
|  | ||||
|     /** | ||||
|      * Sets the profile associated with this session. | ||||
|      * | ||||
|      * @param profileKey A key which can be used to obtain the current | ||||
|      * profile settings from the SessionManager | ||||
|      */ | ||||
|     void setProfileKey(const QString & profileKey); | ||||
|     /** | ||||
|      * Returns the profile key associated with this session. | ||||
|      * This can be passed to the SessionManager to obtain the current | ||||
|      * profile settings. | ||||
|      */ | ||||
|     QString profileKey() const; | ||||
|  | ||||
|     /** | ||||
|      * Adds a new view for this session. | ||||
|      * | ||||
|      * The viewing widget will display the output from the terminal and | ||||
|      * input from the viewing widget (key presses, mouse activity etc.) | ||||
|      * will be sent to the terminal. | ||||
|      * | ||||
|      * Views can be removed using removeView().  The session is automatically | ||||
|      * closed when the last view is removed. | ||||
|      */ | ||||
|     void addView(KTerminalDisplay * widget); | ||||
|     /** | ||||
|      * Removes a view from this session.  When the last view is removed, | ||||
|      * the session will be closed automatically. | ||||
|      * | ||||
|      * @p widget will no longer display output from or send input | ||||
|      * to the terminal | ||||
|      */ | ||||
|     void removeView(KTerminalDisplay * widget); | ||||
|  | ||||
|     /** | ||||
|      * Returns the views connected to this session | ||||
|      */ | ||||
|     QList<KTerminalDisplay *> views() const; | ||||
|  | ||||
|     /** | ||||
|      * Returns the terminal emulation instance being used to encode / decode | ||||
|      * characters to / from the process. | ||||
|      */ | ||||
|     Emulation * emulation() const; | ||||
|  | ||||
|     /** | ||||
|      * Returns the environment of this session as a list of strings like | ||||
|      * VARIABLE=VALUE | ||||
|      */ | ||||
|     QStringList environment() const; | ||||
|     /** | ||||
|      * Sets the environment for this session. | ||||
|      * @p environment should be a list of strings like | ||||
|      * VARIABLE=VALUE | ||||
|      */ | ||||
|     void setEnvironment(const QStringList & environment); | ||||
|  | ||||
|     /** Returns the unique ID for this session. */ | ||||
|     int sessionId() const; | ||||
|  | ||||
|     /** | ||||
|      * Return the session title set by the user (ie. the program running | ||||
|      * in the terminal), or an empty string if the user has not set a custom title | ||||
|      */ | ||||
|     QString userTitle() const; | ||||
|  | ||||
|     /** | ||||
|      * This enum describes the contexts for which separate | ||||
|      * tab title formats may be specified. | ||||
|      */ | ||||
|     enum TabTitleContext { | ||||
|         /** Default tab title format */ | ||||
|         LocalTabTitle, | ||||
|         /** | ||||
|          * Tab title format used session currently contains | ||||
|          * a connection to a remote computer (via SSH) | ||||
|          */ | ||||
|         RemoteTabTitle | ||||
|     }; | ||||
|     /** | ||||
|      * Sets the format used by this session for tab titles. | ||||
|      * | ||||
|      * @param context The context whoose format should be set. | ||||
|      * @param format The tab title format.  This may be a mixture | ||||
|      * of plain text and dynamic elements denoted by a '%' character | ||||
|      * followed by a letter.  (eg. %d for directory).  The dynamic | ||||
|      * elements available depend on the @p context | ||||
|      */ | ||||
|     void setTabTitleFormat(TabTitleContext context , const QString & format); | ||||
|     /** Returns the format used by this session for tab titles. */ | ||||
|     QString tabTitleFormat(TabTitleContext context) const; | ||||
|  | ||||
|  | ||||
|     /** Returns the arguments passed to the shell process when run() is called. */ | ||||
|     QStringList arguments() const; | ||||
|     /** Returns the program name of the shell process started when run() is called. */ | ||||
|     QString program() const; | ||||
|  | ||||
|     /** | ||||
|      * Sets the command line arguments which the session's program will be passed when | ||||
|      * run() is called. | ||||
|      */ | ||||
|     void setArguments(const QStringList & arguments); | ||||
|     /** Sets the program to be executed when run() is called. */ | ||||
|     void setProgram(const QString & program); | ||||
|  | ||||
|     /** Returns the session's current working directory. */ | ||||
|     QString initialWorkingDirectory() { | ||||
|         return _initialWorkingDir; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets the initial working directory for the session when it is run | ||||
|      * This has no effect once the session has been started. | ||||
|      */ | ||||
|     void setInitialWorkingDirectory( const QString & dir ); | ||||
|  | ||||
|     /** | ||||
|      * Sets the type of history store used by this session. | ||||
|      * Lines of output produced by the terminal are added | ||||
|      * to the history store.  The type of history store | ||||
|      * used affects the number of lines which can be | ||||
|      * remembered before they are lost and the storage | ||||
|      * (in memory, on-disk etc.) used. | ||||
|      */ | ||||
|     void setHistoryType(const HistoryType & type); | ||||
|     /** | ||||
|      * Returns the type of history store used by this session. | ||||
|      */ | ||||
|     const HistoryType & historyType() const; | ||||
|     /** | ||||
|      * Clears the history store used by this session. | ||||
|      */ | ||||
|     void clearHistory(); | ||||
|  | ||||
|     /** | ||||
|      * Enables monitoring for activity in the session. | ||||
|      * This will cause notifySessionState() to be emitted | ||||
|      * with the NOTIFYACTIVITY state flag when output is | ||||
|      * received from the terminal. | ||||
|      */ | ||||
|     void setMonitorActivity(bool); | ||||
|     /** Returns true if monitoring for activity is enabled. */ | ||||
|     bool isMonitorActivity() const; | ||||
|  | ||||
|     /** | ||||
|      * Enables monitoring for silence in the session. | ||||
|      * This will cause notifySessionState() to be emitted | ||||
|      * with the NOTIFYSILENCE state flag when output is not | ||||
|      * received from the terminal for a certain period of | ||||
|      * time, specified with setMonitorSilenceSeconds() | ||||
|      */ | ||||
|     void setMonitorSilence(bool); | ||||
|     /** | ||||
|      * Returns true if monitoring for inactivity (silence) | ||||
|      * in the session is enabled. | ||||
|      */ | ||||
|     bool isMonitorSilence()  const; | ||||
|     /** See setMonitorSilence() */ | ||||
|     void setMonitorSilenceSeconds(int seconds); | ||||
|  | ||||
|     /** | ||||
|      * Sets the key bindings used by this session.  The bindings | ||||
|      * specify how input key sequences are translated into | ||||
|      * the character stream which is sent to the terminal. | ||||
|      * | ||||
|      * @param id The name of the key bindings to use.  The | ||||
|      * names of available key bindings can be determined using the | ||||
|      * KeyboardTranslatorManager class. | ||||
|      */ | ||||
|     void setKeyBindings(const QString & id); | ||||
|     /** Returns the name of the key bindings used by this session. */ | ||||
|     QString keyBindings() const; | ||||
|  | ||||
|     /** | ||||
|      * This enum describes the available title roles. | ||||
|      */ | ||||
|     enum TitleRole { | ||||
|         /** The name of the session. */ | ||||
|         NameRole, | ||||
|         /** The title of the session which is displayed in tabs etc. */ | ||||
|         DisplayedTitleRole | ||||
|     }; | ||||
|  | ||||
|     /** Sets the session's title for the specified @p role to @p title. */ | ||||
|     void setTitle(TitleRole role , const QString & title); | ||||
|     /** Returns the session's title for the specified @p role. */ | ||||
|     QString title(TitleRole role) const; | ||||
|     /** Convenience method used to read the name property.  Returns title(Session::NameRole). */ | ||||
|     QString nameTitle() const { | ||||
|         return title(Session::NameRole); | ||||
|     } | ||||
|  | ||||
|     /** Sets the name of the icon associated with this session. */ | ||||
|     void setIconName(const QString & iconName); | ||||
|     /** Returns the name of the icon associated with this session. */ | ||||
|     QString iconName() const; | ||||
|  | ||||
|     /** Sets the text of the icon associated with this session. */ | ||||
|     void setIconText(const QString & iconText); | ||||
|     /** Returns the text of the icon associated with this session. */ | ||||
|     QString iconText() const; | ||||
|  | ||||
|     /** Specifies whether a utmp entry should be created for the pty used by this session. */ | ||||
|     void setAddToUtmp(bool); | ||||
|  | ||||
|     /** Sends the specified @p signal to the terminal process. */ | ||||
|     bool sendSignal(int signal); | ||||
|  | ||||
|     /** | ||||
|      * Specifies whether to close the session automatically when the terminal | ||||
|      * process terminates. | ||||
|      */ | ||||
|     void setAutoClose(bool b) { | ||||
|         _autoClose = b; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sets whether flow control is enabled for this terminal | ||||
|      * session. | ||||
|      */ | ||||
|     void setFlowControlEnabled(bool enabled); | ||||
|  | ||||
|     /** Returns whether flow control is enabled for this terminal session. */ | ||||
|     bool flowControlEnabled() const; | ||||
|  | ||||
|     /** | ||||
|      * Sends @p text to the current foreground terminal program. | ||||
|      */ | ||||
|     void sendText(const QString &text) const; | ||||
|  | ||||
|     /** | ||||
|      * Sends @p QKeyEvent to the current foreground terminal program. | ||||
|      */ | ||||
|     void sendKey(QKeyEvent *key); | ||||
|  | ||||
|     /** | ||||
|      * Returns the process id of the terminal process. | ||||
|      * This is the id used by the system API to refer to the process. | ||||
|      */ | ||||
|     int processId() const; | ||||
|  | ||||
|     /** | ||||
|      * Returns the process id of the terminal's foreground process. | ||||
|      * This is initially the same as processId() but can change | ||||
|      * as the user starts other programs inside the terminal. | ||||
|      */ | ||||
|     int foregroundProcessId() const; | ||||
|  | ||||
|     /** Returns the terminal session's window size in lines and columns. */ | ||||
|     QSize size(); | ||||
|     /** | ||||
|      * Emits a request to resize the session to accommodate | ||||
|      * the specified window size. | ||||
|      * | ||||
|      * @param size The size in lines and columns to request. | ||||
|      */ | ||||
|     void setSize(const QSize & size); | ||||
|  | ||||
|     /** Sets the text codec used by this session's terminal emulation. */ | ||||
|     void setCodec(QTextCodec * codec); | ||||
|  | ||||
|     /** | ||||
|      * Sets whether the session has a dark background or not.  The session | ||||
|      * uses this information to set the COLORFGBG variable in the process's | ||||
|      * environment, which allows the programs running in the terminal to determine | ||||
|      * whether the background is light or dark and use appropriate colors by default. | ||||
|      * | ||||
|      * This has no effect once the session is running. | ||||
|      */ | ||||
|     void setDarkBackground(bool darkBackground); | ||||
|     /** | ||||
|      * Returns true if the session has a dark background. | ||||
|      * See setDarkBackground() | ||||
|      */ | ||||
|     bool hasDarkBackground() const; | ||||
|  | ||||
|     /** | ||||
|      * Attempts to get the shell program to redraw the current display area. | ||||
|      * This can be used after clearing the screen, for example, to get the | ||||
|      * shell to redraw the prompt line. | ||||
|      */ | ||||
|     void refresh(); | ||||
|  | ||||
| //  void startZModem(const QString &rz, const QString &dir, const QStringList &list); | ||||
| //  void cancelZModem(); | ||||
| //  bool isZModemBusy() { return _zmodemBusy; } | ||||
|  | ||||
| public slots: | ||||
|  | ||||
|     /** | ||||
|      * Starts the terminal session. | ||||
|      * | ||||
|      * This creates the terminal process and connects the teletype to it. | ||||
|      */ | ||||
|     void run(); | ||||
|  | ||||
|     /** | ||||
|      * Closes the terminal session.  This sends a hangup signal | ||||
|      * (SIGHUP) to the terminal process and causes the done(Session*) | ||||
|      * signal to be emitted. | ||||
|      */ | ||||
|     void close(); | ||||
|  | ||||
|     /** | ||||
|      * Changes the session title or other customizable aspects of the terminal | ||||
|      * emulation display. For a list of what may be changed see the | ||||
|      * Emulation::titleChanged() signal. | ||||
|      */ | ||||
|     void setUserTitle( int, const QString & caption ); | ||||
|  | ||||
| signals: | ||||
|  | ||||
|     /** Emitted when the terminal process starts. */ | ||||
|     void started(); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when the terminal process exits. | ||||
|      */ | ||||
|     void finished(); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when output is received from the terminal process. | ||||
|      */ | ||||
|     void receivedData( const QString & text ); | ||||
|  | ||||
|     /** Emitted when the session's title has changed. */ | ||||
|     void titleChanged(); | ||||
|  | ||||
|     /** Emitted when the session's profile has changed. */ | ||||
|     void profileChanged(const QString & profile); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when the activity state of this session changes. | ||||
|      * | ||||
|      * @param state The new state of the session.  This may be one | ||||
|      * of NOTIFYNORMAL, NOTIFYSILENCE or NOTIFYACTIVITY | ||||
|      */ | ||||
|     void stateChanged(int state); | ||||
|  | ||||
|     /** Emitted when a bell event occurs in the session. */ | ||||
|     void bellRequest( const QString & message ); | ||||
|  | ||||
|     /** | ||||
|      * Requests that the color the text for any tabs associated with | ||||
|      * this session should be changed; | ||||
|      * | ||||
|      * TODO: Document what the parameter does | ||||
|      */ | ||||
|     void changeTabTextColorRequest(int); | ||||
|  | ||||
|     /** | ||||
|      * Requests that the background color of views on this session | ||||
|      * should be changed. | ||||
|      */ | ||||
|     void changeBackgroundColorRequest(const QColor &); | ||||
|  | ||||
|     /** TODO: Document me. */ | ||||
|     void openUrlRequest(const QString & url); | ||||
|  | ||||
|     /** TODO: Document me. */ | ||||
| //  void zmodemDetected(); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when the terminal process requests a change | ||||
|      * in the size of the terminal window. | ||||
|      * | ||||
|      * @param size The requested window size in terms of lines and columns. | ||||
|      */ | ||||
|     void resizeRequest(const QSize & size); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when a profile change command is received from the terminal. | ||||
|      * | ||||
|      * @param text The text of the command.  This is a string of the form | ||||
|      * "PropertyName=Value;PropertyName=Value ..." | ||||
|      */ | ||||
|     void profileChangeCommandReceived(const QString & text); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when the flow control state changes. | ||||
|      * | ||||
|      * @param enabled True if flow control is enabled or false otherwise. | ||||
|      */ | ||||
|     void flowControlEnabledChanged(bool enabled); | ||||
|  | ||||
| private slots: | ||||
|     void done(int); | ||||
|  | ||||
| //  void fireZModemDetected(); | ||||
|  | ||||
|     void onReceiveBlock( const char * buffer, int len ); | ||||
|     void monitorTimerDone(); | ||||
|  | ||||
|     void onViewSizeChange(int height, int width); | ||||
|     void onEmulationSizeChange(int lines , int columns); | ||||
|  | ||||
|     void activityStateSet(int); | ||||
|  | ||||
|     //automatically detach views from sessions when view is destroyed | ||||
|     void viewDestroyed(QObject * view); | ||||
|  | ||||
| //  void zmodemReadStatus(); | ||||
| //  void zmodemReadAndSendBlock(); | ||||
| //  void zmodemRcvBlock(const char *data, int len); | ||||
| //  void zmodemFinished(); | ||||
|  | ||||
| private: | ||||
|  | ||||
|     void updateTerminalSize(); | ||||
|     WId windowId() const; | ||||
|  | ||||
|     int            _uniqueIdentifier; | ||||
|  | ||||
|     Pty     *_shellProcess; | ||||
|     Emulation  *  _emulation; | ||||
|  | ||||
|     QList<KTerminalDisplay *> _views; | ||||
|  | ||||
|     bool           _monitorActivity; | ||||
|     bool           _monitorSilence; | ||||
|     bool           _notifiedActivity; | ||||
|     bool           _masterMode; | ||||
|     bool           _autoClose; | ||||
|     bool           _wantedClose; | ||||
|     QTimer    *    _monitorTimer; | ||||
|  | ||||
|     int            _silenceSeconds; | ||||
|  | ||||
|     QString        _nameTitle; | ||||
|     QString        _displayTitle; | ||||
|     QString        _userTitle; | ||||
|  | ||||
|     QString        _localTabTitleFormat; | ||||
|     QString        _remoteTabTitleFormat; | ||||
|  | ||||
|     QString        _iconName; | ||||
|     QString        _iconText; // as set by: echo -en '\033]1;IconText\007 | ||||
|     bool           _addToUtmp; | ||||
|     bool           _flowControl; | ||||
|     bool           _fullScripting; | ||||
|  | ||||
|     QString        _program; | ||||
|     QStringList    _arguments; | ||||
|  | ||||
|     QStringList    _environment; | ||||
|     int            _sessionId; | ||||
|  | ||||
|     QString        _initialWorkingDir; | ||||
|  | ||||
|     // ZModem | ||||
| //  bool           _zmodemBusy; | ||||
| //  KProcess*      _zmodemProc; | ||||
| //  ZModemDialog*  _zmodemProgress; | ||||
|  | ||||
|     // Color/Font Changes by ESC Sequences | ||||
|  | ||||
|     QColor         _modifiedBackground; // as set by: echo -en '\033]11;Color\007 | ||||
|  | ||||
|     QString        _profileKey; | ||||
|  | ||||
|     bool _hasDarkBackground; | ||||
|  | ||||
|     static int lastSessionId; | ||||
|  | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Provides a group of sessions which is divided into master and slave sessions. | ||||
|  * Activity in master sessions can be propagated to all sessions within the group. | ||||
|  * The type of activity which is propagated and method of propagation is controlled | ||||
|  * by the masterMode() flags. | ||||
|  */ | ||||
| class SessionGroup : public QObject { | ||||
|     Q_OBJECT | ||||
|  | ||||
| public: | ||||
|     /** Constructs an empty session group. */ | ||||
|     SessionGroup(); | ||||
|     /** Destroys the session group and removes all connections between master and slave sessions. */ | ||||
|     ~SessionGroup(); | ||||
|  | ||||
|     /** Adds a session to the group. */ | ||||
|     void addSession( Session * session ); | ||||
|     /** Removes a session from the group. */ | ||||
|     void removeSession( Session * session ); | ||||
|  | ||||
|     /** Returns the list of sessions currently in the group. */ | ||||
|     QList<Session *> sessions() const; | ||||
|  | ||||
|     /** | ||||
|      * Sets whether a particular session is a master within the group. | ||||
|      * Changes or activity in the group's master sessions may be propagated | ||||
|      * to all the sessions in the group, depending on the current masterMode() | ||||
|      * | ||||
|      * @param session The session whoose master status should be changed. | ||||
|      * @param master True to make this session a master or false otherwise | ||||
|      */ | ||||
|     void setMasterStatus( Session * session , bool master ); | ||||
|     /** Returns the master status of a session.  See setMasterStatus() */ | ||||
|     bool masterStatus( Session * session ) const; | ||||
|  | ||||
|     /** | ||||
|      * This enum describes the options for propagating certain activity or | ||||
|      * changes in the group's master sessions to all sessions in the group. | ||||
|      */ | ||||
|     enum MasterMode { | ||||
|         /** | ||||
|          * Any input key presses in the master sessions are sent to all | ||||
|          * sessions in the group. | ||||
|          */ | ||||
|         CopyInputToAll = 1 | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Specifies which activity in the group's master sessions is propagated | ||||
|      * to all sessions in the group. | ||||
|      * | ||||
|      * @param mode A bitwise OR of MasterMode flags. | ||||
|      */ | ||||
|     void setMasterMode( int mode ); | ||||
|     /** | ||||
|      * Returns a bitwise OR of the active MasterMode flags for this group. | ||||
|      * See setMasterMode() | ||||
|      */ | ||||
|     int masterMode() const; | ||||
|  | ||||
| private: | ||||
|     void connectPair(Session * master , Session * other); | ||||
|     void disconnectPair(Session * master , Session * other); | ||||
|     void connectAll(bool connect); | ||||
|     QList<Session *> masters() const; | ||||
|  | ||||
|     // maps sessions to their master status | ||||
|     QHash<Session *,bool> _sessions; | ||||
|  | ||||
|     int _masterMode; | ||||
| }; | ||||
|  | ||||
|  | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										167
									
								
								konsole-qml-plugin/src/ShellCommand.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										167
									
								
								konsole-qml-plugin/src/ShellCommand.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,167 @@ | ||||
| /* | ||||
|     Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "ShellCommand.h" | ||||
|  | ||||
| //some versions of gcc(4.3) require explicit include | ||||
| #include <cstdlib> | ||||
|  | ||||
|  | ||||
| // expands environment variables in 'text' | ||||
| // function copied from kdelibs/kio/kio/kurlcompletion.cpp | ||||
| static bool expandEnv(QString & text); | ||||
|  | ||||
| ShellCommand::ShellCommand(const QString & fullCommand) | ||||
| { | ||||
|     bool inQuotes = false; | ||||
|  | ||||
|     QString builder; | ||||
|  | ||||
|     for ( int i = 0 ; i < fullCommand.count() ; i++ ) { | ||||
|         QChar ch = fullCommand[i]; | ||||
|  | ||||
|         const bool isLastChar = ( i == fullCommand.count() - 1 ); | ||||
|         const bool isQuote = ( ch == '\'' || ch == '\"' ); | ||||
|  | ||||
|         if ( !isLastChar && isQuote ) { | ||||
|             inQuotes = !inQuotes; | ||||
|         } else { | ||||
|             if ( (!ch.isSpace() || inQuotes) && !isQuote ) { | ||||
|                 builder.append(ch); | ||||
|             } | ||||
|  | ||||
|             if ( (ch.isSpace() && !inQuotes) || ( i == fullCommand.count()-1 ) ) { | ||||
|                 _arguments << builder; | ||||
|                 builder.clear(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| } | ||||
| ShellCommand::ShellCommand(const QString & command , const QStringList & arguments) | ||||
| { | ||||
|     _arguments = arguments; | ||||
|  | ||||
|     if ( !_arguments.isEmpty() ) { | ||||
|         _arguments[0] == command; | ||||
|     } | ||||
| } | ||||
| QString ShellCommand::fullCommand() const | ||||
| { | ||||
|     return _arguments.join(QChar(' ')); | ||||
| } | ||||
| QString ShellCommand::command() const | ||||
| { | ||||
|     if ( !_arguments.isEmpty() ) { | ||||
|         return _arguments[0]; | ||||
|     } else { | ||||
|         return QString(); | ||||
|     } | ||||
| } | ||||
| QStringList ShellCommand::arguments() const | ||||
| { | ||||
|     return _arguments; | ||||
| } | ||||
| bool ShellCommand::isRootCommand() const | ||||
| { | ||||
|     Q_ASSERT(0); // not implemented yet | ||||
|     return false; | ||||
| } | ||||
| bool ShellCommand::isAvailable() const | ||||
| { | ||||
|     Q_ASSERT(0); // not implemented yet | ||||
|     return false; | ||||
| } | ||||
| QStringList ShellCommand::expand(const QStringList & items) | ||||
| { | ||||
|     QStringList result; | ||||
|  | ||||
|     foreach( QString item , items ) | ||||
|     result << expand(item); | ||||
|  | ||||
|     return result; | ||||
| } | ||||
| QString ShellCommand::expand(const QString & text) | ||||
| { | ||||
|     QString result = text; | ||||
|     expandEnv(result); | ||||
|     return result; | ||||
| } | ||||
|  | ||||
| /* | ||||
|  * expandEnv | ||||
|  * | ||||
|  * Expand environment variables in text. Escaped '$' characters are ignored. | ||||
|  * Return true if any variables were expanded | ||||
|  */ | ||||
| static bool expandEnv( QString & text ) | ||||
| { | ||||
|     // Find all environment variables beginning with '$' | ||||
|     // | ||||
|     int pos = 0; | ||||
|  | ||||
|     bool expanded = false; | ||||
|  | ||||
|     while ( (pos = text.indexOf(QLatin1Char('$'), pos)) != -1 ) { | ||||
|  | ||||
|         // Skip escaped '$' | ||||
|         // | ||||
|         if ( pos > 0 && text.at(pos-1) == QLatin1Char('\\') ) { | ||||
|             pos++; | ||||
|         } | ||||
|         // Variable found => expand | ||||
|         // | ||||
|         else { | ||||
|             // Find the end of the variable = next '/' or ' ' | ||||
|             // | ||||
|             int pos2 = text.indexOf( QLatin1Char(' '), pos+1 ); | ||||
|             int pos_tmp = text.indexOf( QLatin1Char('/'), pos+1 ); | ||||
|  | ||||
|             if ( pos2 == -1 || (pos_tmp != -1 && pos_tmp < pos2) ) { | ||||
|                 pos2 = pos_tmp; | ||||
|             } | ||||
|  | ||||
|             if ( pos2 == -1 ) { | ||||
|                 pos2 = text.length(); | ||||
|             } | ||||
|  | ||||
|             // Replace if the variable is terminated by '/' or ' ' | ||||
|             // and defined | ||||
|             // | ||||
|             if ( pos2 >= 0 ) { | ||||
|                 int len = pos2 - pos; | ||||
|                 QString key = text.mid( pos+1, len-1); | ||||
|                 QString value = | ||||
|                     QString::fromLocal8Bit( ::getenv(key.toLocal8Bit()) ); | ||||
|  | ||||
|                 if ( !value.isEmpty() ) { | ||||
|                     expanded = true; | ||||
|                     text.replace( pos, len, value ); | ||||
|                     pos = pos + value.length(); | ||||
|                 } else { | ||||
|                     pos = pos2; | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return expanded; | ||||
| } | ||||
							
								
								
									
										90
									
								
								konsole-qml-plugin/src/ShellCommand.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								konsole-qml-plugin/src/ShellCommand.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| /* | ||||
|     Copyright (C) 2007 by Robert Knight <robertknight@gmail.com> | ||||
|  | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef SHELLCOMMAND_H | ||||
| #define SHELLCOMMAND_H | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QStringList> | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * A class to parse and extract information about shell commands. | ||||
|  * | ||||
|  * ShellCommand can be used to: | ||||
|  * | ||||
|  * <ul> | ||||
|  *      <li>Take a command-line (eg "/bin/sh -c /path/to/my/script") and split it | ||||
|  *          into its component parts (eg. the command "/bin/sh" and the arguments | ||||
|  *          "-c","/path/to/my/script") | ||||
|  *      </li> | ||||
|  *      <li>Take a command and a list of arguments and combine them to | ||||
|  *          form a complete command line. | ||||
|  *      </li> | ||||
|  *      <li>Determine whether the binary specified by a command exists in the | ||||
|  *          user's PATH. | ||||
|  *      </li> | ||||
|  *      <li>Determine whether a command-line specifies the execution of | ||||
|  *          another command as the root user using su/sudo etc. | ||||
|  *      </li> | ||||
|  * </ul> | ||||
|  */ | ||||
| class ShellCommand { | ||||
| public: | ||||
|     /** | ||||
|      * Constructs a ShellCommand from a command line. | ||||
|      * | ||||
|      * @param fullCommand The command line to parse. | ||||
|      */ | ||||
|     ShellCommand(const QString & fullCommand); | ||||
|     /** | ||||
|      * Constructs a ShellCommand with the specified @p command and @p arguments. | ||||
|      */ | ||||
|     ShellCommand(const QString & command , const QStringList & arguments); | ||||
|  | ||||
|     /** Returns the command. */ | ||||
|     QString command() const; | ||||
|     /** Returns the arguments. */ | ||||
|     QStringList arguments() const; | ||||
|  | ||||
|     /** | ||||
|      * Returns the full command line. | ||||
|      */ | ||||
|     QString fullCommand() const; | ||||
|  | ||||
|     /** Returns true if this is a root command. */ | ||||
|     bool isRootCommand() const; | ||||
|     /** Returns true if the program specified by @p command() exists. */ | ||||
|     bool isAvailable() const; | ||||
|  | ||||
|     /** Expands environment variables in @p text .*/ | ||||
|     static QString expand(const QString & text); | ||||
|  | ||||
|     /** Expands environment variables in each string in @p list. */ | ||||
|     static QStringList expand(const QStringList & items); | ||||
|  | ||||
| private: | ||||
|     QStringList _arguments; | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif // SHELLCOMMAND_H | ||||
|  | ||||
							
								
								
									
										251
									
								
								konsole-qml-plugin/src/TerminalCharacterDecoder.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										251
									
								
								konsole-qml-plugin/src/TerminalCharacterDecoder.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,251 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|      | ||||
|     Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> | ||||
|      | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser 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 Lesser 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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "TerminalCharacterDecoder.h" | ||||
|  | ||||
| // Qt | ||||
| #include <QtCore/QTextStream> | ||||
|  | ||||
| // KDE | ||||
| //#include <kdebug.h> | ||||
|  | ||||
| // Konsole | ||||
| #include "konsole_wcwidth.h" | ||||
|  | ||||
|  | ||||
| PlainTextDecoder::PlainTextDecoder() | ||||
|  : _output(0) | ||||
|  , _includeTrailingWhitespace(true) | ||||
|  , _recordLinePositions(false) | ||||
| { | ||||
|  | ||||
| } | ||||
| void PlainTextDecoder::setTrailingWhitespace(bool enable) | ||||
| { | ||||
|     _includeTrailingWhitespace = enable; | ||||
| } | ||||
| bool PlainTextDecoder::trailingWhitespace() const | ||||
| { | ||||
|     return _includeTrailingWhitespace; | ||||
| } | ||||
| void PlainTextDecoder::begin(QTextStream* output) | ||||
| { | ||||
|    _output = output; | ||||
|    if (!_linePositions.isEmpty()) | ||||
|        _linePositions.clear(); | ||||
| } | ||||
| void PlainTextDecoder::end() | ||||
| { | ||||
|     _output = 0; | ||||
| } | ||||
|  | ||||
| void PlainTextDecoder::setRecordLinePositions(bool record) | ||||
| { | ||||
|     _recordLinePositions = record; | ||||
| } | ||||
| QList<int> PlainTextDecoder::linePositions() const | ||||
| { | ||||
|     return _linePositions; | ||||
| } | ||||
| void PlainTextDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/ | ||||
|                              ) | ||||
| { | ||||
|     Q_ASSERT( _output ); | ||||
|  | ||||
|     if (_recordLinePositions && _output->string()) | ||||
|     { | ||||
|         int pos = _output->string()->count(); | ||||
|         _linePositions << pos; | ||||
|     } | ||||
|  | ||||
|     //TODO should we ignore or respect the LINE_WRAPPED line property? | ||||
|  | ||||
|     //note:  we build up a QString and send it to the text stream rather writing into the text | ||||
|     //stream a character at a time because it is more efficient. | ||||
|     //(since QTextStream always deals with QStrings internally anyway) | ||||
|     QString plainText; | ||||
|     plainText.reserve(count); | ||||
|     | ||||
|     int outputCount = count; | ||||
|  | ||||
|     // if inclusion of trailing whitespace is disabled then find the end of the | ||||
|     // line | ||||
|     if ( !_includeTrailingWhitespace ) | ||||
|     { | ||||
|         for (int i = count-1 ; i >= 0 ; i--) | ||||
|         { | ||||
|             if ( characters[i].character != ' '  ) | ||||
|                 break; | ||||
|             else | ||||
|                 outputCount--; | ||||
|         } | ||||
|     } | ||||
|      | ||||
|     for (int i=0;i<outputCount;) | ||||
|     { | ||||
|         plainText.append( QChar(characters[i].character) ); | ||||
|         i += qMax(1,konsole_wcwidth(characters[i].character)); | ||||
|     } | ||||
|     *_output << plainText; | ||||
| } | ||||
|  | ||||
| HTMLDecoder::HTMLDecoder() : | ||||
|         _output(0) | ||||
|     ,_colorTable(base_color_table) | ||||
|        ,_innerSpanOpen(false) | ||||
|        ,_lastRendition(DEFAULT_RENDITION) | ||||
| { | ||||
|      | ||||
| } | ||||
|  | ||||
| void HTMLDecoder::begin(QTextStream* output) | ||||
| { | ||||
|     _output = output; | ||||
|  | ||||
|     QString text; | ||||
|  | ||||
|     //open monospace span | ||||
|     openSpan(text,"font-family:monospace"); | ||||
|  | ||||
|     *output << text; | ||||
| } | ||||
|  | ||||
| void HTMLDecoder::end() | ||||
| { | ||||
|     Q_ASSERT( _output ); | ||||
|  | ||||
|     QString text; | ||||
|  | ||||
|     closeSpan(text); | ||||
|  | ||||
|     *_output << text; | ||||
|  | ||||
|     _output = 0; | ||||
|  | ||||
| } | ||||
|  | ||||
| //TODO: Support for LineProperty (mainly double width , double height) | ||||
| void HTMLDecoder::decodeLine(const Character* const characters, int count, LineProperty /*properties*/ | ||||
|                             ) | ||||
| { | ||||
|     Q_ASSERT( _output ); | ||||
|  | ||||
|     QString text; | ||||
|  | ||||
|     int spaceCount = 0; | ||||
|          | ||||
|     for (int i=0;i<count;i++) | ||||
|     { | ||||
|         QChar ch(characters[i].character); | ||||
|  | ||||
|         //check if appearance of character is different from previous char | ||||
|         if ( characters[i].rendition != _lastRendition  || | ||||
|              characters[i].foregroundColor != _lastForeColor  || | ||||
|              characters[i].backgroundColor != _lastBackColor ) | ||||
|         { | ||||
|             if ( _innerSpanOpen ) | ||||
|                     closeSpan(text); | ||||
|  | ||||
|             _lastRendition = characters[i].rendition; | ||||
|             _lastForeColor = characters[i].foregroundColor; | ||||
|             _lastBackColor = characters[i].backgroundColor; | ||||
|              | ||||
|             //build up style string | ||||
|             QString style; | ||||
|  | ||||
|             bool useBold; | ||||
|             ColorEntry::FontWeight weight = characters[i].fontWeight(_colorTable); | ||||
|             if (weight == ColorEntry::UseCurrentFormat) | ||||
|                 useBold = _lastRendition & RE_BOLD; | ||||
|             else | ||||
|                 useBold = weight == ColorEntry::Bold; | ||||
|              | ||||
|             if (useBold) | ||||
|                 style.append("font-weight:bold;"); | ||||
|  | ||||
|             if ( _lastRendition & RE_UNDERLINE ) | ||||
|                     style.append("font-decoration:underline;"); | ||||
|          | ||||
|             //colours - a colour table must have been defined first | ||||
|             if ( _colorTable )     | ||||
|             { | ||||
|                 style.append( QString("color:%1;").arg(_lastForeColor.color(_colorTable).name() ) ); | ||||
|  | ||||
|                 if (!characters[i].isTransparent(_colorTable)) | ||||
|                 { | ||||
|                     style.append( QString("background-color:%1;").arg(_lastBackColor.color(_colorTable).name() ) ); | ||||
|                 } | ||||
|             } | ||||
|          | ||||
|             //open the span with the current style     | ||||
|             openSpan(text,style); | ||||
|             _innerSpanOpen = true; | ||||
|         } | ||||
|  | ||||
|         //handle whitespace | ||||
|         if (ch.isSpace()) | ||||
|             spaceCount++; | ||||
|         else | ||||
|             spaceCount = 0; | ||||
|          | ||||
|  | ||||
|         //output current character | ||||
|         if (spaceCount < 2) | ||||
|         { | ||||
|             //escape HTML tag characters and just display others as they are | ||||
|             if ( ch == '<' ) | ||||
|                 text.append("<"); | ||||
|             else if (ch == '>') | ||||
|                     text.append(">"); | ||||
|             else     | ||||
|                     text.append(ch); | ||||
|         } | ||||
|         else | ||||
|         { | ||||
|             text.append(" "); //HTML truncates multiple spaces, so use a space marker instead | ||||
|         } | ||||
|          | ||||
|     } | ||||
|  | ||||
|     //close any remaining open inner spans | ||||
|     if ( _innerSpanOpen ) | ||||
|         closeSpan(text); | ||||
|  | ||||
|     //start new line | ||||
|     text.append("<br>"); | ||||
|      | ||||
|     *_output << text; | ||||
| } | ||||
| void HTMLDecoder::openSpan(QString& text , const QString& style) | ||||
| { | ||||
|     text.append( QString("<span style=\"%1\">").arg(style) ); | ||||
| } | ||||
|  | ||||
| void HTMLDecoder::closeSpan(QString& text) | ||||
| { | ||||
|     text.append("</span>"); | ||||
| } | ||||
|  | ||||
| void HTMLDecoder::setColorTable(const ColorEntry* table) | ||||
| { | ||||
|     _colorTable = table; | ||||
| } | ||||
							
								
								
									
										148
									
								
								konsole-qml-plugin/src/TerminalCharacterDecoder.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										148
									
								
								konsole-qml-plugin/src/TerminalCharacterDecoder.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,148 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|      | ||||
|     Copyright 2006-2008 by Robert Knight <robertknight@gmail.com> | ||||
|      | ||||
|     This program is free software; you can redistribute it and/or modify | ||||
|     it under the terms of the GNU Lesser 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 Lesser 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. | ||||
| */ | ||||
|  | ||||
| #ifndef TERMINAL_CHARACTER_DECODER_H | ||||
| #define TERMINAL_CHARACTER_DECODER_H | ||||
|  | ||||
| #include "Character.h" | ||||
|  | ||||
| #include <QList> | ||||
|  | ||||
| class QTextStream; | ||||
|  | ||||
|  | ||||
|  | ||||
| /** | ||||
|  * Base class for terminal character decoders | ||||
|  * | ||||
|  * The decoder converts lines of terminal characters which consist of a unicode character, foreground | ||||
|  * and background colours and other appearance-related properties into text strings. | ||||
|  * | ||||
|  * Derived classes may produce either plain text with no other colour or appearance information, or | ||||
|  * they may produce text which incorporates these additional properties.  | ||||
|  */ | ||||
| class TerminalCharacterDecoder | ||||
| { | ||||
| public: | ||||
|     virtual ~TerminalCharacterDecoder() {} | ||||
|  | ||||
|     /** Begin decoding characters.  The resulting text is appended to @p output. */ | ||||
|     virtual void begin(QTextStream* output) = 0; | ||||
|     /** End decoding. */ | ||||
|     virtual void end() = 0; | ||||
|  | ||||
|     /** | ||||
|      * Converts a line of terminal characters with associated properties into a text string | ||||
|      * and writes the string into an output QTextStream. | ||||
|      * | ||||
|      * @param characters An array of characters of length @p count. | ||||
|      * @param count The number of characters | ||||
|      * @param properties Additional properties which affect all characters in the line | ||||
|      */ | ||||
|     virtual void decodeLine(const Character* const characters,  | ||||
|                             int count, | ||||
|                             LineProperty properties) = 0;  | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * A terminal character decoder which produces plain text, ignoring colours and other appearance-related | ||||
|  * properties of the original characters. | ||||
|  */ | ||||
| class PlainTextDecoder : public TerminalCharacterDecoder | ||||
| { | ||||
| public: | ||||
|     PlainTextDecoder();  | ||||
|  | ||||
|     /**  | ||||
|      * Set whether trailing whitespace at the end of lines should be included  | ||||
|      * in the output. | ||||
|      * Defaults to true. | ||||
|      */ | ||||
|     void setTrailingWhitespace(bool enable); | ||||
|     /** | ||||
|      * Returns whether trailing whitespace at the end of lines is included | ||||
|      * in the output. | ||||
|      */ | ||||
|     bool trailingWhitespace() const; | ||||
|     /**  | ||||
|      * Returns of character positions in the output stream | ||||
|      * at which new lines where added.  Returns an empty if setTrackLinePositions() is false or if  | ||||
|      * the output device is not a string. | ||||
|      */ | ||||
|     QList<int> linePositions() const; | ||||
|     /** Enables recording of character positions at which new lines are added.  See linePositions() */ | ||||
|     void setRecordLinePositions(bool record); | ||||
|  | ||||
|     virtual void begin(QTextStream* output); | ||||
|     virtual void end(); | ||||
|  | ||||
|     virtual void decodeLine(const Character* const characters, | ||||
|                             int count, | ||||
|                             LineProperty properties);     | ||||
|  | ||||
|      | ||||
| private: | ||||
|     QTextStream* _output; | ||||
|     bool _includeTrailingWhitespace; | ||||
|  | ||||
|     bool _recordLinePositions; | ||||
|     QList<int> _linePositions; | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * A terminal character decoder which produces pretty HTML markup | ||||
|  */ | ||||
| class HTMLDecoder : public TerminalCharacterDecoder | ||||
| { | ||||
| public: | ||||
|     /**  | ||||
|      * Constructs an HTML decoder using a default black-on-white color scheme. | ||||
|      */ | ||||
|     HTMLDecoder(); | ||||
|  | ||||
|     /** | ||||
|      * Sets the colour table which the decoder uses to produce the HTML colour codes in its | ||||
|      * output | ||||
|      */ | ||||
|     void setColorTable( const ColorEntry* table ); | ||||
|          | ||||
|     virtual void decodeLine(const Character* const characters, | ||||
|                             int count, | ||||
|                             LineProperty properties); | ||||
|  | ||||
|     virtual void begin(QTextStream* output); | ||||
|     virtual void end(); | ||||
|  | ||||
| private: | ||||
|     void openSpan(QString& text , const QString& style); | ||||
|     void closeSpan(QString& text); | ||||
|  | ||||
|     QTextStream* _output; | ||||
|     const ColorEntry* _colorTable; | ||||
|     bool _innerSpanOpen;  | ||||
|     quint8 _lastRendition; | ||||
|     CharacterColor _lastForeColor; | ||||
|     CharacterColor _lastBackColor; | ||||
|  | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										2170
									
								
								konsole-qml-plugin/src/TerminalDisplay.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2170
									
								
								konsole-qml-plugin/src/TerminalDisplay.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										715
									
								
								konsole-qml-plugin/src/TerminalDisplay.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										715
									
								
								konsole-qml-plugin/src/TerminalDisplay.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,715 @@ | ||||
| /* | ||||
|     This file is part of KTerminal, QML plugin of the Konsole, | ||||
|     which is a terminal emulator from KDE. | ||||
|  | ||||
|     Copyright 2006-2008 by Robert Knight   <robertknight@gmail.com> | ||||
|     Copyright 1997,1998 by Lars Doelle     <lars.doelle@on-line.de> | ||||
|  | ||||
|     Rewritten for QT5/QML by Dmitry Zagnoyko   <hiroshidi@gmail.com>, Copyright (C) 2013 | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef TERMINALDISPLAY_H | ||||
| #define TERMINALDISPLAY_H | ||||
|  | ||||
| #include <QtGui/QColor> | ||||
| #include <QtCore/QPointer> | ||||
|  | ||||
| // Konsole | ||||
| #include "Filter.h" | ||||
| #include "Character.h" | ||||
| #include "ksession.h" | ||||
| //#include "konsole_export.h" | ||||
| #define KONSOLEPRIVATE_EXPORT | ||||
|  | ||||
| #include <QtQuick/QQuickItem> | ||||
| #include <QtQuick/QQuickPaintedItem> | ||||
|  | ||||
| class QTimer; | ||||
| class QEvent; | ||||
| class QKeyEvent; | ||||
| class QTimerEvent; | ||||
| //class KMenu; | ||||
|  | ||||
| extern unsigned short vt100_graphics[32]; | ||||
|  | ||||
| class ScreenWindow; | ||||
|  | ||||
| /** | ||||
|  * A widget which displays output from a terminal emulation and sends input keypresses and mouse activity | ||||
|  * to the terminal. | ||||
|  * | ||||
|  * When the terminal emulation receives new output from the program running in the terminal, | ||||
|  * it will update the display by calling updateImage(). | ||||
|  * | ||||
|  * TODO More documentation | ||||
|  */ | ||||
|  | ||||
| class KONSOLEPRIVATE_EXPORT KTerminalDisplay : public QQuickPaintedItem | ||||
| { | ||||
|     Q_OBJECT | ||||
|  | ||||
|     Q_PROPERTY(KSession *session       READ getSession      WRITE setSession     NOTIFY changedSession) | ||||
|     Q_PROPERTY(QString  colorScheme    READ scheme()        WRITE setColorScheme NOTIFY changedScheme) | ||||
|     Q_PROPERTY(QFont    font           READ getVTFont       WRITE setVTFont ) | ||||
|     Q_PROPERTY(bool activeFocusOnClick READ autoFocus       WRITE setAutoFocus   NOTIFY changedAutoFocus) | ||||
|     Q_PROPERTY(bool ShowIMEOnClick     READ autoVKB         WRITE setAutoVKB     NOTIFY changedAutoVKB) | ||||
|  | ||||
|  | ||||
| public: | ||||
|     KTerminalDisplay(QQuickItem *parent = 0); | ||||
|     ~KTerminalDisplay(); | ||||
|  | ||||
|     QString scheme() { return m_scheme; } | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     /** Returns the terminal color palette used by the display. */ | ||||
|     const ColorEntry* colorTable() const; | ||||
|     /** Sets the terminal color palette used by the display. */ | ||||
|     void setColorTable(const ColorEntry table[]); | ||||
|     /** | ||||
|      * Returns the seed used to generate random colors for the display | ||||
|      * (in color schemes that support them). | ||||
|      */ | ||||
|     uint randomSeed() const; | ||||
|  | ||||
|     /** Returns true if the cursor is set to blink or false otherwise. */ | ||||
|     bool blinkingCursor() { return _hasBlinkingCursor; } | ||||
|     /** Specifies whether or not the cursor blinks. */ | ||||
|     void setBlinkingCursor(bool blink); | ||||
|  | ||||
|     /** Specifies whether or not text can blink. */ | ||||
|     void setBlinkingTextEnabled(bool blink); | ||||
|  | ||||
|     void setLineSpacing(uint); | ||||
|     uint lineSpacing() const; | ||||
|  | ||||
|     void emitSelection(bool useXselection,bool appendReturn); | ||||
|  | ||||
|     /** | ||||
|      * This enum describes the available shapes for the keyboard cursor. | ||||
|      * See setKeyboardCursorShape() | ||||
|      */ | ||||
|     enum KeyboardCursorShape | ||||
|     { | ||||
|         /** A rectangular block which covers the entire area of the cursor character. */ | ||||
|         BlockCursor, | ||||
|         /** | ||||
|          * A single flat line which occupies the space at the bottom of the cursor | ||||
|          * character's area. | ||||
|          */ | ||||
|         UnderlineCursor, | ||||
|         /** | ||||
|          * An cursor shaped like the capital letter 'I', similar to the IBeam | ||||
|          * cursor used in Qt/KDE text editors. | ||||
|          */ | ||||
|         IBeamCursor | ||||
|     }; | ||||
|     /** | ||||
|      * Sets the shape of the keyboard cursor.  This is the cursor drawn | ||||
|      * at the position in the terminal where keyboard input will appear. | ||||
|      * | ||||
|      * In addition the terminal display widget also has a cursor for | ||||
|      * the mouse pointer, which can be set using the QWidget::setCursor() | ||||
|      * method. | ||||
|      * | ||||
|      * Defaults to BlockCursor | ||||
|      */ | ||||
|     void setKeyboardCursorShape(KeyboardCursorShape shape); | ||||
|     /** | ||||
|      * Returns the shape of the keyboard cursor.  See setKeyboardCursorShape() | ||||
|      */ | ||||
|     KeyboardCursorShape keyboardCursorShape() const; | ||||
|  | ||||
|     /** | ||||
|      * Sets the color used to draw the keyboard cursor. | ||||
|      * | ||||
|      * The keyboard cursor defaults to using the foreground color of the character | ||||
|      * underneath it. | ||||
|      * | ||||
|      * @param useForegroundColor If true, the cursor color will change to match | ||||
|      * the foreground color of the character underneath it as it is moved, in this | ||||
|      * case, the @p color parameter is ignored and the color of the character | ||||
|      * under the cursor is inverted to ensure that it is still readable. | ||||
|      * @param color The color to use to draw the cursor.  This is only taken into | ||||
|      * account if @p useForegroundColor is false. | ||||
|      */ | ||||
|     void setKeyboardCursorColor(bool useForegroundColor , const QColor& color); | ||||
|  | ||||
|     /** | ||||
|      * Returns the color of the keyboard cursor, or an invalid color if the keyboard | ||||
|      * cursor color is set to change according to the foreground color of the character | ||||
|      * underneath it. | ||||
|      */ | ||||
|     QColor keyboardCursorColor() const; | ||||
|  | ||||
|     // Show VKB | ||||
|     void ShowVKB(bool show); | ||||
|  | ||||
|     /** | ||||
|      * Returns the number of lines of text which can be displayed in the widget. | ||||
|      * | ||||
|      * This will depend upon the height of the widget and the current font. | ||||
|      * See fontHeight() | ||||
|      */ | ||||
|     int  lines()   { return _lines;   } | ||||
|     /** | ||||
|      * Returns the number of characters of text which can be displayed on | ||||
|      * each line in the widget. | ||||
|      * | ||||
|      * This will depend upon the width of the widget and the current font. | ||||
|      * See fontWidth() | ||||
|      */ | ||||
|     int  columns() { return _columns; } | ||||
|  | ||||
|     /** | ||||
|      * Returns the height of the characters in the font used to draw the text in the display. | ||||
|      */ | ||||
|     int  fontHeight()   { return _fontHeight;   } | ||||
|     /** | ||||
|      * Returns the width of the characters in the display. | ||||
|      * This assumes the use of a fixed-width font. | ||||
|      */ | ||||
|     int  fontWidth()    { return _fontWidth; } | ||||
|  | ||||
|  | ||||
|  | ||||
|     /** | ||||
|      * Sets which characters, in addition to letters and numbers, | ||||
|      * are regarded as being part of a word for the purposes | ||||
|      * of selecting words in the display by double clicking on them. | ||||
|      * | ||||
|      * The word boundaries occur at the first and last characters which | ||||
|      * are either a letter, number, or a character in @p wc | ||||
|      * | ||||
|      * @param wc An array of characters which are to be considered parts | ||||
|      * of a word ( in addition to letters and numbers ). | ||||
|      */ | ||||
|     void setWordCharacters(const QString& wc); | ||||
|     /** | ||||
|      * Returns the characters which are considered part of a word for the | ||||
|      * purpose of selecting words in the display with the mouse. | ||||
|      * | ||||
|      * @see setWordCharacters() | ||||
|      */ | ||||
|     QString wordCharacters() { return _wordCharacters; } | ||||
|  | ||||
|     /** | ||||
|      * Sets the type of effect used to alert the user when a 'bell' occurs in the | ||||
|      * terminal session. | ||||
|      * | ||||
|      * The terminal session can trigger the bell effect by calling bell() with | ||||
|      * the alert message. | ||||
|      */ | ||||
|     void setBellMode(int mode); | ||||
|     /** | ||||
|      * Returns the type of effect used to alert the user when a 'bell' occurs in | ||||
|      * the terminal session. | ||||
|      * | ||||
|      * See setBellMode() | ||||
|      */ | ||||
|     int bellMode() { return _bellMode; } | ||||
|  | ||||
|     /** | ||||
|      * This enum describes the different types of sounds and visual effects which | ||||
|      * can be used to alert the user when a 'bell' occurs in the terminal | ||||
|      * session. | ||||
|      */ | ||||
|     enum BellMode | ||||
|     { | ||||
|         /** A system beep. */ | ||||
|         SystemBeepBell=0, | ||||
|         /** | ||||
|          * KDE notification.  This may play a sound, show a passive popup | ||||
|          * or perform some other action depending on the user's settings. | ||||
|          */ | ||||
|         NotifyBell=1, | ||||
|         /** A silent, visual bell (eg. inverting the display's colors briefly) */ | ||||
|         VisualBell=2, | ||||
|         /** No bell effects */ | ||||
|         NoBell=3 | ||||
|     }; | ||||
|  | ||||
|     void setSelection(const QString &t); | ||||
|  | ||||
|     /** | ||||
|      * Specified whether anti-aliasing of text in the terminal display | ||||
|      * is enabled or not.  Defaults to enabled. | ||||
|      */ | ||||
|     static void setAntialias( bool antialias ) { _antialiasText = antialias; } | ||||
|     /** | ||||
|      * Returns true if anti-aliasing of text in the terminal is enabled. | ||||
|      */ | ||||
|     static bool antialias()                 { return _antialiasText;   } | ||||
|  | ||||
|     /** | ||||
|      * Specifies whether characters with intense colors should be rendered | ||||
|      * as bold. Defaults to true. | ||||
|      */ | ||||
|     void setBoldIntense(bool value) { _boldIntense = value; } | ||||
|     /** | ||||
|      * Returns true if characters with intense colors are rendered in bold. | ||||
|      */ | ||||
|     bool getBoldIntense() { return _boldIntense; } | ||||
|  | ||||
|     /** | ||||
|      * Sets the status of the BiDi rendering inside the terminal display. | ||||
|      * Defaults to disabled. | ||||
|      */ | ||||
|     void setBidiEnabled(bool set) { _bidiEnabled=set; } | ||||
|     /** | ||||
|      * Returns the status of the BiDi rendering in this widget. | ||||
|      */ | ||||
|     bool isBidiEnabled() { return _bidiEnabled; } | ||||
|  | ||||
|     /** | ||||
|      * Sets the terminal screen section which is displayed in this widget. | ||||
|      * When updateImage() is called, the display fetches the latest character image from the | ||||
|      * the associated terminal screen window. | ||||
|      * | ||||
|      * In terms of the model-view paradigm, the ScreenWindow is the model which is rendered | ||||
|      * by the TerminalDisplay. | ||||
|      */ | ||||
|     void setScreenWindow( ScreenWindow* window ); | ||||
|     /** Returns the terminal screen section which is displayed in this widget.  See setScreenWindow() */ | ||||
|     ScreenWindow* screenWindow() const; | ||||
|  | ||||
|     static bool HAVE_TRANSPARENCY; | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| public slots: | ||||
|     void forcedFocus(); | ||||
|     void setColorScheme(const QString &name); | ||||
|     QStringList availableColorSchemes(); | ||||
|  | ||||
|     void click(qreal x, qreal y); | ||||
|  | ||||
|     bool autoFocus() { return m_focusOnClick; } | ||||
|     void setAutoFocus(bool au); | ||||
|     bool autoVKB() { return m_showVKBonClick; } | ||||
|     void setAutoVKB(bool au); | ||||
|  | ||||
|  | ||||
|     /** Returns the font used to draw characters in the display */ | ||||
|     QFont getVTFont() { return m_font; } | ||||
|  | ||||
|     /** | ||||
|      * Sets the font used to draw the display.  Has no effect if @p font | ||||
|      * is larger than the size of the display itself. | ||||
|      */ | ||||
|     void setVTFont(const QFont& font); | ||||
|  | ||||
|     /** | ||||
|      * Scroll to the bottom of the terminal (reset scrolling). | ||||
|      */ | ||||
|     void scrollToEnd(); | ||||
|  | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     /** | ||||
|      * Causes the terminal display to fetch the latest character image from the associated | ||||
|      * terminal screen ( see setScreenWindow() ) and redraw the display. | ||||
|      */ | ||||
|     void updateImage(); | ||||
|     /** | ||||
|      * Causes the terminal display to fetch the latest line status flags from the | ||||
|      * associated terminal screen ( see setScreenWindow() ). | ||||
|      */ | ||||
|     void updateLineProperties(); | ||||
|  | ||||
|     /** Copies the selected text to the clipboard. */ | ||||
|     void copyClipboard(); | ||||
|     /** | ||||
|      * Pastes the content of the clipboard into the | ||||
|      * display. | ||||
|      */ | ||||
|     void pasteClipboard(); | ||||
|     /** | ||||
|      * Pastes the content of the selection into the | ||||
|      * display. | ||||
|      */ | ||||
|     void pasteSelection(); | ||||
|  | ||||
|     /** | ||||
|        * Changes whether the flow control warning box should be shown when the flow control | ||||
|        * stop key (Ctrl+S) are pressed. | ||||
|        */ | ||||
|     void setFlowControlWarningEnabled(bool enabled); | ||||
|     /** | ||||
|      * Returns true if the flow control warning box is enabled. | ||||
|      * See outputSuspended() and setFlowControlWarningEnabled() | ||||
|      */ | ||||
|     bool flowControlWarningEnabled() const | ||||
|     { return _flowControlWarningEnabled; } | ||||
|  | ||||
|     /** | ||||
|      * Causes the widget to display or hide a message informing the user that terminal | ||||
|      * output has been suspended (by using the flow control key combination Ctrl+S) | ||||
|      * | ||||
|      * @param suspended True if terminal output has been suspended and the warning message should | ||||
|      *                     be shown or false to indicate that terminal output has been resumed and that | ||||
|      *                     the warning message should disappear. | ||||
|      */ | ||||
|     //void outputSuspended(bool suspended); | ||||
|  | ||||
|     /** | ||||
|      * Shows a notification that a bell event has occurred in the terminal. | ||||
|      * TODO: More documentation here | ||||
|      */ | ||||
|     void bell(const QString& message); | ||||
|  | ||||
|     /** | ||||
|      * Sets the background of the display to the specified color. | ||||
|      * @see setColorTable(), setForegroundColor() | ||||
|      */ | ||||
|     void setBackgroundColor(const QColor& color); | ||||
|  | ||||
|     /** | ||||
|      * Sets the text of the display to the specified color. | ||||
|      * @see setColorTable(), setBackgroundColor() | ||||
|      */ | ||||
|     void setForegroundColor(const QColor& color); | ||||
|  | ||||
|     void selectionChanged(); | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
|     void setSession(KSession * session); | ||||
|     KSession * getSession() const { return m_session; } | ||||
|  | ||||
| signals: | ||||
|     void changedScheme(QString scheme); | ||||
|     void changedAutoVKB(bool au); | ||||
|     void changedAutoFocus(bool au); | ||||
|  | ||||
|     void clicked(); | ||||
|  | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     /** | ||||
|      * Emitted when the user presses a key whilst the terminal widget has focus. | ||||
|      */ | ||||
|     void keyPressedSignal(QKeyEvent *e); | ||||
|  | ||||
|     void changedFontMetricSignal(int height, int width); | ||||
|     void changedContentSizeSignal(int height, int width); | ||||
|  | ||||
|     /** | ||||
|      * Emitted when the user right clicks on the display, or right-clicks with the Shift | ||||
|      * key held down if usesMouse() is true. | ||||
|      * | ||||
|      * This can be used to display a context menu. | ||||
|      */ | ||||
|     void configureRequest(const QPoint& position); | ||||
|  | ||||
|     /** | ||||
|      * When a shortcut which is also a valid terminal key sequence is pressed while | ||||
|      * the terminal widget  has focus, this signal is emitted to allow the host to decide | ||||
|      * whether the shortcut should be overridden. | ||||
|      * When the shortcut is overridden, the key sequence will be sent to the terminal emulation instead | ||||
|      * and the action associated with the shortcut will not be triggered. | ||||
|      * | ||||
|      * @p override is set to false by default and the shortcut will be triggered as normal. | ||||
|      */ | ||||
|     void overrideShortcutCheck(QKeyEvent* keyEvent,bool& override); | ||||
|     void isBusySelecting(bool); | ||||
|     //void sendStringToEmu(const char*); | ||||
|  | ||||
|     // qtermwidget signals | ||||
|     void copyAvailable(bool); | ||||
|     void termGetFocus(); | ||||
|     void termLostFocus(); | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
|     void changedSession(KSession *session); | ||||
|  | ||||
|  | ||||
| protected: | ||||
|     void paint (QPainter * painter); | ||||
|     void keyPressEvent(QKeyEvent *event); | ||||
|     bool event( QEvent *); | ||||
|  | ||||
|     void geometryChanged(const QRectF &newGeometry, const QRectF &oldGeometry); | ||||
|     QRect geometryRound(const QRectF &r) const; | ||||
|  | ||||
|     void mousePressEvent(QMouseEvent*ev); | ||||
| //    void mouseReleaseEvent( QMouseEvent* ); | ||||
| //    void mouseMoveEvent( QMouseEvent* ); | ||||
|  | ||||
|     void focusInEvent(QFocusEvent* event); | ||||
|     void focusOutEvent(QFocusEvent* event); | ||||
|  | ||||
|  | ||||
|  | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     void fontChange(const QFont &font); | ||||
|     void extendSelection(const QPoint &pos ); | ||||
|  | ||||
|     // classifies the 'ch' into one of three categories | ||||
|     // and returns a character to indicate which category it is in | ||||
|     // | ||||
|     //     - A space (returns ' ') | ||||
|     //     - Part of a word (returns 'a') | ||||
|     //     - Other characters (returns the input character) | ||||
|     QChar charClass(QChar ch) const; | ||||
|  | ||||
|     void clearImage(); | ||||
|  | ||||
|     // reimplemented | ||||
|     // cath for UT Soft Keyboard QInputMethodEvent | ||||
|     void inputMethodEvent ( QInputMethodEvent* event ); | ||||
|     void inputMethodQuery( QInputMethodQueryEvent* event ); | ||||
|     QVariant inputMethodQuery( Qt::InputMethodQuery query ) const; | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
|  | ||||
| protected slots: | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     void blinkEvent(); | ||||
|     void blinkCursorEvent(); | ||||
|  | ||||
|     //Renables bell noises and visuals.  Used to disable further bells for a short period of time | ||||
|     //after emitting the first in a sequence of bell events. | ||||
|     void enableBell(); | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
|  | ||||
| private slots: | ||||
|     void swapColorTable(); | ||||
|  | ||||
| private: | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     // -- Drawing helpers -- | ||||
|  | ||||
|     // divides the part of the display specified by 'rect' into | ||||
|     // fragments according to their colors and styles and calls | ||||
|     // drawTextFragment() to draw the fragments | ||||
|     void drawContents(QPainter *paint, QRectF &rect); | ||||
|  | ||||
|     // draws a section of text, all the text in this section | ||||
|     // has a common color and style | ||||
|     void drawTextFragment(QPainter *painter, const QRectF &rect, | ||||
|                           const QString& text, const Character* style); | ||||
|  | ||||
|     // draws the background for a text fragment | ||||
|     // if useOpacitySetting is true then the color's alpha value will be set to | ||||
|     // the display's transparency (set with setOpacity()), otherwise the background | ||||
|     // will be drawn fully opaque | ||||
|     void drawBackground(QPainter *painter, const QRectF& rect, const QColor& color, | ||||
|                         bool useOpacitySetting); | ||||
|  | ||||
|     // draws the cursor character | ||||
|     void drawCursor(QPainter *painter, const QRectF &rect , const QColor& foregroundColor, | ||||
|                                        const QColor& backgroundColor , bool& invertColors); | ||||
|  | ||||
|     // draws the characters or line graphics in a text fragment | ||||
|     void drawCharacters(QPainter *painter, const QRectF &rect,  const QString& text, | ||||
|                                            const Character* style, bool invertCharacterColor); | ||||
|  | ||||
|     // draws a string of line graphics | ||||
|     void drawLineCharString(QPainter *painter, qreal x, qreal y, | ||||
|                             const QString& str, const Character* attributes); | ||||
|  | ||||
|     // draws the preedit string for input methods | ||||
|     void drawInputMethodPreeditString(QPainter *painter , const QRectF& rect); | ||||
|  | ||||
|     // -- | ||||
|  | ||||
|     // maps an area in the character image to an area on the widget | ||||
|     QRect imageToWidget(const QRect& imageArea) const; | ||||
|  | ||||
|     // maps a point on the widget to the position ( ie. line and column ) | ||||
|     // of the character at that point. | ||||
|     void getCharacterPosition(const QPointF& widgetPoint,int& line,int& column) const; | ||||
|  | ||||
|     // the area where the preedit string for input methods will be draw | ||||
|     QRectF preeditRect() const; | ||||
|  | ||||
|     // scrolls the image by a number of lines. | ||||
|     // 'lines' may be positive ( to scroll the image down ) | ||||
|     // or negative ( to scroll the image up ) | ||||
|     // 'region' is the part of the image to scroll - currently only | ||||
|     // the top, bottom and height of 'region' are taken into account, | ||||
|     // the left and right are ignored. | ||||
|     void scrollImage(int lines , const QRect& region); | ||||
|  | ||||
|     void calcGeometry(); | ||||
|     void propagateSize(); | ||||
|     void updateImageSize(); | ||||
|     void makeImage(); | ||||
|  | ||||
|     // returns the position of the cursor in columns and lines | ||||
|     QPoint cursorPosition() const; | ||||
|  | ||||
|     // redraws the cursor | ||||
|     void updateCursor(); | ||||
|  | ||||
|     bool handleShortcutOverrideEvent(QKeyEvent* event); | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
|     /** | ||||
|     * Sets the seed used to generate random colors for the display | ||||
|     * (in color schemes that support them). | ||||
|     */ | ||||
|     void setRandomSeed(uint seed); | ||||
|  | ||||
|  | ||||
|  | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///                                 MEMBERS | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     QFont       m_font; | ||||
|     QPalette    m_palette; | ||||
|     KSession   *m_session; | ||||
|     QString     m_scheme; | ||||
|  | ||||
|     bool m_focusOnClick; | ||||
|     bool m_showVKBonClick; | ||||
|  | ||||
|     QQuickItem *m_parent; | ||||
|     QRectF      m_widgetRect; | ||||
|  | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     // the window onto the terminal screen which this display | ||||
|     // is currently showing. | ||||
|     QPointer<ScreenWindow> _screenWindow; | ||||
|  | ||||
|     bool   _allowBell; | ||||
|     bool   _fixedFont;     // has fixed pitch | ||||
|     int    _fontHeight;    // height | ||||
|     qreal  _fontWidth;     // width | ||||
|     int    _fontAscent;    // ascend | ||||
|     bool   _boldIntense;   // Whether intense colors should be rendered with bold font | ||||
|  | ||||
|     qreal  _leftMargin;   // offset | ||||
|     qreal  _topMargin;    // offset | ||||
|  | ||||
|     int _lines;      // the number of lines that can be displayed in the widget | ||||
|     int _columns;    // the number of columns that can be displayed in the widget | ||||
|  | ||||
|     int _usedLines;  // the number of lines that are actually being used, this will be less | ||||
|                      // than 'lines' if the character image provided with setImage() is smaller | ||||
|                      // than the maximum image size which can be displayed | ||||
|  | ||||
|     int _usedColumns; // the number of columns that are actually being used, this will be less | ||||
|                       // than 'columns' if the character image provided with setImage() is smaller | ||||
|                       // than the maximum image size which can be displayed | ||||
|  | ||||
|     qreal _contentHeight; | ||||
|     qreal _contentWidth; | ||||
|  | ||||
|     Character* _image; // [lines][columns] | ||||
|                        // only the area [usedLines][usedColumns] in the image contains valid data | ||||
|  | ||||
|     int _imageSize; | ||||
|     QVector<LineProperty> _lineProperties; | ||||
|  | ||||
|     ColorEntry _colorTable[TABLE_COLORS]; | ||||
|     uint _randomSeed; | ||||
|  | ||||
|     bool _resizing; | ||||
|     bool _bidiEnabled; | ||||
|  | ||||
|     QPoint  _iPntSel;           // initial selection point | ||||
|     QPoint  _pntSel;            // current selection point | ||||
|     QPoint  _tripleSelBegin;    // help avoid flicker | ||||
|     int     _actSel;            // selection state | ||||
|     bool    _wordSelectionMode; | ||||
|     bool    _lineSelectionMode; | ||||
|     bool    _preserveLineBreaks; | ||||
|     bool    _columnSelectionMode; | ||||
|  | ||||
|     QClipboard*  _clipboard; | ||||
|     QString     _wordCharacters; | ||||
|     int         _bellMode; | ||||
|  | ||||
|     bool _blinking;           // hide text in paintEvent | ||||
|     bool _hasBlinker;         // has characters to blink | ||||
|     bool _cursorBlinking;     // hide cursor in paintEvent | ||||
|     bool _hasBlinkingCursor;  // has blinking cursor enabled | ||||
|     bool _allowBlinkingText;  // allow text to blink | ||||
|  | ||||
|     bool _isFixedSize;           //Columns / lines are locked. | ||||
|     QTimer* _blinkTimer;         // active when hasBlinker | ||||
|     QTimer* _blinkCursorTimer;   // active when hasBlinkingCursor | ||||
|     QTimer* _resizeTimer; | ||||
|  | ||||
|     bool _flowControlWarningEnabled; | ||||
|  | ||||
|     uint _lineSpacing; | ||||
|     bool _colorsInverted; // true during visual bell | ||||
|     QRgb _blendColor; | ||||
|  | ||||
|     KeyboardCursorShape _cursorShape; | ||||
|  | ||||
|     // custom cursor color.  if this is invalid then the foreground | ||||
|     // color of the character under the cursor is used | ||||
|     QColor _cursorColor; | ||||
|  | ||||
|  | ||||
|     struct InputMethodData | ||||
|     { | ||||
|         QString preeditString; | ||||
|         QRectF previousPreeditRect; | ||||
|     }; | ||||
|     InputMethodData _inputMethodData; | ||||
|  | ||||
|     static bool _antialiasText;   // do we antialias or not | ||||
|  | ||||
|     //the delay in milliseconds between redrawing blinking text | ||||
|     static const int TEXT_BLINK_DELAY = 500; | ||||
|     static const int DEFAULT_LEFT_MARGIN = 1; | ||||
|     static const int DEFAULT_TOP_MARGIN = 1; | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|     ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
| public: | ||||
|     static void setTransparencyEnabled(bool enable) | ||||
|     { | ||||
|         HAVE_TRANSPARENCY = enable; | ||||
|     } | ||||
| }; | ||||
|  | ||||
| class AutoScrollHandler : public QObject | ||||
| { | ||||
|     Q_OBJECT | ||||
|  | ||||
| public: | ||||
|     AutoScrollHandler(QQuickItem* parent); | ||||
|  | ||||
| protected: | ||||
|     virtual void timerEvent(QTimerEvent* event); | ||||
|     virtual bool eventFilter(QObject* watched,QEvent* event); | ||||
|  | ||||
| private: | ||||
|     QQuickItem* widget() const { return static_cast<QQuickItem*>(parent()); } | ||||
|     int _timerId; | ||||
| }; | ||||
|  | ||||
| #endif // TERMINALDISPLAY_H | ||||
							
								
								
									
										1221
									
								
								konsole-qml-plugin/src/Vt102Emulation.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										1221
									
								
								konsole-qml-plugin/src/Vt102Emulation.cpp
									
									
									
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										188
									
								
								konsole-qml-plugin/src/Vt102Emulation.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										188
									
								
								konsole-qml-plugin/src/Vt102Emulation.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,188 @@ | ||||
| /* | ||||
|     This file is part of Konsole, an X terminal. | ||||
|      | ||||
|     Copyright 2007-2008 by Robert Knight <robertknight@gmail.com> | ||||
|     Copyright 1997,1998 by Lars Doelle <lars.doelle@on-line.de> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef VT102EMULATION_H | ||||
| #define VT102EMULATION_H | ||||
|  | ||||
| // Standard Library | ||||
| #include <stdio.h> | ||||
|  | ||||
| // Qt  | ||||
| #include <QtGui/QKeyEvent> | ||||
| #include <QtCore/QHash> | ||||
| #include <QtCore/QTimer> | ||||
|  | ||||
| // Konsole | ||||
| #include "Emulation.h" | ||||
| #include "Screen.h" | ||||
|  | ||||
| #define MODE_AppScreen       (MODES_SCREEN+0)   // Mode #1 | ||||
| #define MODE_AppCuKeys       (MODES_SCREEN+1)   // Application cursor keys (DECCKM) | ||||
| #define MODE_AppKeyPad       (MODES_SCREEN+2)   //  | ||||
| #define MODE_Mouse1000       (MODES_SCREEN+3)   // Send mouse X,Y position on press and release | ||||
| #define MODE_Mouse1001       (MODES_SCREEN+4)   // Use Hilight mouse tracking | ||||
| #define MODE_Mouse1002       (MODES_SCREEN+5)   // Use cell motion mouse tracking | ||||
| #define MODE_Mouse1003       (MODES_SCREEN+6)   // Use all motion mouse tracking  | ||||
| #define MODE_Ansi            (MODES_SCREEN+7)   // Use US Ascii for character sets G0-G3 (DECANM)  | ||||
| #define MODE_132Columns      (MODES_SCREEN+8)   // 80 <-> 132 column mode switch (DECCOLM) | ||||
| #define MODE_Allow132Columns (MODES_SCREEN+9)   // Allow DECCOLM mode | ||||
| #define MODE_total           (MODES_SCREEN+10) | ||||
|  | ||||
|  | ||||
| struct CharCodes | ||||
| { | ||||
|   // coding info | ||||
|   char charset[4]; // | ||||
|   int  cu_cs;      // actual charset. | ||||
|   bool graphic;    // Some VT100 tricks | ||||
|   bool pound  ;    // Some VT100 tricks | ||||
|   bool sa_graphic; // saved graphic | ||||
|   bool sa_pound;   // saved pound | ||||
| }; | ||||
|  | ||||
| /** | ||||
|  * Provides an xterm compatible terminal emulation based on the DEC VT102 terminal. | ||||
|  * A full description of this terminal can be found at http://vt100.net/docs/vt102-ug/ | ||||
|  *  | ||||
|  * In addition, various additional xterm escape sequences are supported to provide  | ||||
|  * features such as mouse input handling. | ||||
|  * See http://rtfm.etla.org/xterm/ctlseq.html for a description of xterm's escape | ||||
|  * sequences.  | ||||
|  * | ||||
|  */ | ||||
| class Vt102Emulation : public Emulation | ||||
| {  | ||||
| Q_OBJECT | ||||
|  | ||||
| public: | ||||
|   /** Constructs a new emulation */ | ||||
|   Vt102Emulation(); | ||||
|   ~Vt102Emulation(); | ||||
|    | ||||
|   // reimplemented from Emulation | ||||
|   virtual void clearEntireScreen(); | ||||
|   virtual void reset(); | ||||
|   virtual char eraseChar() const; | ||||
|    | ||||
| public slots:  | ||||
|   // reimplemented from Emulation  | ||||
|   virtual void sendString(const char*,int length = -1); | ||||
|   virtual void sendText(const QString& text); | ||||
|   virtual void sendKeyEvent(QKeyEvent*); | ||||
|   virtual void sendMouseEvent(int buttons, int column, int line, int eventType); | ||||
|    | ||||
| protected: | ||||
|   // reimplemented from Emulation | ||||
|   virtual void setMode(int mode); | ||||
|   virtual void resetMode(int mode); | ||||
|   virtual void receiveChar(int cc); | ||||
|    | ||||
| private slots: | ||||
|   //causes changeTitle() to be emitted for each (int,QString) pair in pendingTitleUpdates | ||||
|   //used to buffer multiple title updates | ||||
|   void updateTitle(); | ||||
|  | ||||
| private: | ||||
|   unsigned short applyCharset(unsigned short c); | ||||
|   void setCharset(int n, int cs); | ||||
|   void useCharset(int n); | ||||
|   void setAndUseCharset(int n, int cs); | ||||
|   void saveCursor(); | ||||
|   void restoreCursor(); | ||||
|   void resetCharset(int scrno); | ||||
|  | ||||
|   void setMargins(int top, int bottom); | ||||
|   //set margins for all screens back to their defaults | ||||
|   void setDefaultMargins(); | ||||
|  | ||||
|   // returns true if 'mode' is set or false otherwise | ||||
|   bool getMode    (int mode); | ||||
|   // saves the current boolean value of 'mode' | ||||
|   void saveMode   (int mode); | ||||
|   // restores the boolean value of 'mode'  | ||||
|   void restoreMode(int mode); | ||||
|   // resets all modes | ||||
|   // (except MODE_Allow132Columns) | ||||
|   void resetModes(); | ||||
|  | ||||
|   void resetTokenizer(); | ||||
|   #define MAX_TOKEN_LENGTH 80 | ||||
|   void addToCurrentToken(int cc); | ||||
|   int tokenBuffer[MAX_TOKEN_LENGTH]; //FIXME: overflow? | ||||
|   int tokenBufferPos; | ||||
| #define MAXARGS 15 | ||||
|   void addDigit(int dig); | ||||
|   void addArgument(); | ||||
|   int argv[MAXARGS]; | ||||
|   int argc; | ||||
|   void initTokenizer(); | ||||
|  | ||||
|   // Set of flags for each of the ASCII characters which indicates | ||||
|   // what category they fall into (printable character, control, digit etc.) | ||||
|   // for the purposes of decoding terminal output | ||||
|   int charClass[256]; | ||||
|  | ||||
|   void reportDecodingError();  | ||||
|  | ||||
|   void processToken(int code, int p, int q); | ||||
|   void processWindowAttributeChange(); | ||||
|  | ||||
|   void reportTerminalType(); | ||||
|   void reportSecondaryAttributes(); | ||||
|   void reportStatus(); | ||||
|   void reportAnswerBack(); | ||||
|   void reportCursorPosition(); | ||||
|   void reportTerminalParms(int p); | ||||
|  | ||||
|   void onScrollLock(); | ||||
|   void scrollLock(const bool lock); | ||||
|  | ||||
|   // clears the screen and resizes it to the specified | ||||
|   // number of columns | ||||
|   void clearScreenAndSetColumns(int columnCount); | ||||
|  | ||||
|   CharCodes _charset[2]; | ||||
|  | ||||
|   class TerminalState | ||||
|   { | ||||
|   public: | ||||
|     // Initializes all modes to false | ||||
|     TerminalState() | ||||
|     { memset(&mode,false,MODE_total * sizeof(bool)); } | ||||
|  | ||||
|     bool mode[MODE_total]; | ||||
|   }; | ||||
|  | ||||
|   TerminalState _currentModes; | ||||
|   TerminalState _savedModes; | ||||
|  | ||||
|   //hash table and timer for buffering calls to the session instance  | ||||
|   //to update the name of the session | ||||
|   //or window title. | ||||
|   //these calls occur when certain escape sequences are seen in the  | ||||
|   //output from the terminal | ||||
|   QHash<int,QString> _pendingTitleUpdates; | ||||
|   QTimer* _titleUpdateTimer; | ||||
| }; | ||||
|  | ||||
|  | ||||
| #endif // VT102EMULATION_H | ||||
							
								
								
									
										128
									
								
								konsole-qml-plugin/src/default.keytab
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								konsole-qml-plugin/src/default.keytab
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | ||||
| # [README.default.Keytab] Buildin Keyboard Table | ||||
| # | ||||
| # To customize your keyboard, copy this file to something | ||||
| # ending with .keytab and change it to meet you needs. | ||||
| # Please read the README.KeyTab and the README.keyboard | ||||
| # in this case. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| keyboard "Default (XFree 4)" | ||||
|  | ||||
| # -------------------------------------------------------------- | ||||
| # | ||||
| # Note that this particular table is a "risc" version made to | ||||
| # ease customization without bothering with obsolete details. | ||||
| # See VT100.keytab for the more hairy stuff. | ||||
| # | ||||
| # -------------------------------------------------------------- | ||||
|  | ||||
| # common keys | ||||
|  | ||||
| key Escape             : "\E" | ||||
|  | ||||
| key Tab   -Shift       : "\t" | ||||
| key Tab   +Shift+Ansi  : "\E[Z" | ||||
| key Tab   +Shift-Ansi  : "\t" | ||||
| key Backtab     +Ansi  : "\E[Z" | ||||
| key Backtab     -Ansi  : "\t" | ||||
|  | ||||
| key Return-Shift-NewLine : "\r" | ||||
| key Return-Shift+NewLine : "\r\n" | ||||
|  | ||||
| key Return+Shift         : "\EOM" | ||||
|  | ||||
| # Backspace and Delete codes are preserving CTRL-H. | ||||
|  | ||||
| key Backspace      : "\x7f" | ||||
|  | ||||
| # Arrow keys in VT52 mode | ||||
| # shift up/down are reserved for scrolling. | ||||
| # shift left/right are reserved for switching between tabs (this is hardcoded). | ||||
|  | ||||
| key Up   -Shift-Ansi : "\EA" | ||||
| key Down -Shift-Ansi : "\EB" | ||||
| key Right-Shift-Ansi : "\EC" | ||||
| key Left -Shift-Ansi : "\ED" | ||||
|  | ||||
| # Arrow keys in ANSI mode with Application - and Normal Cursor Mode) | ||||
|  | ||||
| key Up    -Shift-AnyMod+Ansi+AppCuKeys           : "\EOA" | ||||
| key Down  -Shift-AnyMod+Ansi+AppCuKeys           : "\EOB" | ||||
| key Right -Shift-AnyMod+Ansi+AppCuKeys           : "\EOC" | ||||
| key Left  -Shift-AnyMod+Ansi+AppCuKeys           : "\EOD" | ||||
|  | ||||
| key Up    -Shift-AnyMod+Ansi-AppCuKeys           : "\E[A" | ||||
| key Down  -Shift-AnyMod+Ansi-AppCuKeys           : "\E[B" | ||||
| key Right -Shift-AnyMod+Ansi-AppCuKeys           : "\E[C" | ||||
| key Left  -Shift-AnyMod+Ansi-AppCuKeys           : "\E[D" | ||||
|  | ||||
| key Up    -Shift+AnyMod+Ansi                     : "\E[1;*A" | ||||
| key Down  -Shift+AnyMod+Ansi                     : "\E[1;*B" | ||||
| key Right -Shift+AnyMod+Ansi                     : "\E[1;*C" | ||||
| key Left  -Shift+AnyMod+Ansi                     : "\E[1;*D" | ||||
|  | ||||
| # other grey PC keys | ||||
|  | ||||
| key Enter+NewLine : "\r\n" | ||||
| key Enter-NewLine : "\r" | ||||
|  | ||||
| key Home        -AnyMod     -AppCuKeys           : "\E[H"   | ||||
| key End         -AnyMod     -AppCuKeys           : "\E[F"   | ||||
| key Home        -AnyMod     +AppCuKeys           : "\EOH"   | ||||
| key End         -AnyMod     +AppCuKeys           : "\EOF"   | ||||
| key Home        +AnyMod                          : "\E[1;*H" | ||||
| key End         +AnyMod                          : "\E[1;*F" | ||||
|  | ||||
| key Insert      -AnyMod                          : "\E[2~" | ||||
| key Delete      -AnyMod                          : "\E[3~" | ||||
| key Insert      +AnyMod                          : "\E[2;*~" | ||||
| key Delete      +AnyMod                          : "\E[3;*~" | ||||
|  | ||||
| key Prior -Shift-AnyMod                          : "\E[5~" | ||||
| key Next  -Shift-AnyMod                          : "\E[6~" | ||||
| key Prior -Shift+AnyMod                          : "\E[5;*~" | ||||
| key Next  -Shift+AnyMod                          : "\E[6;*~" | ||||
|  | ||||
| # Function keys | ||||
| key F1          -AnyMod                          : "\EOP" | ||||
| key F2          -AnyMod                          : "\EOQ" | ||||
| key F3          -AnyMod                          : "\EOR" | ||||
| key F4          -AnyMod                          : "\EOS" | ||||
| key F5          -AnyMod                          : "\E[15~" | ||||
| key F6          -AnyMod                          : "\E[17~" | ||||
| key F7          -AnyMod                          : "\E[18~" | ||||
| key F8          -AnyMod                          : "\E[19~" | ||||
| key F9          -AnyMod                          : "\E[20~" | ||||
| key F10         -AnyMod                          : "\E[21~" | ||||
| key F11         -AnyMod                          : "\E[23~" | ||||
| key F12         -AnyMod                          : "\E[24~" | ||||
|  | ||||
| key F1          +AnyMod                          : "\EO*P" | ||||
| key F2          +AnyMod                          : "\EO*Q" | ||||
| key F3          +AnyMod                          : "\EO*R" | ||||
| key F4          +AnyMod                          : "\EO*S" | ||||
| key F5          +AnyMod                          : "\E[15;*~" | ||||
| key F6          +AnyMod                          : "\E[17;*~" | ||||
| key F7          +AnyMod                          : "\E[18;*~" | ||||
| key F8          +AnyMod                          : "\E[19;*~" | ||||
| key F9          +AnyMod                          : "\E[20;*~" | ||||
| key F10         +AnyMod                          : "\E[21;*~" | ||||
| key F11         +AnyMod                          : "\E[23;*~" | ||||
| key F12         +AnyMod                          : "\E[24;*~" | ||||
|  | ||||
| # Work around dead keys | ||||
|  | ||||
| key Space +Control : "\x00" | ||||
|  | ||||
| # Some keys are used by konsole to cause operations. | ||||
| # The scroll* operations refer to the history buffer. | ||||
|  | ||||
| key Up    +Shift-AppScreen  : scrollLineUp | ||||
| key Prior +Shift-AppScreen  : scrollPageUp | ||||
| key Down  +Shift-AppScreen  : scrollLineDown | ||||
| key Next  +Shift-AppScreen  : scrollPageDown | ||||
|  | ||||
| key ScrollLock     : scrollLock | ||||
|  | ||||
| # keypad characters are not offered differently by Qt. | ||||
							
								
								
									
										224
									
								
								konsole-qml-plugin/src/konsole_wcwidth.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										224
									
								
								konsole-qml-plugin/src/konsole_wcwidth.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,224 @@ | ||||
| /* $XFree86: xc/programs/xterm/wcwidth.character,v 1.3 2001/07/29 22:08:16 tsi Exp $ */ | ||||
| /* | ||||
|  * This is an implementation of wcwidth() and wcswidth() as defined in | ||||
|  * "The Single UNIX Specification, Version 2, The Open Group, 1997" | ||||
|  * <http://www.UNIX-systems.org/online.html> | ||||
|  * | ||||
|  * Markus Kuhn -- 2001-01-12 -- public domain | ||||
|  */ | ||||
|  | ||||
| #include "konsole_wcwidth.h" | ||||
|  | ||||
| struct interval { | ||||
|     unsigned short first; | ||||
|     unsigned short last; | ||||
| }; | ||||
|  | ||||
| /* auxiliary function for binary search in interval table */ | ||||
| static int bisearch(quint16 ucs, const struct interval * table, int max) | ||||
| { | ||||
|     int min = 0; | ||||
|     int mid; | ||||
|  | ||||
|     if (ucs < table[0].first || ucs > table[max].last) { | ||||
|         return 0; | ||||
|     } | ||||
|     while (max >= min) { | ||||
|         mid = (min + max) / 2; | ||||
|         if (ucs > table[mid].last) { | ||||
|             min = mid + 1; | ||||
|         } else if (ucs < table[mid].first) { | ||||
|             max = mid - 1; | ||||
|         } else { | ||||
|             return 1; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     return 0; | ||||
| } | ||||
|  | ||||
|  | ||||
| /* The following functions define the column width of an ISO 10646 | ||||
|  * character as follows: | ||||
|  * | ||||
|  *    - The null character (U+0000) has a column width of 0. | ||||
|  * | ||||
|  *    - Other C0/C1 control characters and DEL will lead to a return | ||||
|  *      value of -1. | ||||
|  * | ||||
|  *    - Non-spacing and enclosing combining characters (general | ||||
|  *      category code Mn or Me in the Unicode database) have a | ||||
|  *      column width of 0. | ||||
|  * | ||||
|  *    - Other format characters (general category code Cf in the Unicode | ||||
|  *      database) and ZERO WIDTH SPACE (U+200B) have a column width of 0. | ||||
|  * | ||||
|  *    - Hangul Jamo medial vowels and final consonants (U+1160-U+11FF) | ||||
|  *      have a column width of 0. | ||||
|  * | ||||
|  *    - Spacing characters in the East Asian Wide (W) or East Asian | ||||
|  *      FullWidth (F) category as defined in Unicode Technical | ||||
|  *      Report #11 have a column width of 2. | ||||
|  * | ||||
|  *    - All remaining characters (including all printable | ||||
|  *      ISO 8859-1 and WGL4 characters, Unicode control characters, | ||||
|  *      etc.) have a column width of 1. | ||||
|  * | ||||
|  * This implementation assumes that quint16 characters are encoded | ||||
|  * in ISO 10646. | ||||
|  */ | ||||
|  | ||||
| int konsole_wcwidth(quint16 ucs) | ||||
| { | ||||
|     /* sorted list of non-overlapping intervals of non-spacing characters */ | ||||
|     static const struct interval combining[] = { | ||||
|         { 0x0300, 0x034E }, { 0x0360, 0x0362 }, { 0x0483, 0x0486 }, | ||||
|         { 0x0488, 0x0489 }, { 0x0591, 0x05A1 }, { 0x05A3, 0x05B9 }, | ||||
|         { 0x05BB, 0x05BD }, { 0x05BF, 0x05BF }, { 0x05C1, 0x05C2 }, | ||||
|         { 0x05C4, 0x05C4 }, { 0x064B, 0x0655 }, { 0x0670, 0x0670 }, | ||||
|         { 0x06D6, 0x06E4 }, { 0x06E7, 0x06E8 }, { 0x06EA, 0x06ED }, | ||||
|         { 0x070F, 0x070F }, { 0x0711, 0x0711 }, { 0x0730, 0x074A }, | ||||
|         { 0x07A6, 0x07B0 }, { 0x0901, 0x0902 }, { 0x093C, 0x093C }, | ||||
|         { 0x0941, 0x0948 }, { 0x094D, 0x094D }, { 0x0951, 0x0954 }, | ||||
|         { 0x0962, 0x0963 }, { 0x0981, 0x0981 }, { 0x09BC, 0x09BC }, | ||||
|         { 0x09C1, 0x09C4 }, { 0x09CD, 0x09CD }, { 0x09E2, 0x09E3 }, | ||||
|         { 0x0A02, 0x0A02 }, { 0x0A3C, 0x0A3C }, { 0x0A41, 0x0A42 }, | ||||
|         { 0x0A47, 0x0A48 }, { 0x0A4B, 0x0A4D }, { 0x0A70, 0x0A71 }, | ||||
|         { 0x0A81, 0x0A82 }, { 0x0ABC, 0x0ABC }, { 0x0AC1, 0x0AC5 }, | ||||
|         { 0x0AC7, 0x0AC8 }, { 0x0ACD, 0x0ACD }, { 0x0B01, 0x0B01 }, | ||||
|         { 0x0B3C, 0x0B3C }, { 0x0B3F, 0x0B3F }, { 0x0B41, 0x0B43 }, | ||||
|         { 0x0B4D, 0x0B4D }, { 0x0B56, 0x0B56 }, { 0x0B82, 0x0B82 }, | ||||
|         { 0x0BC0, 0x0BC0 }, { 0x0BCD, 0x0BCD }, { 0x0C3E, 0x0C40 }, | ||||
|         { 0x0C46, 0x0C48 }, { 0x0C4A, 0x0C4D }, { 0x0C55, 0x0C56 }, | ||||
|         { 0x0CBF, 0x0CBF }, { 0x0CC6, 0x0CC6 }, { 0x0CCC, 0x0CCD }, | ||||
|         { 0x0D41, 0x0D43 }, { 0x0D4D, 0x0D4D }, { 0x0DCA, 0x0DCA }, | ||||
|         { 0x0DD2, 0x0DD4 }, { 0x0DD6, 0x0DD6 }, { 0x0E31, 0x0E31 }, | ||||
|         { 0x0E34, 0x0E3A }, { 0x0E47, 0x0E4E }, { 0x0EB1, 0x0EB1 }, | ||||
|         { 0x0EB4, 0x0EB9 }, { 0x0EBB, 0x0EBC }, { 0x0EC8, 0x0ECD }, | ||||
|         { 0x0F18, 0x0F19 }, { 0x0F35, 0x0F35 }, { 0x0F37, 0x0F37 }, | ||||
|         { 0x0F39, 0x0F39 }, { 0x0F71, 0x0F7E }, { 0x0F80, 0x0F84 }, | ||||
|         { 0x0F86, 0x0F87 }, { 0x0F90, 0x0F97 }, { 0x0F99, 0x0FBC }, | ||||
|         { 0x0FC6, 0x0FC6 }, { 0x102D, 0x1030 }, { 0x1032, 0x1032 }, | ||||
|         { 0x1036, 0x1037 }, { 0x1039, 0x1039 }, { 0x1058, 0x1059 }, | ||||
|         { 0x1160, 0x11FF }, { 0x17B7, 0x17BD }, { 0x17C6, 0x17C6 }, | ||||
|         { 0x17C9, 0x17D3 }, { 0x180B, 0x180E }, { 0x18A9, 0x18A9 }, | ||||
|         { 0x200B, 0x200F }, { 0x202A, 0x202E }, { 0x206A, 0x206F }, | ||||
|         { 0x20D0, 0x20E3 }, { 0x302A, 0x302F }, { 0x3099, 0x309A }, | ||||
|         { 0xFB1E, 0xFB1E }, { 0xFE20, 0xFE23 }, { 0xFEFF, 0xFEFF }, | ||||
|         { 0xFFF9, 0xFFFB } | ||||
|     }; | ||||
|  | ||||
|     /* test for 8-bit control characters */ | ||||
|     if (ucs == 0) { | ||||
|         return 0; | ||||
|     } | ||||
|     if (ucs < 32 || (ucs >= 0x7f && ucs < 0xa0)) { | ||||
|         return -1; | ||||
|     } | ||||
|  | ||||
|     /* binary search in table of non-spacing characters */ | ||||
|     if (bisearch(ucs, combining, | ||||
|                  sizeof(combining) / sizeof(struct interval) - 1)) { | ||||
|         return 0; | ||||
|     } | ||||
|  | ||||
|     /* if we arrive here, ucs is not a combining or C0/C1 control character */ | ||||
|  | ||||
|     return 1 + | ||||
|            (ucs >= 0x1100 && | ||||
|             (ucs <= 0x115f ||                    /* Hangul Jamo init. consonants */ | ||||
|              (ucs >= 0x2e80 && ucs <= 0xa4cf && (ucs & ~0x0011) != 0x300a && | ||||
|               ucs != 0x303f) ||                  /* CJK ... Yi */ | ||||
|              (ucs >= 0xac00 && ucs <= 0xd7a3) || /* Hangul Syllables */ | ||||
|              (ucs >= 0xf900 && ucs <= 0xfaff) || /* CJK Compatibility Ideographs */ | ||||
|              (ucs >= 0xfe30 && ucs <= 0xfe6f) || /* CJK Compatibility Forms */ | ||||
|              (ucs >= 0xff00 && ucs <= 0xff5f) || /* Fullwidth Forms */ | ||||
|              (ucs >= 0xffe0 && ucs <= 0xffe6) /* do not compare UINT16 with 0x20000 || | ||||
|       (ucs >= 0x20000 && ucs <= 0x2ffff) */)); | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| /* | ||||
|  * The following function is the same as konsole_wcwidth(), except that | ||||
|  * spacing characters in the East Asian Ambiguous (A) category as | ||||
|  * defined in Unicode Technical Report #11 have a column width of 2. | ||||
|  * This experimental variant might be useful for users of CJK legacy | ||||
|  * encodings who want to migrate to UCS. It is not otherwise | ||||
|  * recommended for general use. | ||||
|  */ | ||||
| int konsole_wcwidth_cjk(quint16 ucs) | ||||
| { | ||||
|     /* sorted list of non-overlapping intervals of East Asian Ambiguous | ||||
|      * characters */ | ||||
|     static const struct interval ambiguous[] = { | ||||
|         { 0x00A1, 0x00A1 }, { 0x00A4, 0x00A4 }, { 0x00A7, 0x00A8 }, | ||||
|         { 0x00AA, 0x00AA }, { 0x00AD, 0x00AD }, { 0x00B0, 0x00B4 }, | ||||
|         { 0x00B6, 0x00BA }, { 0x00BC, 0x00BF }, { 0x00C6, 0x00C6 }, | ||||
|         { 0x00D0, 0x00D0 }, { 0x00D7, 0x00D8 }, { 0x00DE, 0x00E1 }, | ||||
|         { 0x00E6, 0x00E6 }, { 0x00E8, 0x00EA }, { 0x00EC, 0x00ED }, | ||||
|         { 0x00F0, 0x00F0 }, { 0x00F2, 0x00F3 }, { 0x00F7, 0x00FA }, | ||||
|         { 0x00FC, 0x00FC }, { 0x00FE, 0x00FE }, { 0x0101, 0x0101 }, | ||||
|         { 0x0111, 0x0111 }, { 0x0113, 0x0113 }, { 0x011B, 0x011B }, | ||||
|         { 0x0126, 0x0127 }, { 0x012B, 0x012B }, { 0x0131, 0x0133 }, | ||||
|         { 0x0138, 0x0138 }, { 0x013F, 0x0142 }, { 0x0144, 0x0144 }, | ||||
|         { 0x0148, 0x014A }, { 0x014D, 0x014D }, { 0x0152, 0x0153 }, | ||||
|         { 0x0166, 0x0167 }, { 0x016B, 0x016B }, { 0x01CE, 0x01CE }, | ||||
|         { 0x01D0, 0x01D0 }, { 0x01D2, 0x01D2 }, { 0x01D4, 0x01D4 }, | ||||
|         { 0x01D6, 0x01D6 }, { 0x01D8, 0x01D8 }, { 0x01DA, 0x01DA }, | ||||
|         { 0x01DC, 0x01DC }, { 0x0251, 0x0251 }, { 0x0261, 0x0261 }, | ||||
|         { 0x02C7, 0x02C7 }, { 0x02C9, 0x02CB }, { 0x02CD, 0x02CD }, | ||||
|         { 0x02D0, 0x02D0 }, { 0x02D8, 0x02DB }, { 0x02DD, 0x02DD }, | ||||
|         { 0x0391, 0x03A1 }, { 0x03A3, 0x03A9 }, { 0x03B1, 0x03C1 }, | ||||
|         { 0x03C3, 0x03C9 }, { 0x0401, 0x0401 }, { 0x0410, 0x044F }, | ||||
|         { 0x0451, 0x0451 }, { 0x2010, 0x2010 }, { 0x2013, 0x2016 }, | ||||
|         { 0x2018, 0x2019 }, { 0x201C, 0x201D }, { 0x2020, 0x2021 }, | ||||
|         { 0x2025, 0x2027 }, { 0x2030, 0x2030 }, { 0x2032, 0x2033 }, | ||||
|         { 0x2035, 0x2035 }, { 0x203B, 0x203B }, { 0x2074, 0x2074 }, | ||||
|         { 0x207F, 0x207F }, { 0x2081, 0x2084 }, { 0x20AC, 0x20AC }, | ||||
|         { 0x2103, 0x2103 }, { 0x2105, 0x2105 }, { 0x2109, 0x2109 }, | ||||
|         { 0x2113, 0x2113 }, { 0x2121, 0x2122 }, { 0x2126, 0x2126 }, | ||||
|         { 0x212B, 0x212B }, { 0x2154, 0x2155 }, { 0x215B, 0x215B }, | ||||
|         { 0x215E, 0x215E }, { 0x2160, 0x216B }, { 0x2170, 0x2179 }, | ||||
|         { 0x2190, 0x2199 }, { 0x21D2, 0x21D2 }, { 0x21D4, 0x21D4 }, | ||||
|         { 0x2200, 0x2200 }, { 0x2202, 0x2203 }, { 0x2207, 0x2208 }, | ||||
|         { 0x220B, 0x220B }, { 0x220F, 0x220F }, { 0x2211, 0x2211 }, | ||||
|         { 0x2215, 0x2215 }, { 0x221A, 0x221A }, { 0x221D, 0x2220 }, | ||||
|         { 0x2223, 0x2223 }, { 0x2225, 0x2225 }, { 0x2227, 0x222C }, | ||||
|         { 0x222E, 0x222E }, { 0x2234, 0x2237 }, { 0x223C, 0x223D }, | ||||
|         { 0x2248, 0x2248 }, { 0x224C, 0x224C }, { 0x2252, 0x2252 }, | ||||
|         { 0x2260, 0x2261 }, { 0x2264, 0x2267 }, { 0x226A, 0x226B }, | ||||
|         { 0x226E, 0x226F }, { 0x2282, 0x2283 }, { 0x2286, 0x2287 }, | ||||
|         { 0x2295, 0x2295 }, { 0x2299, 0x2299 }, { 0x22A5, 0x22A5 }, | ||||
|         { 0x22BF, 0x22BF }, { 0x2312, 0x2312 }, { 0x2460, 0x24BF }, | ||||
|         { 0x24D0, 0x24E9 }, { 0x2500, 0x254B }, { 0x2550, 0x2574 }, | ||||
|         { 0x2580, 0x258F }, { 0x2592, 0x2595 }, { 0x25A0, 0x25A1 }, | ||||
|         { 0x25A3, 0x25A9 }, { 0x25B2, 0x25B3 }, { 0x25B6, 0x25B7 }, | ||||
|         { 0x25BC, 0x25BD }, { 0x25C0, 0x25C1 }, { 0x25C6, 0x25C8 }, | ||||
|         { 0x25CB, 0x25CB }, { 0x25CE, 0x25D1 }, { 0x25E2, 0x25E5 }, | ||||
|         { 0x25EF, 0x25EF }, { 0x2605, 0x2606 }, { 0x2609, 0x2609 }, | ||||
|         { 0x260E, 0x260F }, { 0x261C, 0x261C }, { 0x261E, 0x261E }, | ||||
|         { 0x2640, 0x2640 }, { 0x2642, 0x2642 }, { 0x2660, 0x2661 }, | ||||
|         { 0x2663, 0x2665 }, { 0x2667, 0x266A }, { 0x266C, 0x266D }, | ||||
|         { 0x266F, 0x266F }, { 0x300A, 0x300B }, { 0x301A, 0x301B }, | ||||
|         { 0xE000, 0xF8FF }, { 0xFFFD, 0xFFFD } | ||||
|     }; | ||||
|  | ||||
|     /* binary search in table of non-spacing characters */ | ||||
|     if (bisearch(ucs, ambiguous, | ||||
|                  sizeof(ambiguous) / sizeof(struct interval) - 1)) { | ||||
|         return 2; | ||||
|     } | ||||
|  | ||||
|     return konsole_wcwidth(ucs); | ||||
| } | ||||
| #endif | ||||
|  | ||||
| // single byte char: +1, multi byte char: +2 | ||||
| int string_width( const QString & txt ) | ||||
| { | ||||
|     int w = 0; | ||||
|     for ( int i = 0; i < txt.length(); ++i ) { | ||||
|         w += konsole_wcwidth( txt[ i ].unicode() ); | ||||
|     } | ||||
|     return w; | ||||
| } | ||||
							
								
								
									
										24
									
								
								konsole-qml-plugin/src/konsole_wcwidth.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								konsole-qml-plugin/src/konsole_wcwidth.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | ||||
| /* $XFree86: xc/programs/xterm/wcwidth.h,v 1.2 2001/06/18 19:09:27 dickey Exp $ */ | ||||
|  | ||||
| /* Markus Kuhn -- 2001-01-12 -- public domain */ | ||||
| /* Adaptions for KDE by Waldo Bastian <bastian@kde.org> */ | ||||
| /* | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net> | ||||
| */ | ||||
|  | ||||
|  | ||||
| #ifndef _KONSOLE_WCWIDTH_H_ | ||||
| #define _KONSOLE_WCWIDTH_H_ | ||||
|  | ||||
| // Qt | ||||
| //#include <QtCore/QBool> | ||||
| #include <QtCore/QString> | ||||
|  | ||||
| int konsole_wcwidth(quint16 ucs); | ||||
| #if 0 | ||||
| int konsole_wcwidth_cjk(Q_UINT16 ucs); | ||||
| #endif | ||||
|  | ||||
| int string_width( const QString & txt ); | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										412
									
								
								konsole-qml-plugin/src/kprocess.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										412
									
								
								konsole-qml-plugin/src/kprocess.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,412 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|     This file is part of the KDE libraries | ||||
|  | ||||
|     Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     This library is free software; you can redistribute it and/or | ||||
|     modify it under the terms of the GNU Library General Public | ||||
|     License as published by the Free Software Foundation; either | ||||
|     version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This library 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 | ||||
|     Library General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Library General Public License | ||||
|     along with this library; see the file COPYING.LIB.  If not, write to | ||||
|     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|     Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #include "kprocess.h" | ||||
|  | ||||
| #include <qfile.h> | ||||
|  | ||||
| #ifdef Q_OS_WIN | ||||
| # include <windows.h> | ||||
| #else | ||||
| # include <unistd.h> | ||||
| # include <errno.h> | ||||
| #endif | ||||
|  | ||||
| #ifndef Q_OS_WIN | ||||
| # define STD_OUTPUT_HANDLE 1 | ||||
| # define STD_ERROR_HANDLE 2 | ||||
| #endif | ||||
|  | ||||
| #ifdef _WIN32_WCE | ||||
| #include <stdio.h> | ||||
| #endif | ||||
|  | ||||
| void KProcessPrivate::writeAll(const QByteArray &buf, int fd) | ||||
| { | ||||
| #ifdef Q_OS_WIN | ||||
| #ifndef _WIN32_WCE | ||||
|     HANDLE h = GetStdHandle(fd); | ||||
|     if (h) { | ||||
|         DWORD wr; | ||||
|         WriteFile(h, buf.data(), buf.size(), &wr, 0); | ||||
|     } | ||||
| #else | ||||
|     fwrite(buf.data(), 1, buf.size(), (FILE*)fd); | ||||
| #endif | ||||
| #else | ||||
|     int off = 0; | ||||
|     do { | ||||
|         int ret = ::write(fd, buf.data() + off, buf.size() - off); | ||||
|         if (ret < 0) { | ||||
|             if (errno != EINTR) | ||||
|                 return; | ||||
|         } else { | ||||
|             off += ret; | ||||
|         } | ||||
|     } while (off < buf.size()); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void KProcessPrivate::forwardStd(KProcess::ProcessChannel good, int fd) | ||||
| { | ||||
|     Q_Q(KProcess); | ||||
|  | ||||
|     QProcess::ProcessChannel oc = q->readChannel(); | ||||
|     q->setReadChannel(good); | ||||
|     writeAll(q->readAll(), fd); | ||||
|     q->setReadChannel(oc); | ||||
| } | ||||
|  | ||||
| void KProcessPrivate::_k_forwardStdout() | ||||
| { | ||||
| #ifndef _WIN32_WCE | ||||
|     forwardStd(KProcess::StandardOutput, STD_OUTPUT_HANDLE); | ||||
| #else | ||||
|     forwardStd(KProcess::StandardOutput, (int)stdout); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void KProcessPrivate::_k_forwardStderr() | ||||
| { | ||||
| #ifndef _WIN32_WCE | ||||
|     forwardStd(KProcess::StandardError, STD_ERROR_HANDLE); | ||||
| #else | ||||
|     forwardStd(KProcess::StandardError, (int)stderr); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| ///////////////////////////// | ||||
| // public member functions // | ||||
| ///////////////////////////// | ||||
|  | ||||
| KProcess::KProcess(QObject *parent) : | ||||
|     QProcess(parent), | ||||
|     d_ptr(new KProcessPrivate) | ||||
| { | ||||
|     d_ptr->q_ptr = this; | ||||
|     setOutputChannelMode(ForwardedChannels); | ||||
| } | ||||
|  | ||||
| KProcess::KProcess(KProcessPrivate *d, QObject *parent) : | ||||
|     QProcess(parent), | ||||
|     d_ptr(d) | ||||
| { | ||||
|     d_ptr->q_ptr = this; | ||||
|     setOutputChannelMode(ForwardedChannels); | ||||
| } | ||||
|  | ||||
| KProcess::~KProcess() | ||||
| { | ||||
|     delete d_ptr; | ||||
| } | ||||
|  | ||||
| void KProcess::setOutputChannelMode(OutputChannelMode mode) | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     d->outputChannelMode = mode; | ||||
|     disconnect(this, SIGNAL(readyReadStandardOutput())); | ||||
|     disconnect(this, SIGNAL(readyReadStandardError())); | ||||
|     switch (mode) { | ||||
|     case OnlyStdoutChannel: | ||||
|         connect(this, SIGNAL(readyReadStandardError()), SLOT(_k_forwardStderr())); | ||||
|         break; | ||||
|     case OnlyStderrChannel: | ||||
|         connect(this, SIGNAL(readyReadStandardOutput()), SLOT(_k_forwardStdout())); | ||||
|         break; | ||||
|     default: | ||||
|         QProcess::setProcessChannelMode((ProcessChannelMode)mode); | ||||
|         return; | ||||
|     } | ||||
|     QProcess::setProcessChannelMode(QProcess::SeparateChannels); | ||||
| } | ||||
|  | ||||
| KProcess::OutputChannelMode KProcess::outputChannelMode() const | ||||
| { | ||||
|     Q_D(const KProcess); | ||||
|  | ||||
|     return d->outputChannelMode; | ||||
| } | ||||
|  | ||||
| void KProcess::setNextOpenMode(QIODevice::OpenMode mode) | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     d->openMode = mode; | ||||
| } | ||||
|  | ||||
| #define DUMMYENV "_KPROCESS_DUMMY_=" | ||||
|  | ||||
| void KProcess::clearEnvironment() | ||||
| { | ||||
|     setEnvironment(QStringList() << QString::fromLatin1(DUMMYENV)); | ||||
| } | ||||
|  | ||||
| void KProcess::setEnv(const QString &name, const QString &value, bool overwrite) | ||||
| { | ||||
|     QStringList env = environment(); | ||||
|     if (env.isEmpty()) { | ||||
|         env = systemEnvironment(); | ||||
|         env.removeAll(QString::fromLatin1(DUMMYENV)); | ||||
|     } | ||||
|     QString fname(name); | ||||
|     fname.append(QLatin1Char('=')); | ||||
|     for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) | ||||
|         if ((*it).startsWith(fname)) { | ||||
|             if (overwrite) { | ||||
|                 *it = fname.append(value); | ||||
|                 setEnvironment(env); | ||||
|             } | ||||
|             return; | ||||
|         } | ||||
|     env.append(fname.append(value)); | ||||
|     setEnvironment(env); | ||||
| } | ||||
|  | ||||
| void KProcess::unsetEnv(const QString &name) | ||||
| { | ||||
|     QStringList env = environment(); | ||||
|     if (env.isEmpty()) { | ||||
|         env = systemEnvironment(); | ||||
|         env.removeAll(QString::fromLatin1(DUMMYENV)); | ||||
|     } | ||||
|     QString fname(name); | ||||
|     fname.append(QLatin1Char('=')); | ||||
|     for (QStringList::Iterator it = env.begin(); it != env.end(); ++it) | ||||
|         if ((*it).startsWith(fname)) { | ||||
|             env.erase(it); | ||||
|             if (env.isEmpty()) | ||||
|                 env.append(QString::fromLatin1(DUMMYENV)); | ||||
|             setEnvironment(env); | ||||
|             return; | ||||
|         } | ||||
| } | ||||
|  | ||||
| void KProcess::setProgram(const QString &exe, const QStringList &args) | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     d->prog = exe; | ||||
|     d->args = args; | ||||
| #ifdef Q_OS_WIN | ||||
|     setNativeArguments(QString()); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void KProcess::setProgram(const QStringList &argv) | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     Q_ASSERT( !argv.isEmpty() ); | ||||
|     d->args = argv; | ||||
|     d->prog = d->args.takeFirst(); | ||||
| #ifdef Q_OS_WIN | ||||
|     setNativeArguments(QString()); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| KProcess &KProcess::operator<<(const QString &arg) | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     if (d->prog.isEmpty()) | ||||
|         d->prog = arg; | ||||
|     else | ||||
|         d->args << arg; | ||||
|     return *this; | ||||
| } | ||||
|  | ||||
| KProcess &KProcess::operator<<(const QStringList &args) | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     if (d->prog.isEmpty()) | ||||
|         setProgram(args); | ||||
|     else | ||||
|         d->args << args; | ||||
|     return *this; | ||||
| } | ||||
|  | ||||
| void KProcess::clearProgram() | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     d->prog.clear(); | ||||
|     d->args.clear(); | ||||
| #ifdef Q_OS_WIN | ||||
|     setNativeArguments(QString()); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #if 0 | ||||
| void KProcess::setShellCommand(const QString &cmd) | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     KShell::Errors err; | ||||
|     d->args = KShell::splitArgs( | ||||
|             cmd, KShell::AbortOnMeta | KShell::TildeExpand, &err); | ||||
|     if (err == KShell::NoError && !d->args.isEmpty()) { | ||||
|         d->prog = KStandardDirs::findExe(d->args[0]); | ||||
|         if (!d->prog.isEmpty()) { | ||||
|             d->args.removeFirst(); | ||||
| #ifdef Q_OS_WIN | ||||
|             setNativeArguments(QString()); | ||||
| #endif | ||||
|             return; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     d->args.clear(); | ||||
|  | ||||
| #ifdef Q_OS_UNIX | ||||
| // #ifdef NON_FREE // ... as they ship non-POSIX /bin/sh | ||||
| # if !defined(__linux__) && !defined(__FreeBSD__) && !defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__DragonFly__) && !defined(__GNU__) | ||||
|     // If /bin/sh is a symlink, we can be pretty sure that it points to a | ||||
|     // POSIX shell - the original bourne shell is about the only non-POSIX | ||||
|     // shell still in use and it is always installed natively as /bin/sh. | ||||
|     d->prog = QFile::symLinkTarget(QString::fromLatin1("/bin/sh")); | ||||
|     if (d->prog.isEmpty()) { | ||||
|         // Try some known POSIX shells. | ||||
|         d->prog = KStandardDirs::findExe(QString::fromLatin1("ksh")); | ||||
|         if (d->prog.isEmpty()) { | ||||
|             d->prog = KStandardDirs::findExe(QString::fromLatin1("ash")); | ||||
|             if (d->prog.isEmpty()) { | ||||
|                 d->prog = KStandardDirs::findExe(QString::fromLatin1("bash")); | ||||
|                 if (d->prog.isEmpty()) { | ||||
|                     d->prog = KStandardDirs::findExe(QString::fromLatin1("zsh")); | ||||
|                     if (d->prog.isEmpty()) | ||||
|                         // We're pretty much screwed, to be honest ... | ||||
|                         d->prog = QString::fromLatin1("/bin/sh"); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
| # else | ||||
|     d->prog = QString::fromLatin1("/bin/sh"); | ||||
| # endif | ||||
|  | ||||
|     d->args << QString::fromLatin1("-c") << cmd; | ||||
| #else // Q_OS_UNIX | ||||
|     // KMacroExpander::expandMacrosShellQuote(), KShell::quoteArg() and | ||||
|     // KShell::joinArgs() may generate these for security reasons. | ||||
|     setEnv(PERCENT_VARIABLE, QLatin1String("%")); | ||||
|  | ||||
| #ifndef _WIN32_WCE | ||||
|     WCHAR sysdir[MAX_PATH + 1]; | ||||
|     UINT size = GetSystemDirectoryW(sysdir, MAX_PATH + 1); | ||||
|     d->prog = QString::fromUtf16((const ushort *) sysdir, size); | ||||
|     d->prog += QLatin1String("\\cmd.exe"); | ||||
|     setNativeArguments(QLatin1String("/V:OFF /S /C \"") + cmd + QLatin1Char('"')); | ||||
| #else | ||||
|     d->prog = QLatin1String("\\windows\\cmd.exe"); | ||||
|     setNativeArguments(QLatin1String("/S /C \"") + cmd + QLatin1Char('"')); | ||||
| #endif | ||||
| #endif | ||||
| } | ||||
| #endif | ||||
| QStringList KProcess::program() const | ||||
| { | ||||
|     Q_D(const KProcess); | ||||
|  | ||||
|     QStringList argv = d->args; | ||||
|     argv.prepend(d->prog); | ||||
|     return argv; | ||||
| } | ||||
|  | ||||
| void KProcess::start() | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     QProcess::start(d->prog, d->args, d->openMode); | ||||
| } | ||||
|  | ||||
| int KProcess::execute(int msecs) | ||||
| { | ||||
|     start(); | ||||
|     if (!waitForFinished(msecs)) { | ||||
|         kill(); | ||||
|         waitForFinished(-1); | ||||
|         return -2; | ||||
|     } | ||||
|     return (exitStatus() == QProcess::NormalExit) ? exitCode() : -1; | ||||
| } | ||||
|  | ||||
| // static | ||||
| int KProcess::execute(const QString &exe, const QStringList &args, int msecs) | ||||
| { | ||||
|     KProcess p; | ||||
|     p.setProgram(exe, args); | ||||
|     return p.execute(msecs); | ||||
| } | ||||
|  | ||||
| // static | ||||
| int KProcess::execute(const QStringList &argv, int msecs) | ||||
| { | ||||
|     KProcess p; | ||||
|     p.setProgram(argv); | ||||
|     return p.execute(msecs); | ||||
| } | ||||
|  | ||||
| int KProcess::startDetached() | ||||
| { | ||||
|     Q_D(KProcess); | ||||
|  | ||||
|     qint64 pid; | ||||
|     if (!QProcess::startDetached(d->prog, d->args, workingDirectory(), &pid)) | ||||
|         return 0; | ||||
|     return (int) pid; | ||||
| } | ||||
|  | ||||
| // static | ||||
| int KProcess::startDetached(const QString &exe, const QStringList &args) | ||||
| { | ||||
|     qint64 pid; | ||||
|     if (!QProcess::startDetached(exe, args, QString(), &pid)) | ||||
|         return 0; | ||||
|     return (int) pid; | ||||
| } | ||||
|  | ||||
| // static | ||||
| int KProcess::startDetached(const QStringList &argv) | ||||
| { | ||||
|     QStringList args = argv; | ||||
|     QString prog = args.takeFirst(); | ||||
|     return startDetached(prog, args); | ||||
| } | ||||
|  | ||||
| int KProcess::pid() const | ||||
| { | ||||
| #ifdef Q_OS_UNIX | ||||
|     return (int) QProcess::pid(); | ||||
| #else | ||||
|     return QProcess::pid() ? QProcess::pid()->dwProcessId : 0; | ||||
| #endif | ||||
| } | ||||
|  | ||||
							
								
								
									
										372
									
								
								konsole-qml-plugin/src/kprocess.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										372
									
								
								konsole-qml-plugin/src/kprocess.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,372 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|     This file is part of the KDE libraries | ||||
|  | ||||
|     Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     This library is free software; you can redistribute it and/or | ||||
|     modify it under the terms of the GNU Library General Public | ||||
|     License as published by the Free Software Foundation; either | ||||
|     version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This library 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 | ||||
|     Library General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Library General Public License | ||||
|     along with this library; see the file COPYING.LIB.  If not, write to | ||||
|     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|     Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #ifndef KPROCESS_H | ||||
| #define KPROCESS_H | ||||
|  | ||||
| //#include <kdecore_export.h> | ||||
|  | ||||
| #include <QtCore/QProcess> | ||||
|  | ||||
| class KProcessPrivate; | ||||
|  | ||||
| /** | ||||
|  * \class KProcess kprocess.h <KProcess> | ||||
|  *  | ||||
|  * Child process invocation, monitoring and control. | ||||
|  * | ||||
|  * This class extends QProcess by some useful functionality, overrides | ||||
|  * some defaults with saner values and wraps parts of the API into a more | ||||
|  * accessible one. | ||||
|  * This is the preferred way of spawning child processes in KDE; don't | ||||
|  * use QProcess directly. | ||||
|  * | ||||
|  * @author Oswald Buddenhagen <ossi@kde.org> | ||||
|  **/ | ||||
| class KProcess : public QProcess | ||||
| { | ||||
|     Q_OBJECT | ||||
|     Q_DECLARE_PRIVATE(KProcess) | ||||
|  | ||||
| public: | ||||
|  | ||||
|     /** | ||||
|      * Modes in which the output channels can be opened. | ||||
|      */ | ||||
|     enum OutputChannelMode { | ||||
|         SeparateChannels = QProcess::SeparateChannels, | ||||
|             /**< Standard output and standard error are handled by KProcess | ||||
|                  as separate channels */ | ||||
|         MergedChannels = QProcess::MergedChannels, | ||||
|             /**< Standard output and standard error are handled by KProcess | ||||
|                  as one channel */ | ||||
|         ForwardedChannels = QProcess::ForwardedChannels, | ||||
|             /**< Both standard output and standard error are forwarded | ||||
|                  to the parent process' respective channel */ | ||||
|         OnlyStdoutChannel, | ||||
|             /**< Only standard output is handled; standard error is forwarded */ | ||||
|         OnlyStderrChannel  /**< Only standard error is handled; standard output is forwarded */ | ||||
|     }; | ||||
|  | ||||
|     /** | ||||
|      * Constructor | ||||
|      */ | ||||
|     explicit KProcess(QObject *parent = 0); | ||||
|  | ||||
|     /** | ||||
|      * Destructor | ||||
|      */ | ||||
|     virtual ~KProcess(); | ||||
|  | ||||
|     /** | ||||
|      * Set how to handle the output channels of the child process. | ||||
|      * | ||||
|      * The default is ForwardedChannels, which is unlike in QProcess. | ||||
|      * Do not request more than you actually handle, as this output is | ||||
|      * simply lost otherwise. | ||||
|      * | ||||
|      * This function must be called before starting the process. | ||||
|      * | ||||
|      * @param mode the output channel handling mode | ||||
|      */ | ||||
|     void setOutputChannelMode(OutputChannelMode mode); | ||||
|  | ||||
|     /** | ||||
|      * Query how the output channels of the child process are handled. | ||||
|      * | ||||
|      * @return the output channel handling mode | ||||
|      */ | ||||
|     OutputChannelMode outputChannelMode() const; | ||||
|  | ||||
|     /** | ||||
|      * Set the QIODevice open mode the process will be opened in. | ||||
|      * | ||||
|      * This function must be called before starting the process, obviously. | ||||
|      * | ||||
|      * @param mode the open mode. Note that this mode is automatically | ||||
|      *   "reduced" according to the channel modes and redirections. | ||||
|      *   The default is QIODevice::ReadWrite. | ||||
|      */ | ||||
|     void setNextOpenMode(QIODevice::OpenMode mode); | ||||
|  | ||||
|     /** | ||||
|      * Adds the variable @p name to the process' environment. | ||||
|      * | ||||
|      * This function must be called before starting the process. | ||||
|      * | ||||
|      * @param name the name of the environment variable | ||||
|      * @param value the new value for the environment variable | ||||
|      * @param overwrite if @c false and the environment variable is already | ||||
|      *   set, the old value will be preserved | ||||
|      */ | ||||
|     void setEnv(const QString &name, const QString &value, bool overwrite = true); | ||||
|  | ||||
|     /** | ||||
|      * Removes the variable @p name from the process' environment. | ||||
|      * | ||||
|      * This function must be called before starting the process. | ||||
|      * | ||||
|      * @param name the name of the environment variable | ||||
|      */ | ||||
|     void unsetEnv(const QString &name); | ||||
|  | ||||
|     /** | ||||
|      * Empties the process' environment. | ||||
|      * | ||||
|      * Note that LD_LIBRARY_PATH/DYLD_LIBRARY_PATH is automatically added | ||||
|      * on *NIX. | ||||
|      * | ||||
|      * This function must be called before starting the process. | ||||
|      */ | ||||
|     void clearEnvironment(); | ||||
|  | ||||
|     /** | ||||
|      * Set the program and the command line arguments. | ||||
|      * | ||||
|      * This function must be called before starting the process, obviously. | ||||
|      * | ||||
|      * @param exe the program to execute | ||||
|      * @param args the command line arguments for the program, | ||||
|      *   one per list element | ||||
|      */ | ||||
|     void setProgram(const QString &exe, const QStringList &args = QStringList()); | ||||
|  | ||||
|     /** | ||||
|      * @overload | ||||
|      * | ||||
|      * @param argv the program to execute and the command line arguments | ||||
|      *   for the program, one per list element | ||||
|      */ | ||||
|     void setProgram(const QStringList &argv); | ||||
|  | ||||
|     /** | ||||
|      * Append an element to the command line argument list for this process. | ||||
|      * | ||||
|      * If no executable is set yet, it will be set instead. | ||||
|      * | ||||
|      * For example, doing an "ls -l /usr/local/bin" can be achieved by: | ||||
|      *  \code | ||||
|      *  KProcess p; | ||||
|      *  p << "ls" << "-l" << "/usr/local/bin"; | ||||
|      *  ... | ||||
|      *  \endcode | ||||
|      * | ||||
|      * This function must be called before starting the process, obviously. | ||||
|      * | ||||
|      * @param arg the argument to add | ||||
|      * @return a reference to this KProcess | ||||
|      */ | ||||
|     KProcess &operator<<(const QString& arg); | ||||
|  | ||||
|     /** | ||||
|      * @overload | ||||
|      * | ||||
|      * @param args the arguments to add | ||||
|      * @return a reference to this KProcess | ||||
|      */ | ||||
|     KProcess &operator<<(const QStringList& args); | ||||
|  | ||||
|     /** | ||||
|      * Clear the program and command line argument list. | ||||
|      */ | ||||
|     void clearProgram(); | ||||
|  | ||||
|     /** | ||||
|      * Set a command to execute through a shell (a POSIX sh on *NIX | ||||
|      * and cmd.exe on Windows). | ||||
|      * | ||||
|      * Using this for anything but user-supplied commands is usually a bad | ||||
|      * idea, as the command's syntax depends on the platform. | ||||
|      * Redirections including pipes, etc. are better handled by the | ||||
|      * respective functions provided by QProcess. | ||||
|      * | ||||
|      * If KProcess determines that the command does not really need a | ||||
|      * shell, it will trasparently execute it without one for performance | ||||
|      * reasons. | ||||
|      * | ||||
|      * This function must be called before starting the process, obviously. | ||||
|      * | ||||
|      * @param cmd the command to execute through a shell. | ||||
|      *   The caller must make sure that all filenames etc. are properly | ||||
|      *   quoted when passed as argument. Failure to do so often results in | ||||
|      *   serious security holes. See KShell::quoteArg(). | ||||
|      */ | ||||
|     void setShellCommand(const QString &cmd); | ||||
|  | ||||
|     /** | ||||
|      * Obtain the currently set program and arguments. | ||||
|      * | ||||
|      * @return a list, the first element being the program, the remaining ones | ||||
|      *  being command line arguments to the program. | ||||
|      */ | ||||
|     QStringList program() const; | ||||
|  | ||||
|     /** | ||||
|      * Start the process. | ||||
|      * | ||||
|      * @see QProcess::start(const QString &, const QStringList &, OpenMode) | ||||
|      */ | ||||
|     void start(); | ||||
|  | ||||
|     /** | ||||
|      * Start the process, wait for it to finish, and return the exit code. | ||||
|      * | ||||
|      * This method is roughly equivalent to the sequence: | ||||
|      * <code> | ||||
|      *   start(); | ||||
|      *   waitForFinished(msecs); | ||||
|      *   return exitCode(); | ||||
|      * </code> | ||||
|      * | ||||
|      * Unlike the other execute() variants this method is not static, | ||||
|      * so the process can be parametrized properly and talked to. | ||||
|      * | ||||
|      * @param msecs time to wait for process to exit before killing it | ||||
|      * @return -2 if the process could not be started, -1 if it crashed, | ||||
|      *  otherwise its exit code | ||||
|      */ | ||||
|     int execute(int msecs = -1); | ||||
|  | ||||
|     /** | ||||
|      * @overload | ||||
|      * | ||||
|      * @param exe the program to execute | ||||
|      * @param args the command line arguments for the program, | ||||
|      *   one per list element | ||||
|      * @param msecs time to wait for process to exit before killing it | ||||
|      * @return -2 if the process could not be started, -1 if it crashed, | ||||
|      *  otherwise its exit code | ||||
|      */ | ||||
|     static int execute(const QString &exe, const QStringList &args = QStringList(), int msecs = -1); | ||||
|  | ||||
|     /** | ||||
|      * @overload | ||||
|      * | ||||
|      * @param argv the program to execute and the command line arguments | ||||
|      *   for the program, one per list element | ||||
|      * @param msecs time to wait for process to exit before killing it | ||||
|      * @return -2 if the process could not be started, -1 if it crashed, | ||||
|      *  otherwise its exit code | ||||
|      */ | ||||
|     static int execute(const QStringList &argv, int msecs = -1); | ||||
|  | ||||
|     /** | ||||
|      * Start the process and detach from it. See QProcess::startDetached() | ||||
|      * for details. | ||||
|      * | ||||
|      * Unlike the other startDetached() variants this method is not static, | ||||
|      * so the process can be parametrized properly. | ||||
|      * @note Currently, only the setProgram()/setShellCommand() and | ||||
|      * setWorkingDirectory() parametrizations are supported. | ||||
|      * | ||||
|      * The KProcess object may be re-used immediately after calling this | ||||
|      * function. | ||||
|      * | ||||
|      * @return the PID of the started process or 0 on error | ||||
|      */ | ||||
|     int startDetached(); | ||||
|  | ||||
|     /** | ||||
|      * @overload | ||||
|      * | ||||
|      * @param exe the program to start | ||||
|      * @param args the command line arguments for the program, | ||||
|      *   one per list element | ||||
|      * @return the PID of the started process or 0 on error | ||||
|      */ | ||||
|     static int startDetached(const QString &exe, const QStringList &args = QStringList()); | ||||
|  | ||||
|     /** | ||||
|      * @overload | ||||
|      * | ||||
|      * @param argv the program to start and the command line arguments | ||||
|      *   for the program, one per list element | ||||
|      * @return the PID of the started process or 0 on error | ||||
|      */ | ||||
|     static int startDetached(const QStringList &argv); | ||||
|  | ||||
|     /** | ||||
|      * Obtain the process' ID as known to the system. | ||||
|      * | ||||
|      * Unlike with QProcess::pid(), this is a real PID also on Windows. | ||||
|      * | ||||
|      * This function can be called only while the process is running. | ||||
|      * It cannot be applied to detached processes. | ||||
|      * | ||||
|      * @return the process ID | ||||
|      */ | ||||
|     int pid() const; | ||||
|  | ||||
| protected: | ||||
|     /** | ||||
|      * @internal | ||||
|      */ | ||||
|     KProcess(KProcessPrivate *d, QObject *parent); | ||||
|  | ||||
|     /** | ||||
|      * @internal | ||||
|      */ | ||||
|     KProcessPrivate * const d_ptr; | ||||
|  | ||||
| private: | ||||
|     // hide those | ||||
|     using QProcess::setReadChannelMode; | ||||
|     using QProcess::readChannelMode; | ||||
|     using QProcess::setProcessChannelMode; | ||||
|     using QProcess::processChannelMode; | ||||
|  | ||||
|     Q_PRIVATE_SLOT(d_func(), void _k_forwardStdout()) | ||||
|     Q_PRIVATE_SLOT(d_func(), void _k_forwardStderr()) | ||||
| }; | ||||
|  | ||||
| /* ----------- kprocess_p.h ---------------- */ | ||||
| class KProcessPrivate { | ||||
|  | ||||
|     Q_DECLARE_PUBLIC(KProcess) | ||||
|  | ||||
| protected: | ||||
|     KProcessPrivate() : | ||||
|         openMode(QIODevice::ReadWrite) | ||||
|     { | ||||
|     } | ||||
|     void writeAll(const QByteArray &buf, int fd); | ||||
|     void forwardStd(KProcess::ProcessChannel good, int fd); | ||||
|     void _k_forwardStdout(); | ||||
|     void _k_forwardStderr(); | ||||
|  | ||||
|     QString prog; | ||||
|     QStringList args; | ||||
|     KProcess::OutputChannelMode outputChannelMode; | ||||
|     QIODevice::OpenMode openMode; | ||||
|  | ||||
|     KProcess *q_ptr; | ||||
| }; | ||||
| /* ------------------------------------------- */ | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										701
									
								
								konsole-qml-plugin/src/kpty.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										701
									
								
								konsole-qml-plugin/src/kpty.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,701 @@ | ||||
| /* | ||||
|  | ||||
|    This file is part of the KDE libraries | ||||
|    Copyright (C) 2002 Waldo Bastian <bastian@kde.org> | ||||
|    Copyright (C) 2002-2003,2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 | ||||
|  | ||||
|    This library is free software; you can redistribute it and/or | ||||
|    modify it under the terms of the GNU Library General Public | ||||
|    License as published by the Free Software Foundation; either | ||||
|    version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|    This library 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 | ||||
|    Library General Public License for more details. | ||||
|  | ||||
|    You should have received a copy of the GNU Library General Public License | ||||
|    along with this library; see the file COPYING.LIB.  If not, write to | ||||
|    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|    Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #include "kpty_p.h" | ||||
|  | ||||
|  | ||||
| #if defined(__FreeBSD__) || defined(__NetBSD__) || defined(__OpenBSD__) || defined(__DragonFly__) | ||||
| #define HAVE_LOGIN | ||||
| #define HAVE_LIBUTIL_H | ||||
| #endif | ||||
|  | ||||
| #ifdef __sgi | ||||
| #define __svr4__ | ||||
| #endif | ||||
|  | ||||
| #ifdef __osf__ | ||||
| #define _OSF_SOURCE | ||||
| #include <float.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef _AIX | ||||
| #define _ALL_SOURCE | ||||
| #endif | ||||
|  | ||||
| // __USE_XOPEN isn't defined by default in ICC | ||||
| // (needed for ptsname(), grantpt() and unlockpt()) | ||||
| #ifdef __INTEL_COMPILER | ||||
| #  ifndef __USE_XOPEN | ||||
| #    define __USE_XOPEN | ||||
| #  endif | ||||
| #endif | ||||
|  | ||||
| #include <sys/types.h> | ||||
| #include <sys/ioctl.h> | ||||
| #include <sys/time.h> | ||||
| #include <sys/resource.h> | ||||
| #include <sys/stat.h> | ||||
| #include <sys/param.h> | ||||
|  | ||||
| #include <errno.h> | ||||
| #include <fcntl.h> | ||||
| #include <time.h> | ||||
| #include <stdlib.h> | ||||
| #include <stdio.h> | ||||
| #include <string.h> | ||||
| #include <unistd.h> | ||||
| #include <grp.h> | ||||
|  | ||||
| #if defined(HAVE_PTY_H) | ||||
| # include <pty.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_LIBUTIL_H | ||||
| # include <libutil.h> | ||||
| #elif defined(HAVE_UTIL_H) | ||||
| # include <util.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_UTEMPTER | ||||
| extern "C" { | ||||
| # include <utempter.h> | ||||
| } | ||||
| #else | ||||
| # include <utmp.h> | ||||
| # ifdef HAVE_UTMPX | ||||
| #  include <utmpx.h> | ||||
| # endif | ||||
| # if !defined(_PATH_UTMPX) && defined(_UTMPX_FILE) | ||||
| #  define _PATH_UTMPX _UTMPX_FILE | ||||
| # endif | ||||
| # ifdef HAVE_UPDWTMPX | ||||
| #  if !defined(_PATH_WTMPX) && defined(_WTMPX_FILE) | ||||
| #   define _PATH_WTMPX _WTMPX_FILE | ||||
| #  endif | ||||
| # endif | ||||
| #endif | ||||
|  | ||||
| /* for HP-UX (some versions) the extern C is needed, and for other | ||||
|    platforms it doesn't hurt */ | ||||
| extern "C" { | ||||
| #include <termios.h> | ||||
| #if defined(HAVE_TERMIO_H) | ||||
| # include <termio.h> // struct winsize on some systems | ||||
| #endif | ||||
| } | ||||
|  | ||||
| #if defined (_HPUX_SOURCE) | ||||
| # define _TERMIOS_INCLUDED | ||||
| # include <bsdtty.h> | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_SYS_STROPTS_H | ||||
| # include <sys/stropts.h> // Defines I_PUSH | ||||
| # define _NEW_TTY_CTRL | ||||
| #endif | ||||
|  | ||||
| #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) | ||||
| # define _tcgetattr(fd, ttmode) ioctl(fd, TIOCGETA, (char *)ttmode) | ||||
| #else | ||||
| # if defined(_HPUX_SOURCE) || defined(__Lynx__) || defined (__CYGWIN__) | ||||
| #  define _tcgetattr(fd, ttmode) tcgetattr(fd, ttmode) | ||||
| # else | ||||
| #  define _tcgetattr(fd, ttmode) ioctl(fd, TCGETS, (char *)ttmode) | ||||
| # endif | ||||
| #endif | ||||
|  | ||||
| #if defined (__FreeBSD__) || defined (__NetBSD__) || defined (__OpenBSD__) || defined (__bsdi__) || defined(__APPLE__) || defined (__DragonFly__) | ||||
| # define _tcsetattr(fd, ttmode) ioctl(fd, TIOCSETA, (char *)ttmode) | ||||
| #else | ||||
| # if defined(_HPUX_SOURCE) || defined(__CYGWIN__) | ||||
| #  define _tcsetattr(fd, ttmode) tcsetattr(fd, TCSANOW, ttmode) | ||||
| # else | ||||
| #  define _tcsetattr(fd, ttmode) ioctl(fd, TCSETS, (char *)ttmode) | ||||
| # endif | ||||
| #endif | ||||
|  | ||||
| //#include <kdebug.h> | ||||
| //#include <kstandarddirs.h>  // findExe | ||||
|  | ||||
| #include <QtCore> | ||||
|  | ||||
| // not defined on HP-UX for example | ||||
| #ifndef CTRL | ||||
| # define CTRL(x) ((x) & 037) | ||||
| #endif | ||||
|  | ||||
| #define TTY_GROUP "tty" | ||||
|  | ||||
| /////////////////////// | ||||
| // private functions // | ||||
| /////////////////////// | ||||
|  | ||||
| ////////////////// | ||||
| // private data // | ||||
| ////////////////// | ||||
|  | ||||
| KPtyPrivate::KPtyPrivate(KPty* parent) : | ||||
|         masterFd(-1), slaveFd(-1), ownMaster(true), q_ptr(parent) | ||||
| { | ||||
| } | ||||
|  | ||||
| KPtyPrivate::~KPtyPrivate() | ||||
| { | ||||
| } | ||||
|  | ||||
| bool KPtyPrivate::chownpty(bool) | ||||
| { | ||||
| //    return !QProcess::execute(KStandardDirs::findExe("kgrantpty"), | ||||
| //        QStringList() << (grant?"--grant":"--revoke") << QString::number(masterFd)); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| ///////////////////////////// | ||||
| // public member functions // | ||||
| ///////////////////////////// | ||||
|  | ||||
| KPty::KPty() : | ||||
|         d_ptr(new KPtyPrivate(this)) | ||||
| { | ||||
| } | ||||
|  | ||||
| KPty::KPty(KPtyPrivate *d) : | ||||
|         d_ptr(d) | ||||
| { | ||||
|     d_ptr->q_ptr = this; | ||||
| } | ||||
|  | ||||
| KPty::~KPty() | ||||
| { | ||||
|     close(); | ||||
|     delete d_ptr; | ||||
| } | ||||
|  | ||||
| bool KPty::open() | ||||
| { | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     if (d->masterFd >= 0) | ||||
|         return true; | ||||
|  | ||||
|     d->ownMaster = true; | ||||
|  | ||||
|     QByteArray ptyName; | ||||
|  | ||||
|     // Find a master pty that we can open //////////////////////////////// | ||||
|  | ||||
|     // Because not all the pty animals are created equal, they want to | ||||
|     // be opened by several different methods. | ||||
|  | ||||
|     // We try, as we know them, one by one. | ||||
|  | ||||
| #ifdef HAVE_OPENPTY | ||||
|  | ||||
|     char ptsn[PATH_MAX]; | ||||
|     if (::openpty( &d->masterFd, &d->slaveFd, ptsn, 0, 0)) { | ||||
|         d->masterFd = -1; | ||||
|         d->slaveFd = -1; | ||||
|         qWarning(175) << "Can't open a pseudo teletype"; | ||||
|         return false; | ||||
|     } | ||||
|     d->ttyName = ptsn; | ||||
|  | ||||
| #else | ||||
|  | ||||
| #ifdef HAVE__GETPTY // irix | ||||
|  | ||||
|     char *ptsn = _getpty(&d->masterFd, O_RDWR|O_NOCTTY, S_IRUSR|S_IWUSR, 0); | ||||
|     if (ptsn) { | ||||
|         d->ttyName = ptsn; | ||||
|         goto grantedpt; | ||||
|     } | ||||
|  | ||||
| #elif defined(HAVE_PTSNAME) || defined(TIOCGPTN) | ||||
|  | ||||
| #ifdef HAVE_POSIX_OPENPT | ||||
|     d->masterFd = ::posix_openpt(O_RDWR|O_NOCTTY); | ||||
| #elif defined(HAVE_GETPT) | ||||
|     d->masterFd = ::getpt(); | ||||
| #elif defined(PTM_DEVICE) | ||||
|     d->masterFd = ::open(PTM_DEVICE, O_RDWR|O_NOCTTY); | ||||
| #else | ||||
| # error No method to open a PTY master detected. | ||||
| #endif | ||||
|     if (d->masterFd >= 0) { | ||||
| #ifdef HAVE_PTSNAME | ||||
|         char *ptsn = ptsname(d->masterFd); | ||||
|         if (ptsn) { | ||||
|             d->ttyName = ptsn; | ||||
| #else | ||||
|     int ptyno; | ||||
|     if (!ioctl(d->masterFd, TIOCGPTN, &ptyno)) { | ||||
|         d->ttyName = QByteArray("/dev/pts/") + QByteArray::number(ptyno); | ||||
| #endif | ||||
| #ifdef HAVE_GRANTPT | ||||
|             if (!grantpt(d->masterFd)) { | ||||
|                 goto grantedpt; | ||||
|             } | ||||
| #else | ||||
|  | ||||
|     goto gotpty; | ||||
| #endif | ||||
|         } | ||||
|         ::close(d->masterFd); | ||||
|         d->masterFd = -1; | ||||
|     } | ||||
| #endif // HAVE_PTSNAME || TIOCGPTN | ||||
|  | ||||
|     // Linux device names, FIXME: Trouble on other systems? | ||||
|     for (const char * s3 = "pqrstuvwxyzabcde"; *s3; s3++) { | ||||
|         for (const char * s4 = "0123456789abcdef"; *s4; s4++) { | ||||
|             ptyName = QString().sprintf("/dev/pty%c%c", *s3, *s4).toLatin1(); | ||||
|             d->ttyName = QString().sprintf("/dev/tty%c%c", *s3, *s4).toLatin1(); | ||||
|  | ||||
|             d->masterFd = ::open(ptyName.data(), O_RDWR); | ||||
|             if (d->masterFd >= 0) { | ||||
| #ifdef Q_OS_SOLARIS | ||||
|                 /* Need to check the process group of the pty. | ||||
|                  * If it exists, then the slave pty is in use, | ||||
|                  * and we need to get another one. | ||||
|                  */ | ||||
|                 int pgrp_rtn; | ||||
|                 if (ioctl(d->masterFd, TIOCGPGRP, &pgrp_rtn) == 0 || errno != EIO) { | ||||
|                     ::close(d->masterFd); | ||||
|                     d->masterFd = -1; | ||||
|                     continue; | ||||
|                 } | ||||
| #endif /* Q_OS_SOLARIS */ | ||||
|                 if (!access(d->ttyName.data(),R_OK|W_OK)) { // checks availability based on permission bits | ||||
|                     if (!geteuid()) { | ||||
|                         struct group * p = getgrnam(TTY_GROUP); | ||||
|                         if (!p) { | ||||
|                             p = getgrnam("wheel"); | ||||
|                         } | ||||
|                         gid_t gid = p ? p->gr_gid : getgid (); | ||||
|  | ||||
|                         if (!chown(d->ttyName.data(), getuid(), gid)) { | ||||
|                             chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IWGRP); | ||||
|                         } | ||||
|                     } | ||||
|                     goto gotpty; | ||||
|                 } | ||||
|                 ::close(d->masterFd); | ||||
|                 d->masterFd = -1; | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     qWarning() << "Can't open a pseudo teletype"; | ||||
|     return false; | ||||
|  | ||||
| gotpty: | ||||
|     struct stat st; | ||||
|     if (stat(d->ttyName.data(), &st)) { | ||||
|         return false; // this just cannot happen ... *cough*  Yeah right, I just | ||||
|         // had it happen when pty #349 was allocated.  I guess | ||||
|         // there was some sort of leak?  I only had a few open. | ||||
|     } | ||||
|     if (((st.st_uid != getuid()) || | ||||
|             (st.st_mode & (S_IRGRP|S_IXGRP|S_IROTH|S_IWOTH|S_IXOTH))) && | ||||
|             !d->chownpty(true)) { | ||||
|         qWarning() | ||||
|         << "chownpty failed for device " << ptyName << "::" << d->ttyName | ||||
|         << "\nThis means the communication can be eavesdropped." << endl; | ||||
|     } | ||||
|  | ||||
| #if defined (HAVE__GETPTY) || defined (HAVE_GRANTPT) | ||||
| grantedpt: | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_REVOKE | ||||
|     revoke(d->ttyName.data()); | ||||
| #endif | ||||
|  | ||||
| #ifdef HAVE_UNLOCKPT | ||||
|     unlockpt(d->masterFd); | ||||
| #elif defined(TIOCSPTLCK) | ||||
|     int flag = 0; | ||||
|     ioctl(d->masterFd, TIOCSPTLCK, &flag); | ||||
| #endif | ||||
|  | ||||
|     d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); | ||||
|     if (d->slaveFd < 0) { | ||||
|         qWarning() << "Can't open slave pseudo teletype"; | ||||
|         ::close(d->masterFd); | ||||
|         d->masterFd = -1; | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
| #if (defined(__svr4__) || defined(__sgi__)) | ||||
|     // Solaris | ||||
|     ioctl(d->slaveFd, I_PUSH, "ptem"); | ||||
|     ioctl(d->slaveFd, I_PUSH, "ldterm"); | ||||
| #endif | ||||
|  | ||||
| #endif /* HAVE_OPENPTY */ | ||||
|  | ||||
|     fcntl(d->masterFd, F_SETFD, FD_CLOEXEC); | ||||
|     fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool KPty::open(int fd) | ||||
| { | ||||
| #if !defined(HAVE_PTSNAME) && !defined(TIOCGPTN) | ||||
|      qWarning() << "Unsupported attempt to open pty with fd" << fd; | ||||
|      return false; | ||||
| #else | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     if (d->masterFd >= 0) { | ||||
|         qWarning() << "Attempting to open an already open pty"; | ||||
|          return false; | ||||
|     } | ||||
|  | ||||
|     d->ownMaster = false; | ||||
|  | ||||
| # ifdef HAVE_PTSNAME | ||||
|     char *ptsn = ptsname(fd); | ||||
|     if (ptsn) { | ||||
|         d->ttyName = ptsn; | ||||
| # else | ||||
|     int ptyno; | ||||
|     if (!ioctl(fd, TIOCGPTN, &ptyno)) { | ||||
|         char buf[32]; | ||||
|         sprintf(buf, "/dev/pts/%d", ptyno); | ||||
|         d->ttyName = buf; | ||||
| # endif | ||||
|     } else { | ||||
|         qWarning() << "Failed to determine pty slave device for fd" << fd; | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     d->masterFd = fd; | ||||
|     if (!openSlave()) { | ||||
|  | ||||
|         d->masterFd = -1; | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     return true; | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void KPty::closeSlave() | ||||
| { | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     if (d->slaveFd < 0) { | ||||
|         return; | ||||
|     } | ||||
|     ::close(d->slaveFd); | ||||
|     d->slaveFd = -1; | ||||
| } | ||||
|  | ||||
| bool KPty::openSlave() | ||||
| { | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     if (d->slaveFd >= 0) | ||||
| 	return true; | ||||
|     if (d->masterFd < 0) { | ||||
| 	qDebug() << "Attempting to open pty slave while master is closed"; | ||||
| 	return false; | ||||
|     } | ||||
|     //d->slaveFd = KDE_open(d->ttyName.data(), O_RDWR | O_NOCTTY); | ||||
|     d->slaveFd = ::open(d->ttyName.data(), O_RDWR | O_NOCTTY); | ||||
|     if (d->slaveFd < 0) { | ||||
| 	qDebug() << "Can't open slave pseudo teletype"; | ||||
| 	return false; | ||||
|     } | ||||
|     fcntl(d->slaveFd, F_SETFD, FD_CLOEXEC); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void KPty::close() | ||||
| { | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     if (d->masterFd < 0) { | ||||
|         return; | ||||
|     } | ||||
|     closeSlave(); | ||||
|     // don't bother resetting unix98 pty, it will go away after closing master anyway. | ||||
|     if (memcmp(d->ttyName.data(), "/dev/pts/", 9)) { | ||||
|         if (!geteuid()) { | ||||
|             struct stat st; | ||||
|             if (!stat(d->ttyName.data(), &st)) { | ||||
|                 chown(d->ttyName.data(), 0, st.st_gid == getgid() ? 0 : -1); | ||||
|                 chmod(d->ttyName.data(), S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH); | ||||
|             } | ||||
|         } else { | ||||
|             fcntl(d->masterFd, F_SETFD, 0); | ||||
|             d->chownpty(false); | ||||
|         } | ||||
|     } | ||||
|     ::close(d->masterFd); | ||||
|     d->masterFd = -1; | ||||
| } | ||||
|  | ||||
| void KPty::setCTty() | ||||
| { | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     // Setup job control ////////////////////////////////// | ||||
|  | ||||
|     // Become session leader, process group leader, | ||||
|     // and get rid of the old controlling terminal. | ||||
|     setsid(); | ||||
|  | ||||
|     // make our slave pty the new controlling terminal. | ||||
| #ifdef TIOCSCTTY | ||||
|     ioctl(d->slaveFd, TIOCSCTTY, 0); | ||||
| #else | ||||
|     // __svr4__ hack: the first tty opened after setsid() becomes controlling tty | ||||
|     ::close(::open(d->ttyName, O_WRONLY, 0)); | ||||
| #endif | ||||
|  | ||||
|     // make our new process group the foreground group on the pty | ||||
|     int pgrp = getpid(); | ||||
| #if defined(_POSIX_VERSION) || defined(__svr4__) | ||||
|     tcsetpgrp(d->slaveFd, pgrp); | ||||
| #elif defined(TIOCSPGRP) | ||||
|     ioctl(d->slaveFd, TIOCSPGRP, (char *)&pgrp); | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void KPty::login(const char * user, const char * remotehost) | ||||
| { | ||||
| #ifdef HAVE_UTEMPTER | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     addToUtmp(d->ttyName, remotehost, d->masterFd); | ||||
|     Q_UNUSED(user); | ||||
| #else | ||||
| # ifdef HAVE_UTMPX | ||||
|     struct utmpx l_struct; | ||||
| # else | ||||
|     struct utmp l_struct; | ||||
| # endif | ||||
|     memset(&l_struct, 0, sizeof(l_struct)); | ||||
|     // note: strncpy without terminators _is_ correct here. man 4 utmp | ||||
|  | ||||
|     if (user) { | ||||
|         strncpy(l_struct.ut_name, user, sizeof(l_struct.ut_name)); | ||||
|     } | ||||
|  | ||||
|     if (remotehost) { | ||||
|         strncpy(l_struct.ut_host, remotehost, sizeof(l_struct.ut_host)); | ||||
| # ifdef HAVE_STRUCT_UTMP_UT_SYSLEN | ||||
|         l_struct.ut_syslen = qMin(strlen(remotehost), sizeof(l_struct.ut_host)); | ||||
| # endif | ||||
|     } | ||||
|  | ||||
| # ifndef __GLIBC__ | ||||
|     Q_D(KPty); | ||||
|     const char * str_ptr = d->ttyName.data(); | ||||
|     if (!memcmp(str_ptr, "/dev/", 5)) { | ||||
|         str_ptr += 5; | ||||
|     } | ||||
|     strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); | ||||
| #  ifdef HAVE_STRUCT_UTMP_UT_ID | ||||
|     strncpy(l_struct.ut_id, | ||||
|             str_ptr + strlen(str_ptr) - sizeof(l_struct.ut_id), | ||||
|             sizeof(l_struct.ut_id)); | ||||
| #  endif | ||||
| # endif | ||||
|  | ||||
| # ifdef HAVE_UTMPX | ||||
|     gettimeofday(&l_struct.ut_tv, 0); | ||||
| # else | ||||
|     l_struct.ut_time = time(0); | ||||
| # endif | ||||
|  | ||||
| # ifdef HAVE_LOGIN | ||||
| #  ifdef HAVE_LOGINX | ||||
|     ::loginx(&l_struct); | ||||
| #  else | ||||
|     ::login(&l_struct); | ||||
| #  endif | ||||
| # else | ||||
| #  ifdef HAVE_STRUCT_UTMP_UT_TYPE | ||||
|     l_struct.ut_type = USER_PROCESS; | ||||
| #  endif | ||||
| #  ifdef HAVE_STRUCT_UTMP_UT_PID | ||||
|     l_struct.ut_pid = getpid(); | ||||
| #   ifdef HAVE_STRUCT_UTMP_UT_SESSION | ||||
|     l_struct.ut_session = getsid(0); | ||||
| #   endif | ||||
| #  endif | ||||
| #  ifdef HAVE_UTMPX | ||||
|     utmpxname(_PATH_UTMPX); | ||||
|     setutxent(); | ||||
|     pututxline(&l_struct); | ||||
|     endutxent(); | ||||
| #   ifdef HAVE_UPDWTMPX | ||||
|     updwtmpx(_PATH_WTMPX, &l_struct); | ||||
| #   endif | ||||
| #  else | ||||
|     utmpname(_PATH_UTMP); | ||||
|     setutent(); | ||||
|     pututline(&l_struct); | ||||
|     endutent(); | ||||
|     updwtmp(_PATH_WTMP, &l_struct); | ||||
| #  endif | ||||
| # endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
| void KPty::logout() | ||||
| { | ||||
| #ifdef HAVE_UTEMPTER | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     removeLineFromUtmp(d->ttyName, d->masterFd); | ||||
| #else | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     const char *str_ptr = d->ttyName.data(); | ||||
|     if (!memcmp(str_ptr, "/dev/", 5)) { | ||||
|         str_ptr += 5; | ||||
|     } | ||||
| # ifdef __GLIBC__ | ||||
|     else { | ||||
|         const char * sl_ptr = strrchr(str_ptr, '/'); | ||||
|         if (sl_ptr) { | ||||
|             str_ptr = sl_ptr + 1; | ||||
|         } | ||||
|     } | ||||
| # endif | ||||
| # ifdef HAVE_LOGIN | ||||
| #  ifdef HAVE_LOGINX | ||||
|     ::logoutx(str_ptr, 0, DEAD_PROCESS); | ||||
| #  else | ||||
|     ::logout(str_ptr); | ||||
| #  endif | ||||
| # else | ||||
| #  ifdef HAVE_UTMPX | ||||
|     struct utmpx l_struct, *ut; | ||||
| #  else | ||||
|     struct utmp l_struct, *ut; | ||||
| #  endif | ||||
|     memset(&l_struct, 0, sizeof(l_struct)); | ||||
|  | ||||
|     strncpy(l_struct.ut_line, str_ptr, sizeof(l_struct.ut_line)); | ||||
|  | ||||
| #  ifdef HAVE_UTMPX | ||||
|     utmpxname(_PATH_UTMPX); | ||||
|     setutxent(); | ||||
|     if ((ut = getutxline(&l_struct))) { | ||||
| #  else | ||||
|     utmpname(_PATH_UTMP); | ||||
|     setutent(); | ||||
|     if ((ut = getutline(&l_struct))) { | ||||
| #  endif | ||||
|         memset(ut->ut_name, 0, sizeof(*ut->ut_name)); | ||||
|         memset(ut->ut_host, 0, sizeof(*ut->ut_host)); | ||||
| #  ifdef HAVE_STRUCT_UTMP_UT_SYSLEN | ||||
|         ut->ut_syslen = 0; | ||||
| #  endif | ||||
| #  ifdef HAVE_STRUCT_UTMP_UT_TYPE | ||||
|         ut->ut_type = DEAD_PROCESS; | ||||
| #  endif | ||||
| #  ifdef HAVE_UTMPX | ||||
|         gettimeofday(&ut->ut_tv, 0); | ||||
|         pututxline(ut); | ||||
|     } | ||||
|     endutxent(); | ||||
| #  else | ||||
|     ut->ut_time = time(0); | ||||
|     pututline(ut); | ||||
| } | ||||
| endutent(); | ||||
| #  endif | ||||
| # endif | ||||
| #endif | ||||
| } | ||||
|  | ||||
| // XXX Supposedly, tc[gs]etattr do not work with the master on Solaris. | ||||
| // Please verify. | ||||
|  | ||||
| bool KPty::tcGetAttr(struct ::termios * ttmode) const | ||||
| { | ||||
|     Q_D(const KPty); | ||||
|  | ||||
|     return _tcgetattr(d->masterFd, ttmode) == 0; | ||||
| } | ||||
|  | ||||
| bool KPty::tcSetAttr(struct ::termios * ttmode) | ||||
| { | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     return _tcsetattr(d->masterFd, ttmode) == 0; | ||||
| } | ||||
|  | ||||
| bool KPty::setWinSize(int lines, int columns) | ||||
| { | ||||
|     Q_D(KPty); | ||||
|  | ||||
|     struct winsize winSize; | ||||
|     memset(&winSize, 0, sizeof(winSize)); | ||||
|     winSize.ws_row = (unsigned short)lines; | ||||
|     winSize.ws_col = (unsigned short)columns; | ||||
|     return ioctl(d->masterFd, TIOCSWINSZ, (char *)&winSize) == 0; | ||||
| } | ||||
|  | ||||
| bool KPty::setEcho(bool echo) | ||||
| { | ||||
|     struct ::termios ttmode; | ||||
|     if (!tcGetAttr(&ttmode)) { | ||||
|         return false; | ||||
|     } | ||||
|     if (!echo) { | ||||
|         ttmode.c_lflag &= ~ECHO; | ||||
|     } else { | ||||
|         ttmode.c_lflag |= ECHO; | ||||
|     } | ||||
|     return tcSetAttr(&ttmode); | ||||
| } | ||||
|  | ||||
| const char * KPty::ttyName() const | ||||
| { | ||||
|     Q_D(const KPty); | ||||
|  | ||||
|     return d->ttyName.data(); | ||||
| } | ||||
|  | ||||
| int KPty::masterFd() const | ||||
| { | ||||
|     Q_D(const KPty); | ||||
|  | ||||
|     return d->masterFd; | ||||
| } | ||||
|  | ||||
| int KPty::slaveFd() const | ||||
| { | ||||
|     Q_D(const KPty); | ||||
|  | ||||
|     return d->slaveFd; | ||||
| } | ||||
							
								
								
									
										191
									
								
								konsole-qml-plugin/src/kpty.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										191
									
								
								konsole-qml-plugin/src/kpty.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,191 @@ | ||||
| /* This file is part of the KDE libraries | ||||
|  | ||||
|     Copyright (C) 2003,2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 | ||||
|  | ||||
|     This library is free software; you can redistribute it and/or | ||||
|     modify it under the terms of the GNU Library General Public | ||||
|     License as published by the Free Software Foundation; either | ||||
|     version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This library 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 | ||||
|     Library General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Library General Public License | ||||
|     along with this library; see the file COPYING.LIB.  If not, write to | ||||
|     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|     Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #ifndef kpty_h | ||||
| #define kpty_h | ||||
|  | ||||
| #include <QtCore> | ||||
|  | ||||
| struct KPtyPrivate; | ||||
| struct termios; | ||||
|  | ||||
| /** | ||||
|  * Provides primitives for opening & closing a pseudo TTY pair, assigning the | ||||
|  * controlling TTY, utmp registration and setting various terminal attributes. | ||||
|  */ | ||||
| class KPty { | ||||
|     Q_DECLARE_PRIVATE(KPty) | ||||
|  | ||||
| public: | ||||
|  | ||||
|     /** | ||||
|      * Constructor | ||||
|      */ | ||||
|     KPty(); | ||||
|  | ||||
|     /** | ||||
|      * Destructor: | ||||
|      * | ||||
|      *  If the pty is still open, it will be closed. Note, however, that | ||||
|      *  an utmp registration is @em not undone. | ||||
|     */ | ||||
|     ~KPty(); | ||||
|  | ||||
|     /** | ||||
|      * Create a pty master/slave pair. | ||||
|      * | ||||
|      * @return true if a pty pair was successfully opened | ||||
|      */ | ||||
|     bool open(); | ||||
|  | ||||
|     bool open(int fd); | ||||
|  | ||||
|     /** | ||||
|      * Close the pty master/slave pair. | ||||
|      */ | ||||
|     void close(); | ||||
|  | ||||
|     /** | ||||
|      * Close the pty slave descriptor. | ||||
|      * | ||||
|      * When creating the pty, KPty also opens the slave and keeps it open. | ||||
|      * Consequently the master will never receive an EOF notification. | ||||
|      * Usually this is the desired behavior, as a closed pty slave can be | ||||
|      * reopened any time - unlike a pipe or socket. However, in some cases | ||||
|      * pipe-alike behavior might be desired. | ||||
|      * | ||||
|      * After this function was called, slaveFd() and setCTty() cannot be | ||||
|      * used. | ||||
|      */ | ||||
|     void closeSlave(); | ||||
|     bool openSlave(); | ||||
|  | ||||
|     /** | ||||
|      * Creates a new session and process group and makes this pty the | ||||
|      * controlling tty. | ||||
|      */ | ||||
|     void setCTty(); | ||||
|  | ||||
|     /** | ||||
|      * Creates an utmp entry for the tty. | ||||
|      * This function must be called after calling setCTty and | ||||
|      * making this pty the stdin. | ||||
|      * @param user the user to be logged on | ||||
|      * @param remotehost the host from which the login is coming. This is | ||||
|      *  @em not the local host. For remote logins it should be the hostname | ||||
|      *  of the client. For local logins from inside an X session it should | ||||
|      *  be the name of the X display. Otherwise it should be empty. | ||||
|      */ | ||||
|     void login(const char * user = 0, const char * remotehost = 0); | ||||
|  | ||||
|     /** | ||||
|      * Removes the utmp entry for this tty. | ||||
|      */ | ||||
|     void logout(); | ||||
|  | ||||
|     /** | ||||
|      * Wrapper around tcgetattr(3). | ||||
|      * | ||||
|      * This function can be used only while the PTY is open. | ||||
|      * You will need an #include <termios.h> to do anything useful | ||||
|      * with it. | ||||
|      * | ||||
|      * @param ttmode a pointer to a termios structure. | ||||
|      *  Note: when declaring ttmode, @c struct @c ::termios must be used - | ||||
|      *  without the '::' some version of HP-UX thinks, this declares | ||||
|      *  the struct in your class, in your method. | ||||
|      * @return @c true on success, false otherwise | ||||
|      */ | ||||
|     bool tcGetAttr(struct ::termios * ttmode) const; | ||||
|  | ||||
|     /** | ||||
|      * Wrapper around tcsetattr(3) with mode TCSANOW. | ||||
|      * | ||||
|      * This function can be used only while the PTY is open. | ||||
|      * | ||||
|      * @param ttmode a pointer to a termios structure. | ||||
|      * @return @c true on success, false otherwise. Note that success means | ||||
|      *  that @em at @em least @em one attribute could be set. | ||||
|      */ | ||||
|     bool tcSetAttr(struct ::termios * ttmode); | ||||
|  | ||||
|     /** | ||||
|      * Change the logical (screen) size of the pty. | ||||
|      * The default is 24 lines by 80 columns. | ||||
|      * | ||||
|      * This function can be used only while the PTY is open. | ||||
|      * | ||||
|      * @param lines the number of rows | ||||
|      * @param columns the number of columns | ||||
|      * @return @c true on success, false otherwise | ||||
|      */ | ||||
|     bool setWinSize(int lines, int columns); | ||||
|  | ||||
|     /** | ||||
|      * Set whether the pty should echo input. | ||||
|      * | ||||
|      * Echo is on by default. | ||||
|      * If the output of automatically fed (non-interactive) PTY clients | ||||
|      * needs to be parsed, disabling echo often makes it much simpler. | ||||
|      * | ||||
|      * This function can be used only while the PTY is open. | ||||
|      * | ||||
|      * @param echo true if input should be echoed. | ||||
|      * @return @c true on success, false otherwise | ||||
|      */ | ||||
|     bool setEcho(bool echo); | ||||
|  | ||||
|     /** | ||||
|      * @return the name of the slave pty device. | ||||
|      * | ||||
|      * This function should be called only while the pty is open. | ||||
|      */ | ||||
|     const char * ttyName() const; | ||||
|  | ||||
|     /** | ||||
|      * @return the file descriptor of the master pty | ||||
|      * | ||||
|      * This function should be called only while the pty is open. | ||||
|      */ | ||||
|     int masterFd() const; | ||||
|  | ||||
|     /** | ||||
|      * @return the file descriptor of the slave pty | ||||
|      * | ||||
|      * This function should be called only while the pty slave is open. | ||||
|      */ | ||||
|     int slaveFd() const; | ||||
|  | ||||
| protected: | ||||
|     /** | ||||
|      * @internal | ||||
|      */ | ||||
|     KPty(KPtyPrivate * d); | ||||
|  | ||||
|     /** | ||||
|      * @internal | ||||
|      */ | ||||
|     KPtyPrivate * const d_ptr; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										50
									
								
								konsole-qml-plugin/src/kpty_p.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								konsole-qml-plugin/src/kpty_p.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | ||||
| /* This file is part of the KDE libraries | ||||
|  | ||||
|     Copyright (C) 2003,2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     Rewritten for QT4 by e_k <e_k at users.sourceforge.net>, Copyright (C)2008 | ||||
|  | ||||
|     This library is free software; you can redistribute it and/or | ||||
|     modify it under the terms of the GNU Library General Public | ||||
|     License as published by the Free Software Foundation; either | ||||
|     version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This library 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 | ||||
|     Library General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Library General Public License | ||||
|     along with this library; see the file COPYING.LIB.  If not, write to | ||||
|     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|     Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #ifndef kpty_p_h | ||||
| #define kpty_p_h | ||||
|  | ||||
| #include "kpty.h" | ||||
|  | ||||
| #include <QtCore/QByteArray> | ||||
|  | ||||
| struct KPtyPrivate { | ||||
|  | ||||
|     Q_DECLARE_PUBLIC(KPty) | ||||
|  | ||||
|     KPtyPrivate(KPty* parent); | ||||
|     virtual ~KPtyPrivate(); | ||||
|  | ||||
| #ifndef HAVE_OPENPTY | ||||
|     bool chownpty(bool grant); | ||||
| #endif | ||||
|  | ||||
|     int masterFd; | ||||
|     int slaveFd; | ||||
|     bool ownMaster:1; | ||||
|  | ||||
|     QByteArray ttyName; | ||||
|  | ||||
|     KPty *q_ptr; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										422
									
								
								konsole-qml-plugin/src/kptydevice.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										422
									
								
								konsole-qml-plugin/src/kptydevice.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,422 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|  | ||||
|    This file is part of the KDE libraries | ||||
|    Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|    Copyright (C) 2010 KDE e.V. <kde-ev-board@kde.org> | ||||
|      Author Adriaan de Groot <groot@kde.org> | ||||
|  | ||||
|    This library is free software; you can redistribute it and/or | ||||
|    modify it under the terms of the GNU Library General Public | ||||
|    License as published by the Free Software Foundation; either | ||||
|    version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|    This library 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 | ||||
|    Library General Public License for more details. | ||||
|  | ||||
|    You should have received a copy of the GNU Library General Public License | ||||
|    along with this library; see the file COPYING.LIB.  If not, write to | ||||
|    the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|    Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #include "kptydevice.h" | ||||
| #include "kpty_p.h" | ||||
|  | ||||
| #include <QSocketNotifier> | ||||
|  | ||||
| #include <unistd.h> | ||||
| #include <errno.h> | ||||
| #include <signal.h> | ||||
| #include <termios.h> | ||||
| #include <fcntl.h> | ||||
| #include <sys/ioctl.h> | ||||
| #ifdef HAVE_SYS_FILIO_H | ||||
| # include <sys/filio.h> | ||||
| #endif | ||||
| #ifdef HAVE_SYS_TIME_H | ||||
| # include <sys/time.h> | ||||
| #endif | ||||
|  | ||||
| #if defined(Q_OS_FREEBSD) || defined(Q_OS_MAC) | ||||
|   // "the other end's output queue size" - kinda braindead, huh? | ||||
| # define PTY_BYTES_AVAILABLE TIOCOUTQ | ||||
| #elif defined(TIOCINQ) | ||||
|   // "our end's input queue size" | ||||
| # define PTY_BYTES_AVAILABLE TIOCINQ | ||||
| #else | ||||
|   // likewise. more generic ioctl (theoretically) | ||||
| # define PTY_BYTES_AVAILABLE FIONREAD | ||||
| #endif | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| ////////////////// | ||||
| // private data // | ||||
| ////////////////// | ||||
|  | ||||
| // Lifted from Qt. I don't think they would mind. ;) | ||||
| // Re-lift again from Qt whenever a proper replacement for pthread_once appears | ||||
| static void qt_ignore_sigpipe() | ||||
| { | ||||
|     static QBasicAtomicInt atom = Q_BASIC_ATOMIC_INITIALIZER(0); | ||||
|     if (atom.testAndSetRelaxed(0, 1)) { | ||||
|         struct sigaction noaction; | ||||
|         memset(&noaction, 0, sizeof(noaction)); | ||||
|         noaction.sa_handler = SIG_IGN; | ||||
|         sigaction(SIGPIPE, &noaction, 0); | ||||
|     } | ||||
| } | ||||
|  | ||||
| #define NO_INTR(ret,func) do { ret = func; } while (ret < 0 && errno == EINTR) | ||||
|  | ||||
| bool KPtyDevicePrivate::_k_canRead() | ||||
| { | ||||
|     Q_Q(KPtyDevice); | ||||
|     qint64 readBytes = 0; | ||||
|  | ||||
| #ifdef Q_OS_IRIX // this should use a config define, but how to check it? | ||||
|     size_t available; | ||||
| #else | ||||
|     int available; | ||||
| #endif | ||||
|     if (!::ioctl(q->masterFd(), PTY_BYTES_AVAILABLE, (char *) &available)) { | ||||
| #ifdef Q_OS_SOLARIS | ||||
|         // A Pty is a STREAMS module, and those can be activated | ||||
|         // with 0 bytes available. This happens either when ^C is | ||||
|         // pressed, or when an application does an explicit write(a,b,0) | ||||
|         // which happens in experiments fairly often. When 0 bytes are | ||||
|         // available, you must read those 0 bytes to clear the STREAMS | ||||
|         // module, but we don't want to hit the !readBytes case further down. | ||||
|         if (!available) { | ||||
|             char c; | ||||
|             // Read the 0-byte STREAMS message | ||||
|             NO_INTR(readBytes, read(q->masterFd(), &c, 0)); | ||||
|             // Should return 0 bytes read; -1 is error | ||||
|             if (readBytes < 0) { | ||||
|                 readNotifier->setEnabled(false); | ||||
|                 emit q->readEof(); | ||||
|                 return false; | ||||
|             } | ||||
|             return true; | ||||
|         } | ||||
| #endif | ||||
|  | ||||
|         char *ptr = readBuffer.reserve(available); | ||||
| #ifdef Q_OS_SOLARIS | ||||
|         // Even if available > 0, it is possible for read() | ||||
|         // to return 0 on Solaris, due to 0-byte writes in the stream. | ||||
|         // Ignore them and keep reading until we hit *some* data. | ||||
|         // In Solaris it is possible to have 15 bytes available | ||||
|         // and to (say) get 0, 0, 6, 0 and 9 bytes in subsequent reads. | ||||
|         // Because the stream is set to O_NONBLOCK in finishOpen(), | ||||
|         // an EOF read will return -1. | ||||
|         readBytes = 0; | ||||
|         while (!readBytes) | ||||
| #endif | ||||
|         // Useless block braces except in Solaris | ||||
|         { | ||||
|           NO_INTR(readBytes, read(q->masterFd(), ptr, available)); | ||||
|         } | ||||
|         if (readBytes < 0) { | ||||
|             readBuffer.unreserve(available); | ||||
|             q->setErrorString("Error reading from PTY"); | ||||
|             return false; | ||||
|         } | ||||
|         readBuffer.unreserve(available - readBytes); // *should* be a no-op | ||||
|     } | ||||
|  | ||||
|     if (!readBytes) { | ||||
|         readNotifier->setEnabled(false); | ||||
|         emit q->readEof(); | ||||
|         return false; | ||||
|     } else { | ||||
|         if (!emittedReadyRead) { | ||||
|             emittedReadyRead = true; | ||||
|             emit q->readyRead(); | ||||
|             emittedReadyRead = false; | ||||
|         } | ||||
|         return true; | ||||
|     } | ||||
| } | ||||
|  | ||||
| bool KPtyDevicePrivate::_k_canWrite() | ||||
| { | ||||
|     Q_Q(KPtyDevice); | ||||
|  | ||||
|     writeNotifier->setEnabled(false); | ||||
|     if (writeBuffer.isEmpty()) | ||||
|         return false; | ||||
|  | ||||
|     qt_ignore_sigpipe(); | ||||
|     int wroteBytes; | ||||
|     NO_INTR(wroteBytes, | ||||
|             write(q->masterFd(), | ||||
|                   writeBuffer.readPointer(), writeBuffer.readSize())); | ||||
|     if (wroteBytes < 0) { | ||||
|         q->setErrorString("Error writing to PTY"); | ||||
|         return false; | ||||
|     } | ||||
|     writeBuffer.free(wroteBytes); | ||||
|  | ||||
|     if (!emittedBytesWritten) { | ||||
|         emittedBytesWritten = true; | ||||
|         emit q->bytesWritten(wroteBytes); | ||||
|         emittedBytesWritten = false; | ||||
|     } | ||||
|  | ||||
|     if (!writeBuffer.isEmpty()) | ||||
|         writeNotifier->setEnabled(true); | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| #ifndef timeradd | ||||
| // Lifted from GLIBC | ||||
| # define timeradd(a, b, result) \ | ||||
|     do { \ | ||||
|         (result)->tv_sec = (a)->tv_sec + (b)->tv_sec; \ | ||||
|         (result)->tv_usec = (a)->tv_usec + (b)->tv_usec; \ | ||||
|         if ((result)->tv_usec >= 1000000) { \ | ||||
|             ++(result)->tv_sec; \ | ||||
|             (result)->tv_usec -= 1000000; \ | ||||
|         } \ | ||||
|     } while (0) | ||||
| # define timersub(a, b, result) \ | ||||
|     do { \ | ||||
|         (result)->tv_sec = (a)->tv_sec - (b)->tv_sec; \ | ||||
|         (result)->tv_usec = (a)->tv_usec - (b)->tv_usec; \ | ||||
|         if ((result)->tv_usec < 0) { \ | ||||
|             --(result)->tv_sec; \ | ||||
|             (result)->tv_usec += 1000000; \ | ||||
|         } \ | ||||
|     } while (0) | ||||
| #endif | ||||
|  | ||||
| bool KPtyDevicePrivate::doWait(int msecs, bool reading) | ||||
| { | ||||
|     Q_Q(KPtyDevice); | ||||
| #ifndef __linux__ | ||||
|     struct timeval etv; | ||||
| #endif | ||||
|     struct timeval tv, *tvp; | ||||
|  | ||||
|     if (msecs < 0) | ||||
|         tvp = 0; | ||||
|     else { | ||||
|         tv.tv_sec = msecs / 1000; | ||||
|         tv.tv_usec = (msecs % 1000) * 1000; | ||||
| #ifndef __linux__ | ||||
|         gettimeofday(&etv, 0); | ||||
|         timeradd(&tv, &etv, &etv); | ||||
| #endif | ||||
|         tvp = &tv; | ||||
|     } | ||||
|  | ||||
|     while (reading ? readNotifier->isEnabled() : !writeBuffer.isEmpty()) { | ||||
|         fd_set rfds; | ||||
|         fd_set wfds; | ||||
|  | ||||
|         FD_ZERO(&rfds); | ||||
|         FD_ZERO(&wfds); | ||||
|  | ||||
|         if (readNotifier->isEnabled()) | ||||
|             FD_SET(q->masterFd(), &rfds); | ||||
|         if (!writeBuffer.isEmpty()) | ||||
|             FD_SET(q->masterFd(), &wfds); | ||||
|  | ||||
| #ifndef __linux__ | ||||
|         if (tvp) { | ||||
|             gettimeofday(&tv, 0); | ||||
|             timersub(&etv, &tv, &tv); | ||||
|             if (tv.tv_sec < 0) | ||||
|                 tv.tv_sec = tv.tv_usec = 0; | ||||
|         } | ||||
| #endif | ||||
|  | ||||
|         switch (select(q->masterFd() + 1, &rfds, &wfds, 0, tvp)) { | ||||
|         case -1: | ||||
|             if (errno == EINTR) | ||||
|                 break; | ||||
|             return false; | ||||
|         case 0: | ||||
|             q->setErrorString("PTY operation timed out"); | ||||
|             return false; | ||||
|         default: | ||||
|             if (FD_ISSET(q->masterFd(), &rfds)) { | ||||
|                 bool canRead = _k_canRead(); | ||||
|                 if (reading && canRead) | ||||
|                     return true; | ||||
|             } | ||||
|             if (FD_ISSET(q->masterFd(), &wfds)) { | ||||
|                 bool canWrite = _k_canWrite(); | ||||
|                 if (!reading) | ||||
|                     return canWrite; | ||||
|             } | ||||
|             break; | ||||
|         } | ||||
|     } | ||||
|     return false; | ||||
| } | ||||
|  | ||||
| void KPtyDevicePrivate::finishOpen(QIODevice::OpenMode mode) | ||||
| { | ||||
|     Q_Q(KPtyDevice); | ||||
|  | ||||
|     q->QIODevice::open(mode); | ||||
|     fcntl(q->masterFd(), F_SETFL, O_NONBLOCK); | ||||
|     readBuffer.clear(); | ||||
|     readNotifier = new QSocketNotifier(q->masterFd(), QSocketNotifier::Read, q); | ||||
|     writeNotifier = new QSocketNotifier(q->masterFd(), QSocketNotifier::Write, q); | ||||
|     QObject::connect(readNotifier, SIGNAL(activated(int)), q, SLOT(_k_canRead())); | ||||
|     QObject::connect(writeNotifier, SIGNAL(activated(int)), q, SLOT(_k_canWrite())); | ||||
|     readNotifier->setEnabled(true); | ||||
| } | ||||
|  | ||||
| ///////////////////////////// | ||||
| // public member functions // | ||||
| ///////////////////////////// | ||||
|  | ||||
| KPtyDevice::KPtyDevice(QObject *parent) : | ||||
|     QIODevice(parent), | ||||
|     KPty(new KPtyDevicePrivate(this)) | ||||
| { | ||||
| } | ||||
|  | ||||
| KPtyDevice::~KPtyDevice() | ||||
| { | ||||
|     close(); | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::open(OpenMode mode) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|  | ||||
|     if (masterFd() >= 0) | ||||
|         return true; | ||||
|  | ||||
|     if (!KPty::open()) { | ||||
|         setErrorString("Error opening PTY"); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     d->finishOpen(mode); | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::open(int fd, OpenMode mode) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|  | ||||
|     if (!KPty::open(fd)) { | ||||
|         setErrorString("Error opening PTY"); | ||||
|         return false; | ||||
|     } | ||||
|  | ||||
|     d->finishOpen(mode); | ||||
|  | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| void KPtyDevice::close() | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|  | ||||
|     if (masterFd() < 0) | ||||
|         return; | ||||
|  | ||||
|     delete d->readNotifier; | ||||
|     delete d->writeNotifier; | ||||
|  | ||||
|     QIODevice::close(); | ||||
|  | ||||
|     KPty::close(); | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::isSequential() const | ||||
| { | ||||
|     return true; | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::canReadLine() const | ||||
| { | ||||
|     Q_D(const KPtyDevice); | ||||
|     return QIODevice::canReadLine() || d->readBuffer.canReadLine(); | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::atEnd() const | ||||
| { | ||||
|     Q_D(const KPtyDevice); | ||||
|     return QIODevice::atEnd() && d->readBuffer.isEmpty(); | ||||
| } | ||||
|  | ||||
| qint64 KPtyDevice::bytesAvailable() const | ||||
| { | ||||
|     Q_D(const KPtyDevice); | ||||
|     return QIODevice::bytesAvailable() + d->readBuffer.size(); | ||||
| } | ||||
|  | ||||
| qint64 KPtyDevice::bytesToWrite() const | ||||
| { | ||||
|     Q_D(const KPtyDevice); | ||||
|     return d->writeBuffer.size(); | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::waitForReadyRead(int msecs) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|     return d->doWait(msecs, true); | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::waitForBytesWritten(int msecs) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|     return d->doWait(msecs, false); | ||||
| } | ||||
|  | ||||
| void KPtyDevice::setSuspended(bool suspended) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|     d->readNotifier->setEnabled(!suspended); | ||||
| } | ||||
|  | ||||
| bool KPtyDevice::isSuspended() const | ||||
| { | ||||
|     Q_D(const KPtyDevice); | ||||
|     return !d->readNotifier->isEnabled(); | ||||
| } | ||||
|  | ||||
| // protected | ||||
| qint64 KPtyDevice::readData(char *data, qint64 maxlen) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|     return d->readBuffer.read(data, (int)qMin<qint64>(maxlen, KMAXINT)); | ||||
| } | ||||
|  | ||||
| // protected | ||||
| qint64 KPtyDevice::readLineData(char *data, qint64 maxlen) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|     return d->readBuffer.readLine(data, (int)qMin<qint64>(maxlen, KMAXINT)); | ||||
| } | ||||
|  | ||||
| // protected | ||||
| qint64 KPtyDevice::writeData(const char *data, qint64 len) | ||||
| { | ||||
|     Q_D(KPtyDevice); | ||||
|     Q_ASSERT(len <= KMAXINT); | ||||
|  | ||||
|     d->writeBuffer.write(data, len); | ||||
|     d->writeNotifier->setEnabled(true); | ||||
|     return len; | ||||
| } | ||||
							
								
								
									
										360
									
								
								konsole-qml-plugin/src/kptydevice.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										360
									
								
								konsole-qml-plugin/src/kptydevice.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,360 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* This file is part of the KDE libraries | ||||
|  | ||||
|     Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     This library is free software; you can redistribute it and/or | ||||
|     modify it under the terms of the GNU Library General Public | ||||
|     License as published by the Free Software Foundation; either | ||||
|     version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This library 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 | ||||
|     Library General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Library General Public License | ||||
|     along with this library; see the file COPYING.LIB.  If not, write to | ||||
|     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|     Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #ifndef kptydev_h | ||||
| #define kptydev_h | ||||
|  | ||||
| #include "kpty_p.h" | ||||
|  | ||||
| #include <QtCore/QIODevice> | ||||
|  | ||||
| #define KMAXINT ((int)(~0U >> 1)) | ||||
|  | ||||
| struct KPtyDevicePrivate; | ||||
|  | ||||
| #define Q_DECLARE_PRIVATE_MI(Class, SuperClass) \ | ||||
|     inline Class##Private* d_func() { return reinterpret_cast<Class##Private *>(SuperClass::d_ptr); } \ | ||||
|     inline const Class##Private* d_func() const { return reinterpret_cast<const Class##Private *>(SuperClass::d_ptr); } \ | ||||
|     friend class Class##Private; | ||||
|  | ||||
| /** | ||||
|  * Encapsulates KPty into a QIODevice, so it can be used with Q*Stream, etc. | ||||
|  */ | ||||
| class KPtyDevice : public QIODevice, public KPty { | ||||
|     Q_OBJECT | ||||
|     Q_DECLARE_PRIVATE_MI(KPtyDevice, KPty) | ||||
|  | ||||
| public: | ||||
|  | ||||
|     /** | ||||
|      * Constructor | ||||
|      */ | ||||
|     KPtyDevice(QObject *parent = 0); | ||||
|  | ||||
|     /** | ||||
|      * Destructor: | ||||
|      * | ||||
|      *  If the pty is still open, it will be closed. Note, however, that | ||||
|      *  an utmp registration is @em not undone. | ||||
|      */ | ||||
|     virtual ~KPtyDevice(); | ||||
|  | ||||
|     /** | ||||
|      * Create a pty master/slave pair. | ||||
|      * | ||||
|      * @return true if a pty pair was successfully opened | ||||
|      */ | ||||
|     virtual bool open(OpenMode mode = ReadWrite | Unbuffered); | ||||
|  | ||||
|     /** | ||||
|      * Open using an existing pty master. The ownership of the fd | ||||
|      * remains with the caller, i.e., close() will not close the fd. | ||||
|      * | ||||
|      * This is useful if you wish to attach a secondary "controller" to an | ||||
|      * existing pty device such as a terminal widget. | ||||
|      * Note that you will need to use setSuspended() on both devices to | ||||
|      * control which one gets the incoming data from the pty. | ||||
|      * | ||||
|      * @param fd an open pty master file descriptor. | ||||
|      * @param mode the device mode to open the pty with. | ||||
|      * @return true if a pty pair was successfully opened | ||||
|      */ | ||||
|     bool open(int fd, OpenMode mode = ReadWrite | Unbuffered); | ||||
|  | ||||
|     /** | ||||
|      * Close the pty master/slave pair. | ||||
|      */ | ||||
|     virtual void close(); | ||||
|  | ||||
|     /** | ||||
|      * Sets whether the KPtyDevice monitors the pty for incoming data. | ||||
|      * | ||||
|      * When the KPtyDevice is suspended, it will no longer attempt to buffer | ||||
|      * data that becomes available from the pty and it will not emit any | ||||
|      * signals. | ||||
|      * | ||||
|      * Do not use on closed ptys. | ||||
|      * After a call to open(), the pty is not suspended. If you need to | ||||
|      * ensure that no data is read, call this function before the main loop | ||||
|      * is entered again (i.e., immediately after opening the pty). | ||||
|      */ | ||||
|     void setSuspended(bool suspended); | ||||
|  | ||||
|     /** | ||||
|      * Returns true if the KPtyDevice is not monitoring the pty for incoming | ||||
|      * data. | ||||
|      * | ||||
|      * Do not use on closed ptys. | ||||
|      * | ||||
|      * See setSuspended() | ||||
|      */ | ||||
|     bool isSuspended() const; | ||||
|  | ||||
|     /** | ||||
|      * @return always true | ||||
|      */ | ||||
|     virtual bool isSequential() const; | ||||
|  | ||||
|     /** | ||||
|      * @reimp | ||||
|      */ | ||||
|     bool canReadLine() const; | ||||
|  | ||||
|     /** | ||||
|      * @reimp | ||||
|      */ | ||||
|     bool atEnd() const; | ||||
|  | ||||
|     /** | ||||
|      * @reimp | ||||
|      */ | ||||
|     qint64 bytesAvailable() const; | ||||
|  | ||||
|     /** | ||||
|      * @reimp | ||||
|      */ | ||||
|     qint64 bytesToWrite() const; | ||||
|  | ||||
|     bool waitForBytesWritten(int msecs = -1); | ||||
|     bool waitForReadyRead(int msecs = -1); | ||||
|  | ||||
|  | ||||
| Q_SIGNALS: | ||||
|     /** | ||||
|      * Emitted when EOF is read from the PTY. | ||||
|      * | ||||
|      * Data may still remain in the buffers. | ||||
|      */ | ||||
|     void readEof(); | ||||
|  | ||||
| protected: | ||||
|     virtual qint64 readData(char *data, qint64 maxSize); | ||||
|     virtual qint64 readLineData(char *data, qint64 maxSize); | ||||
|     virtual qint64 writeData(const char *data, qint64 maxSize); | ||||
|  | ||||
| private: | ||||
|     Q_PRIVATE_SLOT(d_func(), bool _k_canRead()) | ||||
|     Q_PRIVATE_SLOT(d_func(), bool _k_canWrite()) | ||||
| }; | ||||
|  | ||||
| ///////////////////////////////////////////////////// | ||||
| // Helper. Remove when QRingBuffer becomes public. // | ||||
| ///////////////////////////////////////////////////// | ||||
|  | ||||
| #include <QtCore/qbytearray.h> | ||||
| #include <QtCore/qlinkedlist.h> | ||||
|  | ||||
| #define CHUNKSIZE 4096 | ||||
|  | ||||
| class KRingBuffer | ||||
| { | ||||
| public: | ||||
|     KRingBuffer() | ||||
|     { | ||||
|         clear(); | ||||
|     } | ||||
|  | ||||
|     void clear() | ||||
|     { | ||||
|         buffers.clear(); | ||||
|         QByteArray tmp; | ||||
|         tmp.resize(CHUNKSIZE); | ||||
|         buffers << tmp; | ||||
|         head = tail = 0; | ||||
|         totalSize = 0; | ||||
|     } | ||||
|  | ||||
|     inline bool isEmpty() const | ||||
|     { | ||||
|         return buffers.count() == 1 && !tail; | ||||
|     } | ||||
|  | ||||
|     inline int size() const | ||||
|     { | ||||
|         return totalSize; | ||||
|     } | ||||
|  | ||||
|     inline int readSize() const | ||||
|     { | ||||
|         return (buffers.count() == 1 ? tail : buffers.first().size()) - head; | ||||
|     } | ||||
|  | ||||
|     inline const char *readPointer() const | ||||
|     { | ||||
|         Q_ASSERT(totalSize > 0); | ||||
|         return buffers.first().constData() + head; | ||||
|     } | ||||
|  | ||||
|     void free(int bytes) | ||||
|     { | ||||
|         totalSize -= bytes; | ||||
|         Q_ASSERT(totalSize >= 0); | ||||
|  | ||||
|         forever { | ||||
|             int nbs = readSize(); | ||||
|  | ||||
|             if (bytes < nbs) { | ||||
|                 head += bytes; | ||||
|                 if (head == tail && buffers.count() == 1) { | ||||
|                     buffers.first().resize(CHUNKSIZE); | ||||
|                     head = tail = 0; | ||||
|                 } | ||||
|                 break; | ||||
|             } | ||||
|  | ||||
|             bytes -= nbs; | ||||
|             if (buffers.count() == 1) { | ||||
|                 buffers.first().resize(CHUNKSIZE); | ||||
|                 head = tail = 0; | ||||
|                 break; | ||||
|             } | ||||
|  | ||||
|             buffers.removeFirst(); | ||||
|             head = 0; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     char *reserve(int bytes) | ||||
|     { | ||||
|         totalSize += bytes; | ||||
|  | ||||
|         char *ptr; | ||||
|         if (tail + bytes <= buffers.last().size()) { | ||||
|             ptr = buffers.last().data() + tail; | ||||
|             tail += bytes; | ||||
|         } else { | ||||
|             buffers.last().resize(tail); | ||||
|             QByteArray tmp; | ||||
|             tmp.resize(qMax(CHUNKSIZE, bytes)); | ||||
|             ptr = tmp.data(); | ||||
|             buffers << tmp; | ||||
|             tail = bytes; | ||||
|         } | ||||
|         return ptr; | ||||
|     } | ||||
|  | ||||
|     // release a trailing part of the last reservation | ||||
|     inline void unreserve(int bytes) | ||||
|     { | ||||
|         totalSize -= bytes; | ||||
|         tail -= bytes; | ||||
|     } | ||||
|  | ||||
|     inline void write(const char *data, int len) | ||||
|     { | ||||
|         memcpy(reserve(len), data, len); | ||||
|     } | ||||
|  | ||||
|     // Find the first occurrence of c and return the index after it. | ||||
|     // If c is not found until maxLength, maxLength is returned, provided | ||||
|     // it is smaller than the buffer size. Otherwise -1 is returned. | ||||
|     int indexAfter(char c, int maxLength = KMAXINT) const | ||||
|     { | ||||
|         int index = 0; | ||||
|         int start = head; | ||||
|         QLinkedList<QByteArray>::ConstIterator it = buffers.begin(); | ||||
|         forever { | ||||
|             if (!maxLength) | ||||
|                 return index; | ||||
|             if (index == size()) | ||||
|                 return -1; | ||||
|             const QByteArray &buf = *it; | ||||
|             ++it; | ||||
|             int len = qMin((it == buffers.end() ? tail : buf.size()) - start, | ||||
|                            maxLength); | ||||
|             const char *ptr = buf.data() + start; | ||||
|             if (const char *rptr = (const char *)memchr(ptr, c, len)) | ||||
|                 return index + (rptr - ptr) + 1; | ||||
|             index += len; | ||||
|             maxLength -= len; | ||||
|             start = 0; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     inline int lineSize(int maxLength = KMAXINT) const | ||||
|     { | ||||
|         return indexAfter('\n', maxLength); | ||||
|     } | ||||
|  | ||||
|     inline bool canReadLine() const | ||||
|     { | ||||
|         return lineSize() != -1; | ||||
|     } | ||||
|  | ||||
|     int read(char *data, int maxLength) | ||||
|     { | ||||
|         int bytesToRead = qMin(size(), maxLength); | ||||
|         int readSoFar = 0; | ||||
|         while (readSoFar < bytesToRead) { | ||||
|             const char *ptr = readPointer(); | ||||
|             int bs = qMin(bytesToRead - readSoFar, readSize()); | ||||
|             memcpy(data + readSoFar, ptr, bs); | ||||
|             readSoFar += bs; | ||||
|             free(bs); | ||||
|         } | ||||
|         return readSoFar; | ||||
|     } | ||||
|  | ||||
|     int readLine(char *data, int maxLength) | ||||
|     { | ||||
|         return read(data, lineSize(qMin(maxLength, size()))); | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     QLinkedList<QByteArray> buffers; | ||||
|     int head, tail; | ||||
|     int totalSize; | ||||
| }; | ||||
|  | ||||
| struct KPtyDevicePrivate : public KPtyPrivate { | ||||
|  | ||||
|     Q_DECLARE_PUBLIC(KPtyDevice) | ||||
|  | ||||
|     KPtyDevicePrivate(KPty* parent) : | ||||
|         KPtyPrivate(parent), | ||||
|         emittedReadyRead(false), emittedBytesWritten(false), | ||||
|         readNotifier(0), writeNotifier(0) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     bool _k_canRead(); | ||||
|     bool _k_canWrite(); | ||||
|  | ||||
|     bool doWait(int msecs, bool reading); | ||||
|     void finishOpen(QIODevice::OpenMode mode); | ||||
|  | ||||
|     bool emittedReadyRead; | ||||
|     bool emittedBytesWritten; | ||||
|     QSocketNotifier *readNotifier; | ||||
|     QSocketNotifier *writeNotifier; | ||||
|     KRingBuffer readBuffer; | ||||
|     KRingBuffer writeBuffer; | ||||
| }; | ||||
|  | ||||
| #endif | ||||
|  | ||||
							
								
								
									
										129
									
								
								konsole-qml-plugin/src/kptyprocess.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										129
									
								
								konsole-qml-plugin/src/kptyprocess.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,129 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|     This file is part of the KDE libraries | ||||
|  | ||||
|     Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     This library is free software; you can redistribute it and/or | ||||
|     modify it under the terms of the GNU Library General Public | ||||
|     License as published by the Free Software Foundation; either | ||||
|     version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This library 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 | ||||
|     Library General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Library General Public License | ||||
|     along with this library; see the file COPYING.LIB.  If not, write to | ||||
|     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|     Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
|  | ||||
| #include "kptyprocess.h" | ||||
| #include "kprocess.h" | ||||
| #include "kptydevice.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
| #include <unistd.h> | ||||
|  | ||||
| KPtyProcess::KPtyProcess(QObject *parent) : | ||||
|     KProcess(new KPtyProcessPrivate, parent) | ||||
| { | ||||
|     Q_D(KPtyProcess); | ||||
|  | ||||
|     d->pty = new KPtyDevice(this); | ||||
|     d->pty->open(); | ||||
|     connect(this, SIGNAL(stateChanged(QProcess::ProcessState)), | ||||
|             SLOT(_k_onStateChanged(QProcess::ProcessState))); | ||||
| } | ||||
|  | ||||
| KPtyProcess::KPtyProcess(int ptyMasterFd, QObject *parent) : | ||||
|     KProcess(new KPtyProcessPrivate, parent) | ||||
| { | ||||
|     Q_D(KPtyProcess); | ||||
|  | ||||
|     d->pty = new KPtyDevice(this); | ||||
|     d->pty->open(ptyMasterFd); | ||||
|     connect(this, SIGNAL(stateChanged(QProcess::ProcessState)), | ||||
|             SLOT(_k_onStateChanged(QProcess::ProcessState))); | ||||
| } | ||||
|  | ||||
| KPtyProcess::~KPtyProcess() | ||||
| { | ||||
|     Q_D(KPtyProcess); | ||||
|  | ||||
|     if (state() != QProcess::NotRunning && d->addUtmp) { | ||||
|         d->pty->logout(); | ||||
|         disconnect(SIGNAL(stateChanged(QProcess::ProcessState)), | ||||
|                    this, SLOT(_k_onStateChanged(QProcess::ProcessState))); | ||||
|     } | ||||
|     delete d->pty; | ||||
| } | ||||
|  | ||||
| void KPtyProcess::setPtyChannels(PtyChannels channels) | ||||
| { | ||||
|     Q_D(KPtyProcess); | ||||
|  | ||||
|     d->ptyChannels = channels; | ||||
| } | ||||
|  | ||||
| KPtyProcess::PtyChannels KPtyProcess::ptyChannels() const | ||||
| { | ||||
|     Q_D(const KPtyProcess); | ||||
|  | ||||
|     return d->ptyChannels; | ||||
| } | ||||
|  | ||||
| void KPtyProcess::setUseUtmp(bool value) | ||||
| { | ||||
|     Q_D(KPtyProcess); | ||||
|  | ||||
|     d->addUtmp = value; | ||||
| } | ||||
|  | ||||
| bool KPtyProcess::isUseUtmp() const | ||||
| { | ||||
|     Q_D(const KPtyProcess); | ||||
|  | ||||
|     return d->addUtmp; | ||||
| } | ||||
|  | ||||
| KPtyDevice *KPtyProcess::pty() const | ||||
| { | ||||
|     Q_D(const KPtyProcess); | ||||
|  | ||||
|     return d->pty; | ||||
| } | ||||
|  | ||||
| void KPtyProcess::setupChildProcess() | ||||
| { | ||||
|     Q_D(KPtyProcess); | ||||
|  | ||||
|     d->pty->setCTty(); | ||||
|  | ||||
| #if 0 | ||||
|     if (d->addUtmp) | ||||
|         d->pty->login(KUser(KUser::UseRealUserID).loginName().toLocal8Bit().data(), qgetenv("DISPLAY")); | ||||
| #endif | ||||
|     if (d->ptyChannels & StdinChannel) | ||||
|         dup2(d->pty->slaveFd(), 0); | ||||
|  | ||||
|     if (d->ptyChannels & StdoutChannel) | ||||
|         dup2(d->pty->slaveFd(), 1); | ||||
|  | ||||
|     if (d->ptyChannels & StderrChannel) | ||||
|         dup2(d->pty->slaveFd(), 2); | ||||
|  | ||||
|     KProcess::setupChildProcess(); | ||||
| } | ||||
|  | ||||
| //#include "kptyprocess.moc" | ||||
							
								
								
									
										178
									
								
								konsole-qml-plugin/src/kptyprocess.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										178
									
								
								konsole-qml-plugin/src/kptyprocess.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,178 @@ | ||||
| /* | ||||
|  * This file is a part of QTerminal - http://gitorious.org/qterminal | ||||
|  * | ||||
|  * This file was un-linked from KDE and modified | ||||
|  * by Maxim Bourmistrov <maxim@unixconn.com> | ||||
|  * | ||||
|  */ | ||||
|  | ||||
| /* | ||||
|     This file is part of the KDE libraries | ||||
|  | ||||
|     Copyright (C) 2007 Oswald Buddenhagen <ossi@kde.org> | ||||
|  | ||||
|     This library is free software; you can redistribute it and/or | ||||
|     modify it under the terms of the GNU Library General Public | ||||
|     License as published by the Free Software Foundation; either | ||||
|     version 2 of the License, or (at your option) any later version. | ||||
|  | ||||
|     This library 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 | ||||
|     Library General Public License for more details. | ||||
|  | ||||
|     You should have received a copy of the GNU Library General Public License | ||||
|     along with this library; see the file COPYING.LIB.  If not, write to | ||||
|     the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, | ||||
|     Boston, MA 02110-1301, USA. | ||||
| */ | ||||
|  | ||||
| #ifndef KPTYPROCESS_H | ||||
| #define KPTYPROCESS_H | ||||
|  | ||||
| #include "kprocess.h" | ||||
| #include "kptydevice.h" | ||||
|  | ||||
| #include <signal.h> | ||||
|  | ||||
| class KPtyDevice; | ||||
|  | ||||
| struct KPtyProcessPrivate; | ||||
|  | ||||
| /** | ||||
|  * This class extends KProcess by support for PTYs (pseudo TTYs). | ||||
|  * | ||||
|  * The PTY is opened as soon as the class is instantiated. Verify that | ||||
|  * it was opened successfully by checking that pty()->masterFd() is not -1. | ||||
|  * | ||||
|  * The PTY is always made the process' controlling TTY. | ||||
|  * Utmp registration and connecting the stdio handles to the PTY are optional. | ||||
|  * | ||||
|  * No attempt to integrate with QProcess' waitFor*() functions was made, | ||||
|  * for it is impossible. Note that execute() does not work with the PTY, too. | ||||
|  * Use the PTY device's waitFor*() functions or use it asynchronously. | ||||
|  * | ||||
|  * @author Oswald Buddenhagen <ossi@kde.org> | ||||
|  */ | ||||
| class KPtyProcess : public KProcess | ||||
| { | ||||
|     Q_OBJECT | ||||
|     Q_DECLARE_PRIVATE(KPtyProcess) | ||||
|  | ||||
| public: | ||||
|     enum PtyChannelFlag { | ||||
|         NoChannels = 0, /**< The PTY is not connected to any channel. */ | ||||
|         StdinChannel = 1, /**< Connect PTY to stdin. */ | ||||
|         StdoutChannel = 2, /**< Connect PTY to stdout. */ | ||||
|         StderrChannel = 4, /**< Connect PTY to stderr. */ | ||||
|         AllOutputChannels = 6, /**< Connect PTY to all output channels. */ | ||||
|         AllChannels = 7 /**< Connect PTY to all channels. */ | ||||
|     }; | ||||
|  | ||||
|     Q_DECLARE_FLAGS(PtyChannels, PtyChannelFlag) | ||||
|  | ||||
|     /** | ||||
|      * Constructor | ||||
|      */ | ||||
|     explicit KPtyProcess(QObject *parent = 0); | ||||
|  | ||||
|     /** | ||||
|      * Construct a process using an open pty master. | ||||
|      * | ||||
|      * @param ptyMasterFd an open pty master file descriptor. | ||||
|      *   The process does not take ownership of the descriptor; | ||||
|      *   it will not be automatically closed at any point. | ||||
|      */ | ||||
|     KPtyProcess(int ptyMasterFd, QObject *parent = 0); | ||||
|  | ||||
|     /** | ||||
|      * Destructor | ||||
|      */ | ||||
|     virtual ~KPtyProcess(); | ||||
|  | ||||
|     /** | ||||
|      * Set to which channels the PTY should be assigned. | ||||
|      * | ||||
|      * This function must be called before starting the process. | ||||
|      * | ||||
|      * @param channels the output channel handling mode | ||||
|      */ | ||||
|     void setPtyChannels(PtyChannels channels); | ||||
|  | ||||
|     bool isRunning() const | ||||
|     { | ||||
|         bool rval; | ||||
|         (pid() > 0) ? rval= true : rval= false; | ||||
|         return rval; | ||||
|  | ||||
|     } | ||||
|     /** | ||||
|      * Query to which channels the PTY is assigned. | ||||
|      * | ||||
|      * @return the output channel handling mode | ||||
|      */ | ||||
|     PtyChannels ptyChannels() const; | ||||
|  | ||||
|     /** | ||||
|      * Set whether to register the process as a TTY login in utmp. | ||||
|      * | ||||
|      * Utmp is disabled by default. | ||||
|      * It should enabled for interactively fed processes, like terminal | ||||
|      * emulations. | ||||
|      * | ||||
|      * This function must be called before starting the process. | ||||
|      * | ||||
|      * @param value whether to register in utmp. | ||||
|      */ | ||||
|     void setUseUtmp(bool value); | ||||
|  | ||||
|     /** | ||||
|      * Get whether to register the process as a TTY login in utmp. | ||||
|      * | ||||
|      * @return whether to register in utmp | ||||
|      */ | ||||
|     bool isUseUtmp() const; | ||||
|  | ||||
|     /** | ||||
|      * Get the PTY device of this process. | ||||
|      * | ||||
|      * @return the PTY device | ||||
|      */ | ||||
|     KPtyDevice *pty() const; | ||||
|  | ||||
| protected: | ||||
|     /** | ||||
|      * @reimp | ||||
|      */ | ||||
|     virtual void setupChildProcess(); | ||||
|  | ||||
| private: | ||||
|     Q_PRIVATE_SLOT(d_func(), void _k_onStateChanged(QProcess::ProcessState)) | ||||
| }; | ||||
|  | ||||
|  | ||||
| ////////////////// | ||||
| // private data // | ||||
| ////////////////// | ||||
|  | ||||
| struct KPtyProcessPrivate : KProcessPrivate { | ||||
|     KPtyProcessPrivate() : | ||||
|         ptyChannels(KPtyProcess::NoChannels), | ||||
|         addUtmp(false) | ||||
|     { | ||||
|     } | ||||
|  | ||||
|     void _k_onStateChanged(QProcess::ProcessState newState) | ||||
|     { | ||||
|         if (newState == QProcess::NotRunning && addUtmp) | ||||
|             pty->logout(); | ||||
|     } | ||||
|  | ||||
|     KPtyDevice *pty; | ||||
|     KPtyProcess::PtyChannels ptyChannels; | ||||
|     bool addUtmp : 1; | ||||
| }; | ||||
|  | ||||
| Q_DECLARE_OPERATORS_FOR_FLAGS(KPtyProcess::PtyChannels) | ||||
|  | ||||
| #endif | ||||
							
								
								
									
										242
									
								
								konsole-qml-plugin/src/ksession.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										242
									
								
								konsole-qml-plugin/src/ksession.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,242 @@ | ||||
| /* | ||||
|     This file is part of Konsole QML plugin, | ||||
|     which is a terminal emulator from KDE. | ||||
|  | ||||
|     Copyright 2013      by Dmitry Zagnoyko <hiroshidi@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| // Own | ||||
| #include "ksession.h" | ||||
|  | ||||
| // Qt | ||||
| #include <QTextCodec> | ||||
|  | ||||
| // Konsole | ||||
| #include "KeyboardTranslator.h" | ||||
| #include "TerminalDisplay.h" | ||||
|  | ||||
|  | ||||
| KSession::KSession(QObject *parent) : | ||||
|     QObject(parent), m_session(createSession("KSession")) | ||||
| { | ||||
|     connect(m_session, SIGNAL(finished()), this, SLOT(sessionFinished())); | ||||
|  | ||||
|     m_session->run(); | ||||
| } | ||||
|  | ||||
| KSession::~KSession() | ||||
| { | ||||
|     if (m_session) { | ||||
|         m_session->close(); | ||||
|         m_session->disconnect(); | ||||
|         delete m_session; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void KSession::setTitle(QString name) | ||||
| { | ||||
|     m_session->setTitle(Session::NameRole, name); | ||||
| } | ||||
|  | ||||
|  | ||||
| Session *KSession::createSession(QString name) | ||||
| { | ||||
|     Session *session = new Session(); | ||||
|  | ||||
|     session->setTitle(Session::NameRole, name); | ||||
|  | ||||
|     /* Thats a freaking bad idea!!!! | ||||
|      * /bin/bash is not there on every system | ||||
|      * better set it to the current $SHELL | ||||
|      * Maybe you can also make a list available and then let the widget-owner decide what to use. | ||||
|      * By setting it to $SHELL right away we actually make the first filecheck obsolete. | ||||
|      * But as iam not sure if you want to do anything else ill just let both checks in and set this to $SHELL anyway. | ||||
|      */ | ||||
|     session->setProgram("/bin/bash"); | ||||
|  | ||||
|     //session->setProgram(getenv("SHELL")); | ||||
|  | ||||
|     QStringList args(""); | ||||
|     session->setArguments(args); | ||||
|     session->setAutoClose(true); | ||||
|  | ||||
|     session->setCodec(QTextCodec::codecForName("UTF-8")); | ||||
|  | ||||
|     session->setFlowControlEnabled(true); | ||||
|     session->setHistoryType(HistoryTypeBuffer(1000)); | ||||
|  | ||||
|     session->setDarkBackground(true); | ||||
|  | ||||
|     session->setKeyBindings(""); | ||||
|  | ||||
|     return session; | ||||
| } | ||||
|  | ||||
| ///////////////////////////////////////////////////////////////////////////////////// | ||||
| ///////////////////////////////////////////////////////////////////////////////////// | ||||
|  | ||||
|  | ||||
| int  KSession::getRandomSeed() | ||||
| { | ||||
|     return m_session->sessionId() * 31; | ||||
| } | ||||
|  | ||||
| void  KSession::addView(KTerminalDisplay *displa) | ||||
| { | ||||
|     m_session->addView(displa); | ||||
| } | ||||
|  | ||||
| void KSession::sessionFinished() | ||||
| { | ||||
|     emit finished(); | ||||
| } | ||||
|  | ||||
| void KSession::selectionChanged(bool textSelected) | ||||
| { | ||||
|     Q_UNUSED(textSelected) | ||||
| } | ||||
|  | ||||
| void KSession::startShellProgram() | ||||
| { | ||||
|     if ( m_session->isRunning() ) { | ||||
|         return; | ||||
|     } | ||||
|  | ||||
|     m_session->run(); | ||||
| } | ||||
|  | ||||
| int KSession::getShellPID() | ||||
| { | ||||
|     return m_session->processId(); | ||||
| } | ||||
|  | ||||
| void KSession::changeDir(const QString &dir) | ||||
| { | ||||
|     /* | ||||
|        this is a very hackish way of trying to determine if the shell is in | ||||
|        the foreground before attempting to change the directory.  It may not | ||||
|        be portable to anything other than Linux. | ||||
|     */ | ||||
|     QString strCmd; | ||||
|     strCmd.setNum(getShellPID()); | ||||
|     strCmd.prepend("ps -j "); | ||||
|     strCmd.append(" | tail -1 | awk '{ print $5 }' | grep -q \\+"); | ||||
|     int retval = system(strCmd.toStdString().c_str()); | ||||
|  | ||||
|     if (!retval) { | ||||
|         QString cmd = "cd " + dir + "\n"; | ||||
|         sendText(cmd); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void KSession::setEnvironment(const QStringList &environment) | ||||
| { | ||||
|     m_session->setEnvironment(environment); | ||||
| } | ||||
|  | ||||
|  | ||||
| void KSession::setShellProgram(const QString &progname) | ||||
| { | ||||
|     if (!m_session) | ||||
|         return; | ||||
|  | ||||
|     m_session->setProgram(progname); | ||||
| } | ||||
|  | ||||
| void KSession::setWorkingDirectory(const QString &dir) | ||||
| { | ||||
|     if (!m_session) | ||||
|         return; | ||||
|  | ||||
|     m_session->setInitialWorkingDirectory(dir); | ||||
| } | ||||
|  | ||||
| void KSession::setArgs(QStringList &args) | ||||
| { | ||||
|     if (!m_session) | ||||
|         return; | ||||
|  | ||||
|     m_session->setArguments(args); | ||||
| } | ||||
|  | ||||
| void KSession::setTextCodec(QTextCodec *codec) | ||||
| { | ||||
|     if (!m_session) | ||||
|         return; | ||||
|  | ||||
|     m_session->setCodec(codec); | ||||
| } | ||||
|  | ||||
| void KSession::setHistorySize(int lines) | ||||
| { | ||||
|     if (lines < 0) | ||||
|         m_session->setHistoryType(HistoryTypeFile()); | ||||
|     else | ||||
|         m_session->setHistoryType(HistoryTypeBuffer(lines)); | ||||
| } | ||||
|  | ||||
| void KSession::sendText(QString text) | ||||
| { | ||||
|     m_session->sendText(text); | ||||
| } | ||||
|  | ||||
| void KSession::sendKey(int rep, int key, int mod) const | ||||
| { | ||||
|     Qt::KeyboardModifier kbm = Qt::KeyboardModifier(mod); | ||||
|  | ||||
|     QKeyEvent qkey(QEvent::KeyPress, key, kbm); | ||||
|  | ||||
|     while (rep > 0){ | ||||
|         m_session->sendKey(&qkey); | ||||
|         --rep; | ||||
|     } | ||||
| } | ||||
|  | ||||
| void KSession::setFlowControlEnabled(bool enabled) | ||||
| { | ||||
|     m_session->setFlowControlEnabled(enabled); | ||||
| } | ||||
|  | ||||
| bool KSession::flowControlEnabled() | ||||
| { | ||||
|     return m_session->flowControlEnabled(); | ||||
| } | ||||
|  | ||||
| void KSession::setKeyBindings(const QString &kb) | ||||
| { | ||||
|     m_session->setKeyBindings(kb); | ||||
|     emit changedKeyBindings(kb); | ||||
| } | ||||
|  | ||||
| QString KSession::getKeyBindings() | ||||
| { | ||||
|    return m_session->keyBindings(); | ||||
| } | ||||
|  | ||||
|  | ||||
| QStringList KSession::availableKeyBindings() | ||||
| { | ||||
|     return KeyboardTranslatorManager::instance()->allTranslators(); | ||||
| } | ||||
|  | ||||
| QString KSession::keyBindings() | ||||
| { | ||||
|     return m_session->keyBindings(); | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										132
									
								
								konsole-qml-plugin/src/ksession.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								konsole-qml-plugin/src/ksession.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| /* | ||||
|     This file is part of Konsole QML plugin, | ||||
|     which is a terminal emulator from KDE. | ||||
|  | ||||
|     Copyright 2013      by Dmitry Zagnoyko <hiroshidi@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef KSESSION_H | ||||
| #define KSESSION_H | ||||
|  | ||||
| #include <QObject> | ||||
|  | ||||
| // Konsole | ||||
| #include "Session.h" | ||||
|  | ||||
| class KTerminalDisplay; | ||||
|  | ||||
| class KSession : public QObject | ||||
| { | ||||
|     Q_OBJECT | ||||
|     Q_PROPERTY(QString  kbScheme  READ  getKeyBindings WRITE setKeyBindings NOTIFY changedKeyBindings) | ||||
|  | ||||
| public: | ||||
|     KSession(QObject *parent = 0); | ||||
|     ~KSession(); | ||||
|      | ||||
| public: | ||||
|     //bool setup(); | ||||
|     void addView(KTerminalDisplay *displa); | ||||
|  | ||||
|     //start shell program if it was not started in constructor | ||||
|     void startShellProgram(); | ||||
|  | ||||
|     int getRandomSeed(); | ||||
|     QString getKeyBindings(); | ||||
|  | ||||
|     //look-n-feel, if you don`t like defaults | ||||
|  | ||||
|     //environment | ||||
|     void setEnvironment(const QStringList & environment); | ||||
|  | ||||
|     //  Shell program, default is /bin/bash | ||||
|     void setShellProgram(const QString & progname); | ||||
|  | ||||
|     //working directory | ||||
|     void setWorkingDirectory(const QString & dir); | ||||
|  | ||||
|     // Shell program args, default is none | ||||
|     void setArgs(QStringList & args); | ||||
|  | ||||
|     //Text codec, default is UTF-8 | ||||
|     void setTextCodec(QTextCodec * codec); | ||||
|  | ||||
|     // History size for scrolling | ||||
|     void setHistorySize(int lines); //infinite if lines < 0 | ||||
|  | ||||
|     // Sets whether flow control is enabled | ||||
|     void setFlowControlEnabled(bool enabled); | ||||
|  | ||||
|     // Returns whether flow control is enabled | ||||
|     bool flowControlEnabled(void); | ||||
|  | ||||
|     /** | ||||
|      * Sets whether the flow control warning box should be shown | ||||
|      * when the flow control stop key (Ctrl+S) is pressed. | ||||
|      */ | ||||
|     //void setFlowControlWarningEnabled(bool enabled); | ||||
|  | ||||
|     /*! Get all available keyboard bindings | ||||
|      */ | ||||
|     static QStringList availableKeyBindings(); | ||||
|  | ||||
|     //! Return current key bindings | ||||
|     QString keyBindings(); | ||||
|  | ||||
| signals: | ||||
|     void finished(); | ||||
|     void copyAvailable(bool); | ||||
|  | ||||
|     void termGetFocus(); | ||||
|     void termLostFocus(); | ||||
|  | ||||
|     void termKeyPressed(QKeyEvent *); | ||||
|  | ||||
|     void changedKeyBindings(QString kb); | ||||
|  | ||||
|  | ||||
| public slots: | ||||
|     /*! Set named key binding for given widget | ||||
|      */ | ||||
|     void setKeyBindings(const QString & kb); | ||||
|     void setTitle(QString name); | ||||
|  | ||||
|     int getShellPID(); | ||||
|     void changeDir(const QString & dir); | ||||
|  | ||||
|     // Send some text to terminal | ||||
|     void sendText(QString text); | ||||
|     // Send some text to terminal | ||||
|     void sendKey(int rep, int key, int mod) const; | ||||
|  | ||||
|  | ||||
| protected slots: | ||||
|     void sessionFinished(); | ||||
|     void selectionChanged(bool textSelected); | ||||
|  | ||||
| private slots: | ||||
|     Session* createSession(QString name); | ||||
|     //Konsole::KTerminalDisplay* createTerminalDisplay(Konsole::Session *session, QQuickItem* parent); | ||||
|  | ||||
| private: | ||||
|     //Konsole::KTerminalDisplay *m_terminalDisplay; | ||||
|     Session *m_session; | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif // KSESSION_H | ||||
							
								
								
									
										63
									
								
								konsole-qml-plugin/src/plugin.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										63
									
								
								konsole-qml-plugin/src/plugin.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,63 @@ | ||||
| /* | ||||
|     This file is part of Konsole QML plugin, | ||||
|     which is a terminal emulator from KDE. | ||||
|  | ||||
|     Copyright 2013      by Dmitry Zagnoyko <hiroshidi@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #include <QString> | ||||
| #include <QDir> | ||||
|  | ||||
| #include "plugin.h" | ||||
|  | ||||
| #include <stdlib.h> | ||||
|  | ||||
| KonsoleKterminalPlugin::KonsoleKterminalPlugin() { } | ||||
|  | ||||
| KonsoleKterminalPlugin::~KonsoleKterminalPlugin() { } | ||||
|  | ||||
| void KonsoleKterminalPlugin::initializeEngine(QQmlEngine *engine, const char *uri) | ||||
| { | ||||
|     Q_ASSERT(uri == QLatin1String("org.kde.konsole")); | ||||
|  | ||||
|     QQmlExtensionPlugin::initializeEngine(engine, uri); | ||||
|  | ||||
|     QStringList pwds = engine->importPathList(); | ||||
|  | ||||
|     if (!pwds.empty()){ | ||||
|  | ||||
|         QString cs, kbl; | ||||
|  | ||||
|         foreach (QString pwd, pwds) { | ||||
|             cs  = pwd + "/org/kde/konsole/color-schemes"; | ||||
|             kbl = pwd + "/org/kde/konsole/kb-layouts"; | ||||
|             if (QDir(cs).exists()) break; | ||||
|         } | ||||
|  | ||||
|         setenv("KB_LAYOUT_DIR",kbl.toLatin1().constData(),1); | ||||
|         setenv("COLORSCHEMES_DIR",cs.toLatin1().constData(),1); | ||||
|     } | ||||
| } | ||||
|  | ||||
| void KonsoleKterminalPlugin::registerTypes(const char *uri) | ||||
| { | ||||
|     Q_ASSERT(uri == QLatin1String("org.kde.konsole")); | ||||
|  | ||||
|     qmlRegisterType<KTerminalDisplay>(uri, 0, 1, "KTerminal"); | ||||
|     qmlRegisterType<KSession>(uri, 0, 1, "KSession"); | ||||
| } | ||||
							
								
								
									
										46
									
								
								konsole-qml-plugin/src/plugin.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								konsole-qml-plugin/src/plugin.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,46 @@ | ||||
| /* | ||||
|     This file is part of Konsole QML plugin, | ||||
|     which is a terminal emulator from KDE. | ||||
|  | ||||
|     Copyright 2013      by Dmitry Zagnoyko <hiroshidi@gmail.com> | ||||
|  | ||||
|     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. | ||||
| */ | ||||
|  | ||||
| #ifndef KDE_QML_PLUGIN_KTERMINAL | ||||
| #define KDE_QML_PLUGIN_KTERMINAL | ||||
|  | ||||
| #include "TerminalDisplay.h" | ||||
| #include "ksession.h" | ||||
|  | ||||
| #include <QtQml/QQmlEngine> | ||||
| #include <QtQml/QQmlExtensionPlugin> | ||||
|  | ||||
| class KonsoleKterminalPlugin : public QQmlExtensionPlugin | ||||
| { | ||||
|     Q_OBJECT | ||||
|     Q_PLUGIN_METADATA(IID "org.qt-project.Qt.QQmlExtensionInterface") | ||||
|  | ||||
| public: | ||||
|     KonsoleKterminalPlugin(); | ||||
|     ~KonsoleKterminalPlugin(); | ||||
|  | ||||
|     void registerTypes(const char *uri); | ||||
|     void initializeEngine(QQmlEngine *engine, const char *uri); | ||||
|  | ||||
| }; | ||||
|  | ||||
| #endif // KDE_QML_PLUGIN_KTERMINAL | ||||
							
								
								
									
										169
									
								
								konsole-qml-plugin/src/plugins.qmltypes
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										169
									
								
								konsole-qml-plugin/src/plugins.qmltypes
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,169 @@ | ||||
| import QtQuick.tooling 1.1 | ||||
|  | ||||
| // This file describes the plugin-supplied types contained in the library. | ||||
| // It is used for QML tooling purposes only. | ||||
| // | ||||
| // This file was auto-generated with the command '/usr/lib/x86_64-linux-gnu/qt5/bin/qmlplugindump -notrelocatable org.kde.konsole 0.1 ../../../'. | ||||
|  | ||||
| Module { | ||||
|     Component { | ||||
|         name: "KSession" | ||||
|         prototype: "QObject" | ||||
|         exports: ["org.kde.konsole/KSession 0.1"] | ||||
|         Property { name: "kbScheme"; type: "string" } | ||||
|         Signal { name: "finished" } | ||||
|         Signal { | ||||
|             name: "copyAvailable" | ||||
|             Parameter { type: "bool" } | ||||
|         } | ||||
|         Signal { name: "termGetFocus" } | ||||
|         Signal { name: "termLostFocus" } | ||||
|         Signal { | ||||
|             name: "termKeyPressed" | ||||
|             Parameter { type: "QKeyEvent"; isPointer: true } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "changedKeyBindings" | ||||
|             Parameter { name: "kb"; type: "string" } | ||||
|         } | ||||
|         Method { | ||||
|             name: "setKeyBindings" | ||||
|             Parameter { name: "kb"; type: "string" } | ||||
|         } | ||||
|         Method { | ||||
|             name: "setTitle" | ||||
|             Parameter { name: "name"; type: "string" } | ||||
|         } | ||||
|         Method { name: "getShellPID"; type: "int" } | ||||
|         Method { | ||||
|             name: "changeDir" | ||||
|             Parameter { name: "dir"; type: "string" } | ||||
|         } | ||||
|         Method { | ||||
|             name: "sendText" | ||||
|             Parameter { name: "text"; type: "string" } | ||||
|         } | ||||
|         Method { | ||||
|             name: "sendKey" | ||||
|             Parameter { name: "rep"; type: "int" } | ||||
|             Parameter { name: "key"; type: "int" } | ||||
|             Parameter { name: "mod"; type: "int" } | ||||
|         } | ||||
|     } | ||||
|     Component { | ||||
|         name: "KTerminalDisplay" | ||||
|         defaultProperty: "data" | ||||
|         prototype: "QQuickPaintedItem" | ||||
|         exports: ["org.kde.konsole/KTerminal 0.1"] | ||||
|         Property { name: "session"; type: "KSession"; isPointer: true } | ||||
|         Property { name: "colorScheme"; type: "string" } | ||||
|         Property { name: "font"; type: "QFont" } | ||||
|         Property { name: "activeFocusOnClick"; type: "bool" } | ||||
|         Property { name: "ShowIMEOnClick"; type: "bool" } | ||||
|         Signal { | ||||
|             name: "changedScheme" | ||||
|             Parameter { name: "scheme"; type: "string" } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "changedAutoVKB" | ||||
|             Parameter { name: "au"; type: "bool" } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "changedAutoFocus" | ||||
|             Parameter { name: "au"; type: "bool" } | ||||
|         } | ||||
|         Signal { name: "clicked" } | ||||
|         Signal { | ||||
|             name: "keyPressedSignal" | ||||
|             Parameter { name: "e"; type: "QKeyEvent"; isPointer: true } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "changedFontMetricSignal" | ||||
|             Parameter { name: "height"; type: "int" } | ||||
|             Parameter { name: "width"; type: "int" } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "changedContentSizeSignal" | ||||
|             Parameter { name: "height"; type: "int" } | ||||
|             Parameter { name: "width"; type: "int" } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "configureRequest" | ||||
|             Parameter { name: "position"; type: "QPoint" } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "overrideShortcutCheck" | ||||
|             Parameter { name: "keyEvent"; type: "QKeyEvent"; isPointer: true } | ||||
|             Parameter { name: "override"; type: "bool&" } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "isBusySelecting" | ||||
|             Parameter { type: "bool" } | ||||
|         } | ||||
|         Signal { | ||||
|             name: "copyAvailable" | ||||
|             Parameter { type: "bool" } | ||||
|         } | ||||
|         Signal { name: "termGetFocus" } | ||||
|         Signal { name: "termLostFocus" } | ||||
|         Signal { | ||||
|             name: "changedSession" | ||||
|             Parameter { name: "session"; type: "KSession"; isPointer: true } | ||||
|         } | ||||
|         Method { name: "forcedFocus" } | ||||
|         Method { | ||||
|             name: "setColorScheme" | ||||
|             Parameter { name: "name"; type: "string" } | ||||
|         } | ||||
|         Method { name: "availableColorSchemes"; type: "QStringList" } | ||||
|         Method { | ||||
|             name: "click" | ||||
|             Parameter { name: "x"; type: "double" } | ||||
|             Parameter { name: "y"; type: "double" } | ||||
|         } | ||||
|         Method { name: "autoFocus"; type: "bool" } | ||||
|         Method { | ||||
|             name: "setAutoFocus" | ||||
|             Parameter { name: "au"; type: "bool" } | ||||
|         } | ||||
|         Method { name: "autoVKB"; type: "bool" } | ||||
|         Method { | ||||
|             name: "setAutoVKB" | ||||
|             Parameter { name: "au"; type: "bool" } | ||||
|         } | ||||
|         Method { name: "getVTFont"; type: "QFont" } | ||||
|         Method { | ||||
|             name: "setVTFont" | ||||
|             Parameter { name: "font"; type: "QFont" } | ||||
|         } | ||||
|         Method { name: "scrollToEnd" } | ||||
|         Method { name: "updateImage" } | ||||
|         Method { name: "updateLineProperties" } | ||||
|         Method { name: "copyClipboard" } | ||||
|         Method { name: "pasteClipboard" } | ||||
|         Method { name: "pasteSelection" } | ||||
|         Method { | ||||
|             name: "setFlowControlWarningEnabled" | ||||
|             Parameter { name: "enabled"; type: "bool" } | ||||
|         } | ||||
|         Method { name: "flowControlWarningEnabled"; type: "bool" } | ||||
|         Method { | ||||
|             name: "bell" | ||||
|             Parameter { name: "message"; type: "string" } | ||||
|         } | ||||
|         Method { | ||||
|             name: "setBackgroundColor" | ||||
|             Parameter { name: "color"; type: "QColor" } | ||||
|         } | ||||
|         Method { | ||||
|             name: "setForegroundColor" | ||||
|             Parameter { name: "color"; type: "QColor" } | ||||
|         } | ||||
|         Method { name: "selectionChanged" } | ||||
|         Method { | ||||
|             name: "setSession" | ||||
|             Parameter { name: "session"; type: "KSession"; isPointer: true } | ||||
|         } | ||||
|         Method { name: "getSession"; type: "KSession*" } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										3
									
								
								konsole-qml-plugin/src/qmldir
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										3
									
								
								konsole-qml-plugin/src/qmldir
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,3 @@ | ||||
| module org.kde.konsole | ||||
| typeinfo plugins.qmltypes | ||||
| plugin kdekonsole | ||||
							
								
								
									
										80
									
								
								konsole-qml-plugin/src/tools.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								konsole-qml-plugin/src/tools.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | ||||
| #include "tools.h" | ||||
|  | ||||
| #include <QCoreApplication> | ||||
| #include <QDir> | ||||
| #include <QtDebug> | ||||
|  | ||||
|  | ||||
| /*! Helper function to get possible location of layout files. | ||||
| By default the KB_LAYOUT_DIR is used (linux/BSD/macports). | ||||
| But in some cases (apple bundle) there can be more locations). | ||||
| */ | ||||
| QString get_kb_layout_dir() | ||||
| { | ||||
| //    qDebug() << __FILE__ << __FUNCTION__; | ||||
|  | ||||
|     QString rval = ""; | ||||
|     QString k(getenv("KB_LAYOUT_DIR")); | ||||
|     QDir d(k); | ||||
|  | ||||
| //    qDebug() << "default KB_LAYOUT_DIR: " << k; | ||||
|  | ||||
|     if (d.exists()) | ||||
|         rval =  k.append("/"); | ||||
|  | ||||
|     // subdir in the app location | ||||
|     d.setPath(QCoreApplication::applicationDirPath() + "/kb-layouts/"); | ||||
|     //qDebug() << d.path(); | ||||
|     if (d.exists()) | ||||
|         rval = QCoreApplication::applicationDirPath() + "/kb-layouts/"; | ||||
| #ifdef Q_WS_MAC | ||||
|     d.setPath(QCoreApplication::applicationDirPath() + "/../Resources/kb-layouts/"); | ||||
|     if (d.exists()) | ||||
|         rval = QCoreApplication::applicationDirPath() + "/../Resources/kb-layouts/"; | ||||
| #endif | ||||
| #ifdef QT_DEBUG | ||||
|     if(!rval.isEmpty()) { | ||||
|         qDebug() << "Using kb-layouts: " << rval; | ||||
|     } else { | ||||
|         qDebug() << "Cannot find kb-layouts in any location!"; | ||||
|     } | ||||
| #endif | ||||
|     return rval; | ||||
| } | ||||
|  | ||||
| /*! Helper function to get possible location of layout files. | ||||
| By default the COLORSCHEMES_DIR is used (linux/BSD/macports). | ||||
| But in some cases (apple bundle) there can be more locations). | ||||
| */ | ||||
| QString get_color_schemes_dir() | ||||
| { | ||||
| //    qDebug() << __FILE__ << __FUNCTION__; | ||||
|  | ||||
|     QString rval = ""; | ||||
|     QString k(getenv("COLORSCHEMES_DIR")); | ||||
|     QDir d(k); | ||||
|  | ||||
| //    qDebug() << "default COLORSCHEMES_DIR: " << k; | ||||
|  | ||||
|     if (d.exists()) | ||||
|         rval =  k.append("/"); | ||||
|  | ||||
|     // subdir in the app location | ||||
|     d.setPath(QCoreApplication::applicationDirPath() + "/color-schemes/"); | ||||
|     //qDebug() << d.path(); | ||||
|     if (d.exists()) | ||||
|         rval = QCoreApplication::applicationDirPath() + "/color-schemes/"; | ||||
| #ifdef Q_WS_MAC | ||||
|     d.setPath(QCoreApplication::applicationDirPath() + "/../Resources/color-schemes/"); | ||||
|     if (d.exists()) | ||||
|         rval = QCoreApplication::applicationDirPath() + "/../Resources/color-schemes/"; | ||||
| #endif | ||||
| #ifdef QT_DEBUG | ||||
|     if(!rval.isEmpty()) { | ||||
|         qDebug() << "Using color-schemes: " << rval; | ||||
|     } else { | ||||
|         qDebug() << "Cannot find color-schemes in any location!"; | ||||
|     } | ||||
| #endif | ||||
|     return rval; | ||||
| } | ||||
							
								
								
									
										10
									
								
								konsole-qml-plugin/src/tools.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								konsole-qml-plugin/src/tools.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| #ifndef TOOLS_H | ||||
| #define TOOLS_H | ||||
|  | ||||
| #include <QString> | ||||
|  | ||||
| QString get_kb_layout_dir(); | ||||
| QString get_color_schemes_dir(); | ||||
|  | ||||
|  | ||||
| #endif | ||||
		Reference in New Issue
	
	Block a user