Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
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"...
Registrado: Marzo 2010
Mensajes: 5278
Edad: 53 Ubicación: Al otro lado de la pantalla
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"
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
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...
Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
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.
Registrado: Septiembre 2009
Mensajes: 4982
Edad: 64 Ubicación: Albacete
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.
Registrado: Agosto 2013
Mensajes: 2086
Edad: 60 Ubicación:
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.
' Display *XOpenDisplay(char *display_name) ' Opens a connection to the X server that controls a display. PrivateExtern XOpenDisplay(display$ AsString)AsPointer
' Window XDefaultRootWindow(Display *display) ' Return the root window for the default screen. PrivateExtern XDefaultRootWindow(displayP AsPointer)AsInteger
' Atom XInternAtom(Display *display, char *atom_name, Bool only_if_exists) ' Returns the atom identifier associated with the specified atom_name string. PrivateExtern XInternAtom(displayP AsPointer, atom_name AsString, only_if_exists AsBoolean)AsInteger
' 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. PrivateExtern XGetWindowProperty(displayP AsPointer, w AsLong, py AsInteger, lo AsLong, ll AsLong, d AsBoolean, rt AsInteger, at AsPointer, af AsPointer, ni AsPointer, ba AsPointer, pr AsPointer)AsInteger
' Status XGetWMName(Display *display, Window w, XTextProperty *text_prop_return) ' Calls XGetTextProperty() to obtain the WM_NAME property. PrivateExtern XGetWMName(displayP AsPointer, w AsLong, text_prop_return AsPointer)AsInteger
' Cursor XCreateFontCursor(Display *display, unsigned int shape) ' Provides a set of standard cursor shapes in a special font named cursor. PrivateExtern XCreateFontCursor(displayP AsPointer, shape AsInteger)AsInteger
' XDefineCursor(Display *display, Window w, Cursor cursor) ' If a cursor is set, it will be used when the pointer is in the window. PrivateExtern XDefineCursor(displayP AsPointer, w AsLong, cursorI AsInteger)AsInteger
' XCloseDisplay(Display *display) ' Closes the connection to the X server for the display specified in the Display structure and destroys all windows. PrivateExtern XCloseDisplay(displayP AsPointer)
' Conexión al servidor X y impostación por defecto:
disp = XOpenDisplay(Null) IfIsNull(disp)ThenError.Raise("Imposible conctarse al Server X !")
escritorio = IDEscritorio(disp)
WhileTrue Wait 0.01 IfIsNumber(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
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 ThenError.Raise("Imposible obtener datos de la función 'XGetWindowProperty' !")
If XA_WINDOW <> tipo ThenError.Raise("Tipo no valido de propiedad '_NET_CLIENT_LIST' !")
p =Alloc(32)
stId = Memory datID ForRead
For b = 1 To n_fin * 2 Read #stId, i If i > 0 Then
XGetWMName(ds, i, p) IfString@(Pointer@(p))="Escritorio"Then Exit ' Si el nombre del "Desktop" no es "Escritorio", poner aqui el nombre corecto ! Endif Next
Registrado: Agosto 2012
Mensajes: 81
Edad: 49 Ubicación: Alcalá de Guadaira (Sevilla)
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.
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).
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.
Fecha y hora actual: Martes, 14 May 2024, 16:02 • Todas las horas son UTC + 1 Hora
Usuarios navegando en este tema: 0 registrados, 0 ocultos y 1 invitado Usuarios registrados conectados: Ninguno
Lista de permisos
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