Switched to Fira Code font
							parent
							
								
									c00b5dbbe1
								
							
						
					
					
						commit
						753e707b38
					
				|  | @ -0,0 +1,2 @@ | |||
| .vim/ | ||||
| *.o | ||||
|  | @ -0,0 +1,213 @@ | |||
| UTF-8 encoded sample plain-text file | ||||
| ‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾ | ||||
| 
 | ||||
| Markus Kuhn [ˈmaʳkʊs kuːn] <mkuhn@acm.org> — 2002-07-25 | ||||
| 
 | ||||
| 
 | ||||
| The ASCII compatible UTF-8 encoding used in this plain-text file | ||||
| is defined in Unicode, ISO 10646-1, and RFC 2279. | ||||
| 
 | ||||
| 
 | ||||
| Using Unicode/UTF-8, you can write in emails and source code things such as | ||||
| 
 | ||||
| Mathematics and sciences: | ||||
| 
 | ||||
|   ∮ E⋅da = Q,  n → ∞, ∑ f(i) = ∏ g(i),      ⎧⎡⎛┌─────┐⎞⎤⎫ | ||||
|                                             ⎪⎢⎜│a²+b³ ⎟⎥⎪ | ||||
|   ∀x∈ℝ: ⌈x⌉ = −⌊−x⌋, α ∧ ¬β = ¬(¬α ∨ β),    ⎪⎢⎜│───── ⎟⎥⎪ | ||||
|                                             ⎪⎢⎜⎷ c₈   ⎟⎥⎪ | ||||
|   ℕ ⊆ ℕ₀ ⊂ ℤ ⊂ ℚ ⊂ ℝ ⊂ ℂ,                   ⎨⎢⎜       ⎟⎥⎬ | ||||
|                                             ⎪⎢⎜ ∞     ⎟⎥⎪ | ||||
|   ⊥ < a ≠ b ≡ c ≤ d ≪ ⊤ ⇒ (⟦A⟧ ⇔ ⟪B⟫),      ⎪⎢⎜ ⎲     ⎟⎥⎪ | ||||
|                                             ⎪⎢⎜ ⎳aⁱ-bⁱ⎟⎥⎪ | ||||
|   2H₂ + O₂ ⇌ 2H₂O, R = 4.7 kΩ, ⌀ 200 mm     ⎩⎣⎝i=1    ⎠⎦⎭ | ||||
| 
 | ||||
| Linguistics and dictionaries: | ||||
| 
 | ||||
|   ði ıntəˈnæʃənəl fəˈnɛtık əsoʊsiˈeıʃn | ||||
|   Y [ˈʏpsilɔn], Yen [jɛn], Yoga [ˈjoːgɑ] | ||||
| 
 | ||||
| APL: | ||||
| 
 | ||||
|   ((V⍳V)=⍳⍴V)/V←,V    ⌷←⍳→⍴∆∇⊃‾⍎⍕⌈ | ||||
| 
 | ||||
| Nicer typography in plain text files: | ||||
| 
 | ||||
|   ╔══════════════════════════════════════════╗ | ||||
|   ║                                          ║ | ||||
|   ║   • ‘single’ and “double” quotes         ║ | ||||
|   ║                                          ║ | ||||
|   ║   • Curly apostrophes: “We’ve been here” ║ | ||||
|   ║                                          ║ | ||||
|   ║   • Latin-1 apostrophe and accents: '´`  ║ | ||||
|   ║                                          ║ | ||||
|   ║   • ‚deutsche‘ „Anführungszeichen“       ║ | ||||
|   ║                                          ║ | ||||
|   ║   • †, ‡, ‰, •, 3–4, —, −5/+5, ™, …      ║ | ||||
|   ║                                          ║ | ||||
|   ║   • ASCII safety test: 1lI|, 0OD, 8B     ║ | ||||
|   ║                      ╭─────────╮         ║ | ||||
|   ║   • the euro symbol: │ 14.95 € │         ║ | ||||
|   ║                      ╰─────────╯         ║ | ||||
|   ╚══════════════════════════════════════════╝ | ||||
| 
 | ||||
| Combining characters: | ||||
| 
 | ||||
|   STARGΛ̊TE SG-1, a = v̇ = r̈, a⃑ ⊥ b⃑ | ||||
| 
 | ||||
| Greek (in Polytonic): | ||||
| 
 | ||||
|   The Greek anthem: | ||||
| 
 | ||||
|   Σὲ γνωρίζω ἀπὸ τὴν κόψη | ||||
|   τοῦ σπαθιοῦ τὴν τρομερή, | ||||
|   σὲ γνωρίζω ἀπὸ τὴν ὄψη | ||||
|   ποὺ μὲ βία μετράει τὴ γῆ. | ||||
| 
 | ||||
|   ᾿Απ᾿ τὰ κόκκαλα βγαλμένη | ||||
|   τῶν ῾Ελλήνων τὰ ἱερά | ||||
|   καὶ σὰν πρῶτα ἀνδρειωμένη | ||||
|   χαῖρε, ὦ χαῖρε, ᾿Ελευθεριά! | ||||
| 
 | ||||
|   From a speech of Demosthenes in the 4th century BC: | ||||
| 
 | ||||
|   Οὐχὶ ταὐτὰ παρίσταταί μοι γιγνώσκειν, ὦ ἄνδρες ᾿Αθηναῖοι, | ||||
|   ὅταν τ᾿ εἰς τὰ πράγματα ἀποβλέψω καὶ ὅταν πρὸς τοὺς | ||||
|   λόγους οὓς ἀκούω· τοὺς μὲν γὰρ λόγους περὶ τοῦ | ||||
|   τιμωρήσασθαι Φίλιππον ὁρῶ γιγνομένους, τὰ δὲ πράγματ᾿  | ||||
|   εἰς τοῦτο προήκοντα,  ὥσθ᾿ ὅπως μὴ πεισόμεθ᾿ αὐτοὶ | ||||
|   πρότερον κακῶς σκέψασθαι δέον. οὐδέν οὖν ἄλλο μοι δοκοῦσιν | ||||
|   οἱ τὰ τοιαῦτα λέγοντες ἢ τὴν ὑπόθεσιν, περὶ ἧς βουλεύεσθαι, | ||||
|   οὐχὶ τὴν οὖσαν παριστάντες ὑμῖν ἁμαρτάνειν. ἐγὼ δέ, ὅτι μέν | ||||
|   ποτ᾿ ἐξῆν τῇ πόλει καὶ τὰ αὑτῆς ἔχειν ἀσφαλῶς καὶ Φίλιππον | ||||
|   τιμωρήσασθαι, καὶ μάλ᾿ ἀκριβῶς οἶδα· ἐπ᾿ ἐμοῦ γάρ, οὐ πάλαι | ||||
|   γέγονεν ταῦτ᾿ ἀμφότερα· νῦν μέντοι πέπεισμαι τοῦθ᾿ ἱκανὸν | ||||
|   προλαβεῖν ἡμῖν εἶναι τὴν πρώτην, ὅπως τοὺς συμμάχους | ||||
|   σώσομεν. ἐὰν γὰρ τοῦτο βεβαίως ὑπάρξῃ, τότε καὶ περὶ τοῦ | ||||
|   τίνα τιμωρήσεταί τις καὶ ὃν τρόπον ἐξέσται σκοπεῖν· πρὶν δὲ | ||||
|   τὴν ἀρχὴν ὀρθῶς ὑποθέσθαι, μάταιον ἡγοῦμαι περὶ τῆς | ||||
|   τελευτῆς ὁντινοῦν ποιεῖσθαι λόγον. | ||||
| 
 | ||||
|   Δημοσθένους, Γ´ ᾿Ολυνθιακὸς | ||||
| 
 | ||||
| Georgian: | ||||
| 
 | ||||
|   From a Unicode conference invitation: | ||||
| 
 | ||||
|   გთხოვთ ახლავე გაიაროთ რეგისტრაცია Unicode-ის მეათე საერთაშორისო | ||||
|   კონფერენციაზე დასასწრებად, რომელიც გაიმართება 10-12 მარტს, | ||||
|   ქ. მაინცში, გერმანიაში. კონფერენცია შეჰკრებს ერთად მსოფლიოს | ||||
|   ექსპერტებს ისეთ დარგებში როგორიცაა ინტერნეტი და Unicode-ი, | ||||
|   ინტერნაციონალიზაცია და ლოკალიზაცია, Unicode-ის გამოყენება | ||||
|   ოპერაციულ სისტემებსა, და გამოყენებით პროგრამებში, შრიფტებში, | ||||
|   ტექსტების დამუშავებასა და მრავალენოვან კომპიუტერულ სისტემებში. | ||||
| 
 | ||||
| Russian: | ||||
| 
 | ||||
|   From a Unicode conference invitation: | ||||
| 
 | ||||
|   Зарегистрируйтесь сейчас на Десятую Международную Конференцию по | ||||
|   Unicode, которая состоится 10-12 марта 1997 года в Майнце в Германии. | ||||
|   Конференция соберет широкий круг экспертов по  вопросам глобального | ||||
|   Интернета и Unicode, локализации и интернационализации, воплощению и | ||||
|   применению Unicode в различных операционных системах и программных | ||||
|   приложениях, шрифтах, верстке и многоязычных компьютерных системах. | ||||
| 
 | ||||
| Thai (UCS Level 2): | ||||
| 
 | ||||
|   Excerpt from a poetry on The Romance of The Three Kingdoms (a Chinese | ||||
|   classic 'San Gua'): | ||||
| 
 | ||||
|   [----------------------------|------------------------] | ||||
|     ๏ แผ่นดินฮั่นเสื่อมโทรมแสนสังเวช  พระปกเกศกองบู๊กู้ขึ้นใหม่ | ||||
|   สิบสองกษัตริย์ก่อนหน้าแลถัดไป       สององค์ไซร้โง่เขลาเบาปัญญา | ||||
|     ทรงนับถือขันทีเป็นที่พึ่ง           บ้านเมืองจึงวิปริตเป็นนักหนา | ||||
|   โฮจิ๋นเรียกทัพทั่วหัวเมืองมา         หมายจะฆ่ามดชั่วตัวสำคัญ | ||||
|     เหมือนขับไสไล่เสือจากเคหา      รับหมาป่าเข้ามาเลยอาสัญ | ||||
|   ฝ่ายอ้องอุ้นยุแยกให้แตกกัน          ใช้สาวนั้นเป็นชนวนชื่นชวนใจ | ||||
|     พลันลิฉุยกุยกีกลับก่อเหตุ          ช่างอาเพศจริงหนาฟ้าร้องไห้ | ||||
|   ต้องรบราฆ่าฟันจนบรรลัย           ฤๅหาใครค้ำชูกู้บรรลังก์ ฯ | ||||
| 
 | ||||
|   (The above is a two-column text. If combining characters are handled | ||||
|   correctly, the lines of the second column should be aligned with the | ||||
|   | character above.) | ||||
| 
 | ||||
| Ethiopian: | ||||
| 
 | ||||
|   Proverbs in the Amharic language: | ||||
| 
 | ||||
