2 /*****************************************************************************
3 ** This is the DevWinList custom class, a sub class of Window.mui.
4 ******************************************************************************/
8 #define USE_INLINE_STDARG
10 #include <proto/muimaster.h>
11 #include <proto/exec.h>
12 #include <proto/dos.h>
13 #include <proto/poseidon.h>
14 #include <proto/intuition.h>
15 #include <proto/graphics.h>
16 #include <proto/usbclass.h>
17 #include <proto/icon.h>
18 #include <proto/utility.h>
21 #include "ActionClass.h"
22 #include "IconListClass.h"
23 #include "DevWinClass.h"
24 #include "CfgListClass.h"
26 extern struct ExecBase
*SysBase
;
27 extern struct Library
*ps
;
28 extern struct IntuitionBase
*IntuitionBase
;
29 extern struct Library
*UtilityBase
;
30 /*extern struct IntuitionBase *IntuitionBase;
31 extern struct DosLibrary *DOSBase;*/
33 #define NewList(list) NEWLIST(list)
35 static char *overridepowerstrings
[] =
38 "Override to bus-powered",
39 "Override to self-powered",
44 /* /// "AllocIfEntry()" */
45 struct IfListEntry
* AllocIfEntry(struct DevWinData
*data
, struct Node
*pif
, BOOL intend
)
47 struct IfListEntry
*iflnode
;
48 iflnode
= psdAllocVec(sizeof(struct IfListEntry
));
52 AddTail(&data
->iflist
, &iflnode
->node
);
58 /* /// "FreeIfEntry()" */
59 void FreeIfEntry(struct DevWinData
*data
, struct IfListEntry
*iflnode
)
61 Remove(&iflnode
->node
);
66 /* /// "InterfaceListDisplayHook()" */
67 AROS_UFH3(LONG
, InterfaceListDisplayHook
,
68 AROS_UFHA(struct Hook
*, hook
, A0
),
69 AROS_UFHA(char **, strarr
, A2
),
70 AROS_UFHA(struct IfListEntry
*, iflnode
, A1
))
79 struct IconListData
*data
;
80 struct DevWinData
*devdata
= (struct DevWinData
*) hook
->h_Data
;
93 struct Library
*bindingcls
;
94 data
= (struct IconListData
*) INST_DATA(IconListClass
->mcc_Class
, devdata
->iflvobj
);
96 psdGetAttrs(PGA_INTERFACE
, iflnode
->pif
,
97 IFA_InterfaceNum
, &ifnum
,
98 IFA_AlternateNum
, &ifaltnum
,
100 IFA_SubClass
, &ifsubclass
,
101 IFA_Protocol
, &ifproto
,
102 IFA_InterfaceName
, &ifname
,
103 IFA_NumEndpoints
, &ifnumeps
,
104 IFA_Binding
, &binding
,
105 IFA_BindingClass
, &bindingcls
,
107 psdSafeRawDoFmt(buf1
, 12, "%ld/%ld", ifnum
, ifaltnum
);
111 case STILLIMG_CLASSCODE
:
114 case BLUETOOTH_CLASSCODE
:
117 case FWUPGRADE_CLASSCODE
:
120 case VENDOR_CLASSCODE
:
122 case SECURITY_CLASSCODE
:
124 case SMARTCARD_CLASSCODE
:
126 case CDCDATA_CLASSCODE
:
130 case MASSSTORE_CLASSCODE
:
132 case PRINTER_CLASSCODE
:
134 case PHYSICAL_CLASSCODE
:
138 case CDCCTRL_CLASSCODE
:
140 case AUDIO_CLASSCODE
:
144 psdSafeRawDoFmt(buf3
, 48, "\33O[%08lx] %ld (%s)",
145 data
->mimainlist
[clsimg
],
147 psdNumToStr(NTS_COMBOCLASS
, (ifclass
<<NTSCCS_CLASS
)|(ifsubclass
<<NTSCCS_SUBCLASS
)|(ifproto
<<NTSCCS_PROTO
)|
148 NTSCCF_CLASS
|NTSCCF_SUBCLASS
|NTSCCF_PROTO
, "None"));
149 psdSafeRawDoFmt(buf4
, 8, "%ld", ifsubclass
);
150 psdSafeRawDoFmt(buf5
, 8, "%ld", ifproto
);
151 psdSafeRawDoFmt(buf6
, 8, "%ld", ifnumeps
);
160 *strarr
= bindingcls
->lib_Node
.ln_Name
;
165 *strarr
++ = "\33l\33uNum";
166 *strarr
++ = "\33l\33uName";
167 *strarr
++ = "\33l\33uClass";
168 *strarr
++ = "\33l\33uSub";
169 *strarr
++ = "\33l\33uProto";
170 *strarr
++ = "\33l\33uEPs";
171 *strarr
= "\33l\33uBinding";
178 /* /// "DevWinDispatcher()" */
179 AROS_UFH3(IPTR
, DevWinDispatcher
,
180 AROS_UFHA(struct IClass
*, cl
, A0
),
181 AROS_UFHA(Object
*, obj
, A2
),
182 AROS_UFHA(Msg
, msg
, A1
))
185 // There should never be an uninitialized pointer, but just in case, try to get an mungwall hit if so.
186 struct DevWinData
*data
= (struct DevWinData
*) 0xABADCAFE;
188 // on OM_NEW the obj pointer will be void, so don't try to get the data base in this case.
189 if(msg
->MethodID
!= OM_NEW
) data
= INST_DATA(cl
,obj
);
191 switch(msg
->MethodID
)
195 struct DevListEntry
*dlnode
;
196 struct IfListEntry
*iflnode
;
206 STRPTR devprodname
= NULL
;
214 #ifdef AROS_USB30_CODE
215 IPTR devissuperspeed
;
220 IPTR devisconfigured
;
221 IPTR devlowpower
= 0;
223 IPTR devdontpopup
= 0;
224 IPTR noclassbind
= 0;
225 IPTR overridepower
= 0;
226 IPTR devpowerdrain
= 0;
227 IPTR devpowersupply
= 0;
229 struct Node
*devhub
= NULL
;
230 STRPTR devhubname
= "";
244 struct List
*altiflist
;
247 struct Library
*bindingcls
;
249 STRPTR textbuf1
, textbuf2
, textbuf3
;
252 Object
*oldroot
= NULL
;
254 if(!(obj
= (Object
*) DoSuperMethodA(cl
, obj
, msg
)))
258 data
= INST_DATA(cl
, obj
);
259 NewList(&data
->iflist
);
260 data
->InterfaceDisplayHook
.h_Data
= data
;
261 data
->InterfaceDisplayHook
.h_Entry
= (APTR
) InterfaceListDisplayHook
;
263 dlnode
= (struct DevListEntry
*) GetTagData(MUIA_DevWin_DevEntry
, (IPTR
) NULL
, ((struct opSet
*) msg
)->ops_AttrList
);
267 dlnode
->devdata
= data
;
268 data
->dlnode
= dlnode
;
269 data
->pd
= dlnode
->pd
;
270 psdGetAttrs(PGA_DEVICE
, dlnode
->pd
,
272 DA_UsbVersion
, &devusbvers
,
274 DA_SubClass
, &devsubclass
,
275 DA_Protocol
, &devproto
,
276 DA_VendorID
, &devvendorid
,
277 DA_ProductID
, &devprodid
,
278 DA_Version
, &devversion
,
279 DA_Manufacturer
, &devmanufact
,
280 DA_OrigProductName
, &devprodname
,
281 DA_ProductName
, &customname
,
282 DA_SerialNumber
, &devserial
,
283 DA_IDString
, &devidstr
,
284 DA_CurrLangID
, &devcurrlang
,
285 DA_LangIDArray
, &devlangarray
,
286 DA_IsLowspeed
, &devislowspeed
,
287 DA_IsHighspeed
, &devishighspeed
,
288 #ifdef AROS_USB30_CODE
289 DA_IsSuperspeed
, &devissuperspeed
,
291 DA_IsConnected
, &devisconnected
,
292 DA_HasAddress
, &devhasaddress
,
293 DA_HasDevDesc
, &devhasdevdesc
,
294 DA_IsConfigured
, &devisconfigured
,
295 DA_LowPower
, &devlowpower
,
296 DA_NumConfigs
, &devnumcfgs
,
297 DA_ConfigList
, &cfgs
,
298 DA_Binding
, &binding
,
299 DA_BindingClass
, &bindingcls
,
300 DA_InhibitPopup
, &devdontpopup
,
301 DA_InhibitClassBind
, &noclassbind
,
302 DA_OverridePowerInfo
, &overridepower
,
303 DA_PowerSupply
, &devpowersupply
,
304 DA_PowerDrained
, &devpowerdrain
,
305 DA_AtHubPortNumber
, &devhubport
,
306 DA_HubDevice
, &devhub
,
310 psdGetAttrs(PGA_DEVICE
, devhub
,
311 DA_ProductName
, &devhubname
,
315 if(!devprodname
) /* backward compatibility */
317 devprodname
= customname
;
319 textbuf1
= psdAllocVec(3*1024);
320 textbuf2
= &textbuf1
[1*1024];
321 textbuf3
= &textbuf1
[2*1024];
326 psdSafeRawDoFmt(textbuf1
, 1024, "%s\n%ld (=0x%04lx)\n%04lx\n%s\n%ld (=0x%04lx)\n%s\n%s\n%ld mA supply / %ldmA drained",
327 devprodname
, devprodid
, devprodid
, devversion
, devmanufact
, devvendorid
, devvendorid
,
328 psdNumToStr(NTS_VENDORID
, (LONG
) devvendorid
, "unknown"),
330 devpowersupply
, devpowerdrain
);
333 devstate
= "Configured";
335 else if(devhasdevdesc
)
337 devstate
= "DevDescriptor";
339 else if(devhasaddress
)
341 devstate
= "Valid addr";
343 else if(devisconnected
)
345 devstate
= "Connected";
350 psdSafeRawDoFmt(textbuf2
, 1024, "%s%s\n%s\n%ld\nPort %ld at %s\n%ld (%s)\n%ld\n%ld\n%04lx",
351 devstate
, (devlowpower
? " (Lowpower)" : ""),
352 #ifdef AROS_USB30_CODE
353 (devislowspeed
? "Lowspeed" : (devissuperspeed
? "Superspeed" : (devishighspeed
? "Highspeed" : "Fullspeed"))),
355 (devislowspeed
? "Lowspeed" : (devishighspeed
? "Highspeed" : "Fullspeed")),
358 devhubport
, devhubname
,
360 psdNumToStr(NTS_COMBOCLASS
,
361 (devclass
<<NTSCCS_CLASS
)|(devsubclass
<<NTSCCS_SUBCLASS
)|(devproto
<<NTSCCS_PROTO
)|
362 NTSCCF_CLASS
|NTSCCF_SUBCLASS
|NTSCCF_PROTO
, "None"),
363 devsubclass
, devproto
, devusbvers
);
369 psdGetAttrs(PGA_CONFIG
, pc
,
370 CA_SelfPowered
, &cfgselfpow
,
371 CA_RemoteWakeup
, &cfgremwake
,
372 CA_ConfigNum
, &cfgnum
,
373 CA_MaxPower
, &cfgmaxpower
,
374 CA_ConfigName
, &cfgname
,
375 CA_NumInterfaces
, &cfgnumifs
,
376 CA_InterfaceList
, &ifs
,
379 psdSafeRawDoFmt(&textbuf3
[strlen(textbuf3
)], (ULONG
) 1024-strlen(textbuf3
),
380 "Config %ld (%s)\n Attributes: %s%s\n MaxPower: %ld mA\n %ld interface%s.\n",
382 cfgselfpow
? "self-powered " : "bus-powered ",
383 cfgremwake
? "remote-wakeup" : "",
384 cfgmaxpower
, cfgnumifs
,
385 (cfgnumifs
!= 1) ? "s" : "");
389 data
->classpopup
= CreateClassPopup();
390 data
->contents
= VGroup
,
392 MUIA_ShortHelp
, "These fields show some general information\n"
393 "on the USB device. Note that strings are not\n"
394 "mandatory and might be artificially created\n"
395 "from the product and vendor IDs.",
396 MUIA_FrameTitle
, "General device information",
397 Child
, LabelB("Product name:\nProduct ID:\nProduct version:\nManufacturer:\nVendor:\n\nSerial #:\nPower State:"),
400 MUIA_Background
, MUII_TextBack
,
401 MUIA_Text_Contents
, textbuf1
,
404 Child
, LabelB("State:\nSpeed:\nAddress:\nConnected:\nDevClass:\nSubclass:\nProtocol:\nUSB vers:"),
407 MUIA_Background
, MUII_TextBack
,
408 MUIA_Text_Contents
, textbuf2
,
412 Child
, Label("Custom Device Name:"),
413 Child
, data
->cwnameobj
= StringObject
,
414 MUIA_ShortHelp
, "You can enter a more readable name\n"
415 "here, if the device does not provide\n"
418 //MUIA_HorizWeight, 10,
420 MUIA_String_Contents
, customname
,
421 MUIA_String_AdvanceOnCR
, TRUE
,
424 MUIA_Group_SameWidth
, TRUE
,
425 Child
, data
->changenameobj
= TextObject
,
426 MUIA_ShortHelp
, "Click on this button to change the name of the\n"
427 "name of the device to the new one.",
429 MUIA_Background
, MUII_ButtonBack
,
431 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
432 MUIA_Text_Contents
, "\33c Change Name ",
434 Child
, data
->resetnameobj
= TextObject
,
435 MUIA_ShortHelp
, "Removes the custom name and restores\n"
436 "the original one that Poseidon generated.",
438 MUIA_Background
, MUII_ButtonBack
,
440 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
441 MUIA_Text_Contents
, "\33c Restore Name ",
446 Child
, Label("Disable class bindings:"),
447 Child
, data
->noclassbindobj
= ImageObject
, ImageButtonFrame
,
448 MUIA_ShortHelp
, "Skips this device during class scan,\n"
449 "making it available for application bindings.",
450 MUIA_Background
, MUII_ButtonBack
,
452 MUIA_InputMode
, MUIV_InputMode_Toggle
,
453 MUIA_Image_Spec
, MUII_CheckMark
,
454 MUIA_Image_FreeVert
, TRUE
,
455 MUIA_Selected
, noclassbind
,
456 MUIA_ShowSelState
, FALSE
,
459 Child
, Label("Inhibit popup:"),
460 Child
, data
->dontpopupobj
= ImageObject
, ImageButtonFrame
,
461 MUIA_ShortHelp
, "Inhibits a popup window appearing\n"
462 "for this particular device.",
463 MUIA_Background
, MUII_ButtonBack
,
465 MUIA_InputMode
, MUIV_InputMode_Toggle
,
466 MUIA_Image_Spec
, MUII_CheckMark
,
467 MUIA_Image_FreeVert
, TRUE
,
468 MUIA_Selected
, devdontpopup
,
469 MUIA_ShowSelState
, FALSE
,
472 Child
, Label("Power info:"),
473 Child
, data
->overridepowerobj
= CycleObject
,
475 MUIA_ShortHelp
, "Some devices and hubs give wrong information\n"
476 "about being self-powered, when they're actually\n"
477 "bus-powered, making me lose my hair.\n"
478 "Hence, you can override the information the\n"
479 "device gives about itself, allowing the power\n"
480 "management to work nicely.",
481 MUIA_Cycle_Entries
, overridepowerstrings
,
482 MUIA_Cycle_Active
, overridepower
,
487 MUIA_ShortHelp
, "This is a list of supported languages\n"
488 "for the USB device. It's not manadatory\n"
489 "and in fact cheap devices won't even use\n"
490 "any string descriptors in their firmware.",
491 Child
, data
->langlvobj
= ListviewObject
,
492 MUIA_FrameTitle
, "Supported languages",
493 MUIA_Listview_List
, ListObject
,
498 Child
, LabelB("Current language:"),
501 MUIA_Background
, MUII_TextBack
,
502 MUIA_Text_Contents
, psdNumToStr(NTS_LANGID
, devcurrlang
, "<unknown>"),
507 MUIA_ShortHelp
, "USB devices are able to support\n"
508 "different configurations. However,\n"
509 "this is really rare.",
510 MUIA_FrameTitle
, "Configurations",
511 Child
, data
->cfglvobj
= FloattextObject
,
513 MUIA_Floattext_Text
, textbuf3
,
518 Child
, ListviewObject
,
519 MUIA_ShortHelp
, "This is a list of so called interfaces\n"
520 "the device has. USB devices can be built\n"
521 "as compound, so that each interface has\n"
522 "different functions. Each interface can be\n"
523 "bound to a different class.",
524 MUIA_FrameTitle
, "Interfaces",
525 MUIA_Listview_List
, data
->iflvobj
=
526 NewObject(IconListClass
->mcc_Class
, 0, MUIA_ContextMenu
, data
->classpopup
, InputListFrame
, MUIA_List_MinLineHeight
, 16, MUIA_List_Format
, "BAR,BAR,BAR,BAR,BAR,BAR,", MUIA_List_Title
, TRUE
,MUIA_List_DisplayHook
, &data
->InterfaceDisplayHook
, TAG_END
),
530 MUIA_Group_SameWidth
, TRUE
,
531 Child
, data
->clsscanobj
= TextObject
,
532 MUIA_ShortHelp
, "Clicking on this button will start a class scan. This means that\n"
533 "each device will be examined if it matches some of the standard\n"
534 "classes in the system. In this case, a binding will be established\n"
535 "and the functionality will be added to the system automatically.",
537 MUIA_Background
, MUII_ButtonBack
,
539 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
540 MUIA_Text_Contents
, "\33c Class Scan ",
542 Child
, data
->unbindobj
= TextObject
,
543 MUIA_ShortHelp
, "Manually removes an interface binding. This can be\n"
544 "useful to temporarily deactivate a device.\n"
545 "Use 'Class Scan' to reactivate the binding.",
548 MUIA_Background
, MUII_ButtonBack
,
550 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
551 MUIA_Text_Contents
, "\33c Release Binding ",
553 Child
, data
->cfgobj
= TextObject
,
554 MUIA_ShortHelp
, "If there is an interface binding and the class\n"
555 "supports a configuration GUI. Clicking on this\n"
556 "button will open the interface preferences window.\n\n"
557 "Note well, that the corrsponding button for the\n"
558 "device binding settings can be found in the device\n"
562 MUIA_Background
, MUII_ButtonBack
,
564 MUIA_InputMode
, MUIV_InputMode_RelVerify
,
565 MUIA_Text_Contents
, "\33c Settings ",
569 psdFreeVec(textbuf1
);
572 set(obj
, MUIA_Window_IsSubWindow
, FALSE
);
573 set(obj
, MUIA_Window_Title
, devidstr
);
574 get(obj
, MUIA_Window_RootObject
, &oldroot
);
575 set(obj
, MUIA_Window_RootObject
, data
->contents
);
576 DoMethod(oldroot
, OM_DISPOSE
);
577 set(obj
, MUIA_Window_ID
, MAKE_ID('D','I','N','F'));
580 UWORD
*wptr
= devlangarray
;
583 DoMethod(data
->langlvobj
, MUIM_List_InsertSingle
,
584 psdNumToStr(NTS_LANGID
, (ULONG
) *wptr
++, "<unknown>"), MUIV_List_Insert_Bottom
);
587 DoMethod(data
->langlvobj
, MUIM_List_InsertSingle
, "<none>", MUIV_List_Insert_Bottom
);
592 psdGetAttrs(PGA_CONFIG
, pc
,
593 CA_InterfaceList
, &ifs
,
599 iflnode
= AllocIfEntry(data
, pif
, FALSE
);
602 DoMethod(data
->iflvobj
, MUIM_List_InsertSingle
, iflnode
, MUIV_List_Insert_Bottom
);
604 psdGetAttrs(PGA_INTERFACE
, pif
,
605 IFA_AlternateIfList
, &altiflist
,
607 altpif
= altiflist
->lh_Head
;
608 while(altpif
->ln_Succ
)
610 iflnode
= AllocIfEntry(data
, altpif
, TRUE
);
613 DoMethod(data
->iflvobj
, MUIM_List_InsertSingle
, iflnode
, MUIV_List_Insert_Bottom
);
616 altpif
= altpif
->ln_Succ
;
623 DoMethod(data
->clsscanobj
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
624 obj
, 1, MUIM_DevWin_Dev_Bind
);
625 DoMethod(data
->unbindobj
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
626 obj
, 1, MUIM_DevWin_If_Unbind
);
627 DoMethod(data
->cfgobj
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
628 obj
, 2, MUIM_DevWin_If_Config
);
629 DoMethod(data
->iflvobj
, MUIM_Notify
, MUIA_Listview_DoubleClick
, TRUE
,
630 obj
, 1, MUIM_DevWin_If_Config
);
631 DoMethod(data
->iflvobj
, MUIM_Notify
, MUIA_List_Active
, MUIV_EveryTime
,
632 obj
, 1, MUIM_DevWin_If_Activate
);
633 DoMethod(data
->iflvobj
, MUIM_Notify
, MUIA_ContextMenuTrigger
, MUIV_EveryTime
,
634 obj
, 2, MUIM_DevWin_If_FBind
, MUIV_TriggerValue
);
635 DoMethod(data
->cwnameobj
, MUIM_Notify
, MUIA_String_Acknowledge
, MUIV_EveryTime
,
636 obj
, 1, MUIM_DevWin_SetCustomName
);
637 DoMethod(data
->changenameobj
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
638 obj
, 1, MUIM_DevWin_SetCustomName
);
639 DoMethod(data
->resetnameobj
, MUIM_Notify
, MUIA_Pressed
, FALSE
,
640 obj
, 1, MUIM_DevWin_ResetCustomName
);
641 DoMethod(data
->dontpopupobj
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
,
642 obj
, 1, MUIM_DevWin_PopupInhibitChg
);
643 DoMethod(data
->noclassbindobj
, MUIM_Notify
, MUIA_Selected
, MUIV_EveryTime
,
644 obj
, 1, MUIM_DevWin_NoClassBindChg
);
645 DoMethod(data
->overridepowerobj
, MUIM_Notify
, MUIA_Cycle_Active
, MUIV_EveryTime
,
646 obj
, 1, MUIM_DevWin_PowerInfoChg
);
648 CoerceMethod(cl
, obj
, OM_DISPOSE
);
657 struct IfListEntry
*iflnode
;
660 if(data
->dlnode
->infowindow
)
662 data
->dlnode
->infowindow
= NULL
;
664 data
->dlnode
->devdata
= NULL
;
668 DoMethod(data
->classpopup
, OM_DISPOSE
);
669 data
->classpopup
= NULL
;
671 iflnode
= (struct IfListEntry
*) data
->iflist
.lh_Head
;
672 while(iflnode
->node
.ln_Succ
)
674 FreeIfEntry(data
, iflnode
);
675 iflnode
= (struct IfListEntry
*) data
->iflist
.lh_Head
;
681 case MUIM_DevWin_Dev_Bind
:
683 DoMethod(obj
, MUIM_DevWin_If_Activate
);
684 DoMethod(data
->iflvobj
, MUIM_List_Redraw
, MUIV_List_Redraw_All
);
687 case MUIM_DevWin_If_Activate
:
691 IPTR hascfggui
= FALSE
;
692 struct Library
*UsbClsBase
;
693 struct IfListEntry
*iflnode
;
695 DoMethod(data
->iflvobj
, MUIM_List_GetEntry
, MUIV_List_GetEntry_Active
, &iflnode
);
698 psdGetAttrs(PGA_INTERFACE
, iflnode
->pif
,
699 IFA_Binding
, &binding
,
700 IFA_BindingClass
, &puc
,
702 set(data
->unbindobj
, MUIA_Disabled
, !binding
);
705 psdGetAttrs(PGA_USBCLASS
, puc
,
706 UCA_ClassBase
, &UsbClsBase
,
708 usbGetAttrs(UGA_CLASS
, NULL
,
709 UCCA_HasBindingCfgGUI
, &hascfggui
,
711 set(data
->cfgobj
, MUIA_Disabled
, !hascfggui
);
713 set(data
->cfgobj
, MUIA_Disabled
, TRUE
);
715 set(data
->iflvobj
, MUIA_ContextMenu
, data
->classpopup
);
717 set(data
->unbindobj
, MUIA_Disabled
, TRUE
);
718 set(data
->cfgobj
, MUIA_Disabled
, TRUE
);
719 set(data
->iflvobj
, MUIA_ContextMenu
, NULL
);
724 case MUIM_DevWin_If_Unbind
:
727 struct IfListEntry
*iflnode
;
729 DoMethod(data
->iflvobj
, MUIM_List_GetEntry
, MUIV_List_GetEntry_Active
, &iflnode
);
732 psdGetAttrs(PGA_INTERFACE
, iflnode
->pif
,
733 IFA_Binding
, &binding
,
737 psdReleaseIfBinding(iflnode
->pif
);
738 set(data
->unbindobj
, MUIA_Disabled
, TRUE
);
739 set(data
->cfgobj
, MUIA_Disabled
, TRUE
);
740 DoMethod(data
->iflvobj
, MUIM_List_Redraw
, MUIV_List_Redraw_All
);
746 case MUIM_DevWin_If_Config
:
750 struct Library
*UsbClsBase
;
751 struct IfListEntry
*iflnode
;
753 DoMethod(data
->iflvobj
, MUIM_List_GetEntry
, MUIV_List_GetEntry_Active
, &iflnode
);
756 psdGetAttrs(PGA_INTERFACE
, iflnode
->pif
,
757 IFA_Binding
, &binding
,
758 IFA_BindingClass
, &puc
,
762 psdGetAttrs(PGA_USBCLASS
, puc
,
763 UCA_ClassBase
, &UsbClsBase
,
765 usbDoMethod(UCM_OpenBindingCfgWindow
, binding
);
771 case MUIM_DevWin_If_FBind
:
773 Object
*mi
= (Object
*) (((IPTR
*) msg
)[1]);
777 STRPTR devname
= NULL
;
779 struct IfListEntry
*iflnode
;
781 DoMethod(data
->iflvobj
, MUIM_List_GetEntry
, MUIV_List_GetEntry_Active
, &iflnode
);
784 get(mi
, MUIA_Menuitem_Title
, &name
);
785 if(!strcmp(name
, "None"))
789 psdGetAttrs(PGA_DEVICE
, data
->pd
,
790 DA_ProductName
, &devname
,
793 psdGetAttrs(PGA_INTERFACE
, iflnode
->pif
,
798 clever
= MUI_RequestA(_app(obj
), obj
, 0, NULL
, "I'm not dumb!|I'll reconsider",
799 "You are about to establish a forced \33binterface\33n\n"
800 "binding. As most people are not capable of reading the\n"
801 "manual and they cause more harm than good,\n"
802 "please make sure you know, what you're doing\n"
803 "and not breaking things (and then bugger me with\n"
804 "silly emails).", NULL
);
810 if(psdSetForcedBinding(name
, devid
, ifid
))
814 psdAddErrorMsg(RETURN_OK
, "Trident", "Forcing interface binding of %s to %s.", devname
, name
);
816 psdAddErrorMsg(RETURN_OK
, "Trident", "Removed forced interface binding of %s.", devname
);
824 case MUIM_DevWin_SetCustomName
:
827 STRPTR devidstr
= NULL
;
828 STRPTR oldname
= NULL
;
829 CONST_STRPTR newname
= "";
831 psdGetAttrs(PGA_DEVICE
, data
->pd
,
832 DA_IDString
, &devidstr
,
833 DA_ProductName
, &oldname
,
839 get(data
->cwnameobj
, MUIA_String_Contents
, &newname
);
844 if(oldname
&& !strcmp(newname
, oldname
))
848 pic
= psdGetUsbDevCfg("Trident", devidstr
, NULL
);
851 psdSetUsbDevCfg("Trident", devidstr
, NULL
, NULL
);
852 pic
= psdGetUsbDevCfg("Trident", devidstr
, NULL
);
856 if(psdAddStringChunk(pic
, IFFCHNK_NAME
, newname
))
858 psdAddErrorMsg(RETURN_OK
, "Trident", "Set new custom name '%s'.", newname
);
859 newnewname
= psdCopyStr(newname
);
862 psdSetAttrs(PGA_DEVICE
, data
->pd
,
863 DA_ProductName
, newnewname
,
870 set(data
->cwnameobj
, MUIA_String_Contents
, newname
);
871 DoMethod(data
->dlnode
->adata
->devlistobj
, MUIM_List_Redraw
, MUIV_List_Redraw_All
);
875 case MUIM_DevWin_ResetCustomName
:
878 STRPTR devidstr
= NULL
;
879 STRPTR oldname
= NULL
;
880 STRPTR origname
= NULL
;
882 psdGetAttrs(PGA_DEVICE
, data
->pd
,
883 DA_IDString
, &devidstr
,
884 DA_ProductName
, &oldname
,
885 DA_OrigProductName
, &origname
,
891 pic
= psdGetUsbDevCfg("Trident", devidstr
, NULL
);
894 if(psdRemCfgChunk(pic
, IFFCHNK_NAME
))
896 psdAddErrorMsg(RETURN_OK
, "Trident", "Custom name '%s' removed.", oldname
);
899 newname
= psdCopyStr(origname
);
902 psdSetAttrs(PGA_DEVICE
, data
->pd
,
903 DA_ProductName
, newname
,
910 psdGetAttrs(PGA_DEVICE
, data
->pd
,
911 DA_ProductName
, &oldname
,
913 set(data
->cwnameobj
, MUIA_String_Contents
, oldname
);
914 DoMethod(data
->dlnode
->adata
->devlistobj
, MUIM_List_Redraw
, MUIV_List_Redraw_All
);
918 case MUIM_DevWin_PopupInhibitChg
:
919 case MUIM_DevWin_NoClassBindChg
:
920 case MUIM_DevWin_PowerInfoChg
:
923 IPTR noclassbind
= 0;
924 IPTR overridepower
= 0;
925 get(data
->dontpopupobj
, MUIA_Selected
, &dontpopup
);
926 get(data
->noclassbindobj
, MUIA_Selected
, &noclassbind
);
927 get(data
->overridepowerobj
, MUIA_Cycle_Active
, &overridepower
);
929 psdSetAttrs(PGA_DEVICE
, data
->pd
,
930 DA_InhibitPopup
, dontpopup
,
931 DA_InhibitClassBind
, noclassbind
,
932 DA_OverridePowerInfo
, overridepower
,
938 return(DoSuperMethodA(cl
,obj
,msg
));