[Libguestfs] [PATCH v3] p2v: Allow virt-p2v to be built with Gtk 2 or 3.

Richard W.M. Jones rjones at redhat.com
Mon May 30 21:34:24 UTC 2016


Currently virt-p2v requires Gtk 2.  This commit changes virt-p2v so it
can be built with either Gtk 2 or 3.

By careful use of macros, this code should compile on both recent
Gtk 2 and Gtk 3.

With no other options, ./configure will now prefer Gtk 3 if it finds
it, or fall back to Gtk 2.  But you can control this by setting
'./configure --with-gtk=2|3|check|no' where the options mean:

  * --with-gtk=2 - Only test for Gtk 2
  * --with-gtk=3 - Only test for Gtk 3
  * --with-gtk=check - Check for Gtk 3 then Gtk 2 (default)
  * --with-gtk=no - Don't build virt-p2v

In the ./configure output you will see something like this:

  checking for --with-gtk option... 2
  checking for GTK... yes
  checking if we can build virt-p2v... yes, with Gtk 2
---
 docs/guestfs-building.pod    |  10 +-
 m4/guestfs_misc_libraries.m4 |  43 +++++-
 p2v/Makefile.am              |   6 +-
 p2v/dependencies.m4          |   8 +-
 p2v/gui.c                    | 330 ++++++++++++++++++++++++++++---------------
 5 files changed, 268 insertions(+), 129 deletions(-)

diff --git a/docs/guestfs-building.pod b/docs/guestfs-building.pod
index f42d25f..faaa626 100644
--- a/docs/guestfs-building.pod
+++ b/docs/guestfs-building.pod
@@ -272,9 +272,15 @@ Optional.  Used by virt-builder for checking digital signatures.
 Optional.  If available, virt-builder will use this library
 for fast, parallel uncompression of templates.
 
-=item gtk2 E<ge> 2.24
+=item Gtk E<ge> 2.24, or 3
 
-Optional.  Used by the virt-p2v user interface.
+Optional.
+
+Used by the virt-p2v graphical user interface.
+
+Either Gtk 2 or Gtk 3 can be used.  If you want to select a specific
+version of Gtk, use S<C<./configure --with-gtk=2>> or
+S<C<./configure --with-gtk=3>>.
 
 =item zip
 