|   ሰማይ አይታረስ ንጉሥ አይከሰስ። | ||||
|   ብላ ካለኝ እንደአባቴ በቆመጠኝ። | ||||
|   ጌጥ ያለቤቱ ቁምጥና ነው። | ||||
|   ደሀ በሕልሙ ቅቤ ባይጠጣ ንጣት በገደለው። | ||||
|   የአፍ ወለምታ በቅቤ አይታሽም። | ||||
|   አይጥ በበላ ዳዋ ተመታ። | ||||
|   ሲተረጉሙ ይደረግሙ። | ||||
|   ቀስ በቀስ፥ ዕንቁላል በእግሩ ይሄዳል። | ||||
|   ድር ቢያብር አንበሳ ያስር። | ||||
|   ሰው እንደቤቱ እንጅ እንደ ጉረቤቱ አይተዳደርም። | ||||
|   እግዜር የከፈተውን ጉሮሮ ሳይዘጋው አይድርም። | ||||
|   የጎረቤት ሌባ፥ ቢያዩት ይስቅ ባያዩት ያጠልቅ። | ||||
|   ሥራ ከመፍታት ልጄን ላፋታት። | ||||
|   ዓባይ ማደሪያ የለው፥ ግንድ ይዞ ይዞራል። | ||||
|   የእስላም አገሩ መካ የአሞራ አገሩ ዋርካ። | ||||
|   ተንጋሎ ቢተፉ ተመልሶ ባፉ። | ||||
|   ወዳጅህ ማር ቢሆን ጨርስህ አትላሰው። | ||||
|   እግርህን በፍራሽህ ልክ ዘርጋ። | ||||
| 
 | ||||
| Runes: | ||||
| 
 | ||||
|   ᚻᛖ ᚳᚹᚫᚦ ᚦᚫᛏ ᚻᛖ ᛒᚢᛞᛖ ᚩᚾ ᚦᚫᛗ ᛚᚪᚾᛞᛖ ᚾᚩᚱᚦᚹᛖᚪᚱᛞᚢᛗ ᚹᛁᚦ ᚦᚪ ᚹᛖᛥᚫ | ||||
| 
 | ||||
