<?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="menubar.c" xml:lang="el">
  <info>
    <title type="text">Γραμμή μενού (C)</title>
    <link type="guide" xref="beginner.c#menu-combo-toolbar"/>
    <link type="seealso" xref="aboutdialog.c"/>
    <link type="seealso" xref="gmenu.c"/>
    <revision version="0.2" date="2012-08-19" status="draft"/>

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

    <desc>Ένα γραφικό συστατικό που κρατά γραφικά συστατικά GtkMenuItem</desc>
  
    <mal:credit xmlns:mal="http://projectmallard.org/1.0/" type="translator copyright">
      <mal:name>Δημήτρης Σπίγγος</mal:name>
      <mal:email>dmtrs32@gmail.com</mal:email>
      <mal:years>2012, 2013</mal:years>
    </mal:credit>
  </info>

  <title>MenuBar</title>

  <media type="image" mime="image/png" src="media/menubar.png"/>
  <p>Μια γραμμή εργαλείων δημιουργήθηκε χρησιμοποιώντας XML και GtkBuilder.</p>
<note><p>Για μια πιο βαθιά ματιά σε αυτό το δείγμα, παρακαλώ μην διστάσετε να κοιτάξετε το <link xref="menubar.vala">γραμμή μενού Vala</link> και/ή τα μαθήματα <link xref="menubar.py">γραμμή μενού Python</link>.</p></note>
      <code mime="text/x-csrc" style="numbered">
#include &lt;gtk/gtk.h&gt;



/* Η συνάρτηση επανάκλησης για την ενέργεια "copy" */
static void
copy_callback (GSimpleAction *simple,
            GVariant      *parameter,
            gpointer       user_data)
{
   g_print ("\"Copy\" activated\n")·
}



/* Η συνάρτηση επανάκλησης για την ενέργεια "paste" */
static void
paste_callback (GSimpleAction *simple,
            GVariant      *parameter,
            gpointer       user_data)
{
   g_print ("\"Paste\" activated\n")·
}



/* Η συνάρτηση επανάκλησης για την ενέργεια "shape" */
static void
shape_callback (GSimpleAction *simple,
            GVariant      *parameter,
            gpointer       user_data)
{
   /* Συλλέγουμε πρώτα την τιμή του στιγμιότυπου GVariant με έναν τύπο συμβολοσειράς..
    * Ο συνολικός σκοπός εδώ είναι να δει αν το σχήμα ορίζεται σε γραμμή, τρίγωνο, κλπ,
    * και να βάλει αυτήν την τιμή μέσα στην μεταβλητή "answer".
    */
   const gchar *answer = g_variant_get_string (parameter, NULL)·
   g_printf ("Shape is set to %s.\n", answer)·
   /* Σημειώστε ότι ορίζουμε την κατάσταση της ενέργειας */
   g_simple_action_set_state (simple, parameter)·
}



/* Η συνάρτηση επανάκλησης στην οποία κλείνει ο  about_dialog που δημιουργήθηκε παρακάτω */
static void
on_close (GtkDialog *dialog,
          gint       response_id,
          gpointer   user_data)
{
  gtk_widget_destroy (GTK_WIDGET (dialog))·
}



