Logo Search packages:      
Sourcecode: libjsw version File versions

statusbar.c

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

#include <gtk/gtk.h>

#include "jc.h"

#include "images/js_con0.xpm"
#include "images/js_con1.xpm"


void StatusBarSetJSIcon(
      status_bar_struct *sb, u_int8_t **icon_data
);

void StatusBarSetJSState(status_bar_struct *sb, gint state);

void StatusBarSetMesg(status_bar_struct *sb, const gchar *mesg);
gint StatusBarInit(status_bar_struct *sb, GtkWidget *parent);
void StatusBarDestroy(status_bar_struct *sb);


/* Height of status bar in pixels. */
#define SB_DEF_HEIGHT         26

/* Size of status bar's joystick state icon in pixels. */
#define SB_JS_ICON_WIDTH      16
#define SB_JS_ICON_HEIGHT     16


/*
 *    Changes the icon displayed on the status bar with
 *    the given xpm data.
 */
void StatusBarSetJSIcon(
      status_bar_struct *sb, u_int8_t **icon_data
)
{
        GdkGC *gc;
      GdkWindow *window;
      GdkPixmap *gdk_pixmap;
      GdkBitmap *mask;
        GtkWidget *w, *pixmap;
        GtkStyle *style;
        gint x, y, width, height, width2, height2;
      jc_struct *jc = jc_core;


        if((jc == NULL) || (sb == NULL) || (icon_data == NULL))
            return;

      /* Get toplevel's GdkWindow. */
      w = jc->toplevel;
      if((w != NULL) ? GTK_WIDGET_NO_WINDOW(w) : 1)
          return;
      else
          window = w->window;
      if(window == NULL)
          return;

      /* Get toplevel's style. */
      style = gtk_widget_get_style(w);
      if(style == NULL)
          style = gtk_widget_get_default_style();
      if(style == NULL)
          return;

      /* Get background GC from style. */
      gc = style->black_gc;


      /* Get GtkFixed as the parent for the icon. */
      w = sb->js_icon_fixed;
        if(w == NULL)
            return;


      /* Begin creating new icon. */

        /* Create GdkPixmap and GdkBitmap pair. */
        gdk_pixmap = gdk_pixmap_create_from_xpm_d(
            window, &mask,
            &style->bg[GTK_STATE_NORMAL],
            (gchar **)icon_data
        );
      if(gdk_pixmap == NULL)
          return;

      /* Create GtkPixmap from the GdkPixmap and GdkBitmap pair. */
        pixmap = gtk_pixmap_new(gdk_pixmap, mask);
      if(pixmap == NULL)
      {
          gdk_pixmap_unref(gdk_pixmap);
          if(mask != NULL)
            gdk_bitmap_unref(mask);
          return;
      }

      /* Get size of the pixmap. */
        gdk_window_get_size((GdkWindow *)gdk_pixmap, &width, &height);
        width2 = w->allocation.width;
      height2 = w->allocation.height;
        x = (width2 / 2) - (width / 2);
        y = (height2 / 2) - (height / 2);

        /* Adjust size of the GtkFixed widget to fit for the pixmap. */
/*    gtk_widget_set_usize(w, width2, height2); */

        /* Put pixmap into fixed widget. */
        gtk_fixed_put(GTK_FIXED(w), pixmap, x, y);
        gtk_widget_shape_combine_mask(w, mask, x, y);
      gtk_widget_show(pixmap);

      /* Unref the GdkPixmap and GdkBitmap. */
      gdk_pixmap_unref(gdk_pixmap);
      gdk_pixmap = NULL;
      if(mask != NULL)
      {
          gdk_bitmap_unref(mask);
          mask = NULL;
      }

      /* Destroy the old GtkPixmap. */
      if(sb->js_icon_pixmap != NULL)
          gtk_widget_destroy(sb->js_icon_pixmap);
      /* Record new GtkPixmap. */
      sb->js_icon_pixmap = pixmap;
}

/*
 *    Sets the joystick `initialized' state.
 */
void StatusBarSetJSState(status_bar_struct *sb, gint state)
{
      if(sb == NULL)
          return;

      switch(state)
      {
          case 1:
            StatusBarSetJSIcon(sb, (u_int8_t **)js_con1_xpm);
            break;

        default:
          StatusBarSetJSIcon(sb, (u_int8_t **)js_con0_xpm);
          break;
      }
}