|   (Old English, which transcribed into Latin reads 'He cwaeth that he | ||||
|   bude thaem lande northweardum with tha Westsae.' and means 'He said | ||||
|   that he lived in the northern land near the Western Sea.') | ||||
| 
 | ||||
| Braille: | ||||
| 
 | ||||
|   ⡌⠁⠧⠑ ⠼⠁⠒  ⡍⠜⠇⠑⠹⠰⠎ ⡣⠕⠌ | ||||
| 
 | ||||
|   ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠙⠑⠁⠙⠒ ⠞⠕ ⠃⠑⠛⠔ ⠺⠊⠹⠲ ⡹⠻⠑ ⠊⠎ ⠝⠕ ⠙⠳⠃⠞ | ||||
|   ⠱⠁⠞⠑⠧⠻ ⠁⠃⠳⠞ ⠹⠁⠞⠲ ⡹⠑ ⠗⠑⠛⠊⠌⠻ ⠕⠋ ⠙⠊⠎ ⠃⠥⠗⠊⠁⠇ ⠺⠁⠎ | ||||
|   ⠎⠊⠛⠝⠫ ⠃⠹ ⠹⠑ ⠊⠇⠻⠛⠹⠍⠁⠝⠂ ⠹⠑ ⠊⠇⠻⠅⠂ ⠹⠑ ⠥⠝⠙⠻⠞⠁⠅⠻⠂ | ||||
|   ⠁⠝⠙ ⠹⠑ ⠡⠊⠑⠋ ⠍⠳⠗⠝⠻⠲ ⡎⠊⠗⠕⠕⠛⠑ ⠎⠊⠛⠝⠫ ⠊⠞⠲ ⡁⠝⠙ | ||||
|   ⡎⠊⠗⠕⠕⠛⠑⠰⠎ ⠝⠁⠍⠑ ⠺⠁⠎ ⠛⠕⠕⠙ ⠥⠏⠕⠝ ⠰⡡⠁⠝⠛⠑⠂ ⠋⠕⠗ ⠁⠝⠹⠹⠔⠛ ⠙⠑  | ||||
|   ⠡⠕⠎⠑ ⠞⠕ ⠏⠥⠞ ⠙⠊⠎ ⠙⠁⠝⠙ ⠞⠕⠲ | ||||
| 
 | ||||
|   ⡕⠇⠙ ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ | ||||
| 
 | ||||
|   ⡍⠔⠙⠖ ⡊ ⠙⠕⠝⠰⠞ ⠍⠑⠁⠝ ⠞⠕ ⠎⠁⠹ ⠹⠁⠞ ⡊ ⠅⠝⠪⠂ ⠕⠋ ⠍⠹ | ||||
|   ⠪⠝ ⠅⠝⠪⠇⠫⠛⠑⠂ ⠱⠁⠞ ⠹⠻⠑ ⠊⠎ ⠏⠜⠞⠊⠊⠥⠇⠜⠇⠹ ⠙⠑⠁⠙ ⠁⠃⠳⠞ | ||||
|   ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ ⡊ ⠍⠊⠣⠞ ⠙⠁⠧⠑ ⠃⠑⠲ ⠔⠊⠇⠔⠫⠂ ⠍⠹⠎⠑⠇⠋⠂ ⠞⠕ | ||||
|   ⠗⠑⠛⠜⠙ ⠁ ⠊⠕⠋⠋⠔⠤⠝⠁⠊⠇ ⠁⠎ ⠹⠑ ⠙⠑⠁⠙⠑⠌ ⠏⠊⠑⠊⠑ ⠕⠋ ⠊⠗⠕⠝⠍⠕⠝⠛⠻⠹  | ||||
|   ⠔ ⠹⠑ ⠞⠗⠁⠙⠑⠲ ⡃⠥⠞ ⠹⠑ ⠺⠊⠎⠙⠕⠍ ⠕⠋ ⠳⠗ ⠁⠝⠊⠑⠌⠕⠗⠎  | ||||
|   ⠊⠎ ⠔ ⠹⠑ ⠎⠊⠍⠊⠇⠑⠆ ⠁⠝⠙ ⠍⠹ ⠥⠝⠙⠁⠇⠇⠪⠫ ⠙⠁⠝⠙⠎ | ||||
|   ⠩⠁⠇⠇ ⠝⠕⠞ ⠙⠊⠌⠥⠗⠃ ⠊⠞⠂ ⠕⠗ ⠹⠑ ⡊⠳⠝⠞⠗⠹⠰⠎ ⠙⠕⠝⠑ ⠋⠕⠗⠲ ⡹⠳ | ||||
|   ⠺⠊⠇⠇ ⠹⠻⠑⠋⠕⠗⠑ ⠏⠻⠍⠊⠞ ⠍⠑ ⠞⠕ ⠗⠑⠏⠑⠁⠞⠂ ⠑⠍⠏⠙⠁⠞⠊⠊⠁⠇⠇⠹⠂ ⠹⠁⠞ | ||||
|   ⡍⠜⠇⠑⠹ ⠺⠁⠎ ⠁⠎ ⠙⠑⠁⠙ ⠁⠎ ⠁ ⠙⠕⠕⠗⠤⠝⠁⠊⠇⠲ | ||||
| 
 | ||||
|   (The first couple of paragraphs of "A Christmas Carol" by Dickens) | ||||
| 
 | ||||
| Compact font selection example text: | ||||
| 
 | ||||
|   ABCDEFGHIJKLMNOPQRSTUVWXYZ /0123456789 | ||||
|   abcdefghijklmnopqrstuvwxyz £©µÀÆÖÞßéöÿ | ||||
|   –—‘“”„†•…‰™œŠŸž€ ΑΒΓΔΩαβγδω АБВГДабвгд | ||||
|   ∀∂∈ℝ∧∪≡∞ ↑↗↨↻⇣ ┐┼╔╘░►☺♀ fi?⑀₂ἠḂӥẄɐː⍎אԱა | ||||
| 
 | ||||
| Greetings in various languages: | ||||
| 
 | ||||
|   Hello world, Καλημέρα κόσμε, コンニチハ | ||||
| 
 | ||||
| Box drawing alignment tests:                                          █ | ||||
|                                                                       ▉ | ||||
|   ╔══╦══╗  ┌──┬──┐  ╭──┬──╮  ╭──┬──╮  ┏━━┳━━┓  ┎┒┏┑   ╷  ╻ ┏┯┓ ┌┰┐    ▊ ╱╲╱╲╳╳╳ | ||||
|   ║┌─╨─┐║  │╔═╧═╗│  │╒═╪═╕│  │╓─╁─╖│  ┃┌─╂─┐┃  ┗╃╄┙  ╶┼╴╺╋╸┠┼┨ ┝╋┥    ▋ ╲╱╲╱╳╳╳ | ||||
|   ║│╲ ╱│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╿ │┃  ┍╅╆┓   ╵  ╹ ┗┷┛ └┸┘    ▌ ╱╲╱╲╳╳╳ | ||||
|   ╠╡ ╳ ╞╣  ├╢   ╟┤  ├┼─┼─┼┤  ├╫─╂─╫┤  ┣┿╾┼╼┿┫  ┕┛┖┚     ┌┄┄┐ ╎ ┏┅┅┓ ┋ ▍ ╲╱╲╱╳╳╳ | ||||
|   ║│╱ ╲│║  │║   ║│  ││ │ ││  │║ ┃ ║│  ┃│ ╽ │┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▎ | ||||
|   ║└─╥─┘║  │╚═╤═╝│  │╘═╪═╛│  │╙─╀─╜│  ┃└─╂─┘┃  ░░▒▒▓▓██ ┊  ┆ ╎ ╏  ┇ ┋ ▏ | ||||
|   ╚══╩══╝  └──┴──┘  ╰──┴──╯  ╰──┴──╯  ┗━━┻━━┛  ▗▄▖▛▀▜   └╌╌┘ ╎ ┗╍╍┛ ┋  ▁▂▃▄▅▆▇█ | ||||
|                                                ▝▀▘▙▄▟ | ||||
| 
 | ||||
| 
 | ||||
|  | @ -93,6 +93,9 @@ char *termname = "st-256color"; | |||
|  */ | ||||
| unsigned int tabspaces = 8; | ||||
| 
 | ||||
| /* bg opacity */ | ||||
| float alpha = 0.8; | ||||
| 
 | ||||
| /* Terminal colors (16 first used in escape sequence) */ | ||||
| static const char *colorname[] = { | ||||
| 	/* 8 normal colors */ | ||||
|  | @ -120,6 +123,7 @@ static const char *colorname[] = { | |||
| 	/* more colors can be added after 255 to use with DefaultXX */ | ||||
| 	"#cccccc", | ||||
| 	"#555555", | ||||
| 	"black", | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
|  | @ -128,7 +132,7 @@ static const char *colorname[] = { | |||
|  * foreground, background, cursor, reverse cursor | ||||
|  */ | ||||
| unsigned int defaultfg = 7; | ||||
| unsigned int defaultbg = 0; | ||||
| unsigned int defaultbg = 258; | ||||
| static unsigned int defaultcs = 256; | ||||
| static unsigned int defaultrcs = 257; | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,472 @@ | |||
| /* See LICENSE file for copyright and license details. */ | ||||
| 
 | ||||
| /*
 | ||||
|  * appearance | ||||
|  * | ||||
|  * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
 | ||||
|  */ | ||||
| static char *font = "Liberation Mono:pixelsize=12:antialias=true:autohint=true"; | ||||
| static int borderpx = 2; | ||||
| 
 | ||||
| /*
 | ||||
|  * What program is execed by st depends of these precedence rules: | ||||
|  * 1: program passed with -e | ||||
|  * 2: scroll and/or utmp | ||||
|  * 3: SHELL environment variable | ||||
|  * 4: value of shell in /etc/passwd | ||||
|  * 5: value of shell in config.h | ||||
|  */ | ||||
| static char *shell = "/bin/sh"; | ||||
| char *utmp = NULL; | ||||
| /* scroll program: to enable use a string like "scroll" */ | ||||
| char *scroll = NULL; | ||||
| char *stty_args = "stty raw pass8 nl -echo -iexten -cstopb 38400"; | ||||
| 
 | ||||
| /* identification sequence returned in DA and DECID */ | ||||
| char *vtiden = "\033[?6c"; | ||||
| 
 | ||||
| /* Kerning / character bounding-box multipliers */ | ||||
| static float cwscale = 1.0; | ||||
| static float chscale = 1.0; | ||||
| 
 | ||||
| /*
 | ||||
|  * word delimiter string | ||||
|  * | ||||
|  * More advanced example: L" `'\"()[]{}" | ||||
|  */ | ||||
| wchar_t *worddelimiters = L" "; | ||||
| 
 | ||||
| /* selection timeouts (in milliseconds) */ | ||||
| static unsigned int doubleclicktimeout = 300; | ||||
| static unsigned int tripleclicktimeout = 600; | ||||
| 
 | ||||
| /* alt screens */ | ||||
| int allowaltscreen = 1; | ||||
| 
 | ||||
| /* allow certain non-interactive (insecure) window operations such as:
 | ||||
|    setting the clipboard text */ | ||||
| int allowwindowops = 0; | ||||
| 
 | ||||
| /*
 | ||||
|  * draw latency range in ms - from new content/keypress/etc until drawing. | ||||
|  * within this range, st draws when content stops arriving (idle). mostly it's | ||||
|  * near minlatency, but it waits longer for slow updates to avoid partial draw. | ||||
|  * low minlatency will tear/flicker more, as it can "detect" idle too early. | ||||
|  */ | ||||
| static double minlatency = 8; | ||||
| static double maxlatency = 33; | ||||
| 
 | ||||
| /*
 | ||||
|  * blinking timeout (set to 0 to disable blinking) for the terminal blinking | ||||
|  * attribute. | ||||
|  */ | ||||
| static unsigned int blinktimeout = 800; | ||||
| 
 | ||||
| /*
 | ||||
|  * thickness of underline and bar cursors | ||||
|  */ | ||||
| static unsigned int cursorthickness = 2; | ||||
| 
 | ||||
| /*
 | ||||
|  * bell volume. It must be a value between -100 and 100. Use 0 for disabling | ||||
|  * it | ||||
|  */ | ||||
| static int bellvolume = 0; | ||||
| 
 | ||||
| /* default TERM value */ | ||||
| char *termname = "st-256color"; | ||||
| 
 | ||||
| /*
 | ||||
|  * spaces per tab | ||||
|  * | ||||
|  * When you are changing this value, don't forget to adapt the »it« value in | ||||
|  * the st.info and appropriately install the st.info in the environment where | ||||
|  * you use this st version. | ||||
|  * | ||||
|  *	it#$tabspaces, | ||||
|  * | ||||
|  * Secondly make sure your kernel is not expanding tabs. When running `stty | ||||
|  * -a` »tab0« should appear. You can tell the terminal to not expand tabs by | ||||
|  *  running following command: | ||||
|  * | ||||
|  *	stty tabs | ||||
|  */ | ||||
| unsigned int tabspaces = 8; | ||||
| 
 | ||||
| /* Terminal colors (16 first used in escape sequence) */ | ||||
| static const char *colorname[] = { | ||||
| 	/* 8 normal colors */ | ||||
| 	"black", | ||||
| 	"red3", | ||||
| 	"green3", | ||||
| 	"yellow3", | ||||
| 	"blue2", | ||||
| 	"magenta3", | ||||
| 	"cyan3", | ||||
| 	"gray90", | ||||
| 
 | ||||
| 	/* 8 bright colors */ | ||||
| 	"gray50", | ||||
| 	"red", | ||||
| 	"green", | ||||
| 	"yellow", | ||||
| 	"#5c5cff", | ||||
| 	"magenta", | ||||
| 	"cyan", | ||||
| 	"white", | ||||
| 
 | ||||
| 	[255] = 0, | ||||
| 
 | ||||
| 	/* more colors can be added after 255 to use with DefaultXX */ | ||||
| 	"#cccccc", | ||||
| 	"#555555", | ||||
| }; | ||||
| 
 | ||||
| 
 | ||||
| /*
 | ||||
|  * Default colors (colorname index) | ||||
|  * foreground, background, cursor, reverse cursor | ||||
|  */ | ||||
| unsigned int defaultfg = 7; | ||||
| unsigned int defaultbg = 0; | ||||
| static unsigned int defaultcs = 256; | ||||
| static unsigned int defaultrcs = 257; | ||||
| 
 | ||||
| /*
 | ||||
|  * Default shape of cursor | ||||
|  * 2: Block ("█") | ||||
|  * 4: Underline ("_") | ||||
|  * 6: Bar ("|") | ||||
|  * 7: Snowman ("☃") | ||||
|  */ | ||||
| static unsigned int cursorshape = 2; | ||||
| 
 | ||||
| /*
 | ||||
|  * Default columns and rows numbers | ||||
|  */ | ||||
| 
 | ||||
| static unsigned int cols = 80; | ||||
| static unsigned int rows = 24; | ||||
| 
 | ||||
| /*
 | ||||
|  * Default colour and shape of the mouse cursor | ||||
|  */ | ||||
| static unsigned int mouseshape = XC_xterm; | ||||
| static unsigned int mousefg = 7; | ||||
| static unsigned int mousebg = 0; | ||||
| 
 | ||||
| /*
 | ||||
|  * Color used to display font attributes when fontconfig selected a font which | ||||
|  * doesn't match the ones requested. | ||||
|  */ | ||||
| static unsigned int defaultattr = 11; | ||||
| 
 | ||||
| /*
 | ||||
|  * Force mouse select/shortcuts while mask is active (when MODE_MOUSE is set). | ||||
|  * Note that if you want to use ShiftMask with selmasks, set this to an other | ||||
|  * modifier, set to 0 to not use it. | ||||
|  */ | ||||
| static uint forcemousemod = ShiftMask; | ||||
| 
 | ||||
| /*
 | ||||
|  * Internal mouse shortcuts. | ||||
|  * Beware that overloading Button1 will disable the selection. | ||||
|  */ | ||||
| static MouseShortcut mshortcuts[] = { | ||||
| 	/* mask                 button   function        argument       release */ | ||||
| 	{ XK_ANY_MOD,           Button2, selpaste,       {.i = 0},      1 }, | ||||
| 	{ ShiftMask,            Button4, ttysend,        {.s = "\033[5;2~"} }, | ||||
| 	{ XK_ANY_MOD,           Button4, ttysend,        {.s = "\031"} }, | ||||
| 	{ ShiftMask,            Button5, ttysend,        {.s = "\033[6;2~"} }, | ||||
| 	{ XK_ANY_MOD,           Button5, ttysend,        {.s = "\005"} }, | ||||
| }; | ||||
| 
 | ||||
| /* Internal keyboard shortcuts. */ | ||||
| #define MODKEY Mod1Mask | ||||
| #define TERMMOD (ControlMask|ShiftMask) | ||||
| 
 | ||||
| static Shortcut shortcuts[] = { | ||||
| 	/* mask                 keysym          function        argument */ | ||||
| 	{ XK_ANY_MOD,           XK_Break,       sendbreak,      {.i =  0} }, | ||||
| 	{ ControlMask,          XK_Print,       toggleprinter,  {.i =  0} }, | ||||
| 	{ ShiftMask,            XK_Print,       printscreen,    {.i =  0} }, | ||||
| 	{ XK_ANY_MOD,           XK_Print,       printsel,       {.i =  0} }, | ||||
| 	{ TERMMOD,              XK_Prior,       zoom,           {.f = +1} }, | ||||
| 	{ TERMMOD,              XK_Next,        zoom,           {.f = -1} }, | ||||
| 	{ TERMMOD,              XK_Home,        zoomreset,      {.f =  0} }, | ||||
| 	{ TERMMOD,              XK_C,           clipcopy,       {.i =  0} }, | ||||
| 	{ TERMMOD,              XK_V,           clippaste,      {.i =  0} }, | ||||
| 	{ TERMMOD,              XK_Y,           selpaste,       {.i =  0} }, | ||||
| 	{ ShiftMask,            XK_Insert,      selpaste,       {.i =  0} }, | ||||
| 	{ TERMMOD,              XK_Num_Lock,    numlock,        {.i =  0} }, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Special keys (change & recompile st.info accordingly) | ||||
|  * | ||||
|  * Mask value: | ||||
|  * * Use XK_ANY_MOD to match the key no matter modifiers state | ||||
|  * * Use XK_NO_MOD to match the key alone (no modifiers) | ||||
|  * appkey value: | ||||
|  * * 0: no value | ||||
|  * * > 0: keypad application mode enabled | ||||
|  * *   = 2: term.numlock = 1 | ||||
|  * * < 0: keypad application mode disabled | ||||
|  * appcursor value: | ||||
|  * * 0: no value | ||||
|  * * > 0: cursor application mode enabled | ||||
|  * * < 0: cursor application mode disabled | ||||
|  * | ||||
|  * Be careful with the order of the definitions because st searches in | ||||
|  * this table sequentially, so any XK_ANY_MOD must be in the last | ||||
|  * position for a key. | ||||
|  */ | ||||
| 
 | ||||
| /*
 | ||||
|  * If you want keys other than the X11 function keys (0xFD00 - 0xFFFF) | ||||
|  * to be mapped below, add them to this array. | ||||
|  */ | ||||
| static KeySym mappedkeys[] = { -1 }; | ||||
| 
 | ||||
| /*
 | ||||
|  * State bits to ignore when matching key or button events.  By default, | ||||
|  * numlock (Mod2Mask) and keyboard layout (XK_SWITCH_MOD) are ignored. | ||||
|  */ | ||||
| static uint ignoremod = Mod2Mask|XK_SWITCH_MOD; | ||||
| 
 | ||||
| /*
 | ||||
|  * This is the huge key array which defines all compatibility to the Linux | ||||
|  * world. Please decide about changes wisely. | ||||
|  */ | ||||
| static Key key[] = { | ||||
| 	/* keysym           mask            string      appkey appcursor */ | ||||
| 	{ XK_KP_Home,       ShiftMask,      "\033[2J",       0,   -1}, | ||||
| 	{ XK_KP_Home,       ShiftMask,      "\033[1;2H",     0,   +1}, | ||||
| 	{ XK_KP_Home,       XK_ANY_MOD,     "\033[H",        0,   -1}, | ||||
| 	{ XK_KP_Home,       XK_ANY_MOD,     "\033[1~",       0,   +1}, | ||||
| 	{ XK_KP_Up,         XK_ANY_MOD,     "\033Ox",       +1,    0}, | ||||
| 	{ XK_KP_Up,         XK_ANY_MOD,     "\033[A",        0,   -1}, | ||||
| 	{ XK_KP_Up,         XK_ANY_MOD,     "\033OA",        0,   +1}, | ||||
| 	{ XK_KP_Down,       XK_ANY_MOD,     "\033Or",       +1,    0}, | ||||
| 	{ XK_KP_Down,       XK_ANY_MOD,     "\033[B",        0,   -1}, | ||||
| 	{ XK_KP_Down,       XK_ANY_MOD,     "\033OB",        0,   +1}, | ||||
| 	{ XK_KP_Left,       XK_ANY_MOD,     "\033Ot",       +1,    0}, | ||||
| 	{ XK_KP_Left,       XK_ANY_MOD,     "\033[D",        0,   -1}, | ||||
| 	{ XK_KP_Left,       XK_ANY_MOD,     "\033OD",        0,   +1}, | ||||
| 	{ XK_KP_Right,      XK_ANY_MOD,     "\033Ov",       +1,    0}, | ||||
| 	{ XK_KP_Right,      XK_ANY_MOD,     "\033[C",        0,   -1}, | ||||
| 	{ XK_KP_Right,      XK_ANY_MOD,     "\033OC",        0,   +1}, | ||||
| 	{ XK_KP_Prior,      ShiftMask,      "\033[5;2~",     0,    0}, | ||||
| 	{ XK_KP_Prior,      XK_ANY_MOD,     "\033[5~",       0,    0}, | ||||
| 	{ XK_KP_Begin,      XK_ANY_MOD,     "\033[E",        0,    0}, | ||||
| 	{ XK_KP_End,        ControlMask,    "\033[J",       -1,    0}, | ||||
| 	{ XK_KP_End,        ControlMask,    "\033[1;5F",    +1,    0}, | ||||
| 	{ XK_KP_End,        ShiftMask,      "\033[K",       -1,    0}, | ||||
| 	{ XK_KP_End,        ShiftMask,      "\033[1;2F",    +1,    0}, | ||||
| 	{ XK_KP_End,        XK_ANY_MOD,     "\033[4~",       0,    0}, | ||||
| 	{ XK_KP_Next,       ShiftMask,      "\033[6;2~",     0,    0}, | ||||
| 	{ XK_KP_Next,       XK_ANY_MOD,     "\033[6~",       0,    0}, | ||||
| 	{ XK_KP_Insert,     ShiftMask,      "\033[2;2~",    +1,    0}, | ||||
| 	{ XK_KP_Insert,     ShiftMask,      "\033[4l",      -1,    0}, | ||||
| 	{ XK_KP_Insert,     ControlMask,    "\033[L",       -1,    0}, | ||||
| 	{ XK_KP_Insert,     ControlMask,    "\033[2;5~",    +1,    0}, | ||||
| 	{ XK_KP_Insert,     XK_ANY_MOD,     "\033[4h",      -1,    0}, | ||||
| 	{ XK_KP_Insert,     XK_ANY_MOD,     "\033[2~",      +1,    0}, | ||||
| 	{ XK_KP_Delete,     ControlMask,    "\033[M",       -1,    0}, | ||||
| 	{ XK_KP_Delete,     ControlMask,    "\033[3;5~",    +1,    0}, | ||||
| 	{ XK_KP_Delete,     ShiftMask,      "\033[2K",      -1,    0}, | ||||
| 	{ XK_KP_Delete,     ShiftMask,      "\033[3;2~",    +1,    0}, | ||||
| 	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[P",       -1,    0}, | ||||
| 	{ XK_KP_Delete,     XK_ANY_MOD,     "\033[3~",      +1,    0}, | ||||
| 	{ XK_KP_Multiply,   XK_ANY_MOD,     "\033Oj",       +2,    0}, | ||||
| 	{ XK_KP_Add,        XK_ANY_MOD,     "\033Ok",       +2,    0}, | ||||
| 	{ XK_KP_Enter,      XK_ANY_MOD,     "\033OM",       +2,    0}, | ||||
| 	{ XK_KP_Enter,      XK_ANY_MOD,     "\r",           -1,    0}, | ||||
| 	{ XK_KP_Subtract,   XK_ANY_MOD,     "\033Om",       +2,    0}, | ||||
| 	{ XK_KP_Decimal,    XK_ANY_MOD,     "\033On",       +2,    0}, | ||||
| 	{ XK_KP_Divide,     XK_ANY_MOD,     "\033Oo",       +2,    0}, | ||||
| 	{ XK_KP_0,          XK_ANY_MOD,     "\033Op",       +2,    0}, | ||||
| 	{ XK_KP_1,          XK_ANY_MOD,     "\033Oq",       +2,    0}, | ||||
| 	{ XK_KP_2,          XK_ANY_MOD,     "\033Or",       +2,    0}, | ||||
| 	{ XK_KP_3,          XK_ANY_MOD,     "\033Os",       +2,    0}, | ||||
| 	{ XK_KP_4,          XK_ANY_MOD,     "\033Ot",       +2,    0}, | ||||
| 	{ XK_KP_5,          XK_ANY_MOD,     "\033Ou",       +2,    0}, | ||||
| 	{ XK_KP_6,          XK_ANY_MOD,     "\033Ov",       +2,    0}, | ||||
| 	{ XK_KP_7,          XK_ANY_MOD,     "\033Ow",       +2,    0}, | ||||
| 	{ XK_KP_8,          XK_ANY_MOD,     "\033Ox",       +2,    0}, | ||||
| 	{ XK_KP_9,          XK_ANY_MOD,     "\033Oy",       +2,    0}, | ||||
| 	{ XK_Up,            ShiftMask,      "\033[1;2A",     0,    0}, | ||||
| 	{ XK_Up,            Mod1Mask,       "\033[1;3A",     0,    0}, | ||||
| 	{ XK_Up,         ShiftMask|Mod1Mask,"\033[1;4A",     0,    0}, | ||||
| 	{ XK_Up,            ControlMask,    "\033[1;5A",     0,    0}, | ||||
| 	{ XK_Up,      ShiftMask|ControlMask,"\033[1;6A",     0,    0}, | ||||
| 	{ XK_Up,       ControlMask|Mod1Mask,"\033[1;7A",     0,    0}, | ||||
| 	{ XK_Up,ShiftMask|ControlMask|Mod1Mask,"\033[1;8A",  0,    0}, | ||||
| 	{ XK_Up,            XK_ANY_MOD,     "\033[A",        0,   -1}, | ||||
| 	{ XK_Up,            XK_ANY_MOD,     "\033OA",        0,   +1}, | ||||
| 	{ XK_Down,          ShiftMask,      "\033[1;2B",     0,    0}, | ||||
| 	{ XK_Down,          Mod1Mask,       "\033[1;3B",     0,    0}, | ||||
| 	{ XK_Down,       ShiftMask|Mod1Mask,"\033[1;4B",     0,    0}, | ||||
| 	{ XK_Down,          ControlMask,    "\033[1;5B",     0,    0}, | ||||
| 	{ XK_Down,    ShiftMask|ControlMask,"\033[1;6B",     0,    0}, | ||||
| 	{ XK_Down,     ControlMask|Mod1Mask,"\033[1;7B",     0,    0}, | ||||
| 	{ XK_Down,ShiftMask|ControlMask|Mod1Mask,"\033[1;8B",0,    0}, | ||||
| 	{ XK_Down,          XK_ANY_MOD,     "\033[B",        0,   -1}, | ||||
| 	{ XK_Down,          XK_ANY_MOD,     "\033OB",        0,   +1}, | ||||
| 	{ XK_Left,          ShiftMask,      "\033[1;2D",     0,    0}, | ||||
| 	{ XK_Left,          Mod1Mask,       "\033[1;3D",     0,    0}, | ||||
| 	{ XK_Left,       ShiftMask|Mod1Mask,"\033[1;4D",     0,    0}, | ||||
| 	{ XK_Left,          ControlMask,    "\033[1;5D",     0,    0}, | ||||
| 	{ XK_Left,    ShiftMask|ControlMask,"\033[1;6D",     0,    0}, | ||||
| 	{ XK_Left,     ControlMask|Mod1Mask,"\033[1;7D",     0,    0}, | ||||
| 	{ XK_Left,ShiftMask|ControlMask|Mod1Mask,"\033[1;8D",0,    0}, | ||||
| 	{ XK_Left,          XK_ANY_MOD,     "\033[D",        0,   -1}, | ||||
| 	{ XK_Left,          XK_ANY_MOD,     "\033OD",        0,   +1}, | ||||
| 	{ XK_Right,         ShiftMask,      "\033[1;2C",     0,    0}, | ||||
| 	{ XK_Right,         Mod1Mask,       "\033[1;3C",     0,    0}, | ||||
| 	{ XK_Right,      ShiftMask|Mod1Mask,"\033[1;4C",     0,    0}, | ||||
| 	{ XK_Right,         ControlMask,    "\033[1;5C",     0,    0}, | ||||
| 	{ XK_Right,   ShiftMask|ControlMask,"\033[1;6C",     0,    0}, | ||||
| 	{ XK_Right,    ControlMask|Mod1Mask,"\033[1;7C",     0,    0}, | ||||
| 	{ XK_Right,ShiftMask|ControlMask|Mod1Mask,"\033[1;8C",0,   0}, | ||||
| 	{ XK_Right,         XK_ANY_MOD,     "\033[C",        0,   -1}, | ||||
| 	{ XK_Right,         XK_ANY_MOD,     "\033OC",        0,   +1}, | ||||
| 	{ XK_ISO_Left_Tab,  ShiftMask,      "\033[Z",        0,    0}, | ||||
| 	{ XK_Return,        Mod1Mask,       "\033\r",        0,    0}, | ||||
| 	{ XK_Return,        XK_ANY_MOD,     "\r",            0,    0}, | ||||
| 	{ XK_Insert,        ShiftMask,      "\033[4l",      -1,    0}, | ||||
| 	{ XK_Insert,        ShiftMask,      "\033[2;2~",    +1,    0}, | ||||
| 	{ XK_Insert,        ControlMask,    "\033[L",       -1,    0}, | ||||
| 	{ XK_Insert,        ControlMask,    "\033[2;5~",    +1,    0}, | ||||
| 	{ XK_Insert,        XK_ANY_MOD,     "\033[4h",      -1,    0}, | ||||
| 	{ XK_Insert,        XK_ANY_MOD,     "\033[2~",      +1,    0}, | ||||
| 	{ XK_Delete,        ControlMask,    "\033[M",       -1,    0}, | ||||
| 	{ XK_Delete,        ControlMask,    "\033[3;5~",    +1,    0}, | ||||
| 	{ XK_Delete,        ShiftMask,      "\033[2K",      -1,    0}, | ||||
| 	{ XK_Delete,        ShiftMask,      "\033[3;2~",    +1,    0}, | ||||
| 	{ XK_Delete,        XK_ANY_MOD,     "\033[P",       -1,    0}, | ||||
| 	{ XK_Delete,        XK_ANY_MOD,     "\033[3~",      +1,    0}, | ||||
| 	{ XK_BackSpace,     XK_NO_MOD,      "\177",          0,    0}, | ||||
| 	{ XK_BackSpace,     Mod1Mask,       "\033\177",      0,    0}, | ||||
| 	{ XK_Home,          ShiftMask,      "\033[2J",       0,   -1}, | ||||
| 	{ XK_Home,          ShiftMask,      "\033[1;2H",     0,   +1}, | ||||
| 	{ XK_Home,          XK_ANY_MOD,     "\033[H",        0,   -1}, | ||||
| 	{ XK_Home,          XK_ANY_MOD,     "\033[1~",       0,   +1}, | ||||
| 	{ XK_End,           ControlMask,    "\033[J",       -1,    0}, | ||||
| 	{ XK_End,           ControlMask,    "\033[1;5F",    +1,    0}, | ||||
| 	{ XK_End,           ShiftMask,      "\033[K",       -1,    0}, | ||||
| 	{ XK_End,           ShiftMask,      "\033[1;2F",    +1,    0}, | ||||
| 	{ XK_End,           XK_ANY_MOD,     "\033[4~",       0,    0}, | ||||
| 	{ XK_Prior,         ControlMask,    "\033[5;5~",     0,    0}, | ||||
| 	{ XK_Prior,         ShiftMask,      "\033[5;2~",     0,    0}, | ||||
| 	{ XK_Prior,         XK_ANY_MOD,     "\033[5~",       0,    0}, | ||||
| 	{ XK_Next,          ControlMask,    "\033[6;5~",     0,    0}, | ||||
| 	{ XK_Next,          ShiftMask,      "\033[6;2~",     0,    0}, | ||||
| 	{ XK_Next,          XK_ANY_MOD,     "\033[6~",       0,    0}, | ||||
| 	{ XK_F1,            XK_NO_MOD,      "\033OP" ,       0,    0}, | ||||
| 	{ XK_F1, /* F13 */  ShiftMask,      "\033[1;2P",     0,    0}, | ||||
| 	{ XK_F1, /* F25 */  ControlMask,    "\033[1;5P",     0,    0}, | ||||
| 	{ XK_F1, /* F37 */  Mod4Mask,       "\033[1;6P",     0,    0}, | ||||
| 	{ XK_F1, /* F49 */  Mod1Mask,       "\033[1;3P",     0,    0}, | ||||
| 	{ XK_F1, /* F61 */  Mod3Mask,       "\033[1;4P",     0,    0}, | ||||
| 	{ XK_F2,            XK_NO_MOD,      "\033OQ" ,       0,    0}, | ||||
| 	{ XK_F2, /* F14 */  ShiftMask,      "\033[1;2Q",     0,    0}, | ||||
| 	{ XK_F2, /* F26 */  ControlMask,    "\033[1;5Q",     0,    0}, | ||||
| 	{ XK_F2, /* F38 */  Mod4Mask,       "\033[1;6Q",     0,    0}, | ||||
| 	{ XK_F2, /* F50 */  Mod1Mask,       "\033[1;3Q",     0,    0}, | ||||
| 	{ XK_F2, /* F62 */  Mod3Mask,       "\033[1;4Q",     0,    0}, | ||||
| 	{ XK_F3,            XK_NO_MOD,      "\033OR" ,       0,    0}, | ||||
| 	{ XK_F3, /* F15 */  ShiftMask,      "\033[1;2R",     0,    0}, | ||||
| 	{ XK_F3, /* F27 */  ControlMask,    "\033[1;5R",     0,    0}, | ||||
| 	{ XK_F3, /* F39 */  Mod4Mask,       "\033[1;6R",     0,    0}, | ||||
| 	{ XK_F3, /* F51 */  Mod1Mask,       "\033[1;3R",     0,    0}, | ||||
| 	{ XK_F3, /* F63 */  Mod3Mask,       "\033[1;4R",     0,    0}, | ||||
| 	{ XK_F4,            XK_NO_MOD,      "\033OS" ,       0,    0}, | ||||
| 	{ XK_F4, /* F16 */  ShiftMask,      "\033[1;2S",     0,    0}, | ||||
| 	{ XK_F4, /* F28 */  ControlMask,    "\033[1;5S",     0,    0}, | ||||
| 	{ XK_F4, /* F40 */  Mod4Mask,       "\033[1;6S",     0,    0}, | ||||
| 	{ XK_F4, /* F52 */  Mod1Mask,       "\033[1;3S",     0,    0}, | ||||
| 	{ XK_F5,            XK_NO_MOD,      "\033[15~",      0,    0}, | ||||
| 	{ XK_F5, /* F17 */  ShiftMask,      "\033[15;2~",    0,    0}, | ||||
| 	{ XK_F5, /* F29 */  ControlMask,    "\033[15;5~",    0,    0}, | ||||
| 	{ XK_F5, /* F41 */  Mod4Mask,       "\033[15;6~",    0,    0}, | ||||
| 	{ XK_F5, /* F53 */  Mod1Mask,       "\033[15;3~",    0,    0}, | ||||
| 	{ XK_F6,            XK_NO_MOD,      "\033[17~",      0,    0}, | ||||
| 	{ XK_F6, /* F18 */  ShiftMask,      "\033[17;2~",    0,    0}, | ||||
| 	{ XK_F6, /* F30 */  ControlMask,    "\033[17;5~",    0,    0}, | ||||
| 	{ XK_F6, /* F42 */  Mod4Mask,       "\033[17;6~",    0,    0}, | ||||
| 	{ XK_F6, /* F54 */  Mod1Mask,       "\033[17;3~",    0,    0}, | ||||
| 	{ XK_F7,            XK_NO_MOD,      "\033[18~",      0,    0}, | ||||
| 	{ XK_F7, /* F19 */  ShiftMask,      "\033[18;2~",    0,    0}, | ||||
| 	{ XK_F7, /* F31 */  ControlMask,    "\033[18;5~",    0,    0}, | ||||
| 	{ XK_F7, /* F43 */  Mod4Mask,       "\033[18;6~",    0,    0}, | ||||
| 	{ XK_F7, /* F55 */  Mod1Mask,       "\033[18;3~",    0,    0}, | ||||
| 	{ XK_F8,            XK_NO_MOD,      "\033[19~",      0,    0}, | ||||
| 	{ XK_F8, /* F20 */  ShiftMask,      "\033[19;2~",    0,    0}, | ||||
| 	{ XK_F8, /* F32 */  ControlMask,    "\033[19;5~",    0,    0}, | ||||
| 	{ XK_F8, /* F44 */  Mod4Mask,       "\033[19;6~",    0,    0}, | ||||
| 	{ XK_F8, /* F56 */  Mod1Mask,       "\033[19;3~",    0,    0}, | ||||
| 	{ XK_F9,            XK_NO_MOD,      "\033[20~",      0,    0}, | ||||
| 	{ XK_F9, /* F21 */  ShiftMask,      "\033[20;2~",    0,    0}, | ||||
| 	{ XK_F9, /* F33 */  ControlMask,    "\033[20;5~",    0,    0}, | ||||
| 	{ XK_F9, /* F45 */  Mod4Mask,       "\033[20;6~",    0,    0}, | ||||
| 	{ XK_F9, /* F57 */  Mod1Mask,       "\033[20;3~",    0,    0}, | ||||
| 	{ XK_F10,           XK_NO_MOD,      "\033[21~",      0,    0}, | ||||
| 	{ XK_F10, /* F22 */ ShiftMask,      "\033[21;2~",    0,    0}, | ||||
| 	{ XK_F10, /* F34 */ ControlMask,    "\033[21;5~",    0,    0}, | ||||
| 	{ XK_F10, /* F46 */ Mod4Mask,       "\033[21;6~",    0,    0}, | ||||
| 	{ XK_F10, /* F58 */ Mod1Mask,       "\033[21;3~",    0,    0}, | ||||
| 	{ XK_F11,           XK_NO_MOD,      "\033[23~",      0,    0}, | ||||
| 	{ XK_F11, /* F23 */ ShiftMask,      "\033[23;2~",    0,    0}, | ||||
| 	{ XK_F11, /* F35 */ ControlMask,    "\033[23;5~",    0,    0}, | ||||
| 	{ XK_F11, /* F47 */ Mod4Mask,       "\033[23;6~",    0,    0}, | ||||
| 	{ XK_F11, /* F59 */ Mod1Mask,       "\033[23;3~",    0,    0}, | ||||
| 	{ XK_F12,           XK_NO_MOD,      "\033[24~",      0,    0}, | ||||
| 	{ XK_F12, /* F24 */ ShiftMask,      "\033[24;2~",    0,    0}, | ||||
| 	{ XK_F12, /* F36 */ ControlMask,    "\033[24;5~",    0,    0}, | ||||
| 	{ XK_F12, /* F48 */ Mod4Mask,       "\033[24;6~",    0,    0}, | ||||
| 	{ XK_F12, /* F60 */ Mod1Mask,       "\033[24;3~",    0,    0}, | ||||
| 	{ XK_F13,           XK_NO_MOD,      "\033[1;2P",     0,    0}, | ||||
| 	{ XK_F14,           XK_NO_MOD,      "\033[1;2Q",     0,    0}, | ||||
| 	{ XK_F15,           XK_NO_MOD,      "\033[1;2R",     0,    0}, | ||||
| 	{ XK_F16,           XK_NO_MOD,      "\033[1;2S",     0,    0}, | ||||
| 	{ XK_F17,           XK_NO_MOD,      "\033[15;2~",    0,    0}, | ||||
| 	{ XK_F18,           XK_NO_MOD,      "\033[17;2~",    0,    0}, | ||||
| 	{ XK_F19,           XK_NO_MOD,      "\033[18;2~",    0,    0}, | ||||
| 	{ XK_F20,           XK_NO_MOD,      "\033[19;2~",    0,    0}, | ||||
| 	{ XK_F21,           XK_NO_MOD,      "\033[20;2~",    0,    0}, | ||||
| 	{ XK_F22,           XK_NO_MOD,      "\033[21;2~",    0,    0}, | ||||
| 	{ XK_F23,           XK_NO_MOD,      "\033[23;2~",    0,    0}, | ||||
| 	{ XK_F24,           XK_NO_MOD,      "\033[24;2~",    0,    0}, | ||||
| 	{ XK_F25,           XK_NO_MOD,      "\033[1;5P",     0,    0}, | ||||
| 	{ XK_F26,           XK_NO_MOD,      "\033[1;5Q",     0,    0}, | ||||
| 	{ XK_F27,           XK_NO_MOD,      "\033[1;5R",     0,    0}, | ||||
| 	{ XK_F28,           XK_NO_MOD,      "\033[1;5S",     0,    0}, | ||||
| 	{ XK_F29,           XK_NO_MOD,      "\033[15;5~",    0,    0}, | ||||
| 	{ XK_F30,           XK_NO_MOD,      "\033[17;5~",    0,    0}, | ||||
| 	{ XK_F31,           XK_NO_MOD,      "\033[18;5~",    0,    0}, | ||||
| 	{ XK_F32,           XK_NO_MOD,      "\033[19;5~",    0,    0}, | ||||
| 	{ XK_F33,           XK_NO_MOD,      "\033[20;5~",    0,    0}, | ||||
| 	{ XK_F34,           XK_NO_MOD,      "\033[21;5~",    0,    0}, | ||||
| 	{ XK_F35,           XK_NO_MOD,      "\033[23;5~",    0,    0}, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Selection types' masks. | ||||
|  * Use the same masks as usual. | ||||
|  * Button1Mask is always unset, to make masks match between ButtonPress. | ||||
|  * ButtonRelease and MotionNotify. | ||||
|  * If no match is found, regular selection is used. | ||||
|  */ | ||||
| static uint selmasks[] = { | ||||
| 	[SEL_RECTANGULAR] = Mod1Mask, | ||||
| }; | ||||
| 
 | ||||
| /*
 | ||||
|  * Printable characters in ASCII, used to estimate the advance width | ||||
|  * of single wide characters. | ||||
|  */ | ||||
| static char ascii_printable[] = | ||||
| 	" !\"#$%&'()*+,-./0123456789:;<=>?" | ||||
| 	"@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_" | ||||
| 	"`abcdefghijklmnopqrstuvwxyz{|}~"; | ||||
							
								
								
									
										5
									
								
								config.h
								
								
								
								
							
							
						
						
									
										5
									
								
								config.h
								
								
								
								
							|  | @ -5,8 +5,9 @@ | |||
|  * | ||||
|  * font: see http://freedesktop.org/software/fontconfig/fontconfig-user.html
 | ||||
|  */ | ||||
| static char *font = "MesloLGS NF:style=Regular:size=10"; | ||||
| static char *font = "Fira Code:size=11"; | ||||
| static int borderpx = 2; | ||||
| float alpha = 0.8; | ||||
| 
 | ||||
| /*
 | ||||
|  * What program is execed by st depends of these precedence rules: | ||||
|  | @ -16,7 +17,7 @@ static int borderpx = 2; | |||
|  * 4: value of shell in /etc/passwd | ||||
|  * 5: value of shell in config.h | ||||
|  */ | ||||
| static char *shell = "/bin/sh"; | ||||
| static char *shell = "/usr/bin/zsh"; | ||||
| char *utmp = NULL; | ||||
| /* scroll program: to enable use a string like "scroll" */ | ||||
| char *scroll = NULL; | ||||
|  |  | |||
|  | @ -16,7 +16,7 @@ PKG_CONFIG = pkg-config | |||
| INCS = -I$(X11INC) \
 | ||||
|        `$(PKG_CONFIG) --cflags fontconfig` \
 | ||||
|        `$(PKG_CONFIG) --cflags freetype2` | ||||
| LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \
 | ||||
| LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\
 | ||||
|        `$(PKG_CONFIG) --libs fontconfig` \
 | ||||
|        `$(PKG_CONFIG) --libs freetype2` | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1,163 @@ | |||
| diff --git a/config.def.h b/config.def.h
 | ||||
| index 0e01717..e116631 100644
 | ||||
| --- a/config.def.h
 | ||||
| +++ b/config.def.h
 | ||||
| @@ -82,6 +82,9 @@ char *termname = "st-256color";
 | ||||
|   */ | ||||
|  unsigned int tabspaces = 8; | ||||
|   | ||||
| +/* bg opacity */
 | ||||
| +float alpha = 0.8;
 | ||||
| +
 | ||||
|  /* Terminal colors (16 first used in escape sequence) */ | ||||
|  static const char *colorname[] = { | ||||
|  	/* 8 normal colors */ | ||||
| @@ -109,6 +112,7 @@ static const char *colorname[] = {
 | ||||
|  	/* more colors can be added after 255 to use with DefaultXX */ | ||||
|  	"#cccccc", | ||||
|  	"#555555", | ||||
| +	"black",
 | ||||
|  }; | ||||
|   | ||||
|   | ||||
| @@ -117,7 +121,7 @@ static const char *colorname[] = {
 | ||||
|   * foreground, background, cursor, reverse cursor | ||||
|   */ | ||||
|  unsigned int defaultfg = 7; | ||||
| -unsigned int defaultbg = 0;
 | ||||
| +unsigned int defaultbg = 258;
 | ||||
|  static unsigned int defaultcs = 256; | ||||
|  static unsigned int defaultrcs = 257; | ||||
|   | ||||
| diff --git a/config.mk b/config.mk
 | ||||
| index 0cbb002..1d2f0e2 100644
 | ||||
| --- a/config.mk
 | ||||
| +++ b/config.mk
 | ||||
| @@ -16,7 +16,7 @@ PKG_CONFIG = pkg-config
 | ||||
|  INCS = -I$(X11INC) \ | ||||
|         `$(PKG_CONFIG) --cflags fontconfig` \ | ||||
|         `$(PKG_CONFIG) --cflags freetype2` | ||||
| -LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft \
 | ||||
| +LIBS = -L$(X11LIB) -lm -lrt -lX11 -lutil -lXft -lXrender\
 | ||||
|         `$(PKG_CONFIG) --libs fontconfig` \ | ||||
|         `$(PKG_CONFIG) --libs freetype2` | ||||
|   | ||||
| diff --git a/st.h b/st.h
 | ||||
| index 38c61c4..b7634ab 100644
 | ||||
| --- a/st.h
 | ||||
| +++ b/st.h
 | ||||
| @@ -120,3 +120,4 @@ extern char *termname;
 | ||||
|  extern unsigned int tabspaces; | ||||
|  extern unsigned int defaultfg; | ||||
|  extern unsigned int defaultbg; | ||||
| +extern float alpha;
 | ||||
| diff --git a/x.c b/x.c
 | ||||
| index 0422421..588dec3 100644
 | ||||
| --- a/x.c
 | ||||
| +++ b/x.c
 | ||||
| @@ -98,6 +98,7 @@ typedef struct {
 | ||||
|  	XSetWindowAttributes attrs; | ||||
|  	int scr; | ||||
|  	int isfixed; /* is fixed geometry? */ | ||||
| +	int depth; /* bit depth */
 | ||||
|  	int l, t; /* left and top offset */ | ||||
|  	int gm; /* geometry mask */ | ||||
|  } XWindow; | ||||
| @@ -229,6 +230,7 @@ static char *usedfont = NULL;
 | ||||
|  static double usedfontsize = 0; | ||||
|  static double defaultfontsize = 0; | ||||
|   | ||||
| +static char *opt_alpha = NULL;
 | ||||
|  static char *opt_class = NULL; | ||||
|  static char **opt_cmd  = NULL; | ||||
|  static char *opt_embed = NULL; | ||||
| @@ -688,7 +690,7 @@ xresize(int col, int row)
 | ||||
|   | ||||
|  	XFreePixmap(xw.dpy, xw.buf); | ||||
|  	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, | ||||
| -			DefaultDepth(xw.dpy, xw.scr));
 | ||||
| +			xw.depth);
 | ||||
|  	XftDrawChange(xw.draw, xw.buf); | ||||
|  	xclear(0, 0, win.w, win.h); | ||||
|   | ||||
| @@ -748,6 +750,13 @@ xloadcols(void)
 | ||||
|  			else | ||||
|  				die("could not allocate color %d\n", i); | ||||
|  		} | ||||
| +
 | ||||
| +	/* set alpha value of bg color */
 | ||||
| +	if (opt_alpha)
 | ||||
| +		alpha = strtof(opt_alpha, NULL);
 | ||||
| +	dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha);
 | ||||
| +	dc.col[defaultbg].pixel &= 0x00FFFFFF;
 | ||||
| +	dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24;
 | ||||
|  	loaded = 1; | ||||
|  } | ||||
|   | ||||
| @@ -1004,11 +1013,23 @@ xinit(int cols, int rows)
 | ||||
|  	Window parent; | ||||
|  	pid_t thispid = getpid(); | ||||
|  	XColor xmousefg, xmousebg; | ||||
| +	XWindowAttributes attr;
 | ||||
| +	XVisualInfo vis;
 | ||||
|   | ||||
|  	if (!(xw.dpy = XOpenDisplay(NULL))) | ||||
|  		die("can't open display\n"); | ||||
|  	xw.scr = XDefaultScreen(xw.dpy); | ||||
| -	xw.vis = XDefaultVisual(xw.dpy, xw.scr);
 | ||||
| +
 | ||||
| +	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) {
 | ||||
| +		parent = XRootWindow(xw.dpy, xw.scr);
 | ||||
| +		xw.depth = 32;
 | ||||
| +	} else {
 | ||||
| +		XGetWindowAttributes(xw.dpy, parent, &attr);
 | ||||
| +		xw.depth = attr.depth;
 | ||||
| +	}
 | ||||
| +
 | ||||
| +	XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis);
 | ||||
| +	xw.vis = vis.visual;
 | ||||
|   | ||||
|  	/* font */ | ||||
|  	if (!FcInit()) | ||||
| @@ -1018,7 +1039,7 @@ xinit(int cols, int rows)
 | ||||
|  	xloadfonts(usedfont, 0); | ||||
|   | ||||
|  	/* colors */ | ||||
| -	xw.cmap = XDefaultColormap(xw.dpy, xw.scr);
 | ||||
| +	xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None);
 | ||||
|  	xloadcols(); | ||||
|   | ||||
|  	/* adjust fixed window geometry */ | ||||
| @@ -1038,19 +1059,15 @@ xinit(int cols, int rows)
 | ||||
|  		| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | ||||
|  	xw.attrs.colormap = xw.cmap; | ||||
|   | ||||
| -	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0))))
 | ||||
