/* measure-tool 1.0, by Chris Lord <chris@o-hand.com>, GPLv2
 * =========================================================
 * gcc -o measure-tool measure-tool.c `pkg-config --cflags --libs gtk+-2.0` -Wall -g
 */

#include <gtk/gtk.h>

static void
size_allocate_cb (GtkWidget     *widget,
                  GtkAllocation *allocation,
                  GtkWidget     *ebox)
{
  gtk_widget_queue_draw (ebox);
}

static gboolean
expose_event_cb (GtkWidget      *widget,
                 GdkEventExpose *event)
{
  PangoRectangle rect;
  PangoLayout *layout;
  gint width, height;
  gchar *string;
  
  gdk_window_clear (widget->window);
  
  gdk_drawable_get_size (widget->window, &width, &height);
  string = g_strdup_printf ("%d x %d", width, height);
  
  gdk_draw_rectangle (widget->window, widget->style->text_gc[GTK_STATE_NORMAL],
                      FALSE, 0, 0, width - 1, height - 1);
  
  gtk_paint_resize_grip (widget->style, widget->window,
                         GTK_STATE_NORMAL, NULL, widget, NULL,
                         GDK_WINDOW_EDGE_SOUTH_EAST,
                         width - 12, height - 12, 12, 12);

  layout = gtk_widget_create_pango_layout (widget, string);
  g_free (string);
  
  pango_layout_get_pixel_extents (layout, &rect, NULL);
  gdk_draw_layout (widget->window, widget->style->text_gc[GTK_STATE_NORMAL],
                   (width - rect.width)/2,
                   (height - rect.height)/2,
                   layout);
  g_object_unref (layout);
  
  return TRUE;
}

static gdouble x, y;
static gint orig_width, orig_height;

static gboolean
move_motion_notify_event_cb (GtkWidget      *widget,
                             GdkEventMotion *event,
                             GtkWidget      *window)
{
  gtk_window_move (GTK_WINDOW (window), event->x_root - x, event->y_root - y);
  return TRUE;
}

static gboolean
size_motion_notify_event_cb (GtkWidget      *widget,
                             GdkEventMotion *event,
                             GtkWidget      *window)
{
  gtk_window_resize (GTK_WINDOW (window), orig_width + (event->x - x),
                     orig_height + (event->y - y));
  return TRUE;
}

static gboolean
button_press_event_cb (GtkWidget      *widget,
                       GdkEventButton *event,
                       GtkWidget      *window)
{
  if (event->button == 3)
    gtk_main_quit ();
  else
    {
      gint width, height;
      
      x = event->x;
      y = event->y;

      gdk_drawable_get_size (widget->window, &width, &height);
      
      if ((x < width - 12) || (y < height - 12))
        g_signal_connect (widget, "motion-notify-event",
                          G_CALLBACK (move_motion_notify_event_cb), window);
      else
        {
          orig_width = width;
          orig_height = height;
          g_signal_connect (widget, "motion-notify-event",
                            G_CALLBACK (size_motion_notify_event_cb), window);
        }
    }
  
  return TRUE;
}

static gboolean
button_release_event_cb (GtkWidget      *widget,
                         GdkEventButton *event,
                         GtkWidget      *window)
{
  g_signal_handlers_disconnect_by_func (widget, move_motion_notify_event_cb,
                                        window);
  g_signal_handlers_disconnect_by_func (widget, size_motion_notify_event_cb,
                                        window);
  
  return TRUE;
}

int
main (int argc, char **argv)
{
  GtkWidget *window, *ebox;
  
  gtk_init (&argc, &argv);
  
  window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  gtk_window_set_decorated (GTK_WINDOW (window), FALSE);
  gtk_window_set_keep_above (GTK_WINDOW (window), TRUE);
  gtk_window_set_opacity (GTK_WINDOW (window), 0.8);
  
  ebox = gtk_event_box_new ();
  gtk_widget_set_app_paintable (ebox, TRUE);
  
  g_signal_connect (window, "size-allocate",
                    G_CALLBACK (size_allocate_cb), ebox);
  g_signal_connect (window, "delete-event",
                    G_CALLBACK (gtk_main_quit), NULL);
  g_signal_connect (ebox, "expose-event",
                    G_CALLBACK (expose_event_cb), NULL);
  g_signal_connect (ebox, "button-press-event",
                    G_CALLBACK (button_press_event_cb), window);
  g_signal_connect (ebox, "button-release-event",
                    G_CALLBACK (button_release_event_cb), window);
  
  gtk_container_add (GTK_CONTAINER (window), ebox);
  
  gtk_widget_show_all (window);
  
  gtk_main ();
  
  return 0;
}


