Visualizza post

Questa sezione ti permette di visualizzare tutti i post inviati da questo utente. N.B: puoi vedere solo i post relativi alle aree dove hai l'accesso.


Post - koko

Pagine: [1] 2 3 4
1
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 13 Maggio 2016, 13:45:08 »
Sono riuscito finalmente ad implementare i plugin esterni.
Adesso higgins riconoscerà eventuali eseguibili presenti in: ~/.config/gambas3/higgins/extbin
Il bello è che l' "API" con cui il plugin esterno dialoga con higgins si basa su semplici messaggi di testo.
Questo vuol dire che i plugin esterni possono essere scritti in qualsiasi linguaggio.
Un plugin di esempio che ho scritto è il seguente, in bash:
Codice: [Seleziona]
#!/bin/bash
#Simple locate plugin example.
#Put me in ~/.config/gambas3/higgins/extbin to use me

#This plugin will search for files using locate command, which has to be installed.
#This plugin will run only when the trigger is used, so:
#   to search for "myfile.txt"
#   write: l:myfile.txt
#   (trigger is "l:")

#This plugin will not search anything lower than 3 characters (minchar=3)


export IFS=$'\n'
trigger="l:" #Search using the trigger? es: l:myfile
minchar=3    #Don't search on queries smaller than that, trigger does not count.

query="$@"

#Do we use a trigger?
if [ -n "$trigger" ] ; then
    #...Yes, we do, so exit if not triggered
    if [[ $query != $trigger* ]] ; then
        exit
    fi
    #Strip the trigger prefix from the query
    query=$(echo $query| sed "s/^$trigger//")
fi

len=${#query}

#Exit if the query is too small
if [ $len -lt $minchar ] ; then
    exit ;
fi


#Finally, start the search:
for file in $(locate -i "$query") ; do
    echo BEGIN
    # For fields description and possible values, please refer to plugins/plugin_999_template
      echo Text=$(basename $file)
      echo SubText="in " $(dirname $file)"/"
      echo Image_file="mimetype://$file"
      echo Clipboard_data="$file"
      echo Action="GUESS"
      echo Action_p="$file"
    echo END
done

Questo script si può lanciare anche da linea di comando (che poi è quello che higgins fa), così:
Codice: [Seleziona]
# ~/.config/gambas3/higgins/extbin/locate.sh l:ciao 
e l'uscita dello script sarà qualcosa del genere:
Codice: [Seleziona]
BEGIN
Text=ciao.srt
SubText=in  /home/
Image_file=mimetype:///home/ciao.srt
Clipboard_data=/home/ciao.srt
Action=GUESS
Action_p=/home/ciao.srt
END
BEGIN
Text=ciao.ORIGINAL.srt
SubText=in  /home/p2p/.aegisub/autoback/
Image_file=mimetype:///home/p2p/.aegisub/autoback/ciao.ORIGINAL.srt
Clipboard_data=/home/p2p/.aegisub/autoback/ciao.ORIGINAL.srt
Action=GUESS
Action_p=/home/p2p/.aegisub/autoback/ciao.ORIGINAL.srt
END
Higgins parserà l'output del programma e prenderà tutte le informazioni che gli servono per compilare la lista dei risultati.

Più semplice di così!

Altra cosa che ho aggiunto è che ogni plugin può essere abilitato/disabilitato e gli stessi possono essere ordinati in modo da avere prima i risultati che ci interessano maggiormente.
Nella lista dei plugin vengono ovviamente visualizzati anche i plugin esterni.

2
L'angolo dell'artista / Schema colori: dark_pastel
« il: 03 Maggio 2016, 09:02:38 »
L'ho fatto per me, ispirato a solarized dark, se vi garba, grabbatelo :)
Il font è: "dina"

3
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 02 Maggio 2016, 11:45:17 »
purtroppo quella è la finestra di xbindkeys, non ho controllo su di essa.
Al massimo posso ridimensionarla o posizionarla dove voglio...

4
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 02 Maggio 2016, 09:48:27 »
xbindkeys non è, purtroppo, una libreria, ma proprio un programma, ed hai ragione che dovrei segnalarne l'eventuale assenza tramite un messaggio a video.
L'errore che dà in console lo scrive higgins "da design":
Codice: [Seleziona]
Public Sub _new(conf As String, Optional alias As String = "")
  If Not System.Exist("xbindkeys") Then
    Debug "ERROR: xbindkeys not found in system path"
    Quit
  Endif

Ad ogni modo, higgins usa xbindkeys solo per registrare una hotkey (shortcut) che visualizzi/nasconda la sua interfaccia.

Credo di aver capito cosa è successo nel tuo caso.
Al primo avvio, higgins cerca la sua directory di configurazione; se non la trova, assume che quella sia la prima volta che l'utente lo lancia; crea la cartella, e quindi avverte l'utente che va configurata almeno l'hotkey.
Poi vuole far partire xbindkeys per regitrare la hotkey, ma non lo trova ed esce.
L'utente installa xbindkeys e rilancia higgins, che però a quel punto trova la sua cartella (l'aveva creata prima di uscire) e quindi non chiede più di registrare la hotkey.
Quetso lo metto a posto in giornata, ma intanto, avendo installato xbindkeys, puoi impostate la hotkey cliccando col tasto dx sulla tray icon e scegliendo "Options" dal menu, oppure clicchi col tasto sx sulla tray icon e poi clicchi sul pulsante alla destra della barra di ricerca.
nella finestra che si apre, clicca "change default hotkey"; a quel punto i apre xbindkeys che ti chiede di battere una combinazione di tasti; io uso alt-space.
Fatto ciò, alt-space mostrerà e nasconderà il form di higgins.


