<?xml version="1.0" encoding="utf-8"?>
<page xmlns="http://projectmallard.org/1.0/" xmlns:its="http://www.w3.org/2005/11/its" xmlns:xi="http://www.w3.org/2001/XInclude" type="guide" style="task" id="aboutdialog.c" xml:lang="sv">
  <info>
    <title type="text">AboutDialog (C)</title>
    <link type="guide" xref="c#windows"/>
    <link type="seealso" xref="dialog.c"/>
    <link type="seealso" xref="messagedialog.c"/>
    <revision version="0.2" date="2012-08-07" status="draft"/>

    <credit type="author copyright">
      <name>Monica Kochofar</name>
      <email its:translate="no">monicakochofar@gmail.com</email>
      <years>2012</years>
    </credit>

    <desc>Visa information om ett program</desc>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Sebastian Rasmussen</mal:name>
      <mal:email>sebras@gmail.com</mal:email>
      <mal:years>2019</mal:years>
    </mal:credit>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Anders Jonsson</mal:name>
      <mal:email>anders.jonsson@norsjovallen.se</mal:email>
      <mal:years>2021</mal:years>
    </mal:credit>
  </info>

  <title>AboutDialog</title>

  <media type="image" mime="image/png" src="media/aboutdialog_GMenu.png"/>
  <p>Ett AboutDialog-exempel som använder Gtk.ApplicationWindow och Menu</p>
  <note><p><em style="bold">Du måste köra Gtk3.4 eller senare för att detta ska fungera</em></p></note>

      <code mime="text/x-csrc" style="numbered">
#include &lt;gtk/gtk.h&gt;

/* Återanropsfunktion vilken reagerar på ”response”-signalen från användaren i
 * meddelandedialogfönstret.
 * Denna funktion används för att förstöra dialogfönstret.
 */
static void
on_close (GtkDialog *dialog,
          gint       response_id,
          gpointer   user_data)
{
  /* Detta kommer att förorsaka att dialogen förstörs */
  gtk_widget_destroy (GTK_WIDGET (dialog));
}

/* Återanropsfunktion för svarssignalen ”activate” relaterad till SimpleAction
 * "about_action".
 * Denna funktion används för att se till att dialogfönstret visas.
 */
static void
about_cb (GSimpleAction *simple,
          GVariant      *parameter,
          gpointer       user_data)
{
  GtkWidget *about_dialog;

  about_dialog = gtk_about_dialog_new ();

  /* Listor med upphovsmän/dokumentatörer som används senare, måste
   * initieras som en null-terminerad vektor av strängar.
   */
  const gchar *authors[] = {"GNOME:s dokumentationsgrupp", NULL};
  const gchar *documenters[] = {"GNOME:s dokumentationsgrupp", NULL};

  /* Vi fyller i informationen för om-dialogen */
  gtk_about_dialog_set_program_name (GTK_ABOUT_DIALOG (about_dialog), "AboutDialog-exempel");
  gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about_dialog), "Copyright \xc2\xa9 2012 GNOME:s dokumentationsgrupp");
  gtk_about_dialog_set_authors (GTK_ABOUT_DIALOG (about_dialog), authors);
  gtk_about_dialog_set_documenters (GTK_ABOUT_DIALOG (about_dialog), documenters);
  gtk_about_dialog_set_website_label (GTK_ABOUT_DIALOG (about_dialog), "GNOME:s utvecklarwebbplats");
  gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (about_dialog), "http://developer.gnome.org");

  /* Vi vill inte visa titeln, vilken i detta fall skulle varit ”AboutDialog-exempel”.
   * Vi måste återställa titeln för meddelandedialogfönstret efter att ha satt
   * programnamnet.
   */
  gtk_window_set_title (GTK_WINDOW (about_dialog), "");

  /* För att stänga om-dialogen när ”close” klickas på ansluter vi svarssignalen
   * till on_close
   */
  g_signal_connect (GTK_DIALOG (about_dialog), "response",
                    G_CALLBACK (on_close), NULL);

  /* Visa om-dialogen */
  gtk_widget_show (about_dialog);
}