| -		parent = XRootWindow(xw.dpy, xw.scr);
 | ||||
|  	xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, | ||||
| -			win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput,
 | ||||
| +			win.w, win.h, 0, xw.depth, InputOutput,
 | ||||
|  			xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity | ||||
|  			| CWEventMask | CWColormap, &xw.attrs); | ||||
|   | ||||
|  	memset(&gcvalues, 0, sizeof(gcvalues)); | ||||
|  	gcvalues.graphics_exposures = False; | ||||
| -	dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures,
 | ||||
| -			&gcvalues);
 | ||||
| -	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h,
 | ||||
| -			DefaultDepth(xw.dpy, xw.scr));
 | ||||
| +	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth);
 | ||||
| +	dc.gc = XCreateGC(xw.dpy, xw.buf, GCGraphicsExposures, &gcvalues);
 | ||||
|  	XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); | ||||
|  	XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); | ||||
|   | ||||
| @@ -1894,6 +1911,9 @@ main(int argc, char *argv[])
 | ||||
|  	case 'a': | ||||
|  		allowaltscreen = 0; | ||||
|  		break; | ||||
| +	case 'A':
 | ||||
| +		opt_alpha = EARGF(usage());
 | ||||
| +		break;
 | ||||
|  	case 'c': | ||||
|  		opt_class = EARGF(usage()); | ||||
|  		break; | ||||
							
								
								
									
										1
									
								
								st.h
								
								
								
								
							
							
						
						
									
										1
									
								
								st.h
								
								
								
								
							|  | @ -123,3 +123,4 @@ extern char *termname; | |||
