Github User Fetcher 1.0.0
C Application with Server and GUI
Loading...
Searching...
No Matches
gui.c File Reference
#include <gtk/gtk.h>

Go to the source code of this file.

Data Structures

struct  AppWidgets
 Holds references to key GTK widgets used in the application. More...
 

Functions

static void display_output (GtkTextBuffer *buffer, const gchar *output)
 Display text output in the GtkTextBuffer.
 
static void on_button_clicked (GtkButton *button, gpointer user_data)
 Callback triggered when the "Fetch" button is clicked.
 
static void activate (GtkApplication *app, gpointer user_data)
 Activates the application window and sets up the UI.
 
int main (int argc, char *argv[])
 Main entry point.
 

Function Documentation

◆ activate()

static void activate ( GtkApplication * app,
gpointer user_data )
static

Activates the application window and sets up the UI.

Creates the window, applies CSS styling, sets up the layout, connects signals, and displays the window.

Parameters
appThe GtkApplication instance.
user_dataUser data (unused).

Definition at line 83 of file gui.c.

83 {
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}
#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
#define g_new0(struct_type, n_structs)
Definition gmem.h:332
#define g_signal_connect(instance, detailed_signal, c_handler, data)
Definition gsignal.h:518
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)
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 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)
static void on_button_clicked(GtkButton *button, gpointer user_data)
Callback triggered when the "Fetch" button is clicked.
Definition gui.c:31
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

References AppWidgets::entry, FALSE, G_CALLBACK, g_new0, g_signal_connect, gdk_display_get_default(), gtk_application_window_new(), GTK_BOX, gtk_box_append(), gtk_box_new(), gtk_button_new_with_label(), gtk_css_provider_load_from_path(), gtk_css_provider_new(), GTK_ENTRY, gtk_entry_new(), gtk_entry_set_placeholder_text(), GTK_ORIENTATION_VERTICAL, GTK_SCROLLED_WINDOW, gtk_scrolled_window_new(), gtk_scrolled_window_set_child(), gtk_style_context_add_provider_for_display(), GTK_STYLE_PROVIDER, GTK_STYLE_PROVIDER_PRIORITY_APPLICATION, GTK_TEXT_VIEW, gtk_text_view_get_buffer(), gtk_text_view_new(), gtk_text_view_set_editable(), gtk_text_view_set_wrap_mode(), GTK_WIDGET, gtk_widget_add_css_class(), gtk_widget_set_margin_bottom(), gtk_widget_set_margin_end(), gtk_widget_set_margin_start(), gtk_widget_set_margin_top(), gtk_widget_set_vexpand(), GTK_WINDOW, gtk_window_destroy(), gtk_window_present(), gtk_window_set_child(), gtk_window_set_default_size(), gtk_window_set_title(), GTK_WRAP_WORD_CHAR, NULL, on_button_clicked(), AppWidgets::output_buffer, and TRUE.

Referenced by main().

◆ display_output()

static void display_output ( GtkTextBuffer * buffer,
const gchar * output )
static

Display text output in the GtkTextBuffer.

Parameters
bufferThe GtkTextBuffer where the output will be shown.
outputThe text to display.

Definition at line 18 of file gui.c.

18 {
20}
GDK_AVAILABLE_IN_ALL void gtk_text_buffer_set_text(GtkTextBuffer *buffer, const char *text, int len)
static const char * output

References gtk_text_buffer_set_text(), and output.

Referenced by on_button_clicked().

◆ main()

int main ( int argc,
char * argv[] )

Main entry point.

Initializes the GtkApplication, connects the activate signal, and runs the application loop.

Parameters
argcArgument count.
argvArgument vector.
Returns
Application exit status.

Definition at line 147 of file gui.c.

147 {
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)
GOBJECT_AVAILABLE_IN_ALL void g_object_unref(gpointer object)
GDK_AVAILABLE_IN_ALL GtkApplication * gtk_application_new(const char *application_id, GApplicationFlags flags)
static void activate(GtkApplication *app, gpointer user_data)
Activates the application window and sets up the UI.
Definition gui.c:83

References activate(), G_APPLICATION, g_application_run(), G_CALLBACK, g_object_unref(), g_signal_connect, gtk_application_new(), and NULL.

◆ on_button_clicked()

static void on_button_clicked ( GtkButton * button,
gpointer user_data )
static

Callback triggered when the "Fetch" button is clicked.

It reads the username from the entry, spawns the external fetcher process, captures its output or error, and displays it.

Parameters
buttonThe GtkButton that was clicked.
user_dataPointer to AppWidgets containing references to UI elements.

Definition at line 31 of file gui.c.

31 {
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}
GLIB_AVAILABLE_IN_ALL void g_free(gpointer mem)
@ 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
#define GTK_EDITABLE(obj)
Definition gtkeditable.h:38
GDK_AVAILABLE_IN_ALL const char * gtk_editable_get_text(GtkEditable *editable)
gint gboolean
Definition gtypes.h:56
G_BEGIN_DECLS typedef char gchar
Definition gtypes.h:52
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 error(LoadState *S, const char *why)

References display_output(), AppWidgets::entry, error(), g_free(), G_SPAWN_DEFAULT, g_spawn_sync(), g_strdup_printf(), gchar, GTK_EDITABLE, gtk_editable_get_text(), NULL, and AppWidgets::output_buffer.

Referenced by activate().