diff --git a/m4/guestfs_misc_libraries.m4 b/m4/guestfs_misc_libraries.m4
index 9b22670..4ae0576 100644
--- a/m4/guestfs_misc_libraries.m4
+++ b/m4/guestfs_misc_libraries.m4
@@ -74,12 +74,41 @@ PKG_CHECK_MODULES([LIBCONFIG], [libconfig],[
     [AC_MSG_WARN([libconfig not found, some features will be disabled])])
 AM_CONDITIONAL([HAVE_LIBCONFIG],[test "x$LIBCONFIG_LIBS" != "x"])
 
-dnl Check for gtk2 library, used by virt-p2v.
-PKG_CHECK_MODULES([GTK2], [gtk+-2.0], [
-    AC_SUBST([GTK2_CFLAGS])
-    AC_SUBST([GTK2_LIBS])
-],
-    [AC_MSG_WARN([gtk2 not found, virt-p2v will be disabled])])
+dnl Check for Gtk 2 or 3 library, used by virt-p2v.
+AC_MSG_CHECKING([for --with-gtk option])
+AC_ARG_WITH([gtk],
+    [AS_HELP_STRING([--with-gtk=2|3|check|no],
+        [prefer Gtk version 2 or 3. @<:@default=check@:>@])],
+    [with_gtk="$withval"
+     AC_MSG_RESULT([$withval])],
+    [with_gtk="check"
+     AC_MSG_RESULT([not set, will check for installed Gtk])]
+)
+
+if test "x$GTK_LIBS" = "x" && \
+        ( test "x$with_gtk" = "x3" || test "x$with_gtk" = "xcheck" ) ; then
+    PKG_CHECK_MODULES([GTK], [gtk+-3.0], [
+        AC_SUBST([GTK_CFLAGS])
+        AC_SUBST([GTK_LIBS])
+        GTK_VERSION=3
+        AC_SUBST([GTK_VERSION])
+    ], [])
+fi
+if test "x$GTK_LIBS" = "x" && \
+        ( test "x$with_gtk" = "x2" || test "x$with_gtk" = "xcheck" ) ; then
+    PKG_CHECK_MODULES([GTK], [gtk+-2.0], [
+        AC_SUBST([GTK_CFLAGS])
+        AC_SUBST([GTK_LIBS])
+        GTK_VERSION=2
+        AC_SUBST([GTK_VERSION])
+    ], [])
+fi
 
 dnl Can we build virt-p2v?
-AM_CONDITIONAL([HAVE_P2V], [test "x$GTK2_LIBS" != "x"])
+AC_MSG_CHECKING([if we can build virt-p2v])
+if test "x$GTK_LIBS" != "x"; then
+    AC_MSG_RESULT([yes, with Gtk $GTK_VERSION])
+else
+    AC_MSG_RESULT([no])
+fi
+AM_CONDITIONAL([HAVE_P2V], [test "x$GTK_LIBS" != "x"])
diff --git a/p2v/Makefile.am b/p2v/Makefile.am
index 3342563..53d7198 100644
--- a/p2v/Makefile.am
+++ b/p2v/Makefile.am
@@ -84,13 +84,13 @@ virt_p2v_CFLAGS = \
 	$(WARN_CFLAGS) $(WERROR_CFLAGS) \
 	$(PCRE_CFLAGS) \
 	$(LIBXML2_CFLAGS) \
-	$(GTK2_CFLAGS)
+	$(GTK_CFLAGS)
 
 virt_p2v_LDADD = \
 	$(top_builddir)/src/libutils.la \
 	$(PCRE_LIBS) \
 	$(LIBXML2_LIBS) \
-	$(GTK2_LIBS) \
+	$(GTK_LIBS) \
 	../gnulib/lib/libgnu.la
 
 # Scripts to build the disk image, USB key, or kickstart.
@@ -104,7 +104,7 @@ dependencies_files = \
 
 $(dependencies_files): dependencies.m4
 	define=`echo $@ | $(SED) 's/dependencies.//;y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'`; \
-	m4 -D$$define=1 $< > $@-t
+	m4 -D$$define=1 -DGTK_VERSION=$(GTK_VERSION) $< > $@-t
 	mv $@-t $@
 
 # Support files needed by the virt-p2v-make-* scripts.
diff --git a/p2v/dependencies.m4 b/p2v/dependencies.m4
index ab25a49..b5d4d6e 100644
--- a/p2v/dependencies.m4
+++ b/p2v/dependencies.m4
@@ -23,7 +23,7 @@ ifelse(REDHAT,1,
   dnl Used by the virt-p2v binary.
   pcre
   libxml2
-  gtk2
+  gtk`'GTK_VERSION
 
   dnl Run as external programs by the p2v binary.
   /usr/bin/ssh
@@ -55,7 +55,7 @@ ifelse(REDHAT,1,
 ifelse(DEBIAN,1,
   libpcre3
   libxml2
-  libgtk2.0-0
+  libgtk`'GTK_VERSION`'.0-0
   openssh-client
   qemu-utils
   curl
@@ -73,7 +73,7 @@ ifelse(DEBIAN,1,
 ifelse(ARCHLINUX,1,
   pcre
   libxml2
-  gtk2
+  gtk`'GTK_VERSION
   openssh
   qemu
   curl
@@ -92,7 +92,7 @@ ifelse(ARCHLINUX,1,
 ifelse(SUSE,1,
   pcre
   libxml2
-  gtk2
+  gtk`'GTK_VERSION
   /usr/bin/ssh
   /usr/bin/qemu-nbd
   curl
diff --git a/p2v/gui.c b/p2v/gui.c
index 633d3a3..f5e0175 100644
--- a/p2v/gui.c
+++ b/p2v/gui.c
@@ -80,6 +80,104 @@
 #define MAX_SUPPORTED_VCPUS 160
 #define MAX_SUPPORTED_MEMORY_MB (UINT64_C (4000 * 1024))
 
+/* Backwards compatibility for some deprecated functions in Gtk 3. */
+#if GTK_CHECK_VERSION(3,2,0)   /* gtk >= 3.2 */
+#define hbox_new(box, homogeneous, spacing)                    \
+  do {                                                         \
+    (box) = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, spacing); \
+    if (homogeneous)                                           \
+      gtk_box_set_homogeneous (GTK_BOX (box), TRUE);           \
+  } while (0)
+#define vbox_new(box, homogeneous, spacing)                    \
+  do {                                                         \
+    (box) = gtk_box_new (GTK_ORIENTATION_VERTICAL, spacing);   \
+    if (homogeneous)                                           \
+      gtk_box_set_homogeneous (GTK_BOX (box), TRUE);           \
+  } while (0)
+#else /* gtk < 3.2 */
+#define hbox_new(box, homogeneous, spacing)             \
+  (box) = gtk_hbox_new ((homogeneous), (spacing))
+#define vbox_new(box, homogeneous, spacing)             \
+  (box) = gtk_vbox_new ((homogeneous), (spacing))
+#endif
+
+#if GTK_CHECK_VERSION(3,4,0)   /* gtk >= 3.4 */
+/* GtkGrid is sufficiently similar to GtkTable that we can just
+ * redefine these functions.
+ */
+#define table_new(grid, rows, columns)          \
+  (grid) = gtk_grid_new ()
+#define table_attach(grid, child, left, right, top, bottom, xoptions, yoptions, xpadding, ypadding) \
+  do {                                                                  \
+    if ((xoptions) == GTK_FILL) {                                       \
+      gtk_widget_set_hexpand ((child), TRUE);                           \
+      gtk_widget_set_halign ((child), GTK_ALIGN_FILL);                  \
+    }                                                                   \
+    if ((yoptions) == GTK_FILL) {                                       \
+      gtk_widget_set_vexpand ((child), TRUE);                           \
+      gtk_widget_set_valign ((child), GTK_ALIGN_FILL);                  \
+    }                                                                   \
+    set_padding ((child), (xpadding), (ypadding));                      \
+    gtk_grid_attach (GTK_GRID (grid), (child),                          \
+                     (left), (top), (right)-(left), (bottom)-(top));    \
+  } while (0)
+#else
+#define table_new(table, rows, columns)                 \
+  (table) = gtk_table_new ((rows), (columns), FALSE)
+#define table_attach(table, child, left, right,top, bottom, xoptions, yoptions, xpadding, ypadding) \
+  gtk_table_attach (GTK_TABLE (table), (child),                         \
+                    (left), (right), (top), (bottom),                   \
+                    (xoptions), (yoptions), (xpadding), (ypadding))
+#endif
+
+#if GTK_CHECK_VERSION(3,8,0)   /* gtk >= 3.8 */
+#define scrolled_window_add_with_viewport(container, child)     \
+  gtk_container_add (GTK_CONTAINER (container), child)
+#else
+#define scrolled_window_add_with_viewport(container, child)             \
+  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (container), child)
+#endif
+
+#if GTK_CHECK_VERSION(3,10,0)   /* gtk >= 3.10 */
+#undef GTK_STOCK_DIALOG_WARNING
+#define GTK_STOCK_DIALOG_WARNING "dialog-warning"
+#define gtk_image_new_from_stock gtk_image_new_from_icon_name
+#endif
+
+#if GTK_CHECK_VERSION(3,14,0)   /* gtk >= 3.14 */
+#define set_padding(widget, xpad, ypad)                               \
+  do {                                                                \
+    if ((xpad) != 0) {                                                \
+      gtk_widget_set_margin_start ((widget), (xpad));                 \
+      gtk_widget_set_margin_end ((widget), (xpad));                   \
+    }                                                                 \
+    if ((ypad) != 0) {                                                \
+      gtk_widget_set_margin_top ((widget), (ypad));                   \
+      gtk_widget_set_margin_bottom ((widget), (ypad));                \
+    }                                                                 \
+  } while (0)
+#define set_alignment(widget, xalign, yalign)                   \
+  do {                                                          \
+    if ((xalign) == 0.)                                         \
+      gtk_widget_set_halign ((widget), GTK_ALIGN_START);        \
+    else if ((xalign) == 1.)                                    \
+      gtk_widget_set_halign ((widget), GTK_ALIGN_END);          \
+    else                                                        \
+      gtk_widget_set_halign ((widget), GTK_ALIGN_CENTER);       \
+    if ((yalign) == 0.)                                         \
+      gtk_widget_set_valign ((widget), GTK_ALIGN_START);        \
+    else if ((xalign) == 1.)                                    \
+      gtk_widget_set_valign ((widget), GTK_ALIGN_END);          \
+    else                                                        \
+      gtk_widget_set_valign ((widget), GTK_ALIGN_CENTER);       \
+  } while (0)
+#else  /* gtk < 3.14 */
+#define set_padding(widget, xpad, ypad)                 \
+  gtk_misc_set_padding(GTK_MISC(widget),(xpad),(ypad))
+#define set_alignment(widget, xalign, yalign)                   \
+  gtk_misc_set_alignment(GTK_MISC(widget),(xalign),(yalign))
+#endif
+
 static void create_connection_dialog (struct config *);
 static void create_conversion_dialog (struct config *);
 static void create_running_dialog (void);
@@ -171,46 +269,46 @@ create_connection_dialog (struct config *config)
   /* The main dialog area. */
   intro = gtk_label_new (_("Connect to a virt-v2v conversion server over SSH:"));
   gtk_label_set_line_wrap (GTK_LABEL (intro), TRUE);
-  gtk_misc_set_padding (GTK_MISC (intro), 10, 10);
+  set_padding (intro, 10, 10);
 
-  table = gtk_table_new (7, 2, FALSE);
+  table_new (table, 7, 2);
   server_label = gtk_label_new (_("Conversion server:"));
-  gtk_misc_set_alignment (GTK_MISC (server_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (table), server_label,
-                    0, 1, 0, 1, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, server_label,
+                0, 1, 0, 1, GTK_FILL, GTK_FILL, 4, 4);
+  set_alignment (server_label, 1., 0.5);
   server_entry = gtk_entry_new ();
   if (config->server != NULL)
     gtk_entry_set_text (GTK_ENTRY (server_entry), config->server);
-  gtk_table_attach (GTK_TABLE (table), server_entry,
-                    1, 2, 0, 1, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, server_entry,
+                1, 2, 0, 1, GTK_FILL, GTK_FILL, 4, 4);
 
   port_label = gtk_label_new (_("SSH port:"));
-  gtk_misc_set_alignment (GTK_MISC (port_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (table), port_label,
-                    0, 1, 1, 2, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, port_label,
+                0, 1, 1, 2, GTK_FILL, GTK_FILL, 4, 4);
+  set_alignment (port_label, 1., 0.5);
   port_entry = gtk_entry_new ();
   gtk_entry_set_width_chars (GTK_ENTRY (port_entry), 6);
   snprintf (port_str, sizeof port_str, "%d", config->port);
   gtk_entry_set_text (GTK_ENTRY (port_entry), port_str);
-  gtk_table_attach (GTK_TABLE (table), port_entry,
-                    1, 2, 1, 2, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, port_entry,
+                1, 2, 1, 2, GTK_FILL, GTK_FILL, 4, 4);
 
   username_label = gtk_label_new (_("User name:"));
-  gtk_misc_set_alignment (GTK_MISC (username_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (table), username_label,
-                    0, 1, 2, 3, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, username_label,
+                0, 1, 2, 3, GTK_FILL, GTK_FILL, 4, 4);
+  set_alignment (username_label, 1., 0.5);
   username_entry = gtk_entry_new ();
   if (config->username != NULL)
     gtk_entry_set_text (GTK_ENTRY (username_entry), config->username);
   else
     gtk_entry_set_text (GTK_ENTRY (username_entry), "root");
-  gtk_table_attach (GTK_TABLE (table), username_entry,
-                    1, 2, 2, 3, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, username_entry,
+                1, 2, 2, 3, GTK_FILL, GTK_FILL, 4, 4);
 
   password_label = gtk_label_new (_("Password:"));
-  gtk_misc_set_alignment (GTK_MISC (password_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (table), password_label,
-                    0, 1, 3, 4, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, password_label,
+                0, 1, 3, 4, GTK_FILL, GTK_FILL, 4, 4);
+  set_alignment (password_label, 1., 0.5);
   password_entry = gtk_entry_new ();
   gtk_entry_set_visibility (GTK_ENTRY (password_entry), FALSE);
 #ifdef GTK_INPUT_PURPOSE_PASSWORD
@@ -219,53 +317,57 @@ create_connection_dialog (struct config *config)
 #endif
   if (config->password != NULL)
     gtk_entry_set_text (GTK_ENTRY (password_entry), config->password);
-  gtk_table_attach (GTK_TABLE (table), password_entry,
-                    1, 2, 3, 4, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, password_entry,
+                1, 2, 3, 4, GTK_FILL, GTK_FILL, 4, 4);
 
   identity_label = gtk_label_new (_("SSH Identity URL:"));
-  gtk_misc_set_alignment (GTK_MISC (identity_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (table), identity_label,
-                    0, 1, 4, 5, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, identity_label,
+                0, 1, 4, 5, GTK_FILL, GTK_FILL, 4, 4);
+  set_alignment (identity_label, 1., 0.5);
   identity_entry = gtk_entry_new ();
   if (config->identity_url != NULL)
     gtk_entry_set_text (GTK_ENTRY (identity_entry), config->identity_url);
-  gtk_table_attach (GTK_TABLE (table), identity_entry,
-                    1, 2, 4, 5, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, identity_entry,
+                1, 2, 4, 5, GTK_FILL, GTK_FILL, 4, 4);
 
   identity_tip_label = gtk_label_new (NULL);
   gtk_label_set_markup (GTK_LABEL (identity_tip_label),
                         _("<i>If using password authentication, leave the SSH Identity URL blank</i>"));
   gtk_label_set_line_wrap (GTK_LABEL (identity_tip_label), TRUE);
-  gtk_table_attach (GTK_TABLE (table), identity_tip_label,
-                    1, 2, 5, 6, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, identity_tip_label,
+                1, 2, 5, 6, GTK_FILL, GTK_FILL, 4, 4);
 
   sudo_button =
     gtk_check_button_new_with_label (_("Use sudo when running virt-v2v"));
   gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON (sudo_button),
                                 config->sudo);
-  gtk_table_attach (GTK_TABLE (table), sudo_button,
-                    1, 2, 6, 7, GTK_FILL, GTK_FILL, 4, 4);
+  table_attach (table, sudo_button,
+                1, 2, 6, 7, GTK_FILL, GTK_FILL, 4, 4);
 
-  test_hbox = gtk_hbox_new (FALSE, 0);
+  hbox_new (test_hbox, FALSE, 0);
   test = gtk_button_new_with_label (_("Test connection"));
   gtk_box_pack_start (GTK_BOX (test_hbox), test, TRUE, FALSE, 0);
 
-  spinner_hbox = gtk_hbox_new (FALSE, 10);
+  hbox_new (spinner_hbox, FALSE, 10);
   spinner = gtk_spinner_new ();
   gtk_box_pack_start (GTK_BOX (spinner_hbox), spinner, FALSE, FALSE, 0);
   spinner_message = gtk_label_new (NULL);
   gtk_label_set_line_wrap (GTK_LABEL (spinner_message), TRUE);
-  gtk_misc_set_padding (GTK_MISC (spinner_message), 10, 10);
+  set_padding (spinner_message, 10, 10);
   gtk_box_pack_start (GTK_BOX (spinner_hbox), spinner_message, TRUE, TRUE, 0);
 
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (conn_dlg)->vbox),
-                      intro, TRUE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (conn_dlg)->vbox),
-                      table, TRUE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (conn_dlg)->vbox),
-                      test_hbox, FALSE, FALSE, 0);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (conn_dlg)->vbox),
-                      spinner_hbox, TRUE, TRUE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
+     intro, TRUE, TRUE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
+     table, TRUE, TRUE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
+     test_hbox, FALSE, FALSE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conn_dlg))),
+     spinner_hbox, TRUE, TRUE, 0);
 
   /* Buttons. */
   gtk_dialog_add_buttons (GTK_DIALOG (conn_dlg),
@@ -306,7 +408,7 @@ show_connection_dialog (void)
 
   /* Show everything except the spinner. */
   gtk_widget_show_all (conn_dlg);
-  gtk_widget_hide_all (spinner_hbox);
+  gtk_widget_hide (spinner_hbox);
 }
 
 /**
@@ -592,55 +694,55 @@ create_conversion_dialog (struct config *config)
   gtk_widget_set_size_request (conv_dlg, 900, 560);
 
   /* The main dialog area. */
