Skip to content

Commit

Permalink
Merge pull request #1 from yihuajack/main
Browse files Browse the repository at this point in the history
Complete GtkDialog, GtkGrid, and XML UI for settings
  • Loading branch information
boqunli committed Mar 10, 2022
2 parents 90edfde + 61c6edd commit fbdb688
Show file tree
Hide file tree
Showing 7 changed files with 224 additions and 105 deletions.
52 changes: 1 addition & 51 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,52 +1,2 @@
# Prerequisites
*.d

# Object files
*.o
*.ko
*.obj
*.elf

# Linker output
*.ilk
*.map
*.exp

# Precompiled Headers
*.gch
*.pch

# Libraries
*.lib
*.a
*.la
*.lo

# Shared objects (inc. Windows DLLs)
*.dll
*.so
*.so.*
*.dylib

# Executables
.vscode
*.exe
*.out
*.app
*.i*86
*.x86_64
*.hex

# Debug files
*.dSYM/
*.su
*.idb
*.pdb

# Kernel Module Compile Results
*.mod*
*.cmd
.tmp_versions/
modules.order
Module.symvers
Mkfile.old
dkms.conf
5 changes: 0 additions & 5 deletions README copy.md

This file was deleted.

30 changes: 23 additions & 7 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,11 +1,27 @@
# stone_game_gtk4

Two players take stones from the stone heap in turns.
Two players take stones from the stone heap in turns.
The one who takes the last stone loses the game.

### Compile and Run
in msys2 mingw:
install gtk4
run
./make.sh
./main.exe
### Usage

#### Windows MSYS2 MinGW-w64