Riguardo la chiusura, higgins è pensato per rimanere sempre attivo; per chiuderlo si usa la tray icon (tasto dx->quit) oppure tasto dx sul bottone di configurazione -> quit.

Dà un warning di riferimento circolare all'uscita (è solo un warning, non necessariamente un male), ma le risorse vengono liberate tutte correttamente, per cui non c'è bisogno di "Quit".

Scusa la prolissità :D[/code]

5
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 29 Aprile 2016, 13:56:31 »
Dopo un lungo ed estenuante lavoro...
No, in realtà è stato divertente, credo di aver concluso, a meno di bug dell'ultim'ora.

Comunque, ho fatto molta attenzione a rendere il programma modulare; in altre parole dovrebbe essere semplice aggiungere plugin per estendere i risultati di higgins.
Nel caso qualcuno fosse interessato a scrivenre di nuovi, ecco come fare:

Prima di tutto bisogna scrivere una classe che si chiami:
plugins/plugin_NomeAPiacere.gambas
inoltre il "NomeAPiacere" non deve finire con "_gui" perchè plugins/plugin_NomeAPiacere_gui.gambas è una stringa riservata a eventuali form di configurazione dello stesso plugin.
I plugin sono lanciati in ordine alfabetico, per questo quelli esistenti li ho chiamati (es:) plugin_090_indexer
Eventuali configurazioni interne al plugin potranno essere salvate tramite la classe Settings.
Ma ogni plugin può fare un pò come vuole riguardo il salvataggio delle sue impostazioni.

Questa classe deve rispecchiare bene o male la classe "plugin_template" che ho scritto come una linea guida, eccola:
Codice: [Seleziona]
' Gambas class file

Create Static
Static Public Description As String = "Example plugin"    'A description for this plugin
Static Public Friendly_name As String = "Example plugin"  'A friendly name for this plugin
Static Public configurable As Boolean = False             'Does this plugin provides a configure() method?

Public Sub _free()

End


