|
Packit |
1470ea |
|
|
Packit |
1470ea |
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="topic" style="task" id="hellognome.js" xml:lang="ko">
|
|
Packit |
1470ea |
<info>
|
|
Packit |
1470ea |
<link type="guide" xref="beginner.js#tutorials"/>
|
|
Packit |
1470ea |
<revision version="0.1" date="2012-07-17" status="draft"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<credit type="author copyright">
|
|
Packit |
1470ea |
<name>Taryn Fox</name>
|
|
Packit |
1470ea |
<email its:translate="no">jewelfox@fursona.net</email>
|
|
Packit |
1470ea |
<years>2012</years>
|
|
Packit |
1470ea |
</credit>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<desc>첫 그놈 프로그램!</desc>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
|
|
Packit |
1470ea |
<mal:name>조성호</mal:name>
|
|
Packit |
1470ea |
<mal:email>shcho@gnome.org</mal:email>
|
|
Packit |
1470ea |
<mal:years>2017</mal:years>
|
|
Packit |
1470ea |
</mal:credit>
|
|
Packit |
1470ea |
</info>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<title>1. 안녕, 그놈!</title>
|
|
Packit |
1470ea |
<synopsis>
|
|
Packit |
1470ea |
이 지침서에서는 자바스크립으로 첫 그놈 프로그램을 작성하는 방법을 알려드립니다. 웹 프로그램을 작성했던 것처럼 동일한 방식으로 그놈 프로그램 작성시 자바스크립트언어를 활용합니다. 그 다음, 다른 그놈 앱 처럼 보이는 프로그램을 작성할 목적으로 "자체" 위젯을 활용하는 방법을 알아보겠습니다.
|
|
Packit |
1470ea |
<note style="warning">컴퓨터에 그놈을 설치하고 코드를 작성할 <link xref="set-up-gedit.js">지에디트</link>를 설정하셨죠? 우선 이 과정을 거쳐야합니다. </note>
|
|
Packit |
1470ea |
</synopsis>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<links type="section"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="webapp">
|
|
Packit |
1470ea |
<title>웹 페이지로 시작하죠</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
HTML, CSS, JavaScript 기본 코드가 몇개 있습니다. 어디서 많이 본 것 같죠?
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<!DOCTYPE html>
|
|
Packit |
1470ea |
<html>
|
|
Packit |
1470ea |
<head>
|
|
Packit |
1470ea |
<title>Hello, GNOME!</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<!-- Use JavaScript to show a greeting when someone clicks the button -->
|
|
Packit |
1470ea |
<script type="application/javascript">
|
|
Packit |
1470ea |
function greeting () {
|
|
Packit |
1470ea |
document.getElementById ("greeting").innerHTML = ("O hai!");
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
</script>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<!-- Very basic CSS style using the GNOME font -->
|
|
Packit |
1470ea |
<style type="text/css">
|
|
Packit |
1470ea |
body {
|
|
Packit |
1470ea |
font-face: Cantarell, sans-serif;
|
|
Packit |
1470ea |
text-align: center; }
|
|
Packit |
1470ea |
</style>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</head>
|
|
Packit |
1470ea |
<body>
|
|
Packit |
1470ea |
<br /> <br />
|
|
Packit |
1470ea |
<button type="button" onclick="greeting()">Hello, GNOME!</button>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<!-- Empty H1 element gets filled in when the button is clicked -->
|
|
Packit |
1470ea |
<h1 id="greeting"></h1>
|
|
Packit |
1470ea |
</body>
|
|
Packit |
1470ea |
</html>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
이걸 <file>hellognome.html</file> 파일로 저장하고 실행했을 때 어떻게 나오는지 살펴보도록 하죠!
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<media type="image" mime="image/png" src="media/hellognomewebapp.png"/>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
웹 브라우저에서 <file>hellognome.html</file> 파일을 열면 위 코드를 실행할 수 있습니다. 하지만 스크린샷으로 보시듯이 웹 앱을 실행할 그놈 프로그램을 만들려고 합니다. 창 크기를 조절하거나 최대로 확대할 수 있으며, 다른 그놈 앱처럼 구석의 X를 눌러 닫을 수 있습니다. 차이점이 있다면 프로그램에서 왭 코드를 실행한다는 점입니다.
|
|
Packit |
1470ea |
대부분은요? 그놈에서 동작하는 앱의 모든 부분을 작성할 때 JavaScript를 사용하는 편으로 계속 진행하겠습니다. 코드를 보고 어떻게 돌아가는지 보도록 하죠!
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="window">
|
|
Packit |
1470ea |
<title>웹 앱에 맞출 그놈 창 만들기</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
우선 그놈에게 gjs를 사용하는 JavaScript 프로그램임을 알려야 합니다. gjs는 JavaScript 코드를 이해할 수 있는 기계 명령으로 바꾸는 그놈의 처리 수단입니다. 따라서 프로그램 시작 부분에 항상 이 줄을 넣어야합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
#!/usr/bin/gjs
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
그 다음 우리가 가져올 라이브러리를 그놈에게 알려야겠죠.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
const GLib = imports.gi.GLib;
|
|
Packit |
1470ea |
const Gtk = imports.gi.Gtk;
|
|
Packit |
1470ea |
const Lang = imports.lang;
|
|
Packit |
1470ea |
const Webkit = imports.gi.WebKit;
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
jQuery가 JavaScript으로 할 수 있는 추가 행동을 우리에게 알려주도록 라이브러리를 추가하는 방식처럼, 이 라이브러리는 그놈 앱에서 처리할 수 있는 새 기능을 제공해줍니다:
|
|
Packit |
1470ea |
<steps>
|
|
Packit |
1470ea |
<item><file>Gtk</file>와 <file>Lang</file>은 그놈 프로그램의 기본적인 부분이며, 창과 위젯을 만들어 한데 묶어둘 수 있습니다. </item>
|
|
Packit |
1470ea |
<item><file>GLib</file>는 우리가 만든 <file>hellognome.html</file> 파일에서 그놈에서 처리할 수 있는 동작이 가능하게 하는 보조 라이브러리입니다. </item>
|
|
Packit |
1470ea |
<item>그리고 <file>Webkit</file>은 HTML 파일을 여는 브라우저 창을 만들 때 사용하는 웹 렌더링 엔진입니다. </item>
|
|
Packit |
1470ea |
</steps>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
이제 프로그램 그 자체를 만들어보죠:
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
const HelloGNOME = new Lang.Class ({
|
|
Packit |
1470ea |
Name: 'Hello GNOME',
|
|
Packit |
1470ea |
이
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
이 코드는 이전에 다루어 보았다면 객체 지향 자바스크립트와 비슷해보일겝니다. 맞습니다. 이 전체 프로그램은 HelloGNOME 클래스입니다. 그리고 보시는 바와 같이 프로그램 이름을 지정하는 속성을 넣었습니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Create the application itself
|
|
Packit |
1470ea |
_init: function () {
|
|
Packit |
1470ea |
this.application = new Gtk.Application ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Connect 'activate' and 'startup' signals to the callback functions
|
|
Packit |
1470ea |
this.application.connect('activate', Lang.bind(this, this._onActivate));
|
|
Packit |
1470ea |
this.application.connect('startup', Lang.bind(this, this._onStartup));
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Callback function for 'activate' signal presents windows when active
|
|
Packit |
1470ea |
_onActivate: function () {
|
|
Packit |
1470ea |
this._window.present ();
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Callback function for 'startup' signal builds the UI
|
|
Packit |
1470ea |
_onStartup: function () {
|
|
Packit |
1470ea |
this._buildUI ();
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
여러분이 빌드한 모든 JavaScript 프로그램을 덜 또는 덜 복사하야 붙여넣을 코드 일부입니다. 이 코드로 새 프로그램을 만들고, activate 시그널과 startup 시그널을 함수에 바인딩하여 창을 나타내고 사용자 인터페이스를 구성합니다.
|
|
Packit |
1470ea |
무슨 얘길까요? 그놈 프로그램의 모든 부분에서는 어떤 중요한 동작이 일어날 때 시그널을 내보냅니다. 예컨대, 단추를 누르면 clicked 시그널을 내보냅니다. 우리는 시그널을 처리할 함수와 연결하고 어떤 일을 벌일 코드를 만들겠습니다. 각각 두 인자를 가진 객체의 연결 메서드를 활용하겠습니다. 우리가 처리하고자 하는 시그널, 그리고 우리가 처리하고자 하는 시그널을 어떤 함수와 연결할 지 지시할 때 사용하는 Lang.bind 함수를 인자로 전달합니다.
|
|
Packit |
1470ea |
이 경우 activate 시그널을 처리할 때 _onActivate 함수를, startup 시그널을 처리할 때 _onStartup을 사용하겠습니다. _onActivate는 창 자체를 나타내러고 지시합니다. 그래서 기본적으로는 <keyseq><key>Alt</key> <key>Tab</key></keyseq> 키를 누를 때마다 예상하던 대로 프로그램이 나타납니다. _onStartup 함수에서 사용자 인터페이스를 만들며 다음에 우리가 살펴볼 _buildUI를 호출합니다.
|
|
Packit |
1470ea |
<note style="tip">위 코드를 프로그램에 복사하여 붙여넣을 때마다 바꿀 이름이 유일한 이름인지 확인하십시오. </note>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="ui">
|
|
Packit |
1470ea |
<title>창 UI 디자인</title>
|
|
Packit |
1470ea |
_buildUI 함수에서 그놈에게 창과 창에 있는 내용을 한번에 하나씩 언급하고 있습니다. 그 다음 개별 요소를 함께 연결하고 화면에 한번에 넣습니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Build the application's UI
|
|
Packit |
1470ea |
_buildUI: function () {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Create the application window
|
|
Packit |
1470ea |
this._window = new Gtk.ApplicationWindow ({
|
|
Packit |
1470ea |
application: this.application,
|
|
Packit |
1470ea |
title: "Welcome to GNOME",
|
|
Packit |
1470ea |
default_height: 200,
|
|
Packit |
1470ea |
default_width: 400,
|
|
Packit |
1470ea |
window_position: Gtk.WindowPosition.CENTER });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
우리가 만들 첫 객체는 ApplicationWindow입니다. 제목 표시줄에 들어갈 제목, 우리가 위에서 만든 프로그램에 필요한 application 속성이 필요합니다. 모양새를 바꾸는 방법에는 여러가지가 있지만 <link xref="GtkApplicationWindow.js">ApplicationWindow</link> 참고 페이지의 내용에서 자세한 내막을 설명해줍니다. 여기서 보시듯, (픽셀 단위) 기본 너비, 높이 값을 설정하고 그놈에게 화면 한가운데에 창을 나타내고 싶음을 지시합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Create a webview to show the web app
|
|
Packit |
1470ea |
this._webView = new Webkit.WebView ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Put the web app into the webview
|
|
Packit |
1470ea |
this._webView.load_uri (GLib.filename_to_uri (GLib.get_current_dir() +
|
|
Packit |
1470ea |
"/hellognome.html", null));
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
시작 부분에서 Webkit을 어떻게 가져왔는지 기억하시죠? 여기서는 앱을 안에다 넣고 실행할 수 있는 더도 덜도 아닌 웹 브라우저, WebView라고 하는 Webkit 클래스의 새 인스턴스를 만들겠습니다. 그 다음 프로그램을 시작할 때 우리가 불러올 URI를 설정하겠습니다.
|
|
Packit |
1470ea |
<link href="http://gnome.org">http://gnome.org</link>와 같은 웹 URI를 그냥 설정 할 수 있습니다. 대신 우리가 작성한 <file>hellognome.html</file> 파일이 어디에 있는지 WebView에 알려줄 GLib 보조 함수 몇가지를 활용하겠습니다. GLib.get_current_dir에서는 앱을 실행할 디렉터리를 반환하고 GLib.filename_to_uri에서는 WebView의 load_uri 함수가 이해할 수 있도록 파일의 경로와 파일 이름을 URI 형식으로 반환합니다(filename_to_uri의 두번째 매개변수는 용도와 값을 바꿔야 할 이유를 정확하게 알기 전까지는 null 값이어야 합니다).
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Put the webview into the window
|
|
Packit |
1470ea |
this._window.add (this._webView);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Show the window and all child widgets
|
|
Packit |
1470ea |
this._window.show_all();
|
|
Packit |
1470ea |
},
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
});
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
각 창은 하나 그리고 오직 하나의 위젯만을 소유할 수 있습니다. 보통 여러 위젯을 넣을 때 <link xref="grid.js">Grid</link>와 같은 컨테이너 위젯을 활용하고 창의 추가 함수로 Grid 안에 넣습니다. 우리는 WebView만 필요하기 때문에, WebView를 창에 넣기만 하면 됩니다. 그 다음 창을 만드는 _buildUI 함수의 마지막 부분으로 창에게 자신과 창의 내용을 보여주도록 지시하겠습니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Run the application
|
|
Packit |
1470ea |
let app = new HelloGNOME ();
|
|
Packit |
1470ea |
app.application.run (ARGV);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
마지막으로 HelloGNOME 클래스의 새 인스턴스를 만들고 그놈에게 이 코드를 실행하라고 지시하겠습니다.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="run">
|
|
Packit |
1470ea |
<title>그놈 프로그램 실행</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
이제 우리는 첫 그놈 프로그램을 만들었으니 시험해볼 떄가 왔습니다. 만드신 프로그램을 컴파일하거나 특별한 프로그램 마냥 설치할 필요가 없습니다. 그놈에는 그놈 셸을 실행하게 하는 gjs를 자체적으로 보유하고 있습니다. 그냥 터미널 상에서 접근할 수 있는 그 어떤 디렉터리에든 <file>hellognome.html</file> 파일과 실제 프로그램 <file>hellognome.js</file>파일을 저장하십시오(보통 사용자 이름이 붙은 '내 폴더'를 엽니다). 그 후 터미널을 열고 다음 명령을 입력하십시오:
|
|
Packit |
1470ea |
<screen> <output style="prompt">$ </output>gjs hellognome.js </screen>
|
|
Packit |
1470ea |
앞서 보신바와 같이 간단한 메시지를 띄우는 단추가 나타나는, 더 혹은 덜 유사한 화면을 볼 수 있어야합니다.
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<note style="tip">
|
|
Packit |
1470ea |
터미널 명령을 사용핧 수 있습니다.
|
|
Packit |
1470ea |
<screen> <output style="prompt">$ </output>cd (디렉터리 이름) </screen>
|
|
Packit |
1470ea |
터미널에서 저장한 파일이 어디에있는지 찾을 때 여러 디렉터리를 탐색하는 명령입니다. 그놈 파일 관리자 노틸러스에는 파일 탐색 창 어디에서든 마우스 오른쪽 단추를 누른 후 해당 위치에서 터미널을 여는 확장 기능도 있습니다. 새 프로그램을 설치할 때 사용하는 앱(프로그램 추가/제거 또는 소프트웨어 센터)을 확인해보십시오.
|
|
Packit |
1470ea |
</note>
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="whatsnext">
|
|
Packit |
1470ea |
<title>다음은요?</title>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
HTML 코드와 웹 뷰 코드 대신, 다른 프로그램 같이 "자체" 그놈 프로그램을 빌드하는 방법을 알아보려면 <link xref="02_welcome_to_the_grid.js">다음 따라하기 지침서로 계속 진행하십시오</link>. 아니면 Gtk 위젯 예제 코드를 보고 싶으시면 일부 <link xref="beginner.js#samples">코드 예제</link>를 살펴보십시오.
|
|
Packit |
1470ea |
마지막으로 웹용으로 만든 JavaScript 라이브러리로 그놈 프로그램을 만들어보고 싶다면, 그냥 여기서 멈추고 계속 진행하실 수 있습니다. 다른 앱처럼 데스크톱의 현재 활동 메뉴에 프로그램이 나타나도록 .desktop 파일을 만드는 방법을 알아보려면 <link xref="beginner.js#tutorials">다음 따라하기 지침서</link>를 확인해보십시오.
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
<section id="complete">
|
|
Packit |
1470ea |
<title>완전한 코드 예제</title>
|
|
Packit |
1470ea |
#!/usr/bin/gjs
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
imports.gi.versions.Gtk = '3.0';
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
const GLib = imports.gi.GLib;
|
|
Packit |
1470ea |
const Gtk = imports.gi.Gtk;
|
|
Packit |
1470ea |
const Webkit = imports.gi.WebKit;
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
class HelloGNOME {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Create the application itself
|
|
Packit |
1470ea |
constructor() {
|
|
Packit |
1470ea |
this.application = new Gtk.Application ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Connect 'activate' and 'startup' signals to the callback functions
|
|
Packit |
1470ea |
this.application.connect('activate', this._onActivate.bind(this));
|
|
Packit |
1470ea |
this.application.connect('startup', this._onStartup.bind(this));
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Callback function for 'activate' signal presents windows when active
|
|
Packit |
1470ea |
_onActivate() {
|
|
Packit |
1470ea |
this._window.present();
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Callback function for 'startup' signal builds the UI
|
|
Packit |
1470ea |
_onStartup() {
|
|
Packit |
1470ea |
this._buildUI();
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Build the application's UI
|
|
Packit |
1470ea |
_buildUI() {
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Create the application window
|
|
Packit |
1470ea |
this._window = new Gtk.ApplicationWindow ({
|
|
Packit |
1470ea |
application: this.application,
|
|
Packit |
1470ea |
title: "Welcome to GNOME",
|
|
Packit |
1470ea |
default_height: 200,
|
|
Packit |
1470ea |
default_width: 400,
|
|
Packit |
1470ea |
window_position: Gtk.WindowPosition.CENTER });
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Create a webview to show the web app
|
|
Packit |
1470ea |
this._webView = new Webkit.WebView ();
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Put the web app into the webview
|
|
Packit |
1470ea |
this._webView.load_uri (GLib.filename_to_uri (GLib.get_current_dir() +
|
|
Packit |
1470ea |
"/hellognome.html", null));
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Put the webview into the window
|
|
Packit |
1470ea |
this._window.add (this._webView);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Show the window and all child widgets
|
|
Packit |
1470ea |
this._window.show_all();
|
|
Packit |
1470ea |
}
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
};
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
// Run the application
|
|
Packit |
1470ea |
let app = new HelloGNOME ();
|
|
Packit |
1470ea |
app.application.run (ARGV);
|
|
Packit |
1470ea |
|
|
Packit |
1470ea |
</section>
|
|
Packit |
1470ea |
</page>
|