[The GTK Project - A free and open-source cross-platform widget toolkit](https://www.gtk.org/docs/installations/windows/)

- Install GTK4

```bash
pacman -S mingw-w64-x86_64-gtk4
pacman -S mingw-w64-x86_64-python3-gobject
```

- Compile by command

```bash
gcc `pkg-config --cflags gtk4` main_window.c -o main `pkg-config --libs gtk4`
```

### Known Issue

The given `settings.glade` is the XML UI file generated by Glade 3. However, `glade` does NOT support GTK 4, so is not applicable. Instead, use manually-written `settings.ui` for GTK Builder.
69 changes: 28 additions & 41 deletions main_window.c
Original file line number Diff line number Diff line change
Expand Up @@ -270,55 +270,42 @@ static void
settings (GtkWidget *widget,
gpointer data)
{
GError *err = NULL;
// the callback function of settings
g_print ("Setting\n");
GtkApplication *app = GTK_APPLICATION(data);
// GtkWidget* window = gtk_application_window_new (app);
GtkWidget* window = gtk_window_new();

gtk_window_set_title (GTK_WINDOW (window), "STONE_GAME_SETTING 设置");
gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
// GtkApplication *app = GTK_APPLICATION(data);
GtkBuilder* builder = gtk_builder_new();
gboolean built = gtk_builder_add_from_file(builder, "settings.ui", &err);
// https://docs.gtk.org/gtk4/method.Builder.add_from_file.html
// TRUE on success, FALSE if an error occurred.
// g_assert (built == TRUE);
if (err) {
fprintf (stderr, "Unable to read file: %s\n", err->message);
g_error_free(err);
return;
}
GObject* window = gtk_builder_get_object(builder, "dialog_settings");

// boxes: box1
// ----
// box2
GtkWidget* box = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_widget_set_halign (box, GTK_ALIGN_CENTER);
gtk_widget_set_valign (box, GTK_ALIGN_CENTER);
GtkWidget* box1 = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 0);
gtk_widget_set_halign (box1, GTK_ALIGN_CENTER);
gtk_widget_set_valign (box1, GTK_ALIGN_CENTER);
GtkWidget* box2 = gtk_box_new(GTK_ORIENTATION_VERTICAL, 10);
gtk_widget_set_halign (box2, GTK_ALIGN_CENTER);
gtk_widget_set_valign (box2, GTK_ALIGN_CENTER);
GtkWidget* sep = gtk_separator_new(GTK_ORIENTATION_HORIZONTAL);
gtk_window_set_child (GTK_WINDOW (window), box);
gtk_box_append (GTK_BOX(box),box1);
gtk_box_append (GTK_BOX(box),sep);
gtk_box_append (GTK_BOX(box),box2);
// gtk_window_set_title (GTK_WINDOW (window), "STONE_GAME_SETTING 设置");
// gtk_window_set_default_size (GTK_WINDOW (window), 400, 300);
// GtkDialog mapped without a transient parent. This is discouraged.
gtk_window_set_transient_for (GTK_WINDOW (window), GTK_WINDOW (data));

// labels
GtkWidget* label1 = gtk_label_new("请输入个数:");
GtkWidget* entry1 = gtk_entry_new();
gtk_box_append(GTK_BOX(box1),label1);
gtk_box_append(GTK_BOX(box1),entry1);
// GObject* label1 = gtk_builder_get_object(builder, "number_label");
GObject* entry1 = gtk_builder_get_object(builder, "number_entry");

GtkWidget* button1 = gtk_button_new_with_label("清空");
g_signal_connect(G_OBJECT(button1),"clicked",G_CALLBACK(on_button_clicked_clear), entry1);
gtk_box_append(GTK_BOX(box2),button1);
gtk_widget_show(button1);
GObject* button1 = gtk_builder_get_object(builder, "clear_button");
g_signal_connect(GTK_WIDGET (button1), "clicked", G_CALLBACK(on_button_clicked_clear), entry1);
gtk_widget_show (GTK_WIDGET (button1));

GtkWidget* button2 = gtk_button_new_with_label("确认");
g_signal_connect(G_OBJECT(button2), "clicked", G_CALLBACK(on_button_clicked_set), entry1);
g_signal_connect_swapped(G_OBJECT(button2), "clicked", G_CALLBACK(gtk_window_destroy), window);
gtk_box_append(GTK_BOX(box2),button2);
gtk_widget_show(button2);
GObject* button2 = gtk_builder_get_object(builder, "confirm_button");
g_signal_connect(GTK_WIDGET (button2), "clicked", G_CALLBACK(on_button_clicked_set), GTK_WIDGET (entry1));
g_signal_connect_swapped(GTK_WIDGET (button2), "clicked", G_CALLBACK(gtk_window_destroy), GTK_WINDOW (window));
gtk_widget_show (GTK_WIDGET (button2));

gtk_widget_show (window);
gtk_widget_show (GTK_WIDGET (window));
}