| extern unsigned int tabspaces; | ||||
| extern unsigned int defaultfg; | ||||
| extern unsigned int defaultbg; | ||||
| extern float alpha; | ||||
|  |  | |||
|  | @ -0,0 +1,125 @@ | |||
| /* See LICENSE for license details. */ | ||||
| 
 | ||||
| #include <stdint.h> | ||||
| #include <sys/types.h> | ||||
| 
 | ||||
| /* macros */ | ||||
| #define MIN(a, b)		((a) < (b) ? (a) : (b)) | ||||
| #define MAX(a, b)		((a) < (b) ? (b) : (a)) | ||||
| #define LEN(a)			(sizeof(a) / sizeof(a)[0]) | ||||
| #define BETWEEN(x, a, b)	((a) <= (x) && (x) <= (b)) | ||||
| #define DIVCEIL(n, d)		(((n) + ((d) - 1)) / (d)) | ||||
| #define DEFAULT(a, b)		(a) = (a) ? (a) : (b) | ||||
| #define LIMIT(x, a, b)		(x) = (x) < (a) ? (a) : (x) > (b) ? (b) : (x) | ||||
| #define ATTRCMP(a, b)		((a).mode != (b).mode || (a).fg != (b).fg || \ | ||||
| 				(a).bg != (b).bg) | ||||
| #define TIMEDIFF(t1, t2)	((t1.tv_sec-t2.tv_sec)*1000 + \ | ||||
| 				(t1.tv_nsec-t2.tv_nsec)/1E6) | ||||
| #define MODBIT(x, set, bit)	((set) ? ((x) |= (bit)) : ((x) &= ~(bit))) | ||||
| 
 | ||||
