Why does this behave the way it does?



I have been struggling to understand how tables work, and have created a
simple program whose behaviour demonatrates my mystification.

The program in its entirety, is below.

There is one part of the program that may be compiled or left uncompiled
depending on whether one writes
  #if 0
or
  #if 1
Call the first of these "variant 1" and the second "variant 2".

My understanding of what this is supposed to do is as follows:

1. Create a non-resizable window that is 640x400 pixels in size
2. Create a table with 80 columns and 25 rows
3. Put the table into the window
4. Create and populate a couple of textviews with some short text.

Variant 1 of the program displays one of the textviews.
Variant 2 displays both textviews.

What I don't understand:
  There is one textview that appears in both variants. Why does its width
change in the two versions ... the width of the "1234*" textview is larger
in variant 2 than in variant 1. Why?

Similarly, the enclosing window is wider in variant 2 than in variant 1. Why?

In both cases, the increase in width is not desired (nor expected --
obviously there's some part of the documentation that I've missed or
misinterpreted); how do I stop it from occurring?

Here is the program:

----

/*
 * gtk-test-1.cpp
 *
 */

#include <gtkmm.h>

using namespace std;
using namespace Gdk;
using namespace Gtk;

int main(int argc, char *argv[])
{ const int N_ROWS = 25;
  const int N_COLS = 80;
  const int SCREEN_WIDTH = 640;
  const int SCREEN_HEIGHT = 400;

  Gtk::Main INIT(argc, argv);                    // needed to init gtkmm
  Gtk::Window window;                            // the initial window

// the table into which we will place textviews
  Gtk::Table  table(N_ROWS, N_COLS, true);

// set the main window to the desired size and make it non-resizable
  window.set_size_request(SCREEN_WIDTH, SCREEN_HEIGHT);
  window.set_resizable(false);

// we want no space in the table
  table.set_row_spacings(0);
  table.set_col_spacings(0);

// add the table to the window
  window.add(table);

  window.show_all_children();

// create and populate two textviews
  Gtk::TextView * textview_p1 = new Gtk::TextView;
  Gtk::TextView * textview_p2 = new Gtk::TextView;

  Gtk::TextView& textview1 = *textview_p1;
  Gtk::TextView& textview2 = *textview_p2;

  Pango::FontDescription fdesc("Courier New, medium, 12");

  textview1.override_font(fdesc);
  textview2.override_font(fdesc);

// first textview -- width depends on whether second textview is present
  textview1.override_color(RGBA("White"));
  textview1.override_background_color(RGBA("Black"));
  textview1.set_editable(false);
  textview1.set_cursor_visible(false);

  textview1.get_buffer()->set_text("1234*");

  table.show();

  table.attach(textview1, 30, 35, 3, 4);  // left, right+1, top, bottom+1

  table.show_all_children();

// second textview
// variant 1 does not compile the following code; variant 2 does compile it
// the size of the window that contains the text "1234*"  varies depending
// on which variant we execute
#if 0
  textview2.override_color(RGBA("White"));
  textview2.override_background_color(RGBA("Black"));
  textview2.set_editable(false);
  textview2.set_cursor_visible(false);

  textview2.get_buffer()->set_text("5678*");

  table.attach(textview2, 20, 32, 2, 3);  // left, right+1, top, bottom+1

  table.show();
  table.show_all_children();
#endif    // 0

  INIT.run(window);    // draw the window and its contents

  return EXIT_SUCCESS;
}

----

  Doc

-- 
Web:  http://www.sff.net/people/N7DR

Attachment: signature.asc
Description: OpenPGP digital signature



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]