static void
activate (GtkApplication *app,
gpointer user_data)
Expand All @@ -344,7 +331,7 @@ activate (GtkApplication *app,
button_start = gtk_button_new_with_label ("ENTER GAME 开始游戏");
button_exit = gtk_button_new_with_label ("EXIT GAME 退出游戏");

g_signal_connect (button_settings, "clicked", G_CALLBACK (settings), app);
g_signal_connect (button_settings, "clicked", G_CALLBACK (settings), window);
g_signal_connect (button_start, "clicked", G_CALLBACK (start_game), app);
g_signal_connect (button_exit, "clicked", G_CALLBACK (exit_game), window);
// g_signal_connect_swapped (button_exit, "clicked", G_CALLBACK (gtk_window_destroy), window);
Expand Down
4 changes: 3 additions & 1 deletion make.sh
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
gcc `pkg-config --cflags gtk4` main_window.c player.c -o main `pkg-config --libs gtk4`
gcc `pkg-config --cflags gtk4` main_window.c player.c -o main `pkg-config --libs gtk4`
# https://stackoverflow.com/questions/26884574/questions-about-gcc-unrecognized-option-rdynamic
# Use `-export-dynamic` instead of `-rdynamic`
102 changes: 102 additions & 0 deletions settings.glade
Original file line number Diff line number Diff line change
@@ -0,0 +1,102 @@
<?xml version="1.0" encoding="UTF-8"?>
<!-- Generated with glade 3.38.2 -->
<interface>
<requires lib="gtk+" version="3.24"/>
<object class="GtkDialog" id="dialog">
<property name="name">dialog</property>
<property name="can-focus">False</property>
<property name="title" translatable="yes">设置 Settings</property>
<property name="resizable">False</property>
<property name="default-width">800</property>
<property name="default-height">-1</property>
<property name="type-hint">normal</property>
<child internal-child="vbox">
<object class="GtkBox">
<property name="can-focus">False</property>
<property name="orientation">vertical</property>
<property name="spacing">2</property>
<child internal-child="action_area">
<object class="GtkButtonBox">
<property name="can-focus">False</property>
<property name="layout-style">end</property>
<child>
<object class="GtkButton" id="clear_button">
<property name="label" translatable="yes">清空</property>
<property name="name">clear_button</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">0</property>
</packing>
</child>
<child>
<object class="GtkButton" id="confirm_button">
<property name="label" translatable="yes">确认</property>
<property name="name">confirm_button</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
<property name="receives-default">True</property>
</object>
<packing>
<property name="expand">True</property>
<property name="fill">True</property>
<property name="position">1</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">False</property>
<property name="position">0</property>
</packing>
</child>
<child>
<!-- n-columns=2 n-rows=1 -->
<object class="GtkGrid" id="grid">
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="halign">center</property>
<property name="valign">center</property>
<property name="margin-start">50</property>
<property name="margin-end">50</property>
<property name="row-spacing">50</property>
<property name="column-spacing">50</property>
<child>
<object class="GtkLabel" id="number_label">
<property name="name">number_label</property>
<property name="visible">True</property>
<property name="can-focus">False</property>
<property name="label" translatable="yes">请输入个数:</property>
</object>
<packing>
<property name="left-attach">0</property>
<property name="top-attach">0</property>
</packing>
</child>
<child>
<object class="GtkEntry" id="number_entry">
<property name="name">number_entry</property>
<property name="visible">True</property>
<property name="can-focus">True</property>
</object>
<packing>
<property name="left-attach">1</property>
<property name="top-attach">0</property>
</packing>
</child>
</object>
<packing>
<property name="expand">False</property>
<property name="fill">True</property>
<property name="padding">100</property>
<property name="position">1</property>
</packing>
</child>
</object>
</child>
</object>
</interface>
67 changes: 67 additions & 0 deletions settings.ui
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
<?xml version="1.0" encoding="UTF-8"?>
<interface>
<object class="GtkDialog" id="dialog_settings">
<property name="title" translatable="yes">STONE_GAME_SETTING 设置</property>
<property name="resizable">1</property>
<property name="modal">1</property>
<child internal-child="content_area">
<object class="GtkBox" id="content_area">
<child>
<object class="GtkGrid" id="grid">
<property name="margin-start">12</property>
<property name="margin-end">12</property>
<property name="margin-top">12</property>
<property name="margin-bottom">12</property>
<property name="row-spacing">12</property>
<property name="column-spacing">12</property>
<child>
<object class="GtkLabel" id="number_label">
<property name="label">请输入个数:</property>
<property name="xalign">1</property>
<layout>
<property name="column">0</property>
<property name="row">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkEntry" id="number_entry">
<layout>
<property name="column">1</property>
<property name="row">0</property>
</layout>
</object>
</child>
<child>
<object class="GtkSeparator" id="midsep">
<layout>
<property name="column">0</property>
<property name="row">1</property>
<property name="column-span">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="clear_button">
<property name="label">清空</property>
<layout>
<property name="column">0</property>
<property name="row">2</property>
</layout>
</object>
</child>
<child>
<object class="GtkButton" id="confirm_button">
<property name="label">确认</property>
<layout>
<property name="column">1</property>
<property name="row">2</property>
</layout>
</object>
</child>
</object>
</child>
</object>
</child>
</object>
</interface>

0 comments on commit fbdb688

Please sign in to comment.