<commit_before>#include <stdlib.h>
#include <gtk/gtk.h>

static void
clicked (GtkButton *button, GtkMenu *menu)
{
  gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, 0);
}

static void
new_window (GApplication *app,
            GFile        *file)
{
  GtkWidget *window, *grid, *scrolled, *view;
  GtkMenu *menu;

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_application (GTK_WINDOW (window), GTK_APPLICATION (app));
  gtk_window_set_title (GTK_WINDOW (window), "Bloatpad");

  grid = gtk_grid_new ();
  gtk_container_add (GTK_CONTAINER (window), grid);

  menu = gtk_application_get_menu (GTK_APPLICATION (app));
  if (menu != NULL)
    {
      GtkWidget *button;

      button = gtk_button_new ();
      gtk_button_set_image (GTK_BUTTON (button), gtk_image_new_from_icon_name ("help-about", GTK_ICON_SIZE_MENU));
      gtk_widget_set_halign (button, GTK_ALIGN_START);
      gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1);
      g_signal_connect (button, "clicked", G_CALLBACK (clicked), menu);
    }

  scrolled = gtk_scrolled_window_new (NULL, NULL);
  gtk_widget_set_hexpand (scrolled, TRUE);
  gtk_widget_set_vexpand (scrolled, TRUE);
  view = gtk_text_view_new ();

  gtk_container_add (GTK_CONTAINER (scrolled), view);

  gtk_grid_attach (GTK_GRID (grid), scrolled, 0, 1, 1, 1);

  if (file != NULL)
    {
      gchar *contents;
      gsize length;

      if (g_file_load_contents (file, NULL, &contents, &length, NULL, NULL))
        {
          GtkTextBuffer *buffer;

          buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
          gtk_text_buffer_set_text (buffer, contents, length);
          g_free (contents);
        }
    }

  gtk_widget_show_all (GTK_WIDGET (window));
}

static void
bloat_pad_activate (GApplication *application)
{
  new_window (application, NULL);
}

static void
bloat_pad_open (GApplication  *application,
                GFile        **files,
                gint           n_files,
                const gchar   *hint)
{
  gint i;

  for (i = 0; i < n_files; i++)
    new_window (application, files[i]);
}

typedef GtkApplication BloatPad;
typedef GtkApplicationClass BloatPadClass;

G_DEFINE_TYPE (BloatPad, bloat_pad, GTK_TYPE_APPLICATION)

static void
bloat_pad_finalize (GObject *object)
{
  G_OBJECT_CLASS (bloat_pad_parent_class)->finalize (object);
}

static void
show_help (GSimpleAction *action,
           GVariant      *parameter,
           gpointer       user_data)
{
  g_print ("Want help, eh ?!\n");
}

static void
show_about (GSimpleAction *action,
            GVariant      *parameter,
            gpointer       user_data)
{
  GList *list;
  GtkWindow *win;

  list = gtk_application_get_windows (GTK_APPLICATION (g_application_get_default ()));
  win = list->data;

  gtk_show_about_dialog (win,
                         "program-name", "Bloatpad",
                         "title", "About Bloatpad",
                         "comments", "Not much to say, really.",
                         NULL);
}

static void
quit_app (GSimpleAction *action,
          GVariant      *parameter,
          gpointer       user_data)
{
  GList *list, *next;
  GtkWindow *win;

  g_print ("Going down...\n");

  list = gtk_application_get_windows (GTK_APPLICATION (g_application_get_default ()));
  while (list)
    {
      win = list->data;
      next = list->next;

      gtk_widget_destroy (GTK_WIDGET (win));

      list = next;
    }
}

static GSimpleActionGroup *actions = NULL;
static GMenu *menu = NULL;

static void
remove_action (GSimpleAction *action,
               GVariant      *parameter,
               gpointer       user_data)
{
  GAction *add;

  g_menu_remove (menu, g_menu_model_get_n_items (G_MENU_MODEL (menu)) - 1);
  g_simple_action_set_enabled (action, FALSE);
  add = g_simple_action_group_lookup (actions, "add");
  g_simple_action_set_enabled (G_SIMPLE_ACTION (add), TRUE);
}

