Move window with no titlebar

Linux specific forum
coder14
Enthusiast
Enthusiast
Posts: 327
Joined: Tue Jun 21, 2011 10:39 am

Move window with no titlebar

Post by coder14 »

Is there any way to move a borderless window in Linux (without using the ALT key and the mouse button) like it can be done in Windows with WM_NCHITTEST & HTCAPTION?
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: Move window with no titlebar

Post by mestnyi »

I would also like to know
coder14
Enthusiast
Enthusiast
Posts: 327
Joined: Tue Jun 21, 2011 10:39 am

Re: Move window with no titlebar

Post by coder14 »

This is what I have been able to do:

Code: Select all

Procedure Callback(*udata)
  Debug "move window routine?"
EndProcedure

hWnd = OpenWindow(0, 0, 0, 300, 300, "Linux Callback", #PB_Window_ScreenCentered)
g_signal_connect_(hWnd, "button-press-event",  @Callback(), #Null)

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Instead of a callback can the button press event trigger a window move event like the Windows way:

Code: Select all

SendMessage_(WindowID(#win), #WM_NCLBUTTONDOWN, #HTCAPTION, 0)
GTK has a builtin function gtk-window-move to do this but I don't know how to call it.

Code: Select all

g_signal_connect_(hWnd, "button-press-event",  gtk-window-move, #Null) ;does not work!
Any Linux devs can help?
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: Move window with no titlebar

Post by mestnyi »

That's how I work a click event

Code: Select all

ImportC "-gtk"
  g_signal_connect(instance,signal.p-ascii,*Callback,*user_data,destroy=0,flags=0) As "g_signal_connect_data"
EndImport

ProcedureC Callback(*widget.GtkWidget,*event.GdkEventButton,user_data)
  Select *event\button
        Case 1
          Debug "left " 
        Case 3
          Debug "right"
      EndSelect
EndProcedure
hWnd = OpenWindow(0, 0, 0, 300, 300, "Linux Callback", #PB_Window_ScreenCentered)
g_signal_connect(hWnd, "button-press-event",  @Callback(), #Null) 

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
mestnyi
Addict
Addict
Posts: 1098
Joined: Mon Nov 25, 2013 6:41 am

Re: Move window with no titlebar

Post by mestnyi »

like that kind of work

Code: Select all

EnableExplicit

;ImportC "-gtk"
ImportC ""
  g_signal_connect(instance,signal.p-ascii,*fn,*vdata,destroy=0,flags=0) As "g_signal_connect_data"
  g_signal_connect_data(*instance, signal.p-utf8, *handler, *data, *destroy_data, *connect_flags)
EndImport

ProcedureC Callback(*Widget.GtkWindow, *Event.GdkEventAny, Window)
  Static press
  Static DeltaX, DeltaY
  If *Event\type = #GDK_BUTTON_PRESS
    press = 1
    DeltaX = WindowMouseX(Window)
    DeltaY = WindowMouseY(Window)
  ElseIf *Event\type = #GDK_BUTTON_RELEASE
    press = 0
  EndIf
  
  If press
   ResizeWindow(Window,DesktopMouseX()-DeltaX,DesktopMouseY()-DeltaY,#PB_Ignore,#PB_Ignore)
  EndIf
  ProcedureReturn 1
EndProcedure

Define hwnd = OpenWindow(0, 0, 0, 300, 300, "Linux Callback", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
 
gtk_widget_add_events_(WindowID (0), #GDK_MOUSE)
g_signal_connect(hwnd, "event",  @Callback(), 0)
;g_signal_connect_(hwnd, "button-press-event",  @"gtk-window-move", #Null) ;does not work!

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Last edited by mestnyi on Mon Jan 16, 2023 8:25 pm, edited 2 times in total.
coder14
Enthusiast
Enthusiast
Posts: 327
Joined: Tue Jun 21, 2011 10:39 am

Re: Move window with no titlebar

Post by coder14 »

mestnyi wrote:like that kind of work

Code: Select all

EnableExplicit

ImportC "-gtk"
  g_signal_connect(instance,signal.p-ascii,*fn,*vdata,destroy=0,flags=0) As "g_signal_connect_data"
EndImport

ProcedureC Callback(*Widget.GtkWindow, *Event.GdkEventAny, Window)
  Static press
  Static DeltaX, DeltaY
  If *Event\type = #GDK_BUTTON_PRESS
    press = 1
    DeltaX = WindowMouseX(Window)
    DeltaY = WindowMouseY(Window)
  ElseIf *Event\type = #GDK_BUTTON_RELEASE
    press = 0
  EndIf
  
  If press
   ResizeWindow(Window,DesktopMouseX()-DeltaX,DesktopMouseY()-DeltaY,#PB_Ignore,#PB_Ignore)
  EndIf
  ProcedureReturn 1
EndProcedure

Define hwnd = OpenWindow(0, 0, 0, 300, 300, "Linux Callback", #PB_Window_ScreenCentered|#PB_Window_BorderLess)
 
gtk_widget_add_events_(WindowID (0), #GDK_MOUSE)
g_signal_connect(hwnd, "event",  @Callback(), 0)
;g_signal_connect_(hwnd, "button-press-event",  @"gtk-window-move", #Null) ;does not work!

Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
Very good mestnyi!! Ingenious workaround! Thank you.
Post Reply