Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
gui.c
Go to the documentation of this file.
1#include <gtk/gtk.h>
2
3/**
4 * @struct AppWidgets
5 * @brief Holds references to key GTK widgets used in the application.
6 */
11
12/**
13 * @brief Display text output in the GtkTextBuffer.
14 *
15 * @param buffer The GtkTextBuffer where the output will be shown.
16 * @param output The text to display.
17 */
18static void display_output(GtkTextBuffer *buffer, const gchar *output) {
20}
21
22/**
23 * @brief Callback triggered when the "Fetch" button is clicked.
24 *
25 * It reads the username from the entry, spawns the external fetcher process,
26 * captures its output or error, and displays it.
27 *
28 * @param button The GtkButton that was clicked.
29 * @param user_data Pointer to AppWidgets containing references to UI elements.
30 */
31static void on_button_clicked(GtkButton *button, gpointer user_data) {
32 (void)button; // Mark parameter as deliberately unused
33 AppWidgets *widgets = user_data;
34 const gchar *username = gtk_editable_get_text(GTK_EDITABLE(widgets->entry));
35
36 if (!username || *username == '\0') {
37 display_output(widgets->output_buffer, "Please enter a username.");
38 return;
39 }
40
41 gchar *argv[] = {
42 "/home/izelnakri/Github/project-templates/c/build/github_user_fetcher",
43 (gchar *)username, NULL};
44
45 gchar *stdout_data = NULL;
46 gchar *stderr_data = NULL;
47 GError *error = NULL;
48 gint exit_status = 0;
49
50 gboolean success =
51 g_spawn_sync(NULL, argv, NULL, G_SPAWN_DEFAULT, NULL, NULL, &stdout_data,
52 &stderr_data, &exit_status, &error);
53
54 if (!success) {
55 gchar *msg = g_strdup_printf("Error: %s", error->message);
56 display_output(widgets->output_buffer, msg);
57 g_free(msg);
58 g_error_free(error);
59 return;
60 }
61
62 if (exit_status != 0) {
63 gchar *msg = g_strdup_printf("Process failed: %s", stderr_data);
64 display_output(widgets->output_buffer, msg);
65 g_free(msg);
66 } else {
67 display_output(widgets->output_buffer, stdout_data);
68 }
69
70 g_free(stdout_data);
71 g_free(stderr_data);
72}
73
74/**
75 * @brief Activates the application window and sets up the UI.
76 *
77 * Creates the window, applies CSS styling, sets up the layout,
78 * connects signals, and displays the window.
79 *
80 * @param app The GtkApplication instance.
81 * @param user_data User data (unused).
82 */
83static void activate(GtkApplication *app, gpointer user_data) {
84 (void)user_data; // Mark parameter as deliberately unused
85
87 gtk_window_set_title(GTK_WINDOW(window), "GitHub User Fetcher");
88 gtk_window_set_default_size(GTK_WINDOW(window), 600, 400);
89
91 gtk_css_provider_load_from_path(provider, "src/style.css");
95
97 gtk_widget_add_css_class(box, "main-container");
98 // styling:
103 // styling end
104 gtk_window_set_child(GTK_WINDOW(window), box);
105
106 AppWidgets *widgets = g_new0(AppWidgets, 1);
107
108 widgets->entry = GTK_ENTRY(gtk_entry_new());
109 gtk_entry_set_placeholder_text(widgets->entry, "Enter GitHub username");
110 gtk_widget_add_css_class(GTK_WIDGET(widgets->entry), "username-entry");
111 gtk_box_append(GTK_BOX(box), GTK_WIDGET(widgets->entry));
112
113 GtkWidget *button = gtk_button_new_with_label("Fetch");
114 gtk_widget_add_css_class(button, "fetch-button");
115 gtk_box_append(GTK_BOX(box), button);
116
118 gtk_widget_set_vexpand(scrolled, TRUE);
119 gtk_box_append(GTK_BOX(box), scrolled);
120
121 GtkWidget *output_view = gtk_text_view_new();
124 gtk_widget_add_css_class(output_view, "output-view");
125
127
129
130 g_signal_connect(button, "clicked", G_CALLBACK(on_button_clicked), widgets);
131 g_signal_connect(window, "close-request", G_CALLBACK(gtk_window_destroy),
132 NULL);
133
135}
136
137/**
138 * @brief Main entry point.
139 *
140 * Initializes the GtkApplication, connects the activate signal, and runs the
141 * application loop.
142 *
143 * @param argc Argument count.
144 * @param argv Argument vector.
145 * @return Application exit status.
146 */
147int main(int argc, char *argv[]) {
148 GtkApplication *app = gtk_application_new("com.example.githubfetcher",
149 G_APPLICATION_DEFAULT_FLAGS);
150 g_signal_connect(app, "activate", G_CALLBACK(activate), NULL);
151 int status = g_application_run(G_APPLICATION(app), argc, argv);
152 g_object_unref(app);
153 return status;
154}
GIO_AVAILABLE_IN_ALL int g_application_run(GApplication *application, int argc, char **argv)
#define G_APPLICATION(inst)
#define G_CALLBACK(f)
Definition gclosure.h:73
GDK_AVAILABLE_IN_ALL GdkDisplay * gdk_display_get_default(void)
#define NULL
Definition gmacros.h:924
#define TRUE
Definition gmacros.h:933
#define FALSE
Definition gmacros.h:929
GLIB_AVAILABLE_IN_ALL void g_free(gpointer mem)
#define g_new0(struct_type, n_structs)
Definition gmem.h:332
GOBJECT_AVAILABLE_IN_ALL void g_object_unref(gpointer object)
#define g_signal_connect(instance, detailed_signal, c_handler, data)
Definition gsignal.h:518
@ G_SPAWN_DEFAULT
Definition gspawn.h:178
GLIB_AVAILABLE_IN_ALL gboolean g_spawn_sync(const gchar *working_directory, gchar **argv, gchar **envp, GSpawnFlags flags, GSpawnChildSetupFunc child_setup, gpointer user_data, gchar **standard_output, gchar **standard_error, gint *wait_status, GError **error)
GLIB_AVAILABLE_IN_ALL gchar * g_strdup_printf(const gchar *format,...) G_GNUC_PRINTF(1
GDK_AVAILABLE_IN_ALL GtkApplication * gtk_application_new(const char *application_id, GApplicationFlags flags)
GDK_AVAILABLE_IN_ALL GtkWidget * gtk_application_window_new(GtkApplication *application)
GDK_AVAILABLE_IN_ALL GtkWidget * gtk_box_new(GtkOrientation orientation, int spacing)
GDK_AVAILABLE_IN_ALL void gtk_box_append(GtkBox *box, GtkWidget *child)
#define GTK_BOX(obj)
Definition gtkbox.h:39
GDK_AVAILABLE_IN_ALL GtkWidget * gtk_button_new_with_label(const char *label)
GDK_AVAILABLE_IN_ALL void gtk_css_provider_load_from_path(GtkCssProvider *css_provider, const char *path)
GDK_AVAILABLE_IN_ALL GtkCssProvider * gtk_css_provider_new(void)
#define GTK_EDITABLE(obj)
Definition gtkeditable.h:38
GDK_AVAILABLE_IN_ALL const char * gtk_editable_get_text(GtkEditable *editable)
GDK_AVAILABLE_IN_ALL GtkWidget * gtk_entry_new(void)
GDK_AVAILABLE_IN_ALL void gtk_entry_set_placeholder_text(GtkEntry *entry, const char *text)
#define GTK_ENTRY(obj)
Definition gtkentry.h:46
@ GTK_WRAP_WORD_CHAR
Definition gtkenums.h:582
@ GTK_ORIENTATION_VERTICAL
Definition gtkenums.h:440
#define GTK_SCROLLED_WINDOW(obj)
GDK_AVAILABLE_IN_ALL GtkWidget * gtk_scrolled_window_new(void)
GDK_AVAILABLE_IN_ALL void gtk_scrolled_window_set_child(GtkScrolledWindow *scrolled_window, GtkWidget *child)
#define GTK_STYLE_PROVIDER(o)
GDK_AVAILABLE_IN_ALL void gtk_style_context_add_provider_for_display(GdkDisplay *display, GtkStyleProvider *provider, guint priority)
#define GTK_STYLE_PROVIDER_PRIORITY_APPLICATION
GDK_AVAILABLE_IN_ALL void gtk_text_buffer_set_text(GtkTextBuffer *buffer, const char *text, int len)
GDK_AVAILABLE_IN_ALL GtkWidget * gtk_text_view_new(void)
#define GTK_TEXT_VIEW(obj)
Definition gtktextview.h:38
GDK_AVAILABLE_IN_ALL void gtk_text_view_set_wrap_mode(GtkTextView *text_view, GtkWrapMode wrap_mode)
GDK_AVAILABLE_IN_ALL GtkTextBuffer * gtk_text_view_get_buffer(GtkTextView *text_view)
GDK_AVAILABLE_IN_ALL void gtk_text_view_set_editable(GtkTextView *text_view, gboolean setting)
GDK_AVAILABLE_IN_ALL void gtk_widget_set_margin_start(GtkWidget *widget, int margin)
GDK_AVAILABLE_IN_ALL void gtk_widget_set_margin_bottom(GtkWidget *widget, int margin)
GDK_AVAILABLE_IN_ALL void gtk_widget_add_css_class(GtkWidget *widget, const char *css_class)
#define GTK_WIDGET(widget)
Definition gtkwidget.h:44
GDK_AVAILABLE_IN_ALL void gtk_widget_set_margin_end(GtkWidget *widget, int margin)
GDK_AVAILABLE_IN_ALL void gtk_widget_set_vexpand(GtkWidget *widget, gboolean expand)
GDK_AVAILABLE_IN_ALL void gtk_widget_set_margin_top(GtkWidget *widget, int margin)
GDK_AVAILABLE_IN_ALL void gtk_window_set_child(GtkWindow *window, GtkWidget *child)
GDK_AVAILABLE_IN_ALL void gtk_window_destroy(GtkWindow *window)
GDK_AVAILABLE_IN_ALL void gtk_window_set_default_size(GtkWindow *window, int width, int height)
#define GTK_WINDOW(obj)
Definition gtkwindow.h:39
GDK_AVAILABLE_IN_ALL void gtk_window_present(GtkWindow *window)
GDK_AVAILABLE_IN_ALL void gtk_window_set_title(GtkWindow *window, const char *title)
gint gboolean
Definition gtypes.h:56
G_BEGIN_DECLS typedef char gchar
Definition gtypes.h:52
void * gpointer
Definition gtypes.h:109
int gint
Definition gtypes.h:55
static void display_output(GtkTextBuffer *buffer, const gchar *output)
Display text output in the GtkTextBuffer.
Definition gui.c:18
static void on_button_clicked(GtkButton *button, gpointer user_data)
Callback triggered when the "Fetch" button is clicked.
Definition gui.c:31
static void activate(GtkApplication *app, gpointer user_data)
Activates the application window and sets up the UI.
Definition gui.c:83
static const char * output
static void error(LoadState *S, const char *why)
int main(void)
Definition sanitycheckc.c:1
Holds references to key GTK widgets used in the application.
Definition gui.c:7
GtkEntry * entry
Definition gui.c:8
GtkTextBuffer * output_buffer
Definition gui.c:9