| #define TRUECOLOR(r,g,b)	(1 << 24 | (r) << 16 | (g) << 8 | (b)) | ||||
| #define IS_TRUECOL(x)		(1 << 24 & (x)) | ||||
| 
 | ||||
| enum glyph_attribute { | ||||
| 	ATTR_NULL       = 0, | ||||
| 	ATTR_BOLD       = 1 << 0, | ||||
| 	ATTR_FAINT      = 1 << 1, | ||||
| 	ATTR_ITALIC     = 1 << 2, | ||||
| 	ATTR_UNDERLINE  = 1 << 3, | ||||
| 	ATTR_BLINK      = 1 << 4, | ||||
| 	ATTR_REVERSE    = 1 << 5, | ||||
| 	ATTR_INVISIBLE  = 1 << 6, | ||||
| 	ATTR_STRUCK     = 1 << 7, | ||||
| 	ATTR_WRAP       = 1 << 8, | ||||
| 	ATTR_WIDE       = 1 << 9, | ||||
| 	ATTR_WDUMMY     = 1 << 10, | ||||
| 	ATTR_BOLD_FAINT = ATTR_BOLD | ATTR_FAINT, | ||||
| }; | ||||
| 
 | ||||
| enum selection_mode { | ||||
| 	SEL_IDLE = 0, | ||||
| 	SEL_EMPTY = 1, | ||||
| 	SEL_READY = 2 | ||||
| }; | ||||
| 
 | ||||
