GTK를 이용한 타이핑 속도재기

codebank의 이미지

Blog라는게 생겨서 처음으로 글을 써봅니다. :)

15여년이 훌쩍 지난 예전일 입니다. 당시 처음으로 컴퓨터라는 것을 만져본 저는 컴퓨터의 마력에
빠져서 헤어나오지 못하고 허덕이고 있었습니다.
그러던 어느날 당시 AppleII라는 컴퓨터를 이용하여 타자를 연습할 수 있는 재미있는 소스를 발견하게
되었습니다. 30여분 가까이 알지도 못하는 명령어를 타이핑을하고 '] RUN'을 날리자 갑자기 한
사나이가 화면에 나오는 겁니다. 다시 소스설명을 보니 100m달리기 선수더군요. 즉, 'A'부터 'Z'까지를
두세번 계속치면 이 사나이가 달리기를 해서 100m를 몇초에 들어가는지를 확인할 수 있는 소스였습니다.
간단하게 'ABCD...XYZABCD...XYZABCD...UVW'까지 어느만큼 빨리 타자를 치느냐를 초로 계산하여
보여주는 소스였죠. 당시에 제가 13초였던가 그런기록을 가지고 있었고 학원(당시 학원에서 초등학생들을
가르치고 있었죠. 아르바이트로... :))에 있던 학원생들도 20여초 안밖의 좋은 기록을 냈던게 기억납니다.

최근에 GTK를 한번 공부해보자하고 예제 소스를 가지고 놀다가 문뜩 위의 기억이 떠올랐습니다.
멋지게 3D로 만들어볼까도 생각해봤지만 실력도 미천하고 그림은 영소질이 없어서 GTK로 간단하게
copy & paste를 이용하여 만들어보았습니다.
User Interface도 엉망이라 반드시 [Start]버튼을 눌러야만 시간을 검사하고 소문자로만 입력을 받는등
개선여지는 많지만 GTK초보가 이만큼이라도 노력을 했구나하는 생각으로 보아주셨으면 합니다. :oops:

시간이 생기면 OpenGL도 공부해서 OpenGL형태로도 만들어보도록 하겠습니다. :jawdrop:
---------- main.c ---------------------------------------------------------------

#include <gtk/gtk.h>
 
GtkWidget* window;
GtkWidget* button;
GtkWidget* vbox;
GtkWidget* frame;
GtkWidget* label;
GTimer* timer;
 
int  nStep = 0;
gboolean bCheck = FALSE;
char cChar = 'a';
 
static gboolean time_interrupt (gpointer data)
{
	char buff [32];
	gdouble nTm;
 
	nTm = g_timer_elapsed (timer, NULL);
	bzero (buff, 32);
	sprintf (buff, "%3d [%c] %4.2f", nStep, cChar, nTm);
	gtk_label_set_text (GTK_LABEL (label), buff);
	return TRUE;
}
 
static void start_check (GtkWidget* widget, gpointer data)
{
	if (!bCheck) {
		nStep = 0;
		cChar = 'a';
		bCheck = TRUE;
		g_timer_start (timer);
		gtk_timeout_add (5, (GtkFunction)time_interrupt, NULL);
	} else {
		bCheck = FALSE;
		nStep = 0;
		cChar = 'a';
		g_timer_stop (timer);
	}
}
 
static gboolean delete_event (GtkWidget* widget, GdkEvent* event, gpointer data)
{
	g_timer_destroy (timer);
	gtk_main_quit ();
	return TRUE;
}
 
static gboolean key_press_event (GtkWidget* widget, GdkEventKey* event, gpointer data)
{
	if (event->keyval == cChar && nStep < 100) {
		nStep++;
		if (++cChar > 'z')
			cChar = 'a';
	} else if (event->keyval == cChar && nStep >= 100) {
		g_timer_stop (timer);
	}
	return TRUE;
}
 
static void destroy (GtkWidget* widget, gpointer data)
{
	g_timer_destroy (timer);
	gtk_main_quit ();
}
 
int main (int argc, char* argv [])
{
	gtk_init (&argc, &argv);
	window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
	gtk_window_set_title (GTK_WINDOW (window), "100m");
	g_signal_connect (G_OBJECT (window), "delete_event", G_CALLBACK (delete_event), NULL);
	g_signal_connect (G_OBJECT (window), "key_press_event", G_CALLBACK (key_press_event), NULL);
	g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (destroy), NULL);
	gtk_container_set_border_width (GTK_CONTAINER (window), 10);
	vbox = gtk_vbox_new (FALSE, 0);
	gtk_container_add (GTK_CONTAINER (window), vbox);
	frame = gtk_frame_new ("Check your typing speed.");
	label = gtk_label_new ("  0m [a] 00.00");
	gtk_container_add (GTK_CONTAINER (frame), label);
	gtk_box_pack_start (GTK_BOX (vbox), frame, FALSE, FALSE, 0);
	button = gtk_button_new_with_label ("Start");
	g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (start_check), NULL);
	gtk_box_pack_start (GTK_BOX (vbox), button, FALSE, FALSE, 0);
	gtk_widget_show_all (window);
	timer = g_timer_new ();
	gtk_main ();
 
	return 0;
}

------------ end main.c -------------------------------

------------ Makefile -----------------------------------

CPP	= g++
CC	= gcc
RES =
SRC	= main.c
OBJ = main.o $(RES)
LINKOBJ	= $(OBJ)
LIBS	= -L/usr/lib `pkg-config --libs gtk+-2.0`
INCS	= -I/usr/include `pkg-config --cflags gtk+-2.0`
CXXINCS	= -I/usr/lib/gcc-lib/i686-pc-linux-gnu/3.4.5/include/g++-v3
BIN	= 100m
CXXFLAGS	= $(CXXINCS)
CFLAGS	= $(INCS)
RM	= rm -f
 
.PHONY:	all all-before all-after clean clean-custom
 
all: all-before $(BIN) all-after
 
clean: clean-custom
	${RM} $(OBJ) $(BIN)
 
$(BIN): $(OBJ)
	$(CC) $(LINKOBJ) -o $(BIN) $(LIBS)
 
$(OBJ): $(SRC)
	$(CC) -c $(SRC) -o $(OBJ) $(CFLAGS)

------------ end Makefile ---------------------------

P.S. : 소스는 hello world를 기본으로 작성했습니다. 아직 blog에 익숙하지가 않아서
code가 제대로 표현되지 않네요. :-(
P.S.2 : '제기'를 '재기'로 고쳤습니다. :oops:

댓글

hey의 이미지

속도 재기 ^^;

May the F/OSS be with you..



----------------------------
May the F/OSS be with you..


댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.