static void
add_action (GSimpleAction *action,
            GVariant      *parameter,
            gpointer       user_data)
{
  GAction *remove;

  g_menu_append (menu, "Remove", "remove");
  g_simple_action_set_enabled (action, FALSE);
  remove = g_simple_action_group_lookup (actions, "remove");
  g_simple_action_set_enabled (G_SIMPLE_ACTION (remove), TRUE);
}

static GActionEntry entries[] = {
  { "help", show_help, NULL, NULL, NULL },
  { "about", show_about, NULL, NULL, NULL },
  { "quit", quit_app, NULL, NULL, NULL },
  { "add", add_action, NULL, NULL, NULL },
  { "remove", remove_action, NULL, NULL, NULL }
};

static GActionGroup *
get_actions (void)
{
  actions = g_simple_action_group_new ();
  g_simple_action_group_add_entries (actions,
                                     entries, G_N_ELEMENTS (entries),
                                     NULL);

  return G_ACTION_GROUP (actions);
}

static GMenuModel *
get_menu (void)
{
  menu = g_menu_new ();
  g_menu_append (menu, "Help", "help");
  g_menu_append (menu, "About Bloatpad", "about");
  g_menu_append (menu, "Quit", "quit");
  g_menu_append (menu, "Add", "add");

  return G_MENU_MODEL (menu);
}

static void
bloat_pad_init (BloatPad *app)
{
  g_application_set_action_group (G_APPLICATION (app), get_actions ());
  g_application_set_menu (G_APPLICATION (app), get_menu ());
}

static void
bloat_pad_class_init (BloatPadClass *class)
{
  G_OBJECT_CLASS (class)->finalize= bloat_pad_finalize;

  G_APPLICATION_CLASS (class)->activate = bloat_pad_activate;
  G_APPLICATION_CLASS (class)->open = bloat_pad_open;
}