| enum selection_type { | ||||
| 	SEL_REGULAR = 1, | ||||
| 	SEL_RECTANGULAR = 2 | ||||
| }; | ||||
| 
 | ||||
| enum selection_snap { | ||||
| 	SNAP_WORD = 1, | ||||
| 	SNAP_LINE = 2 | ||||
| }; | ||||
| 
 | ||||
| typedef unsigned char uchar; | ||||
| typedef unsigned int uint; | ||||
| typedef unsigned long ulong; | ||||
| typedef unsigned short ushort; | ||||
| 
 | ||||
| typedef uint_least32_t Rune; | ||||
| 
 | ||||
| #define Glyph Glyph_ | ||||
| typedef struct { | ||||
| 	Rune u;           /* character code */ | ||||
| 	ushort mode;      /* attribute flags */ | ||||
| 	uint32_t fg;      /* foreground  */ | ||||
| 	uint32_t bg;      /* background  */ | ||||
| } Glyph; | ||||
| 
 | ||||
| typedef Glyph *Line; | ||||
| 
 | ||||
| typedef union { | ||||
| 	int i; | ||||
| 	uint ui; | ||||
| 	float f; | ||||
| 	const void *v; | ||||
| 	const char *s; | ||||
| } Arg; | ||||
| 
 | ||||
| void die(const char *, ...); | ||||
| void redraw(void); | ||||
| void draw(void); | ||||
| 
 | ||||
| void printscreen(const Arg *); | ||||
| void printsel(const Arg *); | ||||
| void sendbreak(const Arg *); | ||||
| void toggleprinter(const Arg *); | ||||
| 
 | ||||
| int tattrset(int); | ||||
| void tnew(int, int); | ||||
| void tresize(int, int); | ||||
| void tsetdirtattr(int); | ||||
| void ttyhangup(void); | ||||
| int ttynew(char *, char *, char *, char **); | ||||
| size_t ttyread(void); | ||||
| void ttyresize(int, int); | ||||
| void ttywrite(const char *, size_t, int); | ||||
| 
 | ||||
| void resettitle(void); | ||||
| 
 | ||||
| void selclear(void); | ||||
| void selinit(void); | ||||
| void selstart(int, int, int); | ||||
| void selextend(int, int, int, int); | ||||
| int selected(int, int); | ||||
| char *getsel(void); | ||||
| 
 | ||||
| size_t utf8encode(Rune, char *); | ||||
| 
 | ||||
| void *xmalloc(size_t); | ||||
| void *xrealloc(void *, size_t); | ||||
| char *xstrdup(char *); | ||||
| 
 | ||||
| /* config.h globals */ | ||||
| extern char *utmp; | ||||
| extern char *scroll; | ||||
| extern char *stty_args; | ||||
| extern char *vtiden; | ||||
| extern wchar_t *worddelimiters; | ||||
| extern int allowaltscreen; | ||||
| extern int allowwindowops; | ||||
| extern char *termname; | ||||
| extern unsigned int tabspaces; | ||||
| extern unsigned int defaultfg; | ||||
| extern unsigned int defaultbg; | ||||
							
								
								
									
										40
									
								
								x.c
								
								
								
								
							
							
						
						
									
										40
									
								
								x.c
								
								
								
								
							|  | @ -106,6 +106,7 @@ typedef struct { | |||
| 	XSetWindowAttributes attrs; | ||||
| 	int scr; | ||||
| 	int isfixed; /* is fixed geometry? */ | ||||
| 	int depth; /* bit depth */ | ||||
| 	int l, t; /* left and top offset */ | ||||
| 	int gm; /* geometry mask */ | ||||
| } XWindow; | ||||
|  | @ -244,6 +245,7 @@ static char *usedfont = NULL; | |||
| static double usedfontsize = 0; | ||||
| static double defaultfontsize = 0; | ||||
| 
 | ||||
| static char *opt_alpha = NULL; | ||||
| static char *opt_class = NULL; | ||||
| static char **opt_cmd  = NULL; | ||||
| static char *opt_embed = NULL; | ||||
|  | @ -739,7 +741,7 @@ xresize(int col, int row) | |||
| 
 | ||||
| 	XFreePixmap(xw.dpy, xw.buf); | ||||
| 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, | ||||
| 			DefaultDepth(xw.dpy, xw.scr)); | ||||
| 			xw.depth); | ||||
| 	XftDrawChange(xw.draw, xw.buf); | ||||
| 	xclear(0, 0, win.w, win.h); | ||||
| 
 | ||||
|  | @ -799,6 +801,13 @@ xloadcols(void) | |||
| 			else | ||||
| 				die("could not allocate color %d\n", i); | ||||
| 		} | ||||
| 
 | ||||
| 	/* set alpha value of bg color */ | ||||
| 	if (opt_alpha) | ||||
| 		alpha = strtof(opt_alpha, NULL); | ||||
| 	dc.col[defaultbg].color.alpha = (unsigned short)(0xffff * alpha); | ||||
| 	dc.col[defaultbg].pixel &= 0x00FFFFFF; | ||||
| 	dc.col[defaultbg].pixel |= (unsigned char)(0xff * alpha) << 24; | ||||
| 	loaded = 1; | ||||
| } | ||||
| 
 | ||||
|  | @ -1108,11 +1117,23 @@ xinit(int cols, int rows) | |||
| 	Window parent; | ||||
| 	pid_t thispid = getpid(); | ||||
| 	XColor xmousefg, xmousebg; | ||||
| 	XWindowAttributes attr; | ||||
| 	XVisualInfo vis; | ||||
| 
 | ||||
| 	if (!(xw.dpy = XOpenDisplay(NULL))) | ||||
| 		die("can't open display\n"); | ||||
| 	xw.scr = XDefaultScreen(xw.dpy); | ||||
| 	xw.vis = XDefaultVisual(xw.dpy, xw.scr); | ||||
| 
 | ||||
| 	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) { | ||||
| 		parent = XRootWindow(xw.dpy, xw.scr); | ||||
| 		xw.depth = 32; | ||||
| 	} else { | ||||
| 		XGetWindowAttributes(xw.dpy, parent, &attr); | ||||
| 		xw.depth = attr.depth; | ||||
| 	} | ||||
| 
 | ||||
| 	XMatchVisualInfo(xw.dpy, xw.scr, xw.depth, TrueColor, &vis); | ||||
| 	xw.vis = vis.visual; | ||||
| 
 | ||||
| 	/* font */ | ||||
| 	if (!FcInit()) | ||||
|  | @ -1122,7 +1143,7 @@ xinit(int cols, int rows) | |||
| 	xloadfonts(usedfont, 0); | ||||
| 
 | ||||
| 	/* colors */ | ||||
| 	xw.cmap = XDefaultColormap(xw.dpy, xw.scr); | ||||
| 	xw.cmap = XCreateColormap(xw.dpy, parent, xw.vis, None); | ||||
| 	xloadcols(); | ||||
| 
 | ||||