static void
activate (GtkApplication *app,
          gpointer        user_data)
{
  GtkWidget *window;

  GSimpleAction *about_action;

  /* Skapa ett fönster med en titel och en standardstorlek */
  window = gtk_application_window_new (app);
  gtk_window_set_title (GTK_WINDOW (window), "AboutDialog-exempel");
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200);

  /* Skapa en ny åtgärd, ge den parametertypen NULL. Den kommer
   * alltid att vara NULL för åtgärder som anropas från en meny. (t.ex. genom att klicka på
   * knapparna ”ok” eller ”avbryt”)
   */
  about_action = g_simple_action_new ("about", NULL);

  /* Anslut ”activate”-signalen till en lämplig återanropsfunktion.
   * Den kommer att indikera att åtgärden nyss aktiverats.
   */
  g_signal_connect (about_action, "activate", G_CALLBACK (about_cb),
                    GTK_WINDOW (window));

  /* Lägger till about_action till den övergripande åtgärdsmappningen. En åtgärdsmappning
   * är ett gränssnitt som innehåller ett antal namngivna GAction-instanser
   * (så som about_action)
   */
  g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (about_action));

  gtk_widget_show_all (window);
}

/* Återanropsfunktion för svarssignalen ”activate” från ”quit”-åtgärden
 * hittad i funktionen strax nedanför.
 */
static void
quit_cb (GSimpleAction *simple,
         GVariant      *parameter,
         gpointer       user_data)
{
  GApplication *application = user_data;

  g_application_quit (application);
}

/* Uppstartsfunktion för menyn vi skapar i detta exempel */
static void
startup (GApplication *app,
         gpointer      user_data)
{
  GMenu *menu;
  GSimpleAction *quit_action;

  /* Initiera GMenu, och lägg till ett menyobjekt med etiketten ”Om” och åtgärden
   * ”win.about”. Lägg också till ett annat menyobjekt med etiketten ”Avsluta” och åtgärden
   * ”app.quit”
   */
  menu = g_menu_new ();
  g_menu_append (menu, "Om", "win.about");
  g_menu_append (menu, "Avsluta", "app.quit");

  /* Skapa en ny enkel åtgärd för programmet. (I detta fall är det
   * åtgärden ”quit”.
   */
  quit_action = g_simple_action_new ("quit", NULL);

  /* Säkerställ att menyn vi nyss skapat är inställd för det övergripande programmet */
  gtk_application_set_app_menu (GTK_APPLICATION (app), G_MENU_MODEL (menu));

  g_signal_connect (quit_action,
                    "activate",
                    G_CALLBACK (quit_cb),
                    app);

  g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (quit_action));
}

/* Uppstartsfunktion för programmet */
int
main (int argc, char **argv)
{
  GtkApplication *app;
  int status;

  app = gtk_application_new ("org.gtk.example", G_APPLICATION_FLAGS_NONE);
  g_signal_connect (app, "activate", G_CALLBACK (activate), NULL);
  g_signal_connect (app, "startup", G_CALLBACK (startup), NULL);
  status = g_application_run (G_APPLICATION (app), argc, argv);
  g_object_unref (app);

  return status;
}
</code>
<p>I detta exempel använde vi följande:</p>
<list>
  <item><p><link href="http://developer.gnome.org/gtk3/3.4/GtkApplication.html">GtkApplication</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk3/3.4/GtkWindow.html">GtkWindow</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk3/stable/GtkAboutDialog.html">GtkAboutDialog</link></p></item>
  <item><p><link href="http://developer.gnome.org/gio/stable/GMenu.html">GMenu</link></p></item>
  <item><p><link href="http://developer.gnome.org/gio/stable/GActionMap.html">GActionMap</link></p></item>
</list>
</page>