/* Η συνάρτηση επανάκλησης για την ενέργεια about  (δείτε το aboutdialog.c example) */
static void
about_callback (GSimpleAction *simple,
            GVariant      *parameter,
            gpointer       user_data)
{
   GtkWidget *about_dialog·

   about_dialog = gtk_about_dialog_new ()·

   const gchar *authors[] = {"GNOME Documentation Team", NULL}·
   const gchar *documenters[] = {"GNOME Documentation Team", NULL}·

   /* Συμπληρώστε τον about_dialog με την επιθυμητή πληροφορία */
   gtk_about_dialog_set_program_name (GTK_ABOUT_DIALOG (about_dialog), "AboutDialog Example")·
   gtk_about_dialog_set_copyright (GTK_ABOUT_DIALOG (about_dialog), "Copyright \xc2\xa9 2012 GNOME Documentation Team")·
   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 Developer Website")·
   gtk_about_dialog_set_website (GTK_ABOUT_DIALOG (about_dialog), "http://developer.gnome.org")·

   /* Το σήμα "response" εκπέμπεται όταν ο διάλογος δέχεται ένα συμβάν διαγραφής,
    * συνεπώς συνδέουμε αυτό το σήμα με την συνάρτηση επανάκλησης on_close 
    * που δημιουργήθηκε παραπάνω.
    */
   g_signal_connect (GTK_DIALOG (about_dialog), "response",
                    G_CALLBACK (on_close), NULL)·

   /* Εμφάνιση του διαλόγου περί */
   gtk_widget_show (about_dialog)·
}



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

  GSimpleAction *copy_action·
  GSimpleAction *paste_action·
  GSimpleAction *shape_action·
  GSimpleAction *about_action·

  /* Δημιουργία παραθύρου με τίτλο και προεπιλεγμένο μέγεθος */
  window = gtk_application_window_new (app)·
  gtk_window_set_title (GTK_WINDOW (window), "MenuBar Example")·
  gtk_window_set_default_size (GTK_WINDOW (window), 200, 200)·

  /* Έναρξη δημιουργίας της ενέργειας "copy".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   */
  copy_action = g_simple_action_new ("copy", NULL)·
  /* Συνδέθηκε με μια συνάρτηση επανάκλησης */
  g_signal_connect (copy_action, "activate", G_CALLBACK (copy_callback),
                    GTK_WINDOW (window))·
  /* Προστέθηκε στο παράθυρο */
  g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (copy_action))·

  /* Έναρξη δημιουργίας της κατάστασης "paste".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   */
  paste_action = g_simple_action_new ("paste", NULL)·
  /* Σύνδεση της ενέργειας με μια συνάρτηση επανάκλησης */
  g_signal_connect (paste_action, "activate", G_CALLBACK (paste_callback),
                    GTK_WINDOW (window))·
  /* Προσθήκη της στο παράθυρο */
  g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (paste_action))·

  /* Έναρξη δημιουργίας της ενέργειας "shape".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   * Πρώτα δηλώνουμε ότι ο τύπος της παραμέτρου της απλής ενέργειας είναι μια συμβολοσειρά.
   * Όταν χρησιμοποιούμε g_variant_type_new, είναι κατάλληλη η απελευθέρωση της μνήμης επιστροφής
   * μόλις έχετε τελειώσει μαζί της.
   */
  GVariantType *type_string = g_variant_type_new ("s")·
  /* παράμετροι για το g_simple_action_new_stateful είναι: (όνομα, τύπος παραμέτρου,
   * αρχική κατάσταση).
   */
  shape_action = g_simple_action_new_stateful ("shape", type_string,
                                               g_variant_new_string ("line"))·
  /* Σύνδεση της ενέργειας με μια συνάρτηση επανάκλησης */
  g_signal_connect (shape_action, "activate", G_CALLBACK (shape_callback),
                    GTK_WINDOW (window))·
  /* Προσθήκη της στο παράθυρο */
  g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (shape_action))·
  g_variant_type_free (type_string)·

  /* Έναρξη δημιουργίας της ενέργειας "about".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   */
  about_action = g_simple_action_new ("about", NULL)·
  /* Σύνδεση της ενέργειας με τη συνάρτηση επανάκλησης */
  g_signal_connect (about_action, "activate", G_CALLBACK (about_callback),
                    GTK_WINDOW (window))·
  /* Προσθήκη της στο παράθυρο */
  g_action_map_add_action (G_ACTION_MAP (window), G_ACTION (about_action))·

  gtk_widget_show_all (window)·
}



/* Συνάρτηση επανάκλησης για την ενέργεια "new" */
static void
new_callback (GSimpleAction *simple,
         GVariant      *parameter,
         gpointer       user_data)
{
  g_print ("You clicked \"New\"\n")·
}



/* Συνάρτηση επανάκλησης για την ενέργεια "quit" */
static void
quit_callback (GSimpleAction *simple,
         GVariant      *parameter,
         gpointer       user_data)
{
  GApplication *application = user_data·

  g_print ("You clicked \"Quit\"\n")·
  g_application_quit (application)·
}



/* Συνάρτηση επανάκλησης για την ενέργεια "state" */
static void
state_callback (GSimpleAction *simple,
         GVariant      *parameter,
         gpointer       user_data)
{
   /* Οι δύο πιθανότητες σε αυτήν την περίπτωση για την μεταβλητή "answer" είναι είτε
    * "on" είτε "off".
    */
   const gchar *answer = g_variant_get_string (parameter, NULL)·
   /* Εμφανίζουμε την πληροφορία στον χρήστη */
   g_printf ("State is set to %s.\n", answer)·
   /* Σημειώστε ότι ορίζουμε την κατάσταση της ενέργειας */
   g_simple_action_set_state (simple, parameter)·
}