-  hbox = gtk_hbox_new (TRUE, 1);
-  left_vbox = gtk_vbox_new (FALSE, 1);
-  right_vbox = gtk_vbox_new (TRUE, 1);
+  hbox_new (hbox, TRUE, 1);
+  vbox_new (left_vbox, FALSE, 1);
+  vbox_new (right_vbox, TRUE, 1);
 
   /* The left column: target properties and output options. */
   target_frame = gtk_frame_new (_("Target properties"));
   gtk_container_set_border_width (GTK_CONTAINER (target_frame), 4);
 
-  target_vbox = gtk_vbox_new (FALSE, 1);
+  vbox_new (target_vbox, FALSE, 1);
 
-  target_tbl = gtk_table_new (3, 3, FALSE);
+  table_new (target_tbl, 3, 3);
   guestname_label = gtk_label_new (_("Name:"));
-  gtk_misc_set_alignment (GTK_MISC (guestname_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (target_tbl), guestname_label,
-                    0, 1, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (target_tbl, guestname_label,
+                0, 1, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (guestname_label, 1., 0.5);
   guestname_entry = gtk_entry_new ();
   if (config->guestname != NULL)
     gtk_entry_set_text (GTK_ENTRY (guestname_entry), config->guestname);
-  gtk_table_attach (GTK_TABLE (target_tbl), guestname_entry,
-                    1, 2, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (target_tbl, guestname_entry,
+                1, 2, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
 
   vcpus_label = gtk_label_new (_("# vCPUs:"));
-  gtk_misc_set_alignment (GTK_MISC (vcpus_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (target_tbl), vcpus_label,
-                    0, 1, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (target_tbl, vcpus_label,
+                0, 1, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (vcpus_label, 1., 0.5);
   vcpus_entry = gtk_entry_new ();
   snprintf (vcpus_str, sizeof vcpus_str, "%d", config->vcpus);
   gtk_entry_set_text (GTK_ENTRY (vcpus_entry), vcpus_str);
-  gtk_table_attach (GTK_TABLE (target_tbl), vcpus_entry,
-                    1, 2, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (target_tbl, vcpus_entry,
+                1, 2, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
   vcpus_warning = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
                                             GTK_ICON_SIZE_BUTTON);
-  gtk_table_attach (GTK_TABLE (target_tbl), vcpus_warning,
-                    2, 3, 1, 2, 0, 0, 1, 1);
+  table_attach (target_tbl, vcpus_warning,
+                2, 3, 1, 2, 0, 0, 1, 1);
 
   memory_label = gtk_label_new (_("Memory (MB):"));
-  gtk_misc_set_alignment (GTK_MISC (memory_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (target_tbl), memory_label,
-                    0, 1, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (target_tbl, memory_label,
+                0, 1, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (memory_label, 1., 0.5);
   memory_entry = gtk_entry_new ();
   snprintf (memory_str, sizeof memory_str, "%" PRIu64,
             config->memory / 1024 / 1024);
   gtk_entry_set_text (GTK_ENTRY (memory_entry), memory_str);
-  gtk_table_attach (GTK_TABLE (target_tbl), memory_entry,
-                    1, 2, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (target_tbl, memory_entry,
+                1, 2, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
   memory_warning = gtk_image_new_from_stock (GTK_STOCK_DIALOG_WARNING,
                                              GTK_ICON_SIZE_BUTTON);
-  gtk_table_attach (GTK_TABLE (target_tbl), memory_warning,
-                    2, 3, 2, 3, 0, 0, 1, 1);
+  table_attach (target_tbl, memory_warning,
+                2, 3, 2, 3, 0, 0, 1, 1);
 
   gtk_box_pack_start (GTK_BOX (target_vbox), target_tbl, TRUE, TRUE, 0);
 
@@ -656,56 +758,56 @@ create_conversion_dialog (struct config *config)
   output_frame = gtk_frame_new (_("Virt-v2v output options"));
   gtk_container_set_border_width (GTK_CONTAINER (output_frame), 4);
 
-  output_vbox = gtk_vbox_new (FALSE, 1);
+  vbox_new (output_vbox, FALSE, 1);
 
-  output_tbl = gtk_table_new (5, 2, FALSE);
+  table_new (output_tbl, 5, 2);
   o_label = gtk_label_new (_("Output to (-o):"));
-  gtk_misc_set_alignment (GTK_MISC (o_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (output_tbl), o_label,
-                    0, 1, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, o_label,
+                0, 1, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (o_label, 1., 0.5);
   o_combo = gtk_combo_box_text_new ();
   gtk_widget_set_tooltip_markup (o_combo, _("<b>libvirt</b> means send the converted guest to libvirt-managed KVM on the conversion server.  <b>local</b> means put it in a directory on the conversion server.  <b>rhev</b> means write it to RHEV-M/oVirt.  <b>glance</b> means write it to OpenStack Glance.  See the virt-v2v(1) manual page for more information about output options."));
   repopulate_output_combo (config);
-  gtk_table_attach (GTK_TABLE (output_tbl), o_combo,
-                    1, 2, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, o_combo,
+                1, 2, 0, 1, GTK_FILL, GTK_FILL, 1, 1);
 
   oc_label = gtk_label_new (_("Output conn. (-oc):"));
-  gtk_misc_set_alignment (GTK_MISC (oc_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (output_tbl), oc_label,
-                    0, 1, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, oc_label,
+                0, 1, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (oc_label, 1., 0.5);
   oc_entry = gtk_entry_new ();
   gtk_widget_set_tooltip_markup (oc_entry, _("For <b>libvirt</b> only, the libvirt connection URI, or leave blank to add the guest to the default libvirt instance on the conversion server.  For others, leave this field blank."));
   if (config->output_connection != NULL)
     gtk_entry_set_text (GTK_ENTRY (oc_entry), config->output_connection);
-  gtk_table_attach (GTK_TABLE (output_tbl), oc_entry,
-                    1, 2, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, oc_entry,
+                1, 2, 1, 2, GTK_FILL, GTK_FILL, 1, 1);
 
   os_label = gtk_label_new (_("Output storage (-os):"));
-  gtk_misc_set_alignment (GTK_MISC (os_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (output_tbl), os_label,
-                    0, 1, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, os_label,
+                0, 1, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (os_label, 1., 0.5);
   os_entry = gtk_entry_new ();
   gtk_widget_set_tooltip_markup (os_entry, _("For <b>local</b>, put the directory name on the conversion server.  For <b>rhev</b>, put the Export Storage Domain (server:/mountpoint).  For others, leave this field blank."));
   if (config->output_storage != NULL)
     gtk_entry_set_text (GTK_ENTRY (os_entry), config->output_storage);
-  gtk_table_attach (GTK_TABLE (output_tbl), os_entry,
-                    1, 2, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, os_entry,
+                1, 2, 2, 3, GTK_FILL, GTK_FILL, 1, 1);
 
   of_label = gtk_label_new (_("Output format (-of):"));
-  gtk_misc_set_alignment (GTK_MISC (of_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (output_tbl), of_label,
-                    0, 1, 3, 4, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, of_label,
+                0, 1, 3, 4, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (of_label, 1., 0.5);
   of_entry = gtk_entry_new ();
   gtk_widget_set_tooltip_markup (of_entry, _("The output disk format, typically <b>raw</b> or <b>qcow2</b>.  If blank, defaults to <b>raw</b>."));
   if (config->output_format != NULL)
     gtk_entry_set_text (GTK_ENTRY (of_entry), config->output_format);
-  gtk_table_attach (GTK_TABLE (output_tbl), of_entry,
-                    1, 2, 3, 4, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, of_entry,
+                1, 2, 3, 4, GTK_FILL, GTK_FILL, 1, 1);
 
   oa_label = gtk_label_new (_("Output allocation (-oa):"));
-  gtk_misc_set_alignment (GTK_MISC (oa_label), 1., 0.5);
-  gtk_table_attach (GTK_TABLE (output_tbl), oa_label,
-                    0, 1, 4, 5, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, oa_label,
+                0, 1, 4, 5, GTK_FILL, GTK_FILL, 1, 1);
+  set_alignment (oa_label, 1., 0.5);
   oa_combo = gtk_combo_box_text_new ();
   gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT (oa_combo),
                                   "sparse");
@@ -719,8 +821,8 @@ create_conversion_dialog (struct config *config)
     gtk_combo_box_set_active (GTK_COMBO_BOX (oa_combo), 0);
     break;
   }
-  gtk_table_attach (GTK_TABLE (output_tbl), oa_combo,
-                    1, 2, 4, 5, GTK_FILL, GTK_FILL, 1, 1);
+  table_attach (output_tbl, oa_combo,
+                1, 2, 4, 5, GTK_FILL, GTK_FILL, 1, 1);
 
   debug_button =
     gtk_check_button_new_with_label (_("Enable server-side debugging\n"
@@ -735,7 +837,7 @@ create_conversion_dialog (struct config *config)
   info_frame = gtk_frame_new (_("Information"));
   gtk_container_set_border_width (GTK_CONTAINER (info_frame), 4);
   info_label = gtk_label_new (NULL);
-  gtk_misc_set_alignment (GTK_MISC (info_label), 0.1, 0.5);
+  set_alignment (info_label, 0.1, 0.5);
   set_info_label ();
   gtk_container_add (GTK_CONTAINER (info_frame), info_label);
 
@@ -748,8 +850,7 @@ create_conversion_dialog (struct config *config)
                                   GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
   disks_list = gtk_tree_view_new ();
   populate_disks (GTK_TREE_VIEW (disks_list));
-  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (disks_sw),
-                                         disks_list);
+  scrolled_window_add_with_viewport (disks_sw, disks_list);
   gtk_container_add (GTK_CONTAINER (disks_frame), disks_sw);
 
   removable_frame = gtk_frame_new (_("Removable media"));
@@ -760,8 +861,7 @@ create_conversion_dialog (struct config *config)
                                   GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC);
   removable_list = gtk_tree_view_new ();
   populate_removable (GTK_TREE_VIEW (removable_list));
-  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (removable_sw),
-                                         removable_list);
+  scrolled_window_add_with_viewport (removable_sw,  removable_list);
   gtk_container_add (GTK_CONTAINER (removable_frame), removable_sw);
 
   interfaces_frame = gtk_frame_new (_("Network interfaces"));
@@ -776,8 +876,7 @@ create_conversion_dialog (struct config *config)
                     G_CALLBACK (maybe_identify_click), NULL);
   gtk_widget_set_tooltip_markup (interfaces_list, _("Left click on an interface name to flash the light on the physical interface."));
   populate_interfaces (GTK_TREE_VIEW (interfaces_list));
-  gtk_scrolled_window_add_with_viewport (GTK_SCROLLED_WINDOW (interfaces_sw),
-                                         interfaces_list);
+  scrolled_window_add_with_viewport (interfaces_sw, interfaces_list);
   gtk_container_add (GTK_CONTAINER (interfaces_frame), interfaces_sw);
 
   /* Pack the top level dialog. */
@@ -791,8 +890,9 @@ create_conversion_dialog (struct config *config)
 
   gtk_box_pack_start (GTK_BOX (hbox), left_vbox, TRUE, TRUE, 0);
   gtk_box_pack_start (GTK_BOX (hbox), right_vbox, TRUE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (conv_dlg)->vbox),
-                      hbox, TRUE, TRUE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (conv_dlg))),
+     hbox, TRUE, TRUE, 0);
 
   /* Buttons. */
   gtk_dialog_add_buttons (GTK_DIALOG (conv_dlg),
@@ -1489,23 +1589,27 @@ create_running_dialog (void)
   v2v_output = gtk_text_view_new ();
   gtk_text_view_set_editable (GTK_TEXT_VIEW (v2v_output), FALSE);
   gtk_text_view_set_wrap_mode (GTK_TEXT_VIEW (v2v_output), GTK_WRAP_CHAR);
+  /* XXX Gtk3 ignores this, why? */
   gtk_widget_set_size_request (v2v_output, 700, 400);
   log_label = gtk_label_new (NULL);
-  gtk_misc_set_alignment (GTK_MISC (log_label), 0., 0.5);
-  gtk_misc_set_padding (GTK_MISC (log_label), 10, 10);
+  set_alignment (log_label, 0., 0.5);
+  set_padding (log_label, 10, 10);
   set_log_dir (NULL);
   status_label = gtk_label_new (NULL);
-  gtk_misc_set_alignment (GTK_MISC (status_label), 0., 0.5);
-  gtk_misc_set_padding (GTK_MISC (status_label), 10, 10);
+  set_alignment (status_label, 0., 0.5);
+  set_padding (status_label, 10, 10);
 
   gtk_container_add (GTK_CONTAINER (v2v_output_sw), v2v_output);
 
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (run_dlg)->vbox),
-                      v2v_output_sw, TRUE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (run_dlg)->vbox),
-                      log_label, TRUE, TRUE, 0);
-  gtk_box_pack_start (GTK_BOX (GTK_DIALOG (run_dlg)->vbox),
-                      status_label, TRUE, TRUE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (run_dlg))),
+     v2v_output_sw, TRUE, TRUE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (run_dlg))),
+     log_label, TRUE, TRUE, 0);
+  gtk_box_pack_start
+    (GTK_BOX (gtk_dialog_get_content_area (GTK_DIALOG (run_dlg))),
+     status_label, TRUE, TRUE, 0);
 
   /* Buttons. */
   gtk_dialog_add_buttons (GTK_DIALOG (run_dlg),
-- 
2.7.4




More information about the Libguestfs mailing list