/*
 *    Sets a new message on the given status bar.
 *    If mesg is null, the message is then cleared.
 */
void StatusBarSetMesg(status_bar_struct *sb, const gchar *mesg)
{
      GtkWidget *w;


      if(sb == NULL)
          return;

      w = sb->mesg_label;
      if(w == NULL)
          return;

      gtk_label_set_text(
          GTK_LABEL(w),
          ((mesg == NULL) ? "" : mesg)
      );
}

/*
 *    Creates widgest for the given status bar and parent
 *    it to the specified parent assumed to be a vbox.
 */
gint StatusBarInit(status_bar_struct *sb, GtkWidget *parent)
{
      gint border_minor = 2;
      GtkWidget *w, *parent2, *parent3;


      if((sb == NULL) || (parent == NULL))
          return(-1);

      /* Record parent as the status bar's toplevel widget. */
      sb->toplevel = parent;

      /* Main table. */
        w = gtk_table_new(1, 2, FALSE);
      gtk_box_pack_start(GTK_BOX(parent), w, FALSE, FALSE, 0);
        gtk_widget_show(w);
      parent2 = w;

      /* Outer frame goes in main table. */
      w = gtk_frame_new(NULL);
      gtk_frame_set_shadow_type(GTK_FRAME(w), GTK_SHADOW_OUT);
      gtk_widget_set_usize(w, -1, SB_DEF_HEIGHT);
        gtk_table_attach(
          GTK_TABLE(parent2), w,
            0, 2,
            0, 1,
            GTK_FILL | GTK_SHRINK | GTK_EXPAND,
            GTK_FILL | GTK_SHRINK | GTK_EXPAND,
            0, 0
        );
      gtk_widget_show(w);


      /* Joystick icon fixed widget. */
        w = gtk_frame_new(NULL);
        gtk_frame_set_shadow_type(GTK_FRAME(w), GTK_SHADOW_IN);
        gtk_table_attach(
          GTK_TABLE(parent2), w,
            0, 1,
            0, 1,
            GTK_SHRINK | GTK_FILL,
            GTK_SHRINK | GTK_FILL,
            border_minor, border_minor
        );
        gtk_widget_show(w);
      parent3 = w;

        /* Put a hbox inside frame. */
/*
        w = gtk_hbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(parent3), w);
        gtk_widget_show(w);   
        parent3 = w;
 */
      sb->js_icon_fixed = w = gtk_fixed_new();
      sb->js_icon_pixmap = NULL;
        gtk_widget_set_usize(w, SB_JS_ICON_WIDTH, SB_JS_ICON_HEIGHT);
/*    gtk_box_pack_start(GTK_BOX(parent3), w, FALSE, FALSE, 0); */
      gtk_container_add(GTK_CONTAINER(parent3), w);
        gtk_widget_show(w);


      /* Label and its frame. */
        w = gtk_frame_new(NULL);
        gtk_frame_set_shadow_type(GTK_FRAME(w), GTK_SHADOW_IN);
        gtk_table_attach(
          GTK_TABLE(parent2), w,
            1, 2,
            0, 1,
            GTK_FILL | GTK_SHRINK | GTK_EXPAND,
            GTK_FILL | GTK_SHRINK | GTK_EXPAND,
            border_minor, border_minor
        );
        gtk_widget_show(w);

      parent3 = w;

      /* Put a hbox inside frame. */
        w = gtk_hbox_new(FALSE, 0);
        gtk_container_add(GTK_CONTAINER(parent3), w);
        gtk_widget_show(w);
      parent3 = w;

      sb->mesg_label = w = gtk_label_new("Ready");
        gtk_box_pack_start(GTK_BOX(parent3), w, FALSE, FALSE, border_minor);
        gtk_label_set_justify(GTK_LABEL(w), GTK_JUSTIFY_LEFT);
      gtk_widget_show(w);


      return(0);
}

/*
 *    Destroys all resources on the status bar.
 */
void StatusBarDestroy(status_bar_struct *sb)
{
        if(sb == NULL)
            return;

      /* Begin destroying widgets. */

      /* Icon pixmap. */
      if(sb->js_icon_pixmap != NULL)
      {
            gtk_widget_destroy(sb->js_icon_pixmap);
          sb->js_icon_pixmap = NULL;
      }

      /* Do not destroy the toplevel widget, it belongs to the calling
       * function.
       */
        sb->toplevel = NULL;
}


Generated by  Doxygen 1.6.0   Back to index