/* Συνάρτηση επανάκλησης για την ενέργεια "awesome" */
static void
awesome_callback (GSimpleAction *simple,
         GVariant      *parameter,
         gpointer       user_data)
{
  GVariant *action_state = g_action_get_state (G_ACTION (simple))·
  gboolean active = g_variant_get_boolean (action_state)·
  GVariant *new_state = g_variant_new_boolean (!active)·
  /* Ορισμός της νέας κατάστασης για την ενέργεια.
   * (Παρακολούθηση αν ήταν τελευταία σημειωμένη ή όχι).
   */
  g_simple_action_set_state (simple, new_state)·

  if (active)
     g_print ("You unchecked \"Awesome\"\n")·
  else
     g_print ("You checked \"Awesome\"\n")·
}



/* Έναρξη συνάρτησης για το μενού που δημιουργούμε σε αυτό το δείγμα */
static void
startup (GApplication *app,
         gpointer      user_data)
{
  /* Initialize variables */
  GSimpleAction *new_action·
  GSimpleAction *quit_action·
  GSimpleAction *state_action·
  GSimpleAction *awesome_action·

  GtkBuilder *builder·

  GError **error·

  /* Έναρξη δημιουργίας της ενέργειας "new".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   */
  new_action = g_simple_action_new ("new", NULL)·
  g_signal_connect (new_action, "activate", G_CALLBACK (new_callback), app)·
  /* Προστίθεται στην συνολική εφαρμογή */
  g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (new_action))·

  /* Έναρξη δημιουργίας της ενέργειας "quit".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   */
  quit_action = g_simple_action_new ("quit", NULL)·
  g_signal_connect (quit_action, "activate", G_CALLBACK (quit_callback), app)·
  /* Προστίθεται στην συνολική εφαρμογή */
  g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (quit_action))·

  /*Έναρξη δημιουργίας της ενέργειας "state".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   */
  GVariantType *type_string2 = g_variant_type_new ("s")·
  state_action = g_simple_action_new_stateful ("state", type_string2,
                                               g_variant_new_string ("off"))·
  g_signal_connect (state_action, "activate", G_CALLBACK (state_callback), app)·
  /* Προστίθεται στην συνολική εφαρμογή */
  g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (state_action))·
  g_variant_type_free (type_string2)·

  /* Έναρξη δημιουργίας της ενέργειας "awesome".
   * Σημειώστε ότι είναι μια ενέργεια χωρίς κατάσταση.
   */
  awesome_action = g_simple_action_new_stateful ("awesome", NULL, g_variant_new_boolean (FALSE))·
  g_signal_connect (awesome_action, "activate", G_CALLBACK (awesome_callback), app)·
  /* Προστίθεται στην συνολική εφαρμογή */
  g_action_map_add_action (G_ACTION_MAP (app), G_ACTION (awesome_action))·

  /* Ένας δομητής για να προσθέσει τη διεπαφή χρήστη που σχεδιάστηκε με GLADE στο πλέγμα: */
  builder = gtk_builder_new ()·
  /* Λήψη του αρχείου (αν είναι εκεί):
   * Σημείωση: πρέπει να βεβαιωθείτε ότι το αρχείο είναι στον τρέχοντα κατάλογο για
   * αυτήν την εργασία. Η χρησιμοποιούμενη συνάρτηση εδώ επιστρέφει μια τιμή μέσα στη μεταβλητή μας
   * "error" και είναι ίση με μηδέν αν βρεθεί όντως ένα σφάλμα.
   */
  gtk_builder_add_from_file (builder, "menubar.ui", error)·
  if (error == 0) {
     g_print ("File not found.\n")·
  }

  /* Εξαγωγή της γραμμής μενού */
  GObject *menubar = gtk_builder_get_object (builder, "menubar")·
  gtk_application_set_menubar (GTK_APPLICATION (app), G_MENU_MODEL (menubar))·

  /* Εξαγωγή του μενού εφαρμογών */
  GObject *appmenu = gtk_builder_get_object (builder, "appmenu")·
  gtk_application_set_app_menu (GTK_APPLICATION (app), G_MENU_MODEL (appmenu))·
}



/* Έναρξη συνάρτησης για την εφαρμογή */
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>Σε αυτό το παράδειγμα χρησιμοποιήσαμε τα παρακάτω:</p>
<list>
  <item><p><link href="http://developer.gnome.org/gtk3/stable/GtkApplication.html">GtkApplication</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk3/stable/GtkWindow.html">GtkWindow</link></p></item>
  <item><p><link href="http://developer.gnome.org/gio/stable/GSimpleAction.html">GSimpleAction</link></p></item>
  <item><p><link href="http://developer.gnome.org/gtk/stable/GtkAboutDialog.html">GtkAboutDialog</link></p></item>
  <item><p><link href="http://developer.gnome.org/glib/stable/glib-GVariantType.html">GVariantType</link></p></item>
</list>
</page>
