summaryrefslogtreecommitdiff
path: root/tests/testpopup.c
blob: 085d08ca2faa1126ffa3e8b073ecaa35711b736a (plain)
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
#include <gtk/gtk.h>

static void
draw_popup (GtkDrawingArea  *da,
            cairo_t         *cr,
            int              width,
            int              height,
            gpointer         data)
{
  cairo_set_source_rgb (cr, 1, 0, 0);
  cairo_paint (cr);
}

static gboolean
place_popup (GtkEventControllerMotion *motion,
             gdouble                   x,
             gdouble                   y,
             GtkWidget                *popup)
{
  gint width, height, win_x, win_y;
  GtkWidget *widget;

  widget = gtk_event_controller_get_widget (GTK_EVENT_CONTROLLER (motion));

  gtk_window_get_size (GTK_WINDOW (popup), &width, &height);
  gtk_window_get_position (GTK_WINDOW (widget), &win_x, &win_y);
  gtk_window_move (GTK_WINDOW (popup),
                   (int) win_x + x - width / 2,
                   (int) win_y + y - height / 2);
}

static gboolean
on_map (GtkWidget *parent)
{
  GtkWidget *popup, *da;
  GtkEventController *motion;

  popup = gtk_window_new (GTK_WINDOW_POPUP);
  da = gtk_drawing_area_new ();
  gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), draw_popup, NULL, NULL);
  gtk_container_add (GTK_CONTAINER (popup), da);

  gtk_widget_set_size_request (GTK_WIDGET (popup), 20, 20);
  gtk_window_set_transient_for (GTK_WINDOW (popup), GTK_WINDOW (parent));

  motion = gtk_event_controller_motion_new ();
  gtk_widget_add_controller (parent, motion);
  g_signal_connect (motion, "motion", G_CALLBACK (place_popup), popup);

  gtk_widget_show (popup);

  return FALSE;
}

int
main (int argc, char *argv[])
{
  GtkWidget *window;

  gtk_init ();

  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);

  g_signal_connect (window, "destroy", gtk_main_quit, NULL);
  g_signal_connect (window, "map", G_CALLBACK (on_map), NULL);

  gtk_widget_show (window);

  gtk_main ();

  return 0;
}