Public Struct rItemT
  plugin As String            'The plugin name
  Text As String              'Text displayed in the clipboard
  SubText As String           'Text displayed under the main text
  Image_file As String        'Optional image displayed: possible values:
                              '  "mimetype://fullpath/to/filename/to/identify"
                              '     get picture from mime icon
                              '   "desktopfile://fullpath/to/.desktop/file"
                              '     Get the picture from .desktop file
                              '   "resize://fullpath/to/image/file"
                              '     Load the image from disk and resize it automatically
                              '   "/fullpath/to/image/file"
                              '     Load the image from disk
 
  Clipboard_data As String    'The data copied to the clipboard
  Action As String            'String that indicates what to do when activating a result:
                              '"DESKTOPOPEN"
                              '       Open folders and starts .desktop files
                              '"EXEC"
                              '       Executes executables files
                              '"GUESS"
                              '       Choose an action based on filetype
                              '"NULL"
                              '       Does nothing

  Action_p As Variant         'the parameter for Action
 
End Struct


Private textcontrol As Object
Private plugin As String
Private iconsize As Integer
Private minchar As Integer = 3 'The plugin will not operate on searches smaller than that


Public Sub _new(p_plugin As String, p_iconsize As Integer)

  plugin = p_plugin
  iconsize = p_iconsize

End


Public Sub Stop()
 
  'not sure if this is the right way, but this should be called when the plugin has to be unloaded
 
End


Private Sub trigged(query As String) As Boolean
  'this function will decide if the plugin will be search for "query" or not.
  If Len(query) < minchar Then Return False
  'some more controls here (?)
  Return True
End


Public Sub find(textcontrol As Object) As RItemT[]
  'this is the main function, textcontrol is an object that exposes a "text" property.
  'We need to pass an entire object reference instead of a simple string so that
  'we can stop a (slow) plugin as soon as textcontrol.text changes (ie: the user is still typing...)

  Dim anItem As String
  Dim rResults As New RItemT[]
  Dim rResult As RItemT
  Dim current_search As String = textcontrol.text
 
  If Not trigged(textcontrol.text) Then Return
 
  For Each anItem In Dir(User.home).sort()
   
    rResult = create_item(anItem)
    If rResult <> Null Then rResults.Add(rResult)
    'Wait 'if calculations are heavy a wait may be handy.
    If textcontrol.text <> current_search Then Return


  Next 'anItem
  Return rResults

End


Private Function create_item(result As String) As RItemT
  'this function creates an item that will be pushed into the result list.
  Dim return_item As RItemT
  return_item = New RItemT
  return_item.plugin = plugin
  return_item.Action = "EXEC" ' DESKTOPOPEN,EXEC,GUESS,NULL... MORE?
  return_item.Action_p = "/usr/bin/gambas3"
  return_item.Clipboard_data = "Some data copied to the clipboard"
  return_item.image_file = "icon:/" & iconsize & "/bookmark"
  return_item.Text = result
  return_item.SubText = "In: " & User.home
  Return return_item
End

Public Sub configure()
 
  'this starts the configuration window.
  'eg: plugin_template_gui.show()
End

EDIT:
Prossimo passo, permettere di usare plugin scritti in qualsiasi "linguaggio"; l'idea è di lanciarli come come "process" tramite "SHELL" e di comunicare con loro tramite semplici stream.

6
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 19 Aprile 2016, 11:37:33 »
Vabeh, fermo restando il fascino della programmazione Xlib, mi sono scontrato con l'ulteriore problema di dover memorizzare una hotkey secondo la preferenza dell'utente, e da qui ho deciso di abbandonare la vecchia strata (grazie comunque Vuott).
Ne è uscita l'integrazione con xbindkeys che posto qui sotto:

Classe xbindkeys:
Codice: [Seleziona]
' Gambas class file

Private xbindkeysp As Process
Private conf_file As String
Private hotkeys As Collection


Public Sub _new(conf As String)
  If Not System.Exist("xbindkeys") Then
    Debug "ERROR: xbindkeys not found in system path"
    Quit
  Endif
  conf_file = conf
  hotkeys = parse_conf()
  If hotkeys = Null Then hotkeys = New Collection
  Reload_xbindkeys()
End

