DCOP (Desktop COmmunications Protocol) es un mecanismo de IPC/RPC que se usa KDE para las comunicaciones entre aplicaciones del escritorio.
Las aplicaciones KDE proveen una o varias interfaes DCOP las cuales a su vez proveen métodos/funciones que pueden ser llamadas asíncronamente por otras aplicaciones.
El programa dcop nos proporciona acceso al sistema DCOP desde la línea de comandos. La sintaxis de la llamada al programa es la siguiente:
dcop [options] [application [object [function [arg1] [arg2] ... ] ] ]
También puede usarse la versión gráfica kdcop
.
Para comprobar que aplicaciones están disponibles, escribe dcop
sin argumentos
lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop kwin kicker konsole-10818 guidance-10871 konsole-10832 kded adept_notifier kmix knotify kio_uiserver konqueror-10903 minirok klauncher katapult knotes khotkeys kdesudo-12981 kdesktop klipper ksmserver knetworkmanager
Las aplicaciones que abren mas de una ventana de una vez aparecen como <application>-PID
.
Es posible usar el comodín *
:
casiano@europa:~$ dcop konsole* konsole-16440 konsole-16444 konsole-16445 konsole-16447 konsole-16493 konsole-16450¿En cual de estas consolas estoy ahora? Se puede obtener una referencia
casiano@europa:~$ echo $KONSOLE_DCOP DCOPRef(konsole-16444,konsole)
Esa referencia puede ser usada para llamar a los métodos públicos del objeto. Por ejemplo, podemos abrir una nueva pestaña con una sesión escribiendo:
casiano@europa:~$ dcop $KONSOLE_DCOP newSession session-8Vamos a echar un vistazo a los objetos en
konsole-10832
:
lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop konsole-10832 KBookmarkManager-/home/lusasoft/.kde/share/apps/konsole/bookmarks.xml KBookmarkNotifier KDebug MainApplication-Interface konsole-mainwindow#1 ksycoca session-10 session-11 session-2 session-3 session-4 session-5
Podemos asumir que konsole-mainwindow#1
es el objeto que estamos buscando; el objeto por
defecto (es decir, el que estamos buscando para controlar la aplicación) tiene
normalmente el mismo nombre que la aplicación
lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop konsole-10832 konsole-mainwindow#1 QCStringList interfaces() QCStringList functions() QVariant property(QCString property) bool setProperty(QCString name,QVariant property) QValueList<QCString> propertyNames(bool super) QCString name() void setName(QCString name) bool isTopLevel() bool isDialog() bool isModal() bool isPopup() bool isDesktop() bool enabled() void setEnabled(bool enabled) QRect geometry() void setGeometry(QRect geometry) QRect frameGeometry() int x() int y() QPoint pos() void setPos(QPoint pos) QSize frameSize() QSize size() void setSize(QSize size) int width() int height() QRect rect() QRect childrenRect() QRegion childrenRegion() QSizePolicy sizePolicy() void setSizePolicy(QSizePolicy sizePolicy) QSize minimumSize() void setMinimumSize(QSize minimumSize) QSize maximumSize() void setMaximumSize(QSize maximumSize) int minimumWidth() void setMinimumWidth(int minimumWidth) int minimumHeight() void setMinimumHeight(int minimumHeight) int maximumWidth() void setMaximumWidth(int maximumWidth) int maximumHeight() void setMaximumHeight(int maximumHeight) QSize sizeIncrement() void setSizeIncrement(QSize sizeIncrement) QSize baseSize() void setBaseSize(QSize baseSize) BackgroundMode backgroundMode() void setBackgroundMode(BackgroundMode backgroundMode) QColor paletteForegroundColor() void setPaletteForegroundColor(QColor paletteForegroundColor) QColor paletteBackgroundColor() void setPaletteBackgroundColor(QColor paletteBackgroundColor) QPixmap paletteBackgroundPixmap() void setPaletteBackgroundPixmap(QPixmap paletteBackgroundPixmap) QBrush backgroundBrush() QColorGroup colorGroup() QPalette palette() void setPalette(QPalette palette) BackgroundOrigin backgroundOrigin() void setBackgroundOrigin(BackgroundOrigin backgroundOrigin) bool ownPalette() QFont font() void setFont(QFont font) bool ownFont() QCursor cursor() void setCursor(QCursor cursor) bool ownCursor() QString caption() void setCaption(QString caption) QPixmap icon() void setIcon(QPixmap icon) QString iconText() void setIconText(QString iconText) bool mouseTracking() void setMouseTracking(bool mouseTracking) bool underMouse() bool isActiveWindow() bool focusEnabled() FocusPolicy focusPolicy() void setFocusPolicy(FocusPolicy focusPolicy) bool focus() bool updatesEnabled() void setUpdatesEnabled(bool updatesEnabled) bool visible() QRect visibleRect() bool hidden() void setHidden(bool hidden) bool shown() void setShown(bool shown) bool minimized() bool maximized() bool fullScreen() QSize sizeHint() QSize minimumSizeHint() QRect microFocusHint() bool acceptDrops() void setAcceptDrops(bool acceptDrops) bool autoMask() void setAutoMask(bool autoMask) bool customWhatsThis() bool inputMethodEnabled() void setInputMethodEnabled(bool inputMethodEnabled) double windowOpacity() void setWindowOpacity(double windowOpacity) bool rightJustification() void setRightJustification(bool rightJustification) bool usesBigPixmaps() void setUsesBigPixmaps(bool usesBigPixmaps) bool usesTextLabel() void setUsesTextLabel(bool usesTextLabel) bool dockWindowsMovable() void setDockWindowsMovable(bool dockWindowsMovable) bool opaqueMoving() void setOpaqueMoving(bool opaqueMoving) QCStringList actions() bool activateAction(QCString action) bool disableAction(QCString action) bool enableAction(QCString action) bool actionIsEnabled(QCString action) QCString actionToolTip(QCString action) DCOPRef action(QCString name) QMap<QCString,DCOPRef> actionMap() int getWinID() void grabWindowToClipBoard() void hide() void maximize() void minimize() void resize(int newWidth,int newHeight) void move(int newX,int newY) void setGeometry(int newX,int newY,int newWidth,int newHeight) void raise() void lower() void restore() void show() void close()
Vamos a minimizarla:
lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop konsole-10832 konsole-mainwindow#1 minimize
Otro ejemplo. Cambiemos el color de fondo:
casiano@europa:~$ dcop kdesktop KBackgroundIface setWallpaper /tmp/393_5052_2.jpg casiano@europa:~$ dcop kdesktop KBackgroundIface setColor '#E444F2' true casiano@europa:~$ dcop kdesktop KBackgroundIface setColor '#68F20B' true
He aqui un ejemplo que ilustra como establecer notas post-it con knotes desde la shell:
$dcop knotes KNotesIface QCStringList interfaces() QCStringList functions() int newNote(QString name,QString text) int newNoteFromClipboard(QString name) ASYNC showNote(int noteId) ASYNC hideNote(int noteId) ASYNC killNote(int noteId) QMap notes() ASYNC setName(int noteId,QString newName) ASYNC setText(int noteId,QString newText) QString text(int noteId) ASYNC sync(QString app) bool isNew(QString app,int noteId) bool isModified(QString app,int noteId)
Vamos a añadir una nota:
dcop knotes KNotesIface newNote "Titulo de la Nota" "Corregir exámenes"
Ahora veamos las notas que tenemos disponibles:
lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ dcop knotes KNotesIface notes libkcal-2096876672.442->Titulo de la Nota libkcal-461202155.843->03-05-09 15:06 libkcal-962646955.232->Una nota
lusasoft@LusaSoft:~/src/perl/perltesting/dcop$ cat -n dcop_control.pl 1 #!/usr/bin/perl -w 2 use strict; 3 use Log::Log4perl qw(:easy); 4 use Time::HiRes qw(usleep); 5 use Backtick::AutoChomp; 6 7 Log::Log4perl->easy_init($DEBUG); 8 my $logger = Log::Log4perl->get_logger(); 9 10 my @servers = qw{orion beowulf europa}; 11 12 my $konsole= `dcopstart konsole-script`; 13 14 $logger->warn("can't maximize window\n") if system("dcop $konsole konsole-mainwindow#1 maximize"); 15 16 my $thissession= qx{dcop $konsole konsole currentSession}; 17 18 # rename this window/session 19 system qq{dcop $konsole $thissession renameSession "init"}; 20 21 # start a new session tab for each server 22 for (@servers) { 23 # this output is displayed on the terminal which is running your script 24 $logger->debug("connecting to server: $_"); 25 26 # create another konsole tab and save handle in $newsession 27 my $newsession=`dcop $konsole konsole newSession "ssh $_"`; 28 29 # wait for shell startup - raise if needed 30 usleep(1000) while `dcop $konsole $newsession sessionPID` eq 0; 31 32 # rename the new session 33 !system(qq{dcop $konsole $newsession renameSession $_}) or $logger->warn("can't rename new session to $_\n"); 34 35 # and start the ssh session 36 !system(qq{dcop $konsole $newsession sendSession "exec ssh $_ @ARGV"}) or $logger->warn("can't exec ssh $_ @ARGV\n"); 37 38 } 39 40 # close the first session window 41 !system(qq{dcop $konsole $thissession closeSession > /dev/null}) or $logger->warn("can't close intial session\n"); 42 43 __END__