Пример #1
0
void
xdnd_send_status(DndClass *dnd, Window window, Window from, int will_accept, 
  int want_position, int x, int y, int w, int h, Atom action)
{
  XEvent xevent;

  memset (&xevent, 0, sizeof (xevent));

  xevent.xany.type = ClientMessage;
  xevent.xany.display = dnd->display;
  xevent.xclient.window = window;
  xevent.xclient.message_type = dnd->XdndStatus;
  xevent.xclient.format = 32;

  XDND_STATUS_TARGET_WIN (&xevent) = from;
  XDND_STATUS_WILL_ACCEPT_SET (&xevent, will_accept);
  if (will_accept)
    XDND_STATUS_WANT_POSITION_SET (&xevent, want_position);
  if (want_position)
    XDND_STATUS_RECT_SET (&xevent, x, y, w, h);
  if (dnd_version_at_least (dnd->dragging_version, 2))
    if (will_accept)
      XDND_STATUS_ACTION (&xevent) = action;

  XSendEvent (dnd->display, window, 0, 0, &xevent);
}
Пример #2
0
Файл: xdnd.cpp Проект: eriser/es
void Dnd::handlePositionEvent(const XEvent& xEvent)
{
	XEvent  replyXEvent;

	m_DropPosX = XDND_POSITION_ROOT_X((&xEvent));
	m_DropPosY = XDND_POSITION_ROOT_Y((&xEvent));
	m_Time     = XDND_POSITION_TIME((&xEvent));

	memset (&replyXEvent, 0, sizeof(replyXEvent));
	replyXEvent.xany.type            = ClientMessage;
	replyXEvent.xany.display         = m_pDisplay;
	replyXEvent.xclient.window       = m_DragWindow;
	replyXEvent.xclient.message_type = XdndStatus;
	replyXEvent.xclient.format       = 32;

	XDND_STATUS_TARGET_WIN(&replyXEvent) = xEvent.xclient.window;
	XDND_STATUS_WILL_ACCEPT_SET(&replyXEvent, True);
	XDND_STATUS_WANT_POSITION_SET(&replyXEvent, True);
	XDND_STATUS_RECT_SET(&replyXEvent, m_DropPosX, m_DropPosY, 1, 1);
	XDND_STATUS_ACTION(&replyXEvent) = XDND_POSITION_ACTION(&xEvent);

	XSendEvent(m_pDisplay, m_DragWindow, 0, 0, &replyXEvent);
}
Пример #3
0
Bool
wsXDNDProcessClientMessage(XClientMessageEvent *event)
{
  /* test */
  /*{
    char * name = XGetAtomName(wsDisplay, event->message_type);
    printf("Got %s\n",name);
    XFree(name);
    }*/

  if (event->message_type == XA_XdndEnter) {
    Atom ok = XInternAtom(wsDisplay, "text/uri-list", False);
    atom_support = None;
    if ((event->data.l[1] & 1) == 0){
      int index;
      for(index = 0; index <= 2 ; index++){
	if ((Atom) event->data.l[2+index] == ok) {
	  atom_support = ok;
	}
      }
      if (atom_support == None) {
	mp_msg( MSGT_GPLAYER,MSGL_WARN,MSGTR_WS_NotAFile );
      }
    } else {
      /* need to check the whole list here */
      unsigned long ret_left = 1;
      int offset = 0;
      Atom* ret_buff;
      Atom ret_type;
      int ret_format;
      unsigned long ret_items;

      /* while there is data left...*/
      while(ret_left && atom_support == None){
	XGetWindowProperty(wsDisplay,event->data.l[0],XA_XdndTypeList,
			   offset,256,False,XA_ATOM,&ret_type,
			   &ret_format,&ret_items,&ret_left,
			   (unsigned char**)&ret_buff);

	/* sanity checks...*/
	if(ret_buff == NULL || ret_type != XA_ATOM || ret_format != 8*sizeof(Atom)){
	  XFree(ret_buff);
	  break;
	}
	/* now chek what we've got */
	{
	  unsigned long i;
	  for(i=0; i<ret_items; i++){
	    if(ret_buff[i] == ok){
	      atom_support = ok;
	      break;
	    }
	  }
	}
	/* maybe next time ... */
	XFree(ret_buff);
	offset += 256;
      }
    }
    return True;
  }

  if (event->message_type == XA_XdndLeave) {
    return True;
  }

  if (event->message_type == XA_XdndDrop) {
    if ((Window) event->data.l[0] != XGetSelectionOwner(wsDisplay, XA_XdndSelection)){
      puts("Wierd selection owner... QT?");
    }
    if (atom_support != None) {
      XConvertSelection(wsDisplay, XA_XdndSelection, atom_support,
			XA_XdndSelection, event->window,
			CurrentTime);
    }
    return True;
  }

  if (event->message_type == XA_XdndPosition) {
    Window srcwin = event->data.l[0];
    if (atom_support == None){
      return True;
    }

    /* send response */
    {
      XEvent xevent;
      memset (&xevent, 0, sizeof(xevent));
      xevent.xany.type = ClientMessage;
      xevent.xany.display = wsDisplay;
      xevent.xclient.window = srcwin;
      xevent.xclient.message_type = XA_XdndStatus;
      xevent.xclient.format = 32;

      XDND_STATUS_TARGET_WIN (&xevent) = event->window;
      XDND_STATUS_WILL_ACCEPT_SET (&xevent, True);
      XDND_STATUS_WANT_POSITION_SET(&xevent, True);
      /* actually need smth real here */
      XDND_STATUS_RECT_SET(&xevent, 0, 0, 1024,768);
      XDND_STATUS_ACTION(&xevent) = XA_XdndActionCopy;

      XSendEvent(wsDisplay, srcwin, 0, 0, &xevent);
    }
    return True;
  }

  return False;
}