Codebase list dillo / debian/0.8.6-3 src / gtk_menu_title.c
debian/0.8.6-3

Tree @debian/0.8.6-3 (Download .tar.gz)

gtk_menu_title.c @debian/0.8.6-3raw · history · blame

/*
 * File: selection.c
 *
 * Copyright 2004 Sebastian Geerken <s.geerken@ping.de>
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; either version 2 of the License, or
 * (at your option) any later version.
 */

/*
 * This is a widget with a very special purpose, for displaying titles within
 * menues. It is set to inactive (so it cannot be focussed), and the text is
 * centered horizontally.
 *
 * BTW, it is simple to change the look of menu titles, by putting the
 * following into your ~/.gtkrc file:
 *
 *    style "menu-title" = "default" {
 *      font = "-*-helvetica-medium-o-*-*-10-*-*-*-*-*-*-*"
 *    }
 *
 *    widget "*GtkMenuTitle" style "menu-title"
 */
#include "gtk_menu_title.h"

#define BORDER_SPACING  3

static void Gtk_menu_title_class_init   (GtkMenuTitleClass *klass);
static void Gtk_menu_title_init         (GtkMenuTitle *menu_title);

static void Gtk_menu_title_destroy      (GtkObject *object);
static void Gtk_menu_title_size_request (GtkWidget *widget,
                                         GtkRequisition *requisition);
static void Gtk_menu_title_draw         (GtkWidget *widget,
                                         GdkRectangle *area);
static gint Gtk_menu_title_expose_event (GtkWidget *widget,
                                         GdkEventExpose *event);

static GtkMenuItemClass *parent_class = NULL;


/*
 * Standard Gtk+ function.
 */
GtkType a_Gtk_menu_title_get_type (void)
{
  static GtkType type = 0;

  if (!type) {
    GtkTypeInfo info = {
      "GtkMenuTitle",
      sizeof (GtkMenuTitle),
      sizeof (GtkMenuTitleClass),
      (GtkClassInitFunc) Gtk_menu_title_class_init,
      (GtkObjectInitFunc) Gtk_menu_title_init,
      (GtkArgSetFunc) NULL,
      (GtkArgGetFunc) NULL,
      (GtkClassInitFunc)NULL
    };

    type = gtk_type_unique (gtk_menu_item_get_type (), &info);
  }

  return type;
}


/*
 * Standard Gtk+ function.
 */
static void Gtk_menu_title_class_init (GtkMenuTitleClass *klass)
{
   GtkWidgetClass *widget_class;
   GtkObjectClass *object_class;

   parent_class = (GtkMenuItemClass*) klass;

   object_class = (GtkObjectClass*) klass;
   object_class->destroy = Gtk_menu_title_destroy;

   widget_class = (GtkWidgetClass*) klass;
   widget_class->size_request = Gtk_menu_title_size_request;
   widget_class->draw = Gtk_menu_title_draw;
   widget_class->expose_event = Gtk_menu_title_expose_event;
}


/*
 * Standard Gtk+ function.
 */
static void Gtk_menu_title_init (GtkMenuTitle *menu_title)
{
   menu_title->label = NULL;
}


/*
 * Return a new GtkMenuTitle.
 */
GtkWidget* a_Gtk_menu_title_new (const char *label)
{
   GtkWidget *widget;

   widget = gtk_type_new (a_Gtk_menu_title_get_type ());
   GTK_MENU_TITLE(widget)->label = label ? g_strdup (label) : NULL;
   gtk_widget_set_sensitive (widget, FALSE);
   return widget;
}


/*
 * Standard Gtk+ function.
 */
static void Gtk_menu_title_destroy (GtkObject *object)
{
   GtkMenuTitle *menu_title;

   menu_title = GTK_MENU_TITLE (object);
   if (menu_title->label)
      g_free (menu_title->label);
}


/*
 * Standard Gtk+ function.
 */
static void Gtk_menu_title_size_request (GtkWidget *widget,
                                         GtkRequisition *requisition)
{
   GtkMenuTitle *menu_title;

   menu_title = GTK_MENU_TITLE (widget);
   requisition->width = 2 * (GTK_CONTAINER (widget)->border_width +
                             widget->style->klass->xthickness +
                             BORDER_SPACING);
   requisition->height = 2 * (GTK_CONTAINER (widget)->border_width +
                              widget->style->klass->ythickness);

   if (menu_title->label) {
      requisition->width +=
         gdk_string_width (widget->style->font, GTK_MENU_TITLE(widget)->label);
      requisition->height +=
         widget->style->font->ascent + widget->style->font->descent;
   }
}

/*
 * Standard Gtk+ function.
 */
static void Gtk_menu_title_paint (GtkWidget *widget,
                                  GdkRectangle *area)
{
   GtkMenuTitle *menu_title;
   gint x, y;

   menu_title = GTK_MENU_TITLE (widget);
   if (menu_title->label) {
      x =
         (widget->allocation.width - gdk_string_width (widget->style->font,
                                                       menu_title->label)) / 2;
      y =
         GTK_CONTAINER (widget)->border_width +
         widget->style->klass->ythickness
         + widget->style->font->ascent;

      /* We do not use widget->state, but instead GTK_STATE_NORMAL, since
       * otherwise, the text would be rendered gray. */
      gdk_draw_string (widget->window, widget->style->font,
                       widget->style->fg_gc[GTK_STATE_NORMAL], x, y,
                       menu_title->label);
   }
}

/*
 * Standard Gtk+ function.
 */
static void Gtk_menu_title_draw (GtkWidget *widget,
                                 GdkRectangle *area)
{
   if (GTK_WIDGET_DRAWABLE (widget))
      Gtk_menu_title_paint (widget, area);
}


/*
 * Standard Gtk+ function.
 */
static gint Gtk_menu_title_expose_event (GtkWidget *widget,
                                         GdkEventExpose *event)
{
   if (GTK_WIDGET_DRAWABLE (widget))
      Gtk_menu_title_paint (widget, &event->area);
   return TRUE;
}