X11: fix drag&drop
This commit is contained in:
		
							parent
							
								
									1d023c49e2
								
							
						
					
					
						commit
						2a15d5f720
					
				
							
								
								
									
										30
									
								
								src/input.c
									
									
									
									
									
								
							
							
						
						
									
										30
									
								
								src/input.c
									
									
									
									
									
								
							@ -1235,6 +1235,7 @@ int Get_input(int sleep_time)
 | 
			
		||||
#elif defined(USE_X11)
 | 
			
		||||
    int user_feedback_required = 0; // Flag qui indique si on doit arrêter de traiter les évènements ou si on peut enchainer
 | 
			
		||||
    static int xdnd_version = 5;
 | 
			
		||||
    static Window xdnd_source = None;
 | 
			
		||||
 | 
			
		||||
    Color_cycling();
 | 
			
		||||
    // Commit any pending screen update.
 | 
			
		||||
@ -1398,6 +1399,7 @@ int Get_input(int sleep_time)
 | 
			
		||||
          {
 | 
			
		||||
            //int list = event.xclient.data.l[1] & 1;
 | 
			
		||||
            xdnd_version = event.xclient.data.l[1] >> 24;
 | 
			
		||||
            xdnd_source = event.xclient.data.l[0];
 | 
			
		||||
          }
 | 
			
		||||
          else if (event.xclient.message_type == XInternAtom(X11_display, "XdndLeave", False))
 | 
			
		||||
          {
 | 
			
		||||
@ -1406,21 +1408,30 @@ int Get_input(int sleep_time)
 | 
			
		||||
          else if (event.xclient.message_type == XInternAtom(X11_display, "XdndPosition", False))
 | 
			
		||||
          {
 | 
			
		||||
            XEvent reply;
 | 
			
		||||
            int x_abs, y_abs;
 | 
			
		||||
            int x_pos, y_pos;
 | 
			
		||||
            x_pos = (event.xclient.data.l[2] >> 16) & 0xffff;
 | 
			
		||||
            y_pos = event.xclient.data.l[2] & 0xffff;
 | 
			
		||||
            Window root_window, child;
 | 
			
		||||
            unsigned int width, height;
 | 
			
		||||
            unsigned int border_width, depth;
 | 
			
		||||
 | 
			
		||||
            x_abs = (event.xclient.data.l[2] >> 16) & 0xffff;
 | 
			
		||||
            y_abs = event.xclient.data.l[2] & 0xffff;
 | 
			
		||||
            // reply with XdndStatus
 | 
			
		||||
            // see https://github.com/glfw/glfw/blob/a9a5a0b016215b4e40a19acb69577d91cf21a563/src/x11_window.c
 | 
			
		||||
 | 
			
		||||
            memset(&reply, 0, sizeof(reply));
 | 
			
		||||
 | 
			
		||||
            reply.type = ClientMessage;
 | 
			
		||||
            reply.xclient.window = event.xclient.data.l[0];
 | 
			
		||||
            reply.xclient.window = event.xclient.data.l[0]; // drag & drop source window
 | 
			
		||||
            reply.xclient.message_type = XInternAtom(X11_display, "XdndStatus", False);
 | 
			
		||||
            reply.xclient.format = 32;
 | 
			
		||||
            reply.xclient.data.l[0] = event.xclient.window;
 | 
			
		||||
            reply.xclient.data.l[2] = 0; // Specify an empty rectangle
 | 
			
		||||
            reply.xclient.data.l[3] = 0;
 | 
			
		||||
            if (XGetGeometry(X11_display, X11_window, &root_window, &x_pos, &y_pos, &width, &height, &border_width, &depth)
 | 
			
		||||
              && XTranslateCoordinates(X11_display, X11_window, root_window, 0, 0, &x_abs, &y_abs, &child))
 | 
			
		||||
            {
 | 
			
		||||
              reply.xclient.data.l[2] = (x_abs & 0xffff) << 16 | (y_abs & 0xffff);
 | 
			
		||||
              reply.xclient.data.l[3] = (width & 0xffff) << 16 | (height & 0xffff);
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            // Reply that we are ready to copy the dragged data
 | 
			
		||||
            reply.xclient.data.l[1] = 1; // Accept with no rectangle
 | 
			
		||||
@ -1432,12 +1443,15 @@ int Get_input(int sleep_time)
 | 
			
		||||
          }
 | 
			
		||||
          else if (event.xclient.message_type == XInternAtom(X11_display, "XdndDrop", False))
 | 
			
		||||
          {
 | 
			
		||||
            Time time = CurrentTime;
 | 
			
		||||
            if (xdnd_version >= 1)
 | 
			
		||||
              time = event.xclient.data.l[2];
 | 
			
		||||
            XConvertSelection(X11_display,
 | 
			
		||||
                              XInternAtom(X11_display, "XdndSelection", False),
 | 
			
		||||
                              XInternAtom(X11_display, "text/uri-list", False),
 | 
			
		||||
                              XInternAtom(X11_display, "XdndSelection", False),
 | 
			
		||||
                              event.xclient.window,
 | 
			
		||||
                              event.xclient.data.l[2]);
 | 
			
		||||
                              time);
 | 
			
		||||
          }
 | 
			
		||||
          break;
 | 
			
		||||
        case SelectionNotify:
 | 
			
		||||
@ -1475,14 +1489,14 @@ int Get_input(int sleep_time)
 | 
			
		||||
              memset(&reply, 0, sizeof(reply));
 | 
			
		||||
 | 
			
		||||
              reply.type = ClientMessage;
 | 
			
		||||
              reply.xclient.window = event.xselection.requestor;
 | 
			
		||||
              reply.xclient.window = xdnd_source;
 | 
			
		||||
              reply.xclient.message_type = XInternAtom(X11_display, "XdndFinished", False);
 | 
			
		||||
              reply.xclient.format = 32;
 | 
			
		||||
              reply.xclient.data.l[0] = X11_window;
 | 
			
		||||
              reply.xclient.data.l[1] = 1;  // success
 | 
			
		||||
              reply.xclient.data.l[2] = XInternAtom(X11_display, "XdndActionCopy", False);
 | 
			
		||||
 | 
			
		||||
              XSendEvent(X11_display, event.xselection.requestor, False, NoEventMask, &reply);
 | 
			
		||||
              XSendEvent(X11_display, xdnd_source, False, NoEventMask, &reply);
 | 
			
		||||
            }
 | 
			
		||||
          }
 | 
			
		||||
          else if (event.xselection.selection == XInternAtom(X11_display, "CLIPBOARD", False)
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user