private void ForwardDelegateMethod(string selName, NSObject arg1) { var sel = new Selector(selName); if (_originalDelegate.RespondsToSelector(sel)) { void_objc_msgSend_IntPtr( _originalDelegate.Handle, sel.Handle, arg1 != null ? arg1.Handle : IntPtr.Zero); } }
protected virtual void CheckNSObjectProtocol(NSObject obj) { // not documented to allow null, but commonly used this way. OTOH it's not clear what code answer this // (it might be different implementations) but we can make sure that Apple allows null with this test // ref: https://bugzilla.xamarin.com/show_bug.cgi?id=35924 var kind_of_null = obj.IsKindOfClass(null); if (kind_of_null) { ReportError("{0} : IsKindOfClass(null) failed", instance_type_name); } var is_member_of_null = obj.IsMemberOfClass(null); if (is_member_of_null) { ReportError("{0} : IsMemberOfClass(null) failed", instance_type_name); } var respond_to_null = obj.RespondsToSelector(null); if (respond_to_null) { ReportError("{0} : RespondToSelector(null) failed", instance_type_name); } var conforms_to_null = obj.ConformsToProtocol(IntPtr.Zero); if (conforms_to_null) { ReportError("{0} : ConformsToProtocol(null) failed", instance_type_name); } }
internal static void DumpAccessibilityTree(NSObject obj = null, int indentLevel = 0) { if (obj == null) { obj = NSApplication.SharedApplication; } string desc = obj.Description; desc = desc.PadLeft(desc.Length + indentLevel, ' '); Console.WriteLine($"{desc}"); if (!obj.RespondsToSelector(new Selector("accessibilityChildren"))) { string notAccessible = "Not accessible"; Console.WriteLine($"{notAccessible.PadLeft (notAccessible.Length + indentLevel + 2, ' ')}"); return; } NSArray children = (NSArray)obj.PerformSelector(new Selector("accessibilityChildren")); if (children == null) { return; } for (nuint i = 0; i < children.Count; i++) { DumpAccessibilityTree(children.GetItem <NSObject> (i), indentLevel + 2); } }
public static bool AddMethod(this NSObject obj, Selector selector, Delegate imp) { if (obj.RespondsToSelector(selector)) { return(false); } var classHandle = obj.Class.Handle; return(LibObjc.class_addMethod(classHandle, selector.Handle, imp, "v@:")); }
public override NSObject TargetForAction(Selector theAction, NSObject theTarget, NSObject sender) { if (theAction == null) { return(null); } if (theTarget != null && theTarget.RespondsToSelector(theAction)) { return(theTarget); } return(base.TargetForAction(theAction, theTarget, sender)); }
public void ChangeAttributes(NSObject sender) { var sel = new Selector("convertAttributes:"); if (sender.RespondsToSelector(sel)) { var ptr = MacApi.LibObjc.IntPtr_objc_msgSend_IntPtr(sender.Handle, sel.Handle, (SelectedAttributes ?? new NSDictionary()).Handle); if (ObjCRuntime.Runtime.GetNSObject(ptr) is NSDictionary attrs) { SelectedAttributes = (NSMutableDictionary)attrs.MutableCopy(); NSFontManager.SharedFontManager.SetSelectedAttributes(attrs, false); } } }
public override bool SendAction(Selector theAction, NSObject theTarget, NSObject sender) { if (theAction == null) { return(false); } if (base.SendAction(theAction, theTarget, sender)) { return(true); } // FIXME // The following code should not be necessary, it should have been done by base. What am I missing? // It's here to make autocompletion work properly: // Without this, double clicking a word in a completion list of a text field (initial wizard) does not work. if (theAction.Name == "tableAction:") // Prevent crashes when used with certain other selectors. { if (theTarget != null && theTarget.RespondsToSelector(theAction)) { try { var signature = theTarget.GetMethodSignature(theAction); var invocation = signature.ToInvocation(); invocation.Selector = theAction; if (signature.NumberOfArguments > 2) { invocation.SetArgument(sender, 2); } invocation.Invoke(theTarget); return(true); } catch (Exception e) { Console.WriteLine($"Exception in invocation of '{theAction.Name}':{e}"); } } } return(false); }
public override void Connect() { string sel = "connectWithOptions:"; RoyalRDSConnection rdpData = Data as RoyalRDSConnection; rdpData.BeginTemporaryMode(); bool autologon = rdpData.CredentialAutologon; NSString hostname = rdpData.URI.ResolveTokensApi(rdpData).NS(); int port = rdpData.RDPPort; rdpData.EndTemporaryMode(); NSString username = NSString.Empty; //NSString domain = NSString.Empty; NSString password = NSString.Empty; rdpData.BeginTemporaryMode(); CredentialInfo effectiveCred = rdpData.GetEffectiveCredential(); rdpData.EndTemporaryMode(); if (autologon && effectiveCred != null) { string usernameStr = effectiveCred.Username; string passwordStr = effectiveCred.Password; username = usernameStr.NS(); password = passwordStr.NS(); } int screenWidth = 0; int screenHeight = 0; if (rdpData.DesktopWidth == 0 && rdpData.DesktopHeight == 0) { screenWidth = (int)TabViewItem.View.CastTo <NSView>().Frame.Width; screenHeight = (int)TabViewItem.View.CastTo <NSView>().Frame.Height; } else { rdpData.BeginTemporaryMode(); screenWidth = rdpData.DesktopWidth; screenHeight = rdpData.DesktopHeight; rdpData.EndTemporaryMode(); } // TODO: Screen Width should actually be a multitude of 4, not 8, but 8 seems to work just fine with rdesktop if (screenWidth % 8 != 0) { screenWidth = (screenWidth / 8) * 8; } m_screenWidth = screenWidth; m_screenHeight = screenHeight; CordRdpOptions options = new CordRdpOptions(); rdpData.BeginTemporaryMode(); options.Hostname = hostname; options.Port = port; options.Username = username; //options.Domain = domain; options.Password = password; options.ConnectToConsole = rdpData.ConnectToAdministerOrConsole; options.SmartSize = false; //rdpData.SmartSizing; options.ScreenWidth = screenWidth; options.ScreenHeight = screenHeight; options.ColorDepth = rdpData.ColorDepth; options.AllowWallpaper = rdpData.AllowWallpaper; options.AllowAnimations = rdpData.AllowMenuAnimations; options.FontSmoothing = rdpData.AllowFontSmoothing; options.ShowWindowContentsWhileDragging = rdpData.AllowFullWindowDrag; options.ShowThemes = rdpData.AllowThemes; options.RedirectPrinters = rdpData.RedirectPrinters; options.RedirectDiskDrives = rdpData.RedirectDrives; options.AudioRedirectionMode = rdpData.AudioRedirectionMode; rdpData.EndTemporaryMode(); if (m_nativeController.RespondsToSelector(sel)) { m_nativeController.SendMessage(sel, options); } options.Release(); }
public static bool IsSwfControl(this NSObject obj) { return(obj.RespondsToSelector(swfMarkSel)); }