BloatPad *
bloat_pad_new (void)
{
  g_type_init ();<commit_msg>port bloatpad to the new APIs<commit_after>#include <stdlib.h>
#include <gtk/gtk.h>

static void
clicked (GtkButton *button, GtkMenu *menu)
{
  gtk_menu_popup (menu, NULL, NULL, NULL, NULL, 0, 0);
}

static void
new_window (GApplication *app,
            GFile        *file)
{
  GtkWidget *window, *grid, *scrolled, *view;
  GtkWidget *menu;

  window = gtk_application_window_new (GTK_APPLICATION (app));
  gtk_window_set_title (GTK_WINDOW (window), "Bloatpad");

  grid = gtk_grid_new ();
  gtk_container_add (GTK_CONTAINER (window), grid);

  menu = gtk_application_window_get_app_menu (GTK_APPLICATION_WINDOW (window));
  if (menu != NULL)
    {
      GtkWidget *button;

      button = gtk_button_new ();
      gtk_button_set_image (GTK_BUTTON (button), gtk_image_new_from_icon_name ("help-about", GTK_ICON_SIZE_MENU));
      gtk_widget_set_halign (button, GTK_ALIGN_START);
      gtk_grid_attach (GTK_GRID (grid), button, 0, 0, 1, 1);
      g_signal_connect (button, "clicked", G_CALLBACK (clicked), menu);
    }

  scrolled = gtk_scrolled_window_new (NULL, NULL);
  gtk_widget_set_hexpand (scrolled, TRUE);
  gtk_widget_set_vexpand (scrolled, TRUE);
  view = gtk_text_view_new ();

  gtk_container_add (GTK_CONTAINER (scrolled), view);

  gtk_grid_attach (GTK_GRID (grid), scrolled, 0, 1, 1, 1);

  if (file != NULL)
    {
      gchar *contents;
      gsize length;

      if (g_file_load_contents (file, NULL, &contents, &length, NULL, NULL))
        {
          GtkTextBuffer *buffer;

          buffer = gtk_text_view_get_buffer (GTK_TEXT_VIEW (view));
          gtk_text_buffer_set_text (buffer, contents, length);
          g_free (contents);
        }
    }

  gtk_widget_show_all (GTK_WIDGET (window));
}

static void
bloat_pad_activate (GApplication *application)
{
  new_window (application, NULL);
}

static void
bloat_pad_open (GApplication  *application,
                GFile        **files,
                gint           n_files,
                const gchar   *hint)
{
  gint i;

  for (i = 0; i < n_files; i++)
    new_window (application, files[i]);
}

typedef GtkApplication BloatPad;
typedef GtkApplicationClass BloatPadClass;

G_DEFINE_TYPE (BloatPad, bloat_pad, GTK_TYPE_APPLICATION)

static void
bloat_pad_finalize (GObject *object)
{
  G_OBJECT_CLASS (bloat_pad_parent_class)->finalize (object);
}

static void
show_help (GSimpleAction *action,
           GVariant      *parameter,
           gpointer       user_data)
{
  g_print ("Want help, eh ?!\n");
}

static void
show_about (GSimpleAction *action,
            GVariant      *parameter,
            gpointer       user_data)
{
  GList *list;
  GtkWindow *win;

  list = gtk_application_get_windows (GTK_APPLICATION (g_application_get_default ()));
  win = list->data;

  gtk_show_about_dialog (win,
                         "program-name", "Bloatpad",
                         "title", "About Bloatpad",
                         "comments", "Not much to say, really.",
                         NULL);
}

static void
quit_app (GSimpleAction *action,
          GVariant      *parameter,
          gpointer       user_data)
{
  GList *list, *next;
  GtkWindow *win;

  g_print ("Going down...\n");

  list = gtk_application_get_windows (GTK_APPLICATION (g_application_get_default ()));
  while (list)
    {
      win = list->data;
      next = list->next;

      gtk_widget_destroy (GTK_WIDGET (win));

      list = next;
    }
}

static GSimpleActionGroup *actions = NULL;
static GMenu *menu = NULL;

static void
remove_action (GSimpleAction *action,
               GVariant      *parameter,
               gpointer       user_data)
{
  GAction *add;

  g_menu_remove (menu, g_menu_model_get_n_items (G_MENU_MODEL (menu)) - 1);
  g_simple_action_set_enabled (action, FALSE);
  add = g_simple_action_group_lookup (actions, "add");
  g_simple_action_set_enabled (G_SIMPLE_ACTION (add), TRUE);
}

static void
add_action (GSimpleAction *action,
            GVariant      *parameter,
            gpointer       user_data)
{
  GAction *remove;

  g_menu_append (menu, "Remove", "app.remove");
  g_simple_action_set_enabled (action, FALSE);
  remove = g_simple_action_group_lookup (actions, "remove");
  g_simple_action_set_enabled (G_SIMPLE_ACTION (remove), TRUE);
}

static GActionEntry entries[] = {
  { "help", show_help, NULL, NULL, NULL },
  { "about", show_about, NULL, NULL, NULL },
  { "quit", quit_app, NULL, NULL, NULL },
  { "add", add_action, NULL, NULL, NULL },
  { "remove", remove_action, NULL, NULL, NULL }
};

static GActionGroup *
get_actions (void)
{
  actions = g_simple_action_group_new ();
  g_simple_action_group_add_entries (actions,
                                     entries, G_N_ELEMENTS (entries),
                                     NULL);

  return G_ACTION_GROUP (actions);
}

static GMenuModel *
get_menu (void)
{
  menu = g_menu_new ();
  g_menu_append (menu, "Help", "app.help");
  g_menu_append (menu, "About Bloatpad", "app.about");
  g_menu_append (menu, "Quit", "app.quit");
  g_menu_append (menu, "Add", "app.add");

  return G_MENU_MODEL (menu);
}

static void
bloat_pad_init (BloatPad *app)
{
  g_application_set_action_group (G_APPLICATION (app), get_actions ());
  g_application_set_menu (G_APPLICATION (app), get_menu ());
}

static void
bloat_pad_class_init (BloatPadClass *class)
{
  G_OBJECT_CLASS (class)->finalize= bloat_pad_finalize;

  G_APPLICATION_CLASS (class)->activate = bloat_pad_activate;
  G_APPLICATION_CLASS (class)->open = bloat_pad_open;
}

BloatPad *
bloat_pad_new (void)
{
  g_type_init ();
{'fraction_non_alphanumeric': 0.11206429474444646, 'fraction_numerical': 0.002167238576846668, 'mean_word_length': 3.244921425833653, 'pattern_counts': {'":': 0, '<': 9, '<?xml version=': 0, '>': 21, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 4, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '1635127', 'n_tokens_mistral': 3998, 'n_tokens_neox': 3823, 'n_words': 859}