1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
/* -*- mode: C; c-basic-offset: 2; indent-tabs-mode: nil; -*- */

#include <ctk/ctk.h>
#include <math.h>

#include "frame-stats.h"


/* Stub definition of MyTextView which is used in the
 * widget-factory.ui file. We just need this so the
 * test keeps working
 */
typedef struct
{
  CtkTextView tv;
} MyTextView;

typedef CtkTextViewClass MyTextViewClass;

G_DEFINE_TYPE (MyTextView, my_text_view, CTK_TYPE_TEXT_VIEW)<--- There is an unknown macro here somewhere. Configuration is required. If G_DEFINE_TYPE is a macro then please configure it.

static void
my_text_view_init (MyTextView *tv) {}

static void
my_text_view_class_init (MyTextViewClass *tv_class) {}



CtkWidget *
create_widget_factory_content (void)
{
  GError *error = NULL;
  CtkBuilder *builder;
  CtkWidget *result;

  g_type_ensure (my_text_view_get_type ());
  builder = ctk_builder_new ();
  ctk_builder_add_from_file (builder,
                             "../demos/widget-factory/widget-factory.ui",
                             &error);
  if (error != NULL)
    g_error ("Failed to create widgets: %s", error->message);

  result = CTK_WIDGET (ctk_builder_get_object (builder, "box1"));
  g_object_ref (result);
  ctk_container_remove (CTK_CONTAINER (ctk_widget_get_parent (result)),
                        result);
  g_object_unref (builder);

  return result;
}

static void
set_adjustment_to_fraction (CtkAdjustment *adjustment,
                            gdouble        fraction)
{
  gdouble upper = ctk_adjustment_get_upper (adjustment);
  gdouble lower = ctk_adjustment_get_lower (adjustment);
  gdouble page_size = ctk_adjustment_get_page_size (adjustment);

  ctk_adjustment_set_value (adjustment,
                            (1 - fraction) * lower +
                            fraction * (upper - page_size));
}

gboolean
scroll_viewport (CtkWidget     *viewport,
                 CdkFrameClock *frame_clock,
                 gpointer       user_data)
{
  static gint64 start_time;
  gint64 now = cdk_frame_clock_get_frame_time (frame_clock);
  gdouble elapsed;
  CtkAdjustment *hadjustment, *vadjustment;

  if (start_time == 0)
    start_time = now;

  elapsed = (now - start_time) / 1000000.;

  hadjustment = ctk_scrollable_get_hadjustment (CTK_SCROLLABLE (viewport));
  vadjustment = ctk_scrollable_get_vadjustment (CTK_SCROLLABLE (viewport));

  set_adjustment_to_fraction (hadjustment, 0.5 + 0.5 * sin (elapsed));
  set_adjustment_to_fraction (vadjustment, 0.5 + 0.5 * cos (elapsed));

  return TRUE;
}

static GOptionEntry options[] = {
  { NULL }
};

int
main (int argc, char **argv)
{
  CtkWidget *window;
  CtkWidget *scrolled_window;
  CtkWidget *viewport;
  CtkWidget *grid;
  GError *error = NULL;
  int i;

  GOptionContext *context = g_option_context_new (NULL);
  g_option_context_add_main_entries (context, options, NULL);
  frame_stats_add_options (g_option_context_get_main_group (context));
  g_option_context_add_group (context,
                              ctk_get_option_group (TRUE));

  if (!g_option_context_parse (context, &argc, &argv, &error))
    {
      g_printerr ("Option parsing failed: %s\n", error->message);
      return 1;
    }

  window = ctk_window_new (CTK_WINDOW_TOPLEVEL);
  frame_stats_ensure (CTK_WINDOW (window));
  ctk_window_set_default_size (CTK_WINDOW (window), 800, 600);

  scrolled_window = ctk_scrolled_window_new (NULL, NULL);
  ctk_container_add (CTK_CONTAINER (window), scrolled_window);

  viewport = ctk_viewport_new (NULL, NULL);
  ctk_container_add (CTK_CONTAINER (scrolled_window), viewport);

  grid = ctk_grid_new ();
  ctk_container_add (CTK_CONTAINER (viewport), grid);

  for (i = 0; i < 4; i++)
    {
      CtkWidget *content = create_widget_factory_content ();
      ctk_grid_attach (CTK_GRID (grid), content,
                       i % 2, i / 2, 1, 1);
      g_object_unref (content);
    }

  ctk_widget_add_tick_callback (viewport,
                                scroll_viewport,
                                NULL,
                                NULL);

  ctk_widget_show_all (window);
  g_signal_connect (window, "destroy",
                    G_CALLBACK (ctk_main_quit), NULL);
  ctk_main ();

  return 0;
}