Problem using XLookupString

I am having trouble with the following function, giving the error

xbuplot.c: In function �void xbuevent_(float*, float*, int*, char*)':
xbuplot.c:694:65: error: cannot convert �XEvent* {aka _XEvent*}' to �XKeyEvent*' for argument �1' to �int XLookupString(XKeyEvent*, char*, int, KeySym*, XComposeStatus*)'
make: *** [../pltlib/xbuplot.o] Error 1

void xbuevent_ (
  float* x_mm,
  float* y_mm,  /*  position of cursor in mm  */
  int* button,  /*  button that was pressed  */
  char* key  /*  key that was pressed  */
) {

  XEvent event;
  
  // CHRISD:
  //XEvent *event;
  //XKeyEvent *keyevent;
  
  KeySym keysym;
  XComposeStatus compose;
  char buffer = 0;
  int buflen = 1;
  int got_event = 0;

  *button = *key = 0;    /* initialize button and key to zero */

  /* loop until we get a key or button press that we want */
  while (!got_event)
  {
    /* get next button or key press event */
    XMaskEvent (display, ButtonPressMask | KeyPressMask, &event);
    switch (event.type)
    {
      case ButtonPress:
        *button = event.xbutton.button;
        *x_mm = (double) event.xbutton.x / (double) win_width * win_width_mm;
        *y_mm = (double) (win_height - event.xbutton.y) / (double) win_height 
        * win_height_mm;
        got_event++;
        break;
      case KeyPress:
        //XLookupString (&event, &buffer, buflen, &keysym, &compose);
        XLookupString (&event, buffer, buflen, &keysym, &compose);
        switch (keysym)
        {
          case XK_Shift_L:    /* ignore a key press from a key modifier */
          case XK_Shift_R:
          case XK_Control_L:
          case XK_Control_R:
          case XK_Caps_Lock:
          case XK_Shift_Lock:
          case XK_Meta_L:
          case XK_Meta_R:
          case XK_Alt_L:
          case XK_Alt_R:
          case XK_Super_L:
          case XK_Super_R:
          case XK_Hyper_L:
          case XK_Hyper_R:
            break;
          default:
            *key = buffer;
            *x_mm = (double) event.xkey.x / (double) win_width * win_width_mm;
            *y_mm = (double) (win_height - event.xkey.y) / (double) win_height 
            * win_height_mm;
            got_event++;
            break;
        }
    }
  }
}

Humm, the error message is very clear. What exactly do you not understand about it?

Why did you change code from using XKeyEvent to Xevent?

I have made some progress now but now getting the error

xbuplot.c: In function �void xbuevent_(float*, float*, int*, char*)':
xbuplot.c:715:20: error: invalid conversion from �char*' to �char' [-fpermissive]
make: *** [../pltlib/xbuplot.o] Error 1
void xbuevent_ (
  float* x_mm,
  float* y_mm,  /*  position of cursor in mm  */
  int* button,  /*  button that was pressed  */
  char* key  /*  key that was pressed  */
) {

  XEvent event;
  
  // CHRISD:
  //XEvent *event;

  XKeyEvent keyevent;
  
  KeySym keysym;
  XComposeStatus compose;
  char buffer[2];
  //char buffer = 0;
  int buflen = 1;
  int got_event = 0;

  *button = *key = 0;    /* initialize button and key to zero */

  /* loop until we get a key or button press that we want */
  while (!got_event)
  {
    /* get next button or key press event */
    XMaskEvent (display, ButtonPressMask | KeyPressMask, &event);
    switch (event.type)
    {
      case ButtonPress:
        *button = event.xbutton.button;
        *x_mm = (double) event.xbutton.x / (double) win_width * win_width_mm;
        *y_mm = (double) (win_height - event.xbutton.y) / (double) win_height 
        * win_height_mm;
        got_event++;
        break;
      case KeyPress:
        XLookupString (&event.xkey, buffer, buflen, &keysym, &compose);
        //XLookupString (&event, buffer, buflen, &keysym, &compose);
        switch (keysym)
        {
          case XK_Shift_L:    /* ignore a key press from a key modifier */
          case XK_Shift_R:
          case XK_Control_L:
          case XK_Control_R:
          case XK_Caps_Lock:
          case XK_Shift_Lock:
          case XK_Meta_L:
          case XK_Meta_R:
          case XK_Alt_L:
          case XK_Alt_R:
          case XK_Super_L:
          case XK_Super_R:
          case XK_Hyper_L:
          case XK_Hyper_R:
            break;
          default:
            *key = buffer;
            *x_mm = (double) event.xkey.x / (double) win_width * win_width_mm;
            *y_mm = (double) (win_height - event.xkey.y) / (double) win_height 
            * win_height_mm;
            got_event++;
            break;
        }
    }
  }
}

---------- Post updated at 06:18 AM ---------- Previous update was at 05:24 AM ----------

Fixed

---------- Post updated at 06:18 AM ---------- Previous update was at 06:18 AM ----------

This is the new code

void xbuevent_ (
  float* x_mm,
  float* y_mm,  /*  position of cursor in mm  */
  int* button,  /*  button that was pressed  */
  char* key  /*  key that was pressed  */
) {

  XEvent event;
  
  // CHRISD:
  //XEvent *event;

  XKeyEvent keyevent;
  
  KeySym keysym;
  XComposeStatus compose; 

  //char buffer = 0;
  int buflen = 1;
  int got_event = 0;

  *button = *key = 0;    /* initialize button and key to zero */

  /* loop until we get a key or button press that we want */
  while (!got_event)
  {
    /* get next button or key press event */
    XMaskEvent (display, ButtonPressMask | KeyPressMask, &event);
    switch (event.type)
    {
      case ButtonPress:
        *button = event.xbutton.button;
        *x_mm = (double) event.xbutton.x / (double) win_width * win_width_mm;
        *y_mm = (double) (win_height - event.xbutton.y) / (double) win_height 
        * win_height_mm;
        got_event++;
        break;
      case KeyPress:
        char buffer[2];
        XLookupString (&event.xkey, buffer, buflen, &keysym, &compose);
        //XLookupString (&event, buffer, buflen, &keysym, &compose);
        switch (keysym)
        {
          case XK_Shift_L:    /* ignore a key press from a key modifier */
          case XK_Shift_R:
          case XK_Control_L:
          case XK_Control_R:
          case XK_Caps_Lock:
          case XK_Shift_Lock:
          case XK_Meta_L:
          case XK_Meta_R:
          case XK_Alt_L:
          case XK_Alt_R:
          case XK_Super_L:
          case XK_Super_R:
          case XK_Hyper_L:
          case XK_Hyper_R:
            break;
          default:
            *key = *buffer;
            *x_mm = (double) event.xkey.x / (double) win_width * win_width_mm;
            *y_mm = (double) (win_height - event.xkey.y) / (double) win_height 
            * win_height_mm;
            got_event++;
            break;
        }
    }
  }
}