Suppress Fullscreen Citrix Workspace

The Citrix workspace client automatically assigns itself a ‘topmost’ status in Windows once it goes to fullscreen mode. Once this happens all other windows running on your Windows computer are no longer visible and can’t be accessed without switching the Citrix windows from fullscreen mode to windowed or minimized mode.

This behaviour can be annoying when you need to run certain applications locally for best behaviour, one such an example is Teams.

As a workaround I’ve developed a small application which checks all windows for the topmost flag. If a Citrix window (CDViewer) is detected with this flag the flag automatically gets removed. After removal the application adds the flag to all applications listed in the application config file (CtxNotTopmost.dll.config). The last application to receive the topmost status will always be on top of other windows.

Configuration file of the application.

In addition to this functionality the application always displays a ‘widget’ on top. This widget lists the open windows on the local machine. Thus allowing you to bring any of those applications to the front if needed.

The widget

You can find the application which I’ve named CtxNotTopmost (I was low on inspiration) on my Github: https://github.com/scara1701/CtxNotTopmost
Use the releases page to download the most recent version of the application.

Remember, this is an early release of the application. It has been sufficient to fulfill my needs thus far.

SharePoint copy path extension

One of the things I frequently perform is copying the path of a file in a SharePoint library, not creating a link via the ‘Share’ menu.

There is a copy path icon in the details section of the file in SharePoint.

Copy path

There is however one annoying caveat for this function. It is always beneath the ‘Activity section’, which on a file with a lot of activity is constantly loading. This makes the ‘Copy path’ option always move down right before I manage to click on it.

I was in the process of learning to build webparts for SharePoint. So I ended up writing an extension that adds a ‘copy path’ option to the menubar of the document library.

Copy path!

Afterwards you can paste the link from your clipboard! 🙂

You can find the source code for this extension in my Github Repo.

iMac 2011 with macOS Monterey

Don’t trash that iMac yet

The last OS officially supported by the iMac 2011 (iMac 12,1 – Mid2011) is macOS High Sierra. This is a problem for various reasons. The main reason being no recent application updates, for applications such as:

  • Microsoft Office 365
  • Microsoft OneDrive
  • Citrix Workspace
  • Apple XCode

Most manufacturers support only the last 3 versions of macOS for their applications. Macos High Sierra is version 10.13, the OS has been out of this 3 version cycle since Big Sur, the previous version of macOS.

There is however a community online which does their best to run more recent versions of macOS on unsupported machines. One of these projects resulted in OpenCore Legacy Patcher.

With this application it is easy to install macOS Monterey on the iMac 12.1. However there is one big caveat: The GPU (Radeon HD 6750M) is a non-metal supporting device. A solution would be to replace this GPU with a metal-capable GPU, but I do not want to invest €’s in a decade old piece of hardware. The project offers a ‘beta’ solution to support the card somewhat.

So with nothing to lose, I attempted this solution on my old iMac.

And it worked! But… I ran into the following issues:

  • There was flickering of the screen after installing the GPU-fix. To resolve this I had to use ResXtreme to change colours from billions to millions.
  • The menu bar on top was unreadable with a light background. I had to set the font to dark with this terminal command:
defaults write -g ASB_DarkMenuBar -bool true
Fix that font colour in the menu bar
  • I had to manually enter the wifi SSID & code in the wireless settings menu. Selecting the network from the list did nothing
  • The sliders for volume, brightness,… aren’t visible
  • The most recent version of Citrix Workspace just displays a white window. I was able to resolve this by rolling back to version 2108 for mac.
  • I can only connect my USB-headset after boot, otherwise the internal speakers of the iMac aren’t recognized.

I’ve installed Office, Unity (latest LTS), Blender, Visual Studio, Teams,… and all seem to be working. You can tell however that the 3D graphics aren’t as smooth as you would otherwise experience them. I believe they are running in a pseudo software mode. Youtubing and other media seems to go smoothly.

So yes, this is a way forward for a legacy machine. Great for a hobbyist, not something you would want to support in an enterprise environment, but those shouldn’t be running 10 year old hardware anyway 😉

Reset permissions on a SharePoint list item using Power Automate

When working with SharePoint you might have a situation in which you’ve assigned permissions to another user. But what if you want to reset this change using a Power Automate flow?

You could remove the permissions on the object with the build in Power Automate “Stop sharing an item or file” function. But if you do this all permissions of the item will be gone.

What we want is for the object to inherit the permissions of its parent. There is (as far as I’ve seen) no Power Automate function which allows us to do this. In the SharePoint API there is a function called ‘ResetRoleInheritance’ which does exactly what we want.

_api/web/lists(‘listid‘)/items(‘itemid‘)/ResetRoleInheritance

Note: Replace listid and itemid by your values.

So what we can do is make a POST to the SharePoint API:

function to call the ResetRoleInheritance function on the SharePoint API.

After running above command you will notice that the permissions of the item wil now no longer be unique and match the permissions of the list or parent.

There is a caveat. The above call will have an error if the item does not have unique permissions.

To avoid this we should verify first that the item is indeed using unique permissions. Once again we will need to use a function of the SharePoint api. Here we will call the ‘HasUniqueRoleAssignments’ function.

_api/web/lists(‘listid’)/items(‘itemid’)/HasUniqueRoleAssignments

When calling the above function we will get a json response containing a boolean response response for the value HasUniqueRoleAssignments. So we make the following call:

function to call the HasUniqueRoleAssignments function on the API

To parse the result of the above request you can use the ‘json parse’ function of Power Automate.

Parse that json!

So when putting it all together you:

  1. First determine if the item has unique permissions
  2. Parse the result
  3. Add a condition to your flow for the ‘HasUniqueRoleAssignments’ value. Check if it is true.
  4. When true, call the ResetRoleInheritance function
  5. Success

Silencing a loud Intel Macbook Pro

Ever since I started working I’ve had a Mac for personal use. My first job had me working on (broken) Windows machines which had to be repaired. I just wanted something else to look at after business hours, so I ended up with a my first Mac, a Mac Mini with a PowerPC G4 CPU.

Many years have passed since and I still have a Mac, currently a 2017 model Macbook Pro with an intel CPU.

Last year Apple introduced the M1 chip. Many reviewers have been boasting about its amazing performance. What I find even more amazing is that these machines require a lot less cooling than their Intel predecessors. So much power, so little noise. The Macbook Air doesn’t even have a fan any more. If only OEM-partners of Microsoft offered ARM-based devices of similar performance…

With the recent macOS Monterey update us Intel users are graced with a new feature in the settings menu. We now have a battery panel which has an option to put the machine in a low power mode. Since enabling this mode I no longer have had fans spinning like a jet whilst toking light/medium duty tasks.

If you want the same feature on an older version of macOS or you want more control on power consumption per application then you might want to check out Turbo Boost switcher.

Access localhost from Android virtual machine

Whilst playing with Xamarin I encountered an issue when debugging the Android version of the app. Apparently localhost is not translated causing an error when trying to access an API running on my development machine. Strangely I did not encounter this issue when debugging the IOS version of my app.

To access your localhost (aka your development machine) you need to refer to the IP-address 10.0.2.2.

To work around this issue you can use the DeviceInfo class from Xamarin.Essentials. Just add a statement which checks the type of device the code is being ran on.

string baseAddress =
DeviceInfo.Platform == DevicePlatform.Android ? "http://10.0.2.2:25026/file" : "http://localhost:25026/file";