| 	/* adjust fixed window geometry */ | ||||
|  | @ -1142,19 +1163,15 @@ xinit(int cols, int rows) | |||
| 		| ButtonMotionMask | ButtonPressMask | ButtonReleaseMask; | ||||
| 	xw.attrs.colormap = xw.cmap; | ||||
| 
 | ||||
| 	if (!(opt_embed && (parent = strtol(opt_embed, NULL, 0)))) | ||||
| 		parent = XRootWindow(xw.dpy, xw.scr); | ||||
| 	xw.win = XCreateWindow(xw.dpy, parent, xw.l, xw.t, | ||||
| 			win.w, win.h, 0, XDefaultDepth(xw.dpy, xw.scr), InputOutput, | ||||
| 			win.w, win.h, 0, xw.depth, InputOutput, | ||||
| 			xw.vis, CWBackPixel | CWBorderPixel | CWBitGravity | ||||
| 			| CWEventMask | CWColormap, &xw.attrs); | ||||
| 
 | ||||
| 	memset(&gcvalues, 0, sizeof(gcvalues)); | ||||
| 	gcvalues.graphics_exposures = False; | ||||
| 	dc.gc = XCreateGC(xw.dpy, parent, GCGraphicsExposures, | ||||
| 			&gcvalues); | ||||
| 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, | ||||
| 			DefaultDepth(xw.dpy, xw.scr)); | ||||
| 	xw.buf = XCreatePixmap(xw.dpy, xw.win, win.w, win.h, xw.depth); | ||||
| 	dc.gc = XCreateGC(xw.dpy, xw.buf, GCGraphicsExposures, &gcvalues); | ||||
| 	XSetForeground(xw.dpy, dc.gc, dc.col[defaultbg].pixel); | ||||
| 	XFillRectangle(xw.dpy, xw.buf, dc.gc, 0, 0, win.w, win.h); | ||||
| 
 | ||||
|  | @ -1993,6 +2010,9 @@ main(int argc, char *argv[]) | |||
| 	case 'a': | ||||
| 		allowaltscreen = 0; | ||||
| 		break; | ||||
| 	case 'A': | ||||
| 		opt_alpha = EARGF(usage()); | ||||
| 		break; | ||||
| 	case 'c': | ||||
| 		opt_class = EARGF(usage()); | ||||
| 		break; | ||||
|  |  | |||
							
								
								
									
										56
									
								
								x.c.orig
								
								
								
								
							
							
						
						
									
										56
									
								
								x.c.orig
								
								
								
								
							|  | @ -81,6 +81,7 @@ typedef XftGlyphFontSpec GlyphFontSpec; | |||
| typedef struct { | ||||
| 	int tw, th; /* tty width and height */ | ||||
| 	int w, h; /* window width and height */ | ||||
| 	int hborderpx, vborderpx; | ||||
| 	int ch; /* char height */ | ||||
| 	int cw; /* char width  */ | ||||
| 	int mode; /* window state/mode flags */ | ||||
|  | @ -331,7 +332,7 @@ ttysend(const Arg *arg) | |||
| int | ||||
| evcol(XEvent *e) | ||||
| { | ||||
| 	int x = e->xbutton.x - borderpx; | ||||
| 	int x = e->xbutton.x - win.hborderpx; | ||||
| 	LIMIT(x, 0, win.tw - 1); | ||||
| 	return x / win.cw; | ||||
| } | ||||
|  | @ -339,7 +340,7 @@ evcol(XEvent *e) | |||
| int | ||||
| evrow(XEvent *e) | ||||
| { | ||||
| 	int y = e->xbutton.y - borderpx; | ||||
| 	int y = e->xbutton.y - win.vborderpx; | ||||
| 	LIMIT(y, 0, win.th - 1); | ||||
| 	return y / win.ch; | ||||
| } | ||||
|  | @ -722,6 +723,9 @@ cresize(int width, int height) | |||
| 	col = MAX(1, col); | ||||
| 	row = MAX(1, row); | ||||
| 
 | ||||
| 	win.hborderpx = (win.w - col * win.cw) / 2; | ||||
| 	win.vborderpx = (win.h - row * win.ch) / 2; | ||||
| 
 | ||||
| 	tresize(col, row); | ||||
| 	xresize(col, row); | ||||
| 	ttyresize(win.tw, win.th); | ||||
|  | @ -839,8 +843,8 @@ xhints(void) | |||
| 	sizeh->flags = PSize | PResizeInc | PBaseSize | PMinSize; | ||||
| 	sizeh->height = win.h; | ||||
| 	sizeh->width = win.w; | ||||
| 	sizeh->height_inc = win.ch; | ||||
| 	sizeh->width_inc = win.cw; | ||||
| 	sizeh->height_inc = 1; | ||||
| 	sizeh->width_inc = 1; | ||||
| 	sizeh->base_height = 2 * borderpx; | ||||
| 	sizeh->base_width = 2 * borderpx; | ||||
| 	sizeh->min_height = win.ch + 2 * borderpx; | ||||
|  | @ -1122,8 +1126,8 @@ xinit(int cols, int rows) | |||
| 	xloadcols(); | ||||
| 
 | ||||
| 	/* adjust fixed window geometry */ | ||||
| 	win.w = 2 * borderpx + cols * win.cw; | ||||
| 	win.h = 2 * borderpx + rows * win.ch; | ||||
| 	win.w = 2 * win.hborderpx + cols * win.cw; | ||||
| 	win.h = 2 * win.vborderpx + rows * win.ch; | ||||
| 	if (xw.gm & XNegative) | ||||
| 		xw.l += DisplayWidth(xw.dpy, xw.scr) - win.w - 2; | ||||
| 	if (xw.gm & YNegative) | ||||
|  | @ -1211,7 +1215,7 @@ xinit(int cols, int rows) | |||
| int | ||||
| xmakeglyphfontspecs(XftGlyphFontSpec *specs, const Glyph *glyphs, int len, int x, int y) | ||||
| { | ||||
| 	float winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, xp, yp; | ||||
| 	float winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, xp, yp; | ||||
| 	ushort mode, prevmode = USHRT_MAX; | ||||
| 	Font *font = &dc.font; | ||||
| 	int frcflags = FRC_NORMAL; | ||||
|  | @ -1344,7 +1348,7 @@ void | |||
| xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, int y) | ||||
| { | ||||
| 	int charlen = len * ((base.mode & ATTR_WIDE) ? 2 : 1); | ||||
| 	int winx = borderpx + x * win.cw, winy = borderpx + y * win.ch, | ||||
| 	int winx = win.hborderpx + x * win.cw, winy = win.vborderpx + y * win.ch, | ||||
| 	    width = charlen * win.cw; | ||||
| 	Color *fg, *bg, *temp, revfg, revbg, truefg, truebg; | ||||
| 	XRenderColor colfg, colbg; | ||||
|  | @ -1434,17 +1438,17 @@ xdrawglyphfontspecs(const XftGlyphFontSpec *specs, Glyph base, int len, int x, i | |||
| 
 | ||||
| 	/* Intelligent cleaning up of the borders. */ | ||||
| 	if (x == 0) { | ||||
| 		xclear(0, (y == 0)? 0 : winy, borderpx, | ||||
| 		xclear(0, (y == 0)? 0 : winy, win.vborderpx, | ||||
| 			winy + win.ch + | ||||
| 			((winy + win.ch >= borderpx + win.th)? win.h : 0)); | ||||
| 			((winy + win.ch >= win.vborderpx + win.th)? win.h : 0)); | ||||
| 	} | ||||
| 	if (winx + width >= borderpx + win.tw) { | ||||
| 	if (winx + width >= win.hborderpx + win.tw) { | ||||
| 		xclear(winx + width, (y == 0)? 0 : winy, win.w, | ||||
| 			((winy + win.ch >= borderpx + win.th)? win.h : (winy + win.ch))); | ||||
| 			((winy + win.ch >= win.vborderpx + win.th)? win.h : (winy + win.ch))); | ||||
| 	} | ||||
| 	if (y == 0) | ||||
| 		xclear(winx, 0, winx + width, borderpx); | ||||
| 	if (winy + win.ch >= borderpx + win.th) | ||||
| 		xclear(winx, 0, winx + width, win.hborderpx); | ||||
| 	if (winy + win.ch >= win.vborderpx + win.th) | ||||
| 		xclear(winx, winy + win.ch, winx + width, win.h); | ||||
| 
 | ||||
| 	/* Clean up the region we want to draw to. */ | ||||
|  | @ -1538,35 +1542,35 @@ xdrawcursor(int cx, int cy, Glyph g, int ox, int oy, Glyph og) | |||
| 		case 3: /* Blinking Underline */ | ||||
| 		case 4: /* Steady Underline */ | ||||
| 			XftDrawRect(xw.draw, &drawcol, | ||||
| 					borderpx + cx * win.cw, | ||||
| 					borderpx + (cy + 1) * win.ch - \ | ||||
| 					win.hborderpx + cx * win.cw, | ||||
| 					win.vborderpx + (cy + 1) * win.ch - \ | ||||
| 						cursorthickness, | ||||
| 					win.cw, cursorthickness); | ||||
| 			break; | ||||
| 		case 5: /* Blinking bar */ | ||||
| 		case 6: /* Steady bar */ | ||||
| 			XftDrawRect(xw.draw, &drawcol, | ||||
| 					borderpx + cx * win.cw, | ||||
| 					borderpx + cy * win.ch, | ||||
| 					win.hborderpx + cx * win.cw, | ||||
| 					win.vborderpx + cy * win.ch, | ||||
| 					cursorthickness, win.ch); | ||||
| 			break; | ||||
| 		} | ||||
| 	} else { | ||||
| 		XftDrawRect(xw.draw, &drawcol, | ||||
| 				borderpx + cx * win.cw, | ||||
| 				borderpx + cy * win.ch, | ||||
| 				win.hborderpx + cx * win.cw, | ||||
| 				win.vborderpx + cy * win.ch, | ||||
| 				win.cw - 1, 1); | ||||
| 		XftDrawRect(xw.draw, &drawcol, | ||||
| 				borderpx + cx * win.cw, | ||||
| 				borderpx + cy * win.ch, | ||||
| 				win.hborderpx + cx * win.cw, | ||||
| 				win.vborderpx + cy * win.ch, | ||||
| 				1, win.ch - 1); | ||||
| 		XftDrawRect(xw.draw, &drawcol, | ||||
| 				borderpx + (cx + 1) * win.cw - 1, | ||||
| 				borderpx + cy * win.ch, | ||||
| 				win.hborderpx + (cx + 1) * win.cw - 1, | ||||
| 				win.vborderpx + cy * win.ch, | ||||
| 				1, win.ch - 1); | ||||
| 		XftDrawRect(xw.draw, &drawcol, | ||||
| 				borderpx + cx * win.cw, | ||||
| 				borderpx + (cy + 1) * win.ch - 1, | ||||
| 				win.hborderpx + cx * win.cw, | ||||
| 				win.vborderpx + (cy + 1) * win.ch - 1, | ||||
| 				win.cw, 1); | ||||
| 	} | ||||
| } | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue