Portal    Foro    Buscar    FAQ    Registrarse    Conectarse


Publicar nuevo tema  Responder al tema 
Página 1 de 2
Ir a la página 1, 2  Siguiente
 
Programa Sin Ventanas Pero No De Consola
Autor Mensaje
Responder citando   Descargar mensaje  
Mensaje Programa Sin Ventanas Pero No De Consola 
 
Hola, expongo el asunto:

Algunas veces cuando estoy haciendo algún sencillo script en bash me gustaría que el puntero del ratón cambiara de forma mientras hace alguna tarea. Por ejemplo, si está haciendo algo en lo que hay que esperar, pues que aparezca el típico puntero del relojito, o si tengo que seleccionar algo, pues que salta el puntero con forma de cruz. No he encontrado nada en en linux para hacer eso y me preguntaba cómo se podría hacer en gambas.

Las propiedades el mouse creo que tienen para hacer los cambios y sólo sería analizar el primer argumento que se le pase pero ¿Cómo se puede hacer que no aparezca ventana alguna? O sea, el programa realmente no es de consola, pero tampoco tiene ventanas, simplemente cambiará el cursor con el parámetro que yo le ponga para lanzarlo desde los scripts hechos en bash. Algo así como "pointer cruz", "pointer normal"...

Como siempre, gracias de antemano.
 



 
guadafan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 

 



 
última edición por vuott el Viernes, 25 Septiembre 2015, 12:33; editado 2 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
Guadafan, creo que nuestro compañero Vuott se ha quedado a cuadros...y yo tambien..

Si es desde bash, es de consola, si es de manejo de interfaz es de QT/GTK, cambiar el puntero no es difícil.
Además tambien podrías manejar un script hecho en gambas..pero eso es consola.

La idea no es mala, claro, es de entender para que el usuario sepa que esta haciendo un proceso. Eso se entiende.
"Si tengo que seleccionar algo..."..¿ Donde seleccionas un icono, un menú dentro de la consola ?.

Puedes crear ventanas desde la consola..

A ver...cuéntanos mas.

Saludos
 




===================
Gambas Básico
"No es un bug, es una característica no documentada"
 
Shell - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
Sin mencionar que "bloquear el ratón del sistema" va contra el principio de multitarea de los ordenadores existentes desde el i386 en adelante.
Prueba mejor a poner aquello de una /-\| en el mismo sitio, que parece que da vueltas o cosas por el estilo, todas ellas muy clásicas...
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
Ok, a lo mejor me he exlicado mal. Os comento algunos ejemplos para contextualizar esto un poco mejor.

Tengo en el panel del escritorio un icono que me lanza un script de terminal (en ningún momento sale la consola en pantalla, todo se ejecuta de fondo), el script (en bash), toma lo que esté seleccionado y traduce la palabra al/del inglés, para eso toma la palabra, la busca en internet, recibe la traducción, y la muestra en un globo de notify...en eso puede tardar un par de segundos (pero según tu conexión puede tardar más), son segundos en los que de cara al usuario no ocurre nada y me gustaría cambiar el puntero del ratón para dar la impresión de que se está trabajando en algo.

Otro ejemplo, tengo un pequeño script que llama a Scrot para tomar una captura de una porción de la pantalla. Cuando vas a seleccionar un rectánculo de pantalla lo normal es que el puntero del ratón torne a "cruz", pero al lanzar Scrot no ocurre nada. Lo suyo sería ser capaz de realizar la secuencia:

pointer cruz
scrot -s /tmp/captura.png
pointer normal

Como estos, ejemplos a porrones, tengo un script que fuerza el desmontaje de pinchos usb, entre que comprueba si se puede o no desmotar limpiamente o hay que buscar la aplicación que está dando por cul la lata pasan unos instantes en los que de nuevo parece que no está ocurriendo nada.