Private Function parse_conf() As Collection
  Dim pHotKeys As New Collection
  Dim aLine As String
  Dim WhatToDo As String 'find_new,find_action,find_hotkey
  Dim action, hotkey As String
  'Syntax:
  '#new
  'Action
  'hotkey
  If Not Exist(conf_file, True) Then Return Null
  WhatToDo = "find_new"
  For Each aLine In Split(File.Load(conf_file), "\n", "", True)
    Select WhatToDo
      Case "find_new"
        If aLine = "#new" Then WhatToDo = "find_action"
      Case "find_action"
        action = aLine
        WhatToDo = "find_hotkey"
      Case "find_hotkey"
        hotkey = aLine
        pHotkeys[hotkey] = action
        WhatToDo = "find_new"
    End Select
  Next
  Return pHotKeys
End

Private Sub write_conf()
  Dim outfile As String
  Dim action As String
  Dim HotKey As String
  For Each Action In hotkeys
    hotkey = hotkeys.key
    outfile &= "#new" & "\n"
    outfile &= Action & "\n"
    outfile &= Hotkey & "\n"
  Next
  File.Save(conf_file, outfile)
End

Public Sub register(action As String) As String
  Dim tmp As String = Temp()
  Dim out As String
  Dim splitted As String[]
  Dim hotkey As String
  Shell "touch " & tmp Wait
  xbindkeysp.kill
  Shell System.Find("xbindkeys") & " -k -f " & tmp To out
  splitted = Split(out, "\n", "", True)
  hotkey = Trim(splitted[splitted.count - 1])
  hotkeys[hotkey] = "\"" & "echo " & action & "\""
  write_conf()
  Reload_xbindkeys()
  Return hotkey
End

Public Sub close()
  Try xbindkeysp.kill
End

Public Sub Reload_xbindkeys()
  Try xbindkeysp.kill
  xbindkeysp = Shell "xbindkeys -n -f " & conf_file For Read As "xbindkeysp"
End

Event HotkeyPressed(action As String)

Public Sub xbindkeysp_read()
  Dim out As String
  Line Input #xbindkeysp, out
  Raise Hotkeypressed(out)
End

Utilizzatore della classe (esempio)
Codice: [Seleziona]
Public xb As XbindKeys

Public Sub Form_Open()
  xb = New XbindKeys("/tmp/y") As "xb"
End

Public Sub Button1_Click()
  xb.register("Prova_action")
End

Public Sub Form_Close()
  xb.close
End

Public Sub xb_HotkeyPressed(action As String)
  Debug action
End

In sostanza si instanzia un processo xbindkeys, si possono definire nuove hotkey associate a semplici stringhe che ritorneranno al programma principale tramite l'evento _HotkeyPressed.
Manca il codice per rimuovere una hotkey o una azione.

7
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 19 Aprile 2016, 08:53:41 »
Se non ci riesci tu, io non ho speranze, quando uso le extern il 99% delle volte ottengo dei crash :)

8
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 19 Aprile 2016, 08:27:37 »
Grazie vuott, il tuo codice sembra funzionare senza problemi.
Ora la missione è capire perchè il mio non andava :)
-EDIT-
Ok, era qualcosa riguardante la maschera in XgrabKey() mettendo la tua maschera, funge senza problemi.

9
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 18 Aprile 2016, 17:57:08 »
Grazie, lo terrò presente.
Vuott, è strano, con il codice in c a me funge.
occhio al numlock, dev'essere spento perchè anche quello è un modificatore, poi ctrl-shift-y ed il programma stampa ed esce.

10
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 14 Aprile 2016, 18:26:08 »
Ti ringrazio molto ma non ho fatto molti progressi.
il mio codice:
Codice: [Seleziona]
' Gambas class file

Public Struct XEventStruct
  type As Integer
  serial As Long
  send_event As Boolean
  display As Pointer
  windowL As Long
  root As Long
  subwindow As Long
  timeL As Long
  x As Integer
  y As Integer
  x_root As Integer
  y_root As Integer
  state As Integer
  keycode As Integer
  same_screen As Boolean
End Struct

Private Enum KeyPress = 2, KeyRelease, ButtonPress, ButtonRelease, MotionNotify, EnterNotify, LeaveNotify,
                           FocusIn, FocusOut, KeymapNotify, Expose, GraphicsExpose, NoExpose
