GNOME ์ง๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ฐ๋ฐ์์ธ James Westman์ GTK ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ธํฐํ์ด์ค๋ฅผ ๊ตฌ์ถํ๋๋ก ์ค๊ณ๋ ์๋ก์ด ๋งํฌ์ ์ธ์ด์ธ Blueprint๋ฅผ ์๊ฐํ์ต๋๋ค. Blueprint ๋งํฌ์ ์ GTK UI ํ์ผ๋ก ๋ณํํ๊ธฐ ์ํ ์ปดํ์ผ๋ฌ ์ฝ๋๋ Python์ผ๋ก ์์ฑ๋์์ผ๋ฉฐ LGPLv3 ๋ผ์ด์ ์ค์ ๋ฐ๋ผ ๋ฐฐํฌ๋ฉ๋๋ค.
ํ๋ก์ ํธ๋ฅผ ์์ฑํ๋ ์ด์ ๋ GTK์์ ์ฌ์ฉํ๋ UI ์ธํฐํ์ด์ค ์ค๋ช ํ์ผ์ XML ํ์์ผ๋ก ๋ฐ์ธ๋ฉํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ ์ค๋ฒ๋ก๋๋์ด ์๋์ผ๋ก ๋งํฌ์ ์ ์์ฑํ๊ฑฐ๋ ํธ์งํ๋ ๋ฐ ํธ๋ฆฌํ์ง ์์ต๋๋ค. Blueprint ํ์์ ์ ๋ณด๋ฅผ ๋ช ํํ๊ฒ ํ์ํ๋ ๊ฒ์ด ํน์ง์ด๋ฉฐ ์ฝ๊ธฐ ์ฌ์ด ๊ตฌ๋ฌธ ๋๋ถ์ ์ธํฐํ์ด์ค ์์์ ๋ณ๊ฒฝ ์ฌํญ์ ์์ฑ, ํธ์ง ๋ฐ ํ๊ฐํ ๋ ์ ๋ฌธ์ ์ธ ์๊ฐ์ ์ธํฐํ์ด์ค ํธ์ง๊ธฐ๋ฅผ ์ฌ์ฉํ์ง ์๊ณ ๋ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
๋์์ Blueprint๋ GTK๋ฅผ ๋ณ๊ฒฝํ ํ์๊ฐ ์๊ณ GTK ์์ ฏ ๋ชจ๋ธ์ ์์ ํ ๋ณต์ ํ๋ฉฐ ๋งํฌ์ ์ GtkBuilder์ฉ ํ์ค XML ํ์์ผ๋ก ์ปดํ์ผํ๋ ์ถ๊ฐ ๊ธฐ๋ฅ์ผ๋ก ๋ฐฐ์น๋ฉ๋๋ค. Blueprint์ ๊ธฐ๋ฅ์ GtkBuilder์ ์์ ํ ์ผ์นํ๋ฉฐ ์ ๋ณด๋ฅผ ํ์ํ๋ ๋ฐฉ๋ฒ๋ง ๋ค๋ฆ ๋๋ค. ํ๋ก์ ํธ๋ฅผ ๋ธ๋ฃจํ๋ฆฐํธ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ๋ ค๋ฉด ์ฝ๋๋ฅผ ๋ณ๊ฒฝํ์ง ์๊ณ ๋น๋ ์คํฌ๋ฆฝํธ์ ๋ธ๋ฃจํ๋ฆฐํธ ์ปดํ์ผ๋ฌ ํธ์ถ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. Gtk 4.0 ์ฌ์ฉ; template MyAppWindow : Gtk.ApplicationWindow { title: _("๋ด ์ฑ ์ ๋ชฉ"); [titlebar] HeaderBar header_bar {} Label { styles ["heading"] label: _("Hello, world!"); } }
ํ์ค GTK XML ํ์์ ์ปดํ์ผ๋ฌ ์ธ์๋ GNOME Builder ํตํฉ ๊ฐ๋ฐ ํ๊ฒฝ์ ์ํ Blueprint ์ง์ ํ๋ฌ๊ทธ์ธ๋ ๊ฐ๋ฐ ์ค์ ๋๋ค. Visual Studio Code๋ฅผ ํฌํจํ์ฌ LSP๋ฅผ ์ง์ํ๋ ์ฝ๋ ํธ์ง๊ธฐ์์ ๊ฐ์กฐ ํ์, ์ค๋ฅ ๋ถ์, ํํธ ํ์ ๋ฐ ์ฝ๋ ์์ฑ์ ์ฌ์ฉํ ์ ์๋ Blueprint์ฉ ๋ณ๋์ LSP ์๋ฒ(์ธ์ด ์๋ฒ ํ๋กํ ์ฝ)๊ฐ ๊ฐ๋ฐ ์ค์ ๋๋ค.
๋ธ๋ฃจํ๋ฆฐํธ ๊ฐ๋ฐ ๊ณํ์๋ GTK4์์ ์ ๊ณต๋๋ Gtk.Expression ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ ๋งํฌ์
์ ๋ฐ์ํ ํ๋ก๊ทธ๋๋ฐ ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ์ ์๋ ๋ฐฉ๋ฒ์ JavaScript ์น ์ธํฐํ์ด์ค ๊ฐ๋ฐ์์๊ฒ ๋ ์น์ํ๋ฉฐ, ๋ฐ์ดํฐ๊ฐ ๋ณ๊ฒฝ๋ ๋๋ง๋ค ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ๊ฐ์ ๋ก ์
๋ฐ์ดํธํ ํ์ ์์ด ์ธํฐํ์ด์ค ํ์์ ๊ด๋ จ ๋ฐ์ดํฐ ๋ชจ๋ธ์ ์๋์ผ๋ก ๋๊ธฐํํ ์ ์์ต๋๋ค.
์ถ์ฒ : opennet.ru