No sé si ahora se me entiende mejor.
 



 
guadafan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
Ahora está más claro, pero aún así me parece contradictorio, si trabajas en background, trabajas en background. No hay ratón que valga. Si quieres que el usuario sepa que algo "se está cociendo" tienes la opción de hacer lo que hacen los programas tipo MegaSync, Copy o Dropbox, es decir, en el menú que se despliega al pulsar sobre el icono del panel, añade un texto de "Proceso en marcha..." y/o envía un par de mensajes al notify del sistema con "Abriendo dispositivo..." , entre que le aparece el mensaje, el usuario lo lee y lo entiende, se han pasado los dos segunditos necesarios.

Pero, insisto, background es background.

Por cierto, buen trabajo el tuyo, sí señor.

Saludos.
 




===================
No podemos regresar
 
shordi - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
Hooola guadafan !

Cuando utilizamos una aplicación sin ventanas, es muuuy complicado cambiar el puntero del ratón... pero no es imposible.

Vamos a ver un ejemplo que he escrito para ti.
Oh... claro que es un ejemplo general, una idea aproximada, no è propiamente lo que tu quieres.

Comentario del exemplum:
El ejemplo cambia el puntero del ratón, cuando él está directamente sobre el "escritorio" (Desktop).
Se necesita utilizar las funciones externas del API del sistema grafico X11  !
Estas funciones nos permiten de conocer el ID del escritorio y asì manejar el puntero del ratón.
En nombre del "Desktop" debe ser "Escritorio". (Que es el nombre español. Es asì ? ).

Como funciona el ejemplo:
- crear el ejecutable de la applicación;
- abrir un Terminal;
- escribir la ruta del ejecutivo y un numero eligido entre los presentes en el file header ".../X11/cursorfont.h" y visibles en "http://tronche.com/gui/x/xlib/appendix/b/"
ejemplo:
      ~ $ '/ruta/de/mi_aplicacion.gambas' 14

- de todas formas, cuando la aplicación está funcionando, siempre es posible cambiar imagen del puntero enviando por Terminal un numero.

NO OLVIDES de escribir en el Terminal la palabra "quit" + presionar la tecla "Enter", si quieres cerrar la aplicación.

De todas formas para obtener el clasico inicial (por defecto) puntero con la flecha, enviar el valor 2

El cambio del puntero, en todo caso, dura sólo por la sesión actual.

Private s As String


Library "libX11:6.3.0"

Private Const XA_CARDINAL As Integer = 6
Private Const XA_WINDOW As Integer = 33
Private Const MAX_PROPERTY_VALUE_LEN As Integer = 4096

' Display *XOpenDisplay(char *display_name)
' Opens a connection to the X server that controls a display.
Private Extern XOpenDisplay(display$ As String) As Pointer

' Window XDefaultRootWindow(Display *display)
' Return the root window for the default screen.
Private Extern XDefaultRootWindow(displayP As Pointer) As Integer

' Atom XInternAtom(Display *display, char *atom_name, Bool only_if_exists)
' Returns the atom identifier associated with the specified atom_name string.
Private Extern XInternAtom(displayP As Pointer, atom_name As String, only_if_exists As Boolean) As Integer

' int XGetWindowProperty(Display *display, Window w, Atom property, long long_offset, long long_length, Bool delete, Atom req_type, Atom *actual_type_return, int *actual_format_return, unsigned long *nitems_return, unsigned long *bytes_after_return, unsigned char **prop_return)
' Returns the actual type of the property; the actual format of the property.
Private Extern XGetWindowProperty(displayP As Pointer, w As Long, py As Integer, lo As Long, ll As Long, d As Boolean, rt As Integer, at As Pointer, af As Pointer, ni As Pointer, ba As Pointer, pr As Pointer) As Integer

' Status XGetWMName(Display *display, Window w, XTextProperty *text_prop_return)
' Calls XGetTextProperty() to obtain the WM_NAME property.
Private Extern XGetWMName(displayP As Pointer, w As Long, text_prop_return As Pointer) As Integer

' Cursor XCreateFontCursor(Display *display, unsigned int shape)
' Provides a set of standard cursor shapes in a special font named cursor.
Private Extern XCreateFontCursor(displayP As Pointer, shape As Integer) As Integer