Private Const ExposureMask As Integer = 32768
Private Const KeyPressMask As Byte = 1
Private Const ButtonPressMask As Byte = 4



Extern XOpenDisplay(DpyName As String) As Pointer In "libX11"
Extern XDefaultScreen(Display As Pointer) As Integer In "libX11"
Extern XDefaultRootWindow(Display As Pointer) As Integer In "libX11"
Extern XSelectInput(Display As Pointer, Window As Integer, KeyMask As Long) In "libX11"
Private Extern XNextEvent(displayP As Pointer, event_return As XEventStruct) In "libX11"
Extern XGrabKey(Display As Pointer, KeyCode As Integer, Modifiers As Integer, Window As Pointer, OwnEvent As Boolean, PointerMode As Integer, KeyboardMode As Integer) In "libX11"
Extern XGrabKeyboard(Display As Pointer, KeyCode As Integer, Modifiers As Integer, Window As Pointer, OwnEvent As Boolean, PointerMode As Integer, KeyboardMode As Integer) In "libX11"
Extern XKeysymToKeycode(Display As Pointer, keysym As Integer) As Integer In "libX11"


Public Sub form_open()
    Dim pDisplay As Pointer
    Dim pRootWindow As Pointer
    Dim pEvent As New XEventStruct
    Dim keycode As Integer
    pDisplay = XOpenDisplay(":0.0")
    pRootWindow = XDefaultRootWindow(pDisplay)
    keycode = XKeysymToKeycode(pDisplay, Asc("y"))
    XGrabKey(pDisplay, keycode, 1, pRootWindow, False, 1, 1) '95 = F11 key, 1 = GrabModeAsync
    XSelectInput(pDisplay, pRootWindow, KeyPressMask)

    Do
        XNextEvent(pDisplay, pEvent)
        Debug pEvent.type
    Loop
End

Mi stampa qualcosa su un display "nested" vuoto come Xephir (sostituendo pDisplay = XOpenDisplay(":1.0"))
E stampa appena premo *qualsiasi* tasto, non solo quello che in teoria avrei registrato ("y").

D'altro canto questo esempio in c:
https://stackoverflow.com/questions/4037230/global-hotkey-with-x11-xlib
Codice: [Seleziona]
#include <iostream>
#include <X11/Xlib.h>
#include <X11/Xutil.h>


using namespace std;


int main()
{
    Display*    dpy     = XOpenDisplay(0);
    Window      root    = DefaultRootWindow(dpy);
    XEvent      ev;

    unsigned int    modifiers       = ControlMask | ShiftMask;
    int             keycode         = XKeysymToKeycode(dpy,XK_Y);
    Window          grab_window     =  root;
    Bool            owner_events    = False;
    int             pointer_mode    = GrabModeAsync;
    int             keyboard_mode   = GrabModeAsync;

    XGrabKey(dpy, keycode, modifiers, grab_window, owner_events, pointer_mode,
             keyboard_mode);

    XSelectInput(dpy, root, KeyPressMask );
    while(true)
    {
        bool shouldQuit = false;
        XNextEvent(dpy, &ev);
        switch(ev.type)
        {
            case KeyPress:
                cout << "Hot key pressed!" << endl;
                XUngrabKey(dpy,keycode,modifiers,grab_window);
                shouldQuit = true;

            default:
                break;
        }

        if(shouldQuit)
            break;
    }

    XCloseDisplay(dpy);
    return 0;
}

...funziona su qualsiasi display, anche quello su cui c'è kwin e kde (avendo cura di battere ctrl-shift-y con il numlock spento); ed io non riesco a capire quale sia la differenza!

11
Programmazione / Re:Higgins: un lanciatore per gambas
« il: 13 Aprile 2016, 18:12:32 »
Ciao e grazie per le lusinghe :)
Non c'è molto da sapere su higgins, dovrebbe/vorrebbe essere semplice come concetto, e se non lo è, allora non funziona bene  ;D

