Motif Maria Alice G. V. Ferreira 2003 Maria Alice G. V. Ferreira – EP – USP - 2003 MOTIF - Padrão para interfaces “Mecanismo e não política” - critério de projeto do XWindows fornece um mecanismo para a implementação de interfaces Homem-máquina, mas não força a aparência dos programas que utilizam o padrão. • portabilidade • “look and feel” próprio de cada projetista não tolhe a criatividade. X Intrinsics (Xt) - introduz o conceito de “widget”: um objeto auto-suficiente, que fornece algum tipo de funcionalidade de interface (produzido pelo X Consortium) Maria Alice G. V. Ferreira – EP – USP - 2003 Arquitetura do MOTIF Desenvolvimento por camadas Aplicativo MOTIF (Xm) X Intrinsics (Xt) Xlib X-Protocol Maria Alice G. V. Ferreira – EP – USP - 2003 Xlib, Xt e Xm Xlib - fornece a interface em linguagem C que permite ao aplicativo se comunicar com o X-Protocol Xt - fornece elementos de nível mais alto que o Xlib para o programador: Objetos, que são as widgets Manipulação da geometria dos widgets Tratamento dos eventos: identificação e despacho Xm – Aspectos de nível de abstração mais alto: aspecto visual tridimensional, drag and drop, gerenciador de janelas etc UIL – User Interface Language Maria Alice G. V. Ferreira – EP – USP - 2003 Vantagens da orientação a objetos Classe e instância Herança - novos objetos podem ser gerados a partir de objetos já existentes, de forma organizada: • os programas que usavam os objetos “antigos” continuam usando estes objetos • os programas que necessitam dos novos objetos utilizam somente os “novos” objetos - os herdados Hierarquia de objetos - conjunto dos objetos antigos (ancestrais) e novos (descendentes) --> facilita a reutilização das classes Valem todos os termos definidos para objetos. Cada “widget” do Motif é um objeto. Maria Alice G. V. Ferreira – EP – USP - 2003 Object RectObj Core XmPrimitive Composite Constraint XmGadget Shell XmManager Figura 2.1. - Programming Motif - Keith D. Gregory - Springer-Verlag, New York, 1992 Maria Alice G. V. Ferreira – EP – USP - 2003 Árvore de Classes do Motif A árvore de classe baseia-se no conceito de Herança, central à implementação do Motif: classes de suporte classes instanciáveis RectObj, Object, Core - raiz dos conjuntos de widgets. Fornecem funções de instanciação e manutenção do nível básico do sistema de janelas. Xm Primitive - classe que suporta as widgets primitivas, ou seja, as que não são superclasses para outras classes. Fornecem detalhes de aparência às primitivas. Composite - widgets que podem dar origem a outras widgets - definidas por Xt. Maria Alice G. V. Ferreira – EP – USP - 2003 Algumas implementações para MOTIF Athena Motif Open Look Xt Intrinsics Motif Xt Motif Interviews Motif Garnet Fonte: User Interface Software Tools - Brad A. Myers - Submitted for Publication, 1994. Maria Alice G. V. Ferreira – EP – USP - 2003 Conceitos Modelo centrado no usuário – o usuário detém o controle da interface. Separação entre aplicação e interface Mecanismo de “callback” típico “Widgets” com restrições (constraints) – objetos que estão “amarrados” aos objetos-pai por compromissos especificados. Maria Alice G. V. Ferreira – EP – USP - 2003 Conceitos Recursos (atributos) - interface entre o programador e o código interno da “widget”. Recursos possuem valores associados. Uma “widget” típica possui dúzias de recursos, mas a maioria é herdada da superclasse-mãe. Os recursos são identificados por nomes (ex: topShadowColor). Para se atribuir ou consultar um recurso em um programa é necessário conhecer-se o seu nome. Valor Default - é o valor atribuído ao recurso caso o projetista não atribua um valor próprio, no programa. Arquivos de recursos - arquivos em formato texto, que especificam os valores iniciais para os recursos das “widgets” de um programa (similares aos *.sui da SUIT). Maria Alice G. V. Ferreira – EP – USP - 2003 Exemplo TheProg Form_1 Label_1 Form_1 Label_2 Form_2 Label_1 Label_1 Label_2 Label_2 Form_2 TheProg TheProg.Form_1 TheProg.Form_1.Label_ 1 TheProg.Form_1.Label_ 2 Maria Alice G. V. Ferreira – EP – USP - 2003 Label_1 Label_2 TheProg.Form_1.Form_2 TheProg.Form_1.Form_2.Label_1 TheProg.Form_1.Form_2.Label_2 Resource file – corresponde a figura anterior (trecho) ! Sample resource file to produce output of figure 3.3 ! *.foreground: Black *.background: White TheProg.Form_1.height: TheProg.Form_1.width: TheProg.Form_1.background: 200 300 Gray25 *Form_2.height: *Form_2.width: *Form_2.background: 100 300 Gray50 *XmLabel1.height: *XmLabel1.width: 50 100 *.Label_1.fontList: -*-times-medium-r-*--*-180-* *.Form_1.Label_2.fontList: *.Form_1.Label_1.alignment: *.Form_1.Label_2.alignment: -*-times-medium-r-*--*-180-* ALIGNMENT_BEGINNING ALIGNMENT_END Maria Alice G. V. Ferreira – EP – USP - 2003 Eventos tratados no sentido da programação por eventos o programador deve especificar funções a serem executadas quando da ocorrência de um evento e a “widget” é responsável em chamá-las “callback functions” XtMainLoop - é a função responsável pelo gerenciamento dos eventos e seu encaminhamento apropriado às “widgets” responsáveis pelo seu tratamento. o evento de mouse é encaminhado a janela de menor prioridade na hierarquia, localizada na posição em que ocorre o evento. Determina-se se esta janela deseja tratar o evento, o que é feito através de “event mask”. o evento de teclado é encaminhado à janela que possui o focus do teclado. Maria Alice G. V. Ferreira – EP – USP - 2003 Eventos (cont) “timestamp” - contagem em milisegundos a partir do início de operação do servidor (32 bits); reiniciado a cada 49,71 dias, aproximadamente. A maioria dos eventos são manipulados pelas próprias “widgets”. Os programas recebem os eventos registrando um gerenciador de eventos para cada “widget”. O nome do evento é especificado, juntamente com o nome da rotina que irá manipulá-lo. Cada “widget” mantém uma lista destes gerenciadores para cada tipo de evento. Os eventos são registrados através de XtAddEventHandler; esta função adiciona um gerenciador de eventos à lista de cada “widget”; se existem vários gerenciadores para um determinado evento, eles são chamados sem ordem préestabelecida. Maria Alice G. V. Ferreira – EP – USP - 2003 Tipos de Eventos Categoria Client Communications Colormap State Exposure Keyboard Focus Keyboard Input Maria Alice G. V. Ferreira – EP – USP - 2003 Eventos ClientMessage PropertyNotify SelectionClear SelectionNotify SelectionRequest ColormapNotify Expose GraphicsExpose NoExpose FocusIn FocusOut KeyPress KeyRelease Tipos de Eventos (cont) Categoria Pointer / Button Keymap State Structure Control Maria Alice G. V. Ferreira – EP – USP - 2003 Eventos ButtonPress ButtonRelease EnterNotify LeaveNotify MotionNotify KeymapNotify CirculateRequest ConfigureRequest MapRequest ResizeRequest Tipos de Eventos Categoria Window State Maria Alice G. V. Ferreira – EP – USP - 2003 Eventos CirculateNotify ConfigureNotify CreateNotify DestroyNotify GravityNotify MapNotify MappingNotify ReparentNotify UnmapNotify VisibilityNotify Máscaras de Eventos (na forma: Máscara/Evento/Comentário) ButtonMotionNotify / MotionNotify / informa se algum botão do mouse foi pressionado enquanto o mouse se movimenta Button1MotionMask / MotionNotify / informa se o botão 1 do mouse foi pressionado enquanto o mouse se movimenta Idem para os demais botões ButtonPressMask / ButtonPress / informa se algum botão do mouse foi pressionado ButtonReleaseMask / ButtonRelease / informa se algum botão do mouse foi solto etc.......... Maria Alice G. V. Ferreira – EP – USP - 2003 Árvore de classe de Botões do Motif Object RectObj Core XmGadget XmPrimitive Composite XmArrowButton XmLabel XmDrawnButton XmCascadeButton Maria Alice G. V. Ferreira – EP – USP - 2003 XmToggleButton XmPushButton XmPushButton - atributos Maria Alice G. V. Ferreira – EP – USP - 2003 XmPushButton – atributos (herdados – parcial) Maria Alice G. V. Ferreira – EP – USP - 2003 XmPushButton – atributos (herdados – parcial) Maria Alice G. V. Ferreira – EP – USP - 2003 XmPushButton – atributos (herdados – parcial) Maria Alice G. V. Ferreira – EP – USP - 2003 XMotion Event typedef struct { int type; unsigned long serial; Boolean send_event; Display *display; Window window; Window root; Window subwindow; Time time; //timestamp int x,y; // da janela onde ocorre o evento int x_root, y_root; unsigned int_state; //estado dos modificadores, ao //ocorrer o evento char is_hint; Boolean same_screen;} XMotionEvent; Maria Alice G. V. Ferreira – EP – USP - 2003 Program Template #include <Xm/Xm.h> widget appshell; Carrega X11/Intrinsic.h void main(argc,argv) int argc; char *argv[]; { appshell = XtInitialize argv[0],”Example_template”,NULL,0,&argc,&argv); // Incluir código do programa XtRealizeWidget (appshell); XtMainLoop(); } Realiza a captura de eventos Maria Alice G. V. Ferreira – EP – USP - 2003 Gabarito do programa (comentários) • Shell - uma “widget que fornece uma ligação entre o programa e a árvore-raiz. Permite a troca de informação entre o programa e o Window Manager • appshell - o shell de nível mais alto em torno de um programa Maria Alice G. V. Ferreira – EP – USP - 2003 // inserir código the_label = XmCreateLabel (appshell,”TheLabel”,NULL,0); XtManageChild (the_label); XtAddEventHandler(the_label,PointerMotionMask| ButtonPressMask| EnterWindowMask| LeaveWindowMask, False,EvtHandler,NULL); Eventos a serem notificados Nome do gerenciador de eventos Maria Alice G. V. Ferreira – EP – USP - 2003 Gerenciador de eventos void EvtHandler(w,client_data,evt_ptr); widget w; caddr_t client_data; XEvent *evt_ptr; { switch (evt_ptr->type) { case ButtonPress:.....break; case EnterNotify:.....break; case LeaveNotify:.....break; case MotionNotify:....break; default:break; } } Maria Alice G. V. Ferreira – EP – USP - 2003 Referências bibliográficas Programming Motif - Keith D. Gregory - Springer-Verlag, New York, 1992. Links: http://www.opengroup.org/openmotif/ Maria Alice G. V. Ferreira – EP – USP - 2003