' XDefineCursor(Display *display, Window w, Cursor cursor)
' If a cursor is set, it will be used when the pointer is in the window.
Private Extern XDefineCursor(displayP As Pointer, w As Long, cursorI As Integer) As Integer

' XCloseDisplay(Display *display)
' Closes the connection to the X server for the display specified in the Display structure and destroys all windows.
Private Extern XCloseDisplay(displayP As Pointer)


Public Sub Main()

 Dim disp As Pointer
 Dim escritorio, cursor As Integer

    s = Application.Args[1]
    If IsNull(s) Then s = "2"

' Conexión al servidor X y impostación por defecto:
  disp = XOpenDisplay(Null)
  If IsNull(disp) Then Error.Raise("Imposible conctarse al Server X !")
  
  escritorio = IDEscritorio(disp)

    While True
      Wait 0.01
      If IsNumber(s) Then
' Entrando el cursor del ratón en el Escritorio, ello cambia aspecto, configurando aquél que en el archivo header "X11/cursorfont.h" tiene el valor elegido
' entre aquellos visibles en la página "http://tronche.com/gui/x/xlib/appendix/b/":
        cursor = XCreateFontCursor(disp, Val(s))
        XDefineCursor(disp, escritorio, cursor)
      Endif
      If s = "quit" Then
        cursor = XCreateFontCursor(disp, 2)
        XDefineCursor(disp, escritorio, cursor)
        Exit
      Endif
    Wend

' Cerra la libreria:
  XCloseDisplay(disp)
  Quit

End



Public Sub Application_Read()  ' Cuando la aplicación funciona, siempre es posible cambiar puntero enviando un otro numero
  
  Input #File.In, s
  
End


Private Function IDEscritorio(ds As Pointer) As Integer

  Dim datID, p As Pointer
  Dim x_num_Atom, tipo, formato As Integer
  Dim err, n_fin, bytes_succ, i As Integer
  Dim rootW As Long
  Dim stId As Stream
  Dim b As Byte
  
   rootW = XDefaultRootWindow(ds)
  
   x_num_Atom = XInternAtom(ds, "_NET_CLIENT_LIST", False)
  
   err = XGetWindowProperty(ds, rootW, x_num_Atom, 0, MAX_PROPERTY_VALUE_LEN / 4, False, XA_WINDOW, VarPtr(tipo), VarPtr(formato), VarPtr(n_fin), VarPtr(bytes_succ), VarPtr(datID))
   If err <> 0 Then Error.Raise("Imposible obtener datos de la función 'XGetWindowProperty' !")
  
   If XA_WINDOW <> tipo Then Error.Raise("Tipo no valido de propiedad '_NET_CLIENT_LIST' !")
   p = Alloc(32)
   stId = Memory datID For Read
  
   For b = 1 To n_fin * 2
     Read #stId, i
     If i > 0 Then
       XGetWMName(ds, i, p)
       If String@(Pointer@(p)) = "Escritorio" Then Exit   ' Si el nombre del "Desktop" no es "Escritorio", poner aqui el nombre corecto !
     Endif
   Next
  
' Terminando.....:
  stId.Close
  Free(p)
  
  Return i

End



Si esto es muuy complicado, lo que tu quieres realizar es muuuuuuuy complicado.      
 



 
última edición por vuott el Sabado, 26 Septiembre 2015, 19:55; editado 7 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
Gracias vuott, la verdad es que parece supercomplicado al menos para mí, pero si lo único que necesita la aplicación es el ID de la ventana en cuestión podría arreglarlo con wmctrl. Pero no puedo ejecutarlo, me larga esto:

   If XA_WINDOW <tipo> 0 Then   <------------  "Expresión ambigua. Use paréntesis en Fmain.class:106"
       XGetWMName(ds, i, p)
      If String@(Pointer@(p)) = "Escritorio" Then Exit   ' Si el nombre del "Desktop" no es "Escritorio", poner aqui el nombre corecto !
    Endif

Si pongo paréntesis me dice:

      If String@(Pointer@(p)) = "Escritorio" Then Exit   <---------- Break inesperado en Fmain.class:108


