[comp.windows.x] Xwidgets and graphics

phani@aloha1.eng.hawaii.edu (Phanindra Vemuri) (06/01/89)

From uucp Wed May 31 17:21:53 1989
>From phani  Wed May 31 17:21:49 1989 remote from wiliki.eng.hawaii.edu
Received: by aloha1.eng.hawaii.edu (smail2.5)
	id AA00463; 31 May 89 17:21:49 HST (Wed)
Received: by wiliki.eng.hawaii.edu; Wed, 31 May 89 17:04:41 HST
Date: Wed, 31 May 89 17:04:41 HST
From: Phanindra Vemuri <wiliki.eng.hawaii.edu!phani@wiliki.eng.hawaii.edu>
To: phani@aloha1.eng.hawaii.edu


Hi,
   This is my first posting on comp.Windows.X.
   I plan to do some graphics on the X windows.However, I do not
   want to use the Xlib primitives for window management. My idea
   is to use the widgets already provided on X and draw the graphics
   in the windows associated with the widget.
   I started out with a trial code, in which I created a labelwidget and
   by using the display macros obtained the display pointer, the
   window I.D., and the screen number. Using these parameters I attempted 
   to draw a rectengle in this window. Everytime I try to run this program
   it gives a "BadDrawable, window or Pixmap" error. 
   I cannot understand why since I seem to have used the right macros.
   Could someone who has done stuff like this please help me out?
   I have appended below the source code of both the ways in which I tried
   to code it up... 


#include <X11/Xlib.h>
#include <X11/Xutil.h> 
#include <X11/X.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Label.h>
#include <X11/Xos.h>
#include <X11/Viewport.h>
#include <X11/Label.h>
#include <stdio.h>


Display *display;
    
Drawable  root;
XGCValues values;

main(argc, argv)
 int argc;
 char **argv;
 {
  Cardinal i;
  Arg arglist[10];
  int  screen;
  Window win;
  GC gc;
  XtAppContext context;
  char *display_name = NULL;
  int width,height,x = 0,y = 0,depth,border_width = 4,bd_wt =4,wid,ht;
  XtToolkitInitialize(); 
  i = 0;
  XtSetArg(arglist[i], XtNwidth, 100); i++;
  XtSetArg(arglist[i], XtNheight, 150); i++;

   context = XtCreateApplicationContext();
     printf("after context getting\n");
  if((display = XtOpenDisplay(context,display_name,NULL,"XGraph",NULL,NULL,&argc,argv)) == NULL)
    {
     printf("Could not get Display structure pointer \n");
     exit(0);
     }
     printf("After display opening\n");
 
  screen = DefaultScreen(display); 
  printf("screen is %d and win is %d\n",screen,win); 
  /* XDefaultGC(display,screen); */  
  values.foreground = BlackPixel(display,screen);
  values.background = WhitePixel(display,screen);
  gc = XCreateGC(display, RootWindow(display,screen), (GCForeground | GCBackground), &values);
  printf("After XcreateGc\n");
  XGetGeometry(display, RootWindow(display,screen), &root, &x, &y, &width, &height, &border_width, &depth); 
  wid = width/3;
  ht = height/3;
  x = 0;
  y = 0;
  bd_wt = 4;
  win = XCreateWindow(display, RootWindow(display,screen), x, y, wid,ht,bd_wt,BlackPixel(display,screen),WhitePixel(display,screen)); 
  /*
  width = DisplayWidth(display,screen);
  printf("after width\n");
  height = DisplayHeight(display,screen);
  */
  printf("width is %d and height is %d\n", width, height);
  /*
  XtRealizeWidget(toplevel); This causes X windows to be created for parent and all children 
   win = XtWindow(child);
   */ 
  /*win = XConnectionNumber(display);  */ 
  draw_graphics(win, gc, width, height); 
  XtMainLoop();
 }

draw_graphics(win,gc,window_width,window_height)
  Window  win;
  GC gc;
  int window_width,window_height;
  {
   int x,y;
   unsigned int width,height;
   /*
   height = window_height/2;
   width = 3 * window_width /4;
   x = window_width/2 - width/2;
   y = window_height/2 - height/2;
   */
   x = 0;
   y = 0;
   height = 50;
   width = 50;
   printf("x is %d, y is %d , width is %d, height is %d, \n", x,y,width,height);
   XDrawPoint(display, win, gc, x, y);  
   XDrawRectangle(display,win,gc,x,y,width,height); 
   printf("After drawing rectangle\n");
   }




#include <X11/Xlib.h>
#include <X11/Xutil.h> 
#include <X11/X.h>
#include <X11/Intrinsic.h>
#include <X11/StringDefs.h>
#include <X11/Label.h>
#include <X11/Xos.h>
#include <X11/Viewport.h>
#include <X11/Label.h>
#include <stdio.h>


Widget toplevel;
Widget child;
Display *display;
    
Drawable  root;
XGCValues values;

main(argc, argv)
 int argc;
 char **argv;
 {
  Cardinal i;
  Arg arglist[10];
  int  screen;
  Window win;
  XEvent report;
  GC gc;
  char *display_name = NULL;
  int width,height,x = 0,y = 0,depth,border_width = 4,bd_wt =4,wid,ht;
  toplevel = XtInitialize("main", "XGraph", NULL, NULL, &argc, argv);
  i = 0;
  XtSetArg(arglist[i], XtNwidth, 250); i++;
  XtSetArg(arglist[i], XtNheight,300); i++;

  printf("after Xtinitialize\n");
  
  if( (child = XtCreateManagedWidget(argv[0], labelWidgetClass, toplevel,arglist,i)) == NULL)
    {
     printf("Could not create widget \n");
     exit(0);
     }
  printf("after create\n");
  
  if( (display = XtDisplay(toplevel)) == 0)
    {
     printf("Could not get Display structure pointer \n");
     exit(0);
     }
  screen = DefaultScreen(display); 
  printf("screen is %d and win is %d\n",screen,win); 
  /* XDefaultGC(display,screen); */  
  values.foreground = BlackPixel(display,screen);
  values.background = WhitePixel(display,screen);
  gc = XCreateGC(display, RootWindow(display,screen), (GCForeground | GCBackground), &values);
  printf("After XcreateGc\n");
  XGetGeometry(display, RootWindow(display,screen), &root, &x, &y, &width, &height, &border_width, &depth); 
  bd_wt = 4;
  /*
  width = DisplayWidth(display,screen);
  printf("after width\n");
  height = DisplayHeight(display,screen);
  */
  printf("width is %d and height is %d\n", width, height);
  XtRealizeWidget(toplevel); /*This causes X windows to be created for parent and all children */
   win = XtWindow(child);  
/*  win = XConnectionNumber(display);  */ 
   draw_graphics(win, gc, width, height);  
  XtMainLoop();
 }

draw_graphics(win,gc,window_width,window_height)
  Window  win;
  GC gc;
  int window_width,window_height;
  {
   int x,y;
   unsigned int width,height;
   /*
   height = window_height/2;
   width = 3 * window_width /4;
   x = window_width/2 - width/2;
   y = window_height/2 - height/2;
   */
   x = 0;
   y = 0;
   height = 100;
   width = 100;
   printf("x is %d, y is %d , width is %d, height is %d, \n", x,y,width,height);
   XDrawPoint(display, win, gc, x, y);  
   XDrawRectangle(display,win,gc,x,y,width,height); 
   printf("After drawing rectangle\n");
   }

   My e-mail addresses are
   1. phani@wiliki.eng.hawaii.edu
   2. phani@aloha1.eng.hawaii.edu