วันพุธที่ 27 พฤษภาคม พ.ศ. 2563


Error:

yothinin@yothinin-Y400:~/projects/gtk$ gcc -Wall -c  -o hello hello.c `pkg-config --libs --cflags gtk+-2.0`
In file included from /usr/include/gtk-2.0/gtk/gtkobject.h:37,
                 from /usr/include/gtk-2.0/gtk/gtkwidget.h:36,
                 from /usr/include/gtk-2.0/gtk/gtkcontainer.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkbin.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkwindow.h:36,
                 from /usr/include/gtk-2.0/gtk/gtkdialog.h:35,
                 from /usr/include/gtk-2.0/gtk/gtkaboutdialog.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:33,
                 from hello.c:1:
/usr/include/gtk-2.0/gtk/gtktypeutils.h:236:1: warning: ‘GTypeDebugFlags’ is deprecated [-Wdeprecated-declarations]
  236 | void            gtk_type_init   (GTypeDebugFlags    debug_flags);
      | ^~~~
In file included from /usr/include/glib-2.0/gobject/gobject.h:24,
                 from /usr/include/glib-2.0/gobject/gbinding.h:29,
                 from /usr/include/glib-2.0/glib-object.h:22,
                 from /usr/include/glib-2.0/gio/gioenums.h:28,
                 from /usr/include/glib-2.0/gio/giotypes.h:28,
                 from /usr/include/glib-2.0/gio/gio.h:26,
                 from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
                 from /usr/include/gtk-2.0/gdk/gdk.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from hello.c:1:
/usr/include/glib-2.0/gobject/gtype.h:679:1: note: declared here
  679 | {
      | ^
In file included from /usr/include/gtk-2.0/gtk/gtktoolitem.h:31,
                 from /usr/include/gtk-2.0/gtk/gtktoolbutton.h:30,
                 from /usr/include/gtk-2.0/gtk/gtkmenutoolbutton.h:30,
                 from /usr/include/gtk-2.0/gtk/gtk.h:126,
                 from hello.c:1:
/usr/include/gtk-2.0/gtk/gtktooltips.h:73:3: warning: ‘GTimeVal’ is deprecated: Use 'GDateTime' instead [-Wdeprecated-declarations]
   73 |   GTimeVal last_popdown;
      |   ^~~~~~~~
In file included from /usr/include/glib-2.0/glib/galloca.h:32,
                 from /usr/include/glib-2.0/glib.h:30,
                 from /usr/include/glib-2.0/gobject/gbinding.h:28,
                 from /usr/include/glib-2.0/glib-object.h:22,
                 from /usr/include/glib-2.0/gio/gioenums.h:28,
                 from /usr/include/glib-2.0/gio/giotypes.h:28,
                 from /usr/include/glib-2.0/gio/gio.h:26,
                 from /usr/include/gtk-2.0/gdk/gdkapplaunchcontext.h:30,
                 from /usr/include/gtk-2.0/gdk/gdk.h:32,
                 from /usr/include/gtk-2.0/gtk/gtk.h:32,
                 from hello.c:1:
/usr/include/glib-2.0/glib/gtypes.h:547:8: note: declared here
  547 | struct _GTimeVal
      |        ^~~~~~~~~
hello.c: In function ‘main’:
hello.c:8:19: error: ‘win’ undeclared (first use in this function)
    8 |   gtk_widget_show(win);
      |                   ^~~
hello.c:8:19: note: each undeclared identifier is reported only once for each function it appears in
hello.c:4:14: warning: variable ‘window’ set but not used [-Wunused-but-set-variable]
    4 |   GtkWidget *window;
      |              ^~~~~~

แก้ไข:
เพิ่มดังนี้

CFLAGS = -Wall -Wunused                 \
        -DG_DISABLE_DEPRECATED          \
        -DGDK_DISABLE_DEPRECATED        \
        -DGDK_PIXBUF_DISABLE_DEPRECATED \
        -DGTK_DISABLE_DEPRECATED

วันเสาร์ที่ 2 พฤษภาคม พ.ศ. 2563

ทำไมถึงเขียน ภาษา C และ Gtk+ 2.0

หลังจากที่เริ่มเขียนโปรแกรมภาษา C และ Gtk+ 2.0 มาได้ประมาณ 2 สัปดาห์ ก็มีหยุดบ้างทำบ้าง มีหายไปประมาณ 3-4 วัน และบางทีก็ทำสลับกับงานอื่นๆ ไป แต่บางครั้งก็นั่งหน้าจอมากกว่า 12 ชั่วโมง เพื่อค้นหาข้อมูล คิดหาวิธีการเขียนโปรแกรม บางทีเมื่อคิดไม่ออกก็เปลี่ยนไปนั่งทำอย่างอื่นบ้าง ไปหาข้อมูลเกี่ยวกับ Micro-controller หรือไม่ก็ไปไสไม้ทำกล่อง ทำชั้นเรื่อยเปื่อย

เดิมทีจะเขียนระบบ Digital Designage

ถึงตอนนี้การเขียนภาษา C โดยใช้ Gtk+ ก็ถือว่าก้าวหน้าไประดับหนึ่ง สามารถเขียนได้เป็นเรื่องเป็นราว แต่ก็ยังติดขัดปัญหาอยู่บ้าง บางทีก็ติดเรื่องหาตัวอย่างและข้อมูลไม่ได้ทันที กว่าจะเจอก็ใช้เวลานานพอควร

การเรียนรู้ก็เทียบเคียงกับการเขียนโปรแกรมอื่นๆ ในเรื่องหลักการโดยรวม เช่น สร้างหน้าจอรับข้อมูล หลักการก็ต้องมีช่องรับ เมื่อพิมพ์ก็สามารถตรวจสอบการกดปุ่มคีย์บอร์ดได้ด้วย ว่าพิมพ์ถูกหรือผิด มีการดักอีเวนท์ต่างๆ ของคีย์บอร์ด เมื่อกดปุ่ม enter ก็ให้เลื่อนไปอีกช่องหนึ่งหรือคอนโทรลอื่น เป็นต้น

ใน Gtk+ ก็มีสิ่งเหล่านี้รองรับหมดแล้ว และเหนือกว่าบางโปรแกรมด้วยซ้ำไป แต่ปัญหา คือ ตัวอย่างและเอกสารต่างๆ บางทีก็ยากที่จะเรียนรู้ หากเมื่อเทียบกับการเรียนรู้ FoxPro ในอดีต สิ่งหนึ่งที่ผู้เขียนชอบมาก คือ กดปุ่ม F1 เพื่ออ่าน Help ของโปรแกรม และแต่ละส่วนก็จะมีตัวอย่างให้เราพิมพ์ตาม จนแทบไม่ต้องหาจากหนังสือเลย (สมัยนั้นไม่มีแหล่งเรียนรู้ใน www ต้องหาจากหนังสือหรือ Help นี่แหละ และสมัยนั้นลงทุนซื้อหนังสือต่างประเทศราคา 2-3 พันบาทก็มี)

Gtk4 ตอนที่ 6 Defining a Child object

Defining a Child object A Very Simple Editor ในบทความที่ผ่านมาเราสร้างโปรแกรมอ่านไฟล์ชนิดข้อความ และในบทความนี้ก็จะมาปรับแต่งโปรแกรมกันสักหน...