Shordi, pero piensa en lo cargado que queda lanzar un mensaje de zenity para decir que vas a traducir una palabra y luego  sacar otro con la palabra traducida y así todas las veces. Y tampoco queda muy bien en el caso concreto de la cruz para Scrot.
Citar:
Por cierto, buen trabajo el tuyo, sí señor.

¿A qué te refieres?


Otra cosa, he visto en el foro algunos mensajes para utilizar un puntero del ratón con una imagen personalizada, ¿es posible utilizarlos fuera de la ventana principal o el problema es exactamente el mismo que con los punteros del sistema, que fuera de la ventana no tienen efecto? Porque si se puede hacer algo así, se podría lanzar la ventana principal sin nada en las coordenadas -1000x-1000 para quitarlo de la vista y conseguir el efecto de que se ha cambiado el puntero.
 



 
guadafan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
guadafan escribió: [Ver mensaje]
Gracias vuott, la verdad es que parece supercomplicado al menos para mí,


MEMENTO AUDERE SEMPER !



guadafan escribió: [Ver mensaje]
pero si lo único que necesita la aplicación es el ID de la ventana en cuestión podría arreglarlo con wmctrl.

El mi codigo hace tambien esto. Busca el numero de ID de el Escritorio (o si tu quieres, de una otra ventana que tu prefieres !).




guadafan escribió: [Ver mensaje]
Pero no puedo ejecutarlo, me larga esto:
.........
.........

sÌ... perdoname ! Fue un problema de HTML en el mensaje.  

Ahora he desactivado el HTML y el codigo está escrito corectamente y funciona.

Ah... puedes probar el codigo tambien con el IDE de gambas. Recuerda que - para que funcione el mi codigo - tú debes crear en el IDE una aplicación de línea de comandos (es decir: de consola).  



guadafan escribió: [Ver mensaje]
Otra cosa, ...... utilizar un puntero del ratón con una imagen personalizada, ¿es posible utilizarlos fuera de la ventana principal o el problema es ..........

Sì, es posible, pero actualmente solo usando las funciones externas del API de X11, similarmente al mi codigo anterior.

Como ejemplo, mira este codigo que yo he escrito en el WIKI del foro italiano:
http://www.gambas-it.org/wiki/index...eramente_da_noi
 



 
última edición por vuott el Sabado, 26 Septiembre 2015, 01:07; editado 5 veces 
vuott - Ver perfil del usuarioEnviar mensaje privado 
Volver arribaPágina inferior
Responder citando   Descargar mensaje  
Mensaje Re: Programa Sin Ventanas Pero No De Consola 
 
No hay suerte:

Citar:
El programa se ha detenido de forma inesperada:
Violación de segmento (11)

Envíe un reporte de error a la siguiente dirección de correo
electrónico:

 



 
guadafan - Ver perfil del usuarioEnviar mensaje privadoVisitar sitio web del usuario 
Volver arribaPágina inferior
Mostrar mensajes anteriores:    
 
OcultarTemas parecidos
Tema Autor Foro Respuestas último mensaje
No hay nuevos mensajes Cerrar Programa Consola destroyer General 4 Sabado, 23 Octobre 2010, 17:01 Ver último mensaje
soplo
No hay nuevos mensajes ¿hay Algun Programa Parecido Al Paint Per... jsbsan General 6 Viernes, 25 Febrero 2011, 01:39 Ver último mensaje
jsbsan
No hay nuevos mensajes Cómo Restaurar Tus Ventanas Y Su Contenid... shordi Aplicaciones/Fragmentos de Código 1 Jueves, 21 Agosto 2014, 13:55 Ver último mensaje
Shell
No hay nuevos mensajes Haciendo Un Programa Simple Pero Que Me Si... portaro Aplicaciones/Fragmentos de Código 7 Sabado, 25 Noviembre 2017, 16:16 Ver último mensaje
portaro
 

Publicar nuevo tema  Responder al tema  Página 1 de 2
Ir a la página 1, 2  Siguiente

Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado
Usuarios registrados conectados: Ninguno


 
Lista de permisos
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas
No puede adjuntar archivos
Puede descargar archivos
No puede publicar eventos en el calendario



  

 

cron