Comunque la trayicon serve solo a uscire dall'applicazione, ecco perchè ottieni solo "quit" dal suo menu,mentre se ci clicchi, mostri la finestra principale.
Per il resto, basta scrivere un termine nella textbox.
I primi risultati proposti sono i file .desktop (i lanciatori); viene effettuata ricerca per nome, descrizione e commento (purtroppo, per adesso solo i termini inglesi.)
E' quindi presumibile che se scrivi "office" avrai qualsiasi programma che tratti file da ufficio; se scrivi "game", avrai tutti i giochi appartenenti alla categoria "game" e così via.
Se hai installato il programma "locate", che indicizza il tuo disco, higgins lo usa per proporti i risultati della ricerca in modo abbastanza veloce.
Per ultimo, se scrivi =4+4 oppure =sin(4)^2, avrai il risultato dell'operazione.

Essendo un launcher, è comodo che l'utente possa lanciarlo con una combinazione di tasti.
Questa dev'essere registrata in X11 come scorciatoia globale, e a quanto pare gambas non implementa questa cosa; per cui bisogna ricorrere alla programmazione di api a più basso livello come quelle di X11.

So che da quel messaggio in uscita, ma non capisco dove mettere le mani per impedirlo;  :hard:; non credo comunque sia grave.

12
Programmazione / Higgins: un lanciatore per gambas
« il: 13 Aprile 2016, 15:45:23 »
Sto scrivendo un lanciatore di applicazioni, si chiama "higgins", come il maggiordomo di Magnum Pi :)
https://github.com/kokoko3k/higgins/blob/master/README

Attualmente è in grado di fare calcoli, cercare applicazioni, file (tramite locate), e lanciare comandi eventualmente in un terminale.

Quello che manca, e che vorrei integrare, è la registrazione di hotkey globali, di modo che possa essere richiamato tramite una combinazione di tasti senza l'ausilio di helper esterni (come xbindkeys e quelli integrati in kde).

Non ho trovato nulla nella documentazione ufficiale.
L'unico esempio che ho trovato, questo:
http://gambas.8142.n7.nabble.com/How-to-show-a-form-with-keyboard-shortcut-td25183.html
..Ma parla di programmazione delle Xlib a basso livello, troppo basso per me, ed oltretutto non mi funziona nemmeno.
C'è qualcuno in grado di aiutarmi?

A parte questo, estendo l'invito a chiunque volesse contribuire ad allargare le funzionalità di higgins.

13
Programmazione / Re:Evidenziamento di stringhe in un testo.
« il: 16 Febbraio 2016, 15:28:48 »
Grazie per i complimenti, xt7 è un progetto che porto avanti ormai da 7 anni circa; ed ho iniziato a scriverlo parallelamente all'imparare gambas stesso; ed infatti il codice nacque sporco; poi ripulito negli anni, ma ancora si porta dietro qualche schifezza...

Chiesi aiuto per la traduzione anni addietro proprio su questo forum, ma ci tengo a precisare che chiunque volesse contribuire è ben accetto; è su github anche per quello ;)
...in particolare una modifica assai tosta per le mie conoscenze, sarà quella interagire con mpv tramite la libreria condivisa libmpv, invece che tramite l'eseguibile; anche in ottica wayland...

14
Programmazione / Re:Evidenziamento di stringhe in un testo.
« il: 12 Febbraio 2016, 18:32:41 »
Ok, non lo avevo capito :sleepy:
Quello è una piccola parte di un altro progetto che vorrei passare a qt5, aspetterò...
https://github.com/kokoko3k/xt7-player-mpv

15
Programmazione / Re:Evidenziamento di stringhe in un testo.
« il: 10 Febbraio 2016, 15:33:10 »
Scusa il ritardo della risposta.
A parte quello che faccio nel filmato, ossia selezionare righe intere, serve anche selezionare parzialmente le linee, così come è possibile fare con un editor di testo qualsiasi.

Es:
prima linea testo da
selezionare
seconda linea

Pagine: [1] 2 3 4