diff --git a/wpigui/src/dev/native/cpp/main.cpp b/wpigui/src/dev/native/cpp/main.cpp
index abd58a1..b8464dd 100644
--- a/wpigui/src/dev/native/cpp/main.cpp
+++ b/wpigui/src/dev/native/cpp/main.cpp
@@ -1,9 +1,6 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2020 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 #include "wpigui.h"
 
diff --git a/wpigui/src/main/native/cpp/portable-file-dialogs.cpp b/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
index 09f5d37..1330fa7 100644
--- a/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
+++ b/wpigui/src/main/native/cpp/portable-file-dialogs.cpp
@@ -1,9 +1,6 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2020 FIRST. All Rights Reserved.                             */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 //
 //  Portable File Dialogs
diff --git a/wpigui/src/main/native/cpp/wpigui.cpp b/wpigui/src/main/native/cpp/wpigui.cpp
index 955b3f5..4b200b5 100644
--- a/wpigui/src/main/native/cpp/wpigui.cpp
+++ b/wpigui/src/main/native/cpp/wpigui.cpp
@@ -1,9 +1,6 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 #include "wpigui.h"
 
@@ -18,6 +15,7 @@
 #include <imgui_internal.h>
 #include <implot.h>
 #include <stb_image.h>
+#include <wpi/fs.h>
 
 #include "wpigui_internal.h"
 
@@ -56,7 +54,9 @@
 
 static void* IniReadOpen(ImGuiContext* ctx, ImGuiSettingsHandler* handler,
                          const char* name) {
-  if (std::strcmp(name, "GLOBAL") != 0) return nullptr;
+  if (std::strcmp(name, "GLOBAL") != 0) {
+    return nullptr;
+  }
   return static_cast<SavedSettings*>(gContext);
 }
 
@@ -64,7 +64,9 @@
                         void* entry, const char* lineStr) {
   auto impl = static_cast<SavedSettings*>(entry);
   const char* value = std::strchr(lineStr, '=');
-  if (!value) return;
+  if (!value) {
+    return;
+  }
   ++value;
   int num = std::atoi(value);
   if (std::strncmp(lineStr, "width=", 6) == 0) {
@@ -88,7 +90,9 @@
 
 static void IniWriteAll(ImGuiContext* ctx, ImGuiSettingsHandler* handler,
                         ImGuiTextBuffer* out_buf) {
-  if (!gContext) return;
+  if (!gContext) {
+    return;
+  }
   out_buf->appendf(
       "[MainWindow][GLOBAL]\nwidth=%d\nheight=%d\nmaximized=%d\n"
       "xpos=%d\nypos=%d\nuserScale=%d\nstyle=%d\n\n",
@@ -121,7 +125,9 @@
   glfwSetErrorCallback(ErrorCallback);
   glfwInitHint(GLFW_JOYSTICK_HAT_BUTTONS, GLFW_FALSE);
   PlatformGlfwInitHints();
-  if (!glfwInit()) return false;
+  if (!glfwInit()) {
+    return false;
+  }
 
   PlatformGlfwWindowHints();
 
@@ -140,8 +146,12 @@
   iniHandler.WriteAllFn = IniWriteAll;
   ImGui::GetCurrentContext()->SettingsHandlers.push_back(iniHandler);
 
+  io.IniFilename = gContext->iniPath.c_str();
+
   for (auto&& initialize : gContext->initializers) {
-    if (initialize) initialize();
+    if (initialize) {
+      initialize();
+    }
   }
 
   // Load INI file
@@ -171,31 +181,56 @@
       }
     }
   }
-  if (gContext->xPos != -1 && gContext->yPos != -1)
+  if (gContext->xPos != -1 && gContext->yPos != -1) {
     glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
+  }
 
   // Create window with graphics context
   gContext->window =
       glfwCreateWindow(gContext->width, gContext->height,
                        gContext->title.c_str(), nullptr, nullptr);
-  if (!gContext->window) return false;
+  if (!gContext->window) {
+    return false;
+  }
 
   if (!gContext->loadedWidthHeight) {
-    if (windowScale == 1.0)
+#ifndef __APPLE__
+    if (windowScale == 1.0) {
       glfwGetWindowContentScale(gContext->window, &windowScale, nullptr);
+    }
+#endif
     // force user scale if window scale is smaller
-    if (windowScale <= 0.5)
+    if (windowScale <= 0.5) {
       gContext->userScale = 0;
-    else if (windowScale <= 0.75)
+    } else if (windowScale <= 0.75) {
       gContext->userScale = 1;
+    }
     if (windowScale != 1.0) {
-      for (auto&& func : gContext->windowScalers) func(windowScale);
+      for (auto&& func : gContext->windowScalers) {
+        func(windowScale);
+      }
     }
   }
 
   // Update window settings
   if (gContext->xPos != -1 && gContext->yPos != -1) {
-    glfwSetWindowPos(gContext->window, gContext->xPos, gContext->yPos);
+    // check to make sure the position isn't off-screen
+    bool found = false;
+    int monCount;
+    GLFWmonitor** monitors = glfwGetMonitors(&monCount);
+    for (int i = 0; i < monCount; ++i) {
+      int monXPos, monYPos, monWidth, monHeight;
+      glfwGetMonitorWorkarea(monitors[i], &monXPos, &monYPos, &monWidth,
+                             &monHeight);
+      if (gContext->xPos >= monXPos && gContext->xPos < (monXPos + monWidth) &&
+          gContext->yPos >= monYPos && gContext->yPos < (monYPos + monHeight)) {
+        found = true;
+        break;
+      }
+    }
+    if (found) {
+      glfwSetWindowPos(gContext->window, gContext->xPos, gContext->yPos);
+    }
     glfwShowWindow(gContext->window);
   }
 
@@ -206,6 +241,16 @@
   glfwSetWindowMaximizeCallback(gContext->window, WindowMaximizeCallback);
   glfwSetWindowPosCallback(gContext->window, WindowPosCallback);
 
+  // Set icons
+  if (!gContext->icons.empty()) {
+    glfwSetWindowIcon(gContext->window, gContext->icons.size(),
+                      gContext->icons.data());
+    for (auto&& icon : gContext->icons) {
+      stbi_image_free(icon.pixels);
+    }
+    gContext->icons.clear();
+  }
+
   // Setup Dear ImGui style
   SetStyle(static_cast<Style>(gContext->style));
 
@@ -225,7 +270,9 @@
     }
   }
 
-  if (!PlatformInitRenderer()) return false;
+  if (!PlatformInitRenderer()) {
+    return false;
+  }
 
   return true;
 }
@@ -244,6 +291,11 @@
   ImPlot::DestroyContext();
   ImGui::DestroyContext();
 
+  // Delete the save file if requested.
+  if (gContext->resetOnExit) {
+    fs::remove(fs::path{gContext->iniPath});
+  }
+
   glfwDestroyWindow(gContext->window);
   glfwTerminate();
 }
@@ -256,7 +308,9 @@
 
   // Scale based on OS window content scaling
   float windowScale = 1.0;
+#ifndef __APPLE__
   glfwGetWindowContentScale(gContext->window, &windowScale, nullptr);
+#endif
   // map to closest font size: 0 = 0.5x, 1 = 0.75x, 2 = 1.0x, 3 = 1.25x,
   // 4 = 1.5x, 5 = 1.75x, 6 = 2x
   gContext->fontScale = std::clamp(
@@ -266,12 +320,16 @@
 
   for (size_t i = 0; i < gContext->earlyExecutors.size(); ++i) {
     auto& execute = gContext->earlyExecutors[i];
-    if (execute) execute();
+    if (execute) {
+      execute();
+    }
   }
 
   for (size_t i = 0; i < gContext->lateExecutors.size(); ++i) {
     auto& execute = gContext->lateExecutors[i];
-    if (execute) execute();
+    if (execute) {
+      execute();
+    }
   }
 
   // Rendering
@@ -279,34 +337,59 @@
 }
 
 void gui::Exit() {
-  if (!gContext) return;
+  if (!gContext) {
+    return;
+  }
   gContext->exit = true;
 }
 
 void gui::AddInit(std::function<void()> initialize) {
-  if (initialize) gContext->initializers.emplace_back(std::move(initialize));
+  if (initialize) {
+    gContext->initializers.emplace_back(std::move(initialize));
+  }
 }
 
 void gui::AddWindowScaler(std::function<void(float scale)> windowScaler) {
-  if (windowScaler)
+  if (windowScaler) {
     gContext->windowScalers.emplace_back(std::move(windowScaler));
+  }
 }
 
 void gui::AddEarlyExecute(std::function<void()> execute) {
-  if (execute) gContext->earlyExecutors.emplace_back(std::move(execute));
+  if (execute) {
+    gContext->earlyExecutors.emplace_back(std::move(execute));
+  }
 }
 
 void gui::AddLateExecute(std::function<void()> execute) {
-  if (execute) gContext->lateExecutors.emplace_back(std::move(execute));
+  if (execute) {
+    gContext->lateExecutors.emplace_back(std::move(execute));
+  }
 }
 
-GLFWwindow* gui::GetSystemWindow() { return gContext->window; }
+GLFWwindow* gui::GetSystemWindow() {
+  return gContext->window;
+}
+
+bool gui::AddIcon(const unsigned char* data, int len) {
+  // Load from memory
+  GLFWimage image;
+  image.pixels =
+      stbi_load_from_memory(data, len, &image.width, &image.height, nullptr, 4);
+  if (!data) {
+    return false;
+  }
+  gContext->icons.emplace_back(std::move(image));
+  return true;
+}
 
 int gui::AddFont(
     const char* name,
     std::function<ImFont*(ImGuiIO& io, float size, const ImFontConfig* cfg)>
         makeFont) {
-  if (makeFont) gContext->makeFonts.emplace_back(name, std::move(makeFont));
+  if (makeFont) {
+    gContext->makeFonts.emplace_back(name, std::move(makeFont));
+  }
   return gContext->makeFonts.size() - 1;
 }
 
@@ -329,21 +412,49 @@
   }
 }
 
-void gui::SetClearColor(ImVec4 color) { gContext->clearColor = color; }
+void gui::SetClearColor(ImVec4 color) {
+  gContext->clearColor = color;
+}
+
+void gui::ConfigurePlatformSaveFile(const std::string& name) {
+  gContext->iniPath = name;
+#if defined(_MSC_VER)
+  const char* env = std::getenv("APPDATA");
+  if (env) {
+    gContext->iniPath = env + std::string("/" + name);
+  }
+#elif defined(__APPLE__)
+  const char* env = std::getenv("HOME");
+  if (env) {
+    gContext->iniPath = env + std::string("/Library/Preferences/" + name);
+  }
+#else
+  const char* xdg = std::getenv("XDG_CONFIG_HOME");
+  const char* env = std::getenv("HOME");
+  if (xdg) {
+    gContext->iniPath = xdg + std::string("/" + name);
+  } else if (env) {
+    gContext->iniPath = env + std::string("/.config/" + name);
+  }
+#endif
+}
 
 void gui::EmitViewMenu() {
   if (ImGui::BeginMenu("View")) {
     if (ImGui::BeginMenu("Style")) {
       bool selected;
       selected = gContext->style == kStyleClassic;
-      if (ImGui::MenuItem("Classic", nullptr, &selected, true))
+      if (ImGui::MenuItem("Classic", nullptr, &selected, true)) {
         SetStyle(kStyleClassic);
+      }
       selected = gContext->style == kStyleDark;
-      if (ImGui::MenuItem("Dark", nullptr, &selected, true))
+      if (ImGui::MenuItem("Dark", nullptr, &selected, true)) {
         SetStyle(kStyleDark);
+      }
       selected = gContext->style == kStyleLight;
-      if (ImGui::MenuItem("Light", nullptr, &selected, true))
+      if (ImGui::MenuItem("Light", nullptr, &selected, true)) {
         SetStyle(kStyleLight);
+      }
       ImGui::EndMenu();
     }
 
@@ -355,11 +466,14 @@
         bool enabled = (gContext->fontScale - gContext->userScale + i) >= 0 &&
                        (gContext->fontScale - gContext->userScale + i) <
                            Font::kScaledLevels;
-        if (ImGui::MenuItem(label, nullptr, &selected, enabled))
+        if (ImGui::MenuItem(label, nullptr, &selected, enabled)) {
           gContext->userScale = i;
+        }
       }
       ImGui::EndMenu();
     }
+
+    ImGui::MenuItem("Reset UI on Exit?", nullptr, &gContext->resetOnExit);
     ImGui::EndMenu();
   }
 }
@@ -371,12 +485,15 @@
   int height2 = 0;
   unsigned char* imgData =
       stbi_load_from_memory(data, len, &width2, &height2, nullptr, 4);
-  if (!data) return false;
+  if (!data) {
+    return false;
+  }
 
-  if (width2 == width && height2 == height)
+  if (width2 == width && height2 == height) {
     UpdateTexture(texture, kPixelRGBA, width2, height2, imgData);
-  else
+  } else {
     *texture = CreateTexture(kPixelRGBA, width2, height2, imgData);
+  }
 
   stbi_image_free(imgData);
 
@@ -389,11 +506,17 @@
   int width = 0;
   int height = 0;
   unsigned char* data = stbi_load(filename, &width, &height, nullptr, 4);
-  if (!data) return false;
+  if (!data) {
+    return false;
+  }
 
   *out_texture = CreateTexture(kPixelRGBA, width, height, data);
-  if (out_width) *out_width = width;
-  if (out_height) *out_height = height;
+  if (out_width) {
+    *out_width = width;
+  }
+  if (out_height) {
+    *out_height = height;
+  }
 
   stbi_image_free(data);
 
@@ -408,11 +531,17 @@
   int height = 0;
   unsigned char* imgData =
       stbi_load_from_memory(data, len, &width, &height, nullptr, 4);
-  if (!imgData) return false;
+  if (!imgData) {
+    return false;
+  }
 
   *out_texture = CreateTexture(kPixelRGBA, width, height, imgData);
-  if (out_width) *out_width = width;
-  if (out_height) *out_height = height;
+  if (out_width) {
+    *out_width = width;
+  }
+  if (out_height) {
+    *out_height = height;
+  }
 
   stbi_image_free(imgData);
 
@@ -422,7 +551,9 @@
 void gui::MaxFit(ImVec2* min, ImVec2* max, float width, float height) {
   float destWidth = max->x - min->x;
   float destHeight = max->y - min->y;
-  if (width == 0 || height == 0) return;
+  if (width == 0 || height == 0) {
+    return;
+  }
   if (destWidth * height > destHeight * width) {
     float outputWidth = width * destHeight / height;
     min->x += (destWidth - outputWidth) / 2;
diff --git a/wpigui/src/main/native/directx11/wpigui_directx11.cpp b/wpigui/src/main/native/directx11/wpigui_directx11.cpp
index 6ecf155..771a2ed 100644
--- a/wpigui/src/main/native/directx11/wpigui_directx11.cpp
+++ b/wpigui/src/main/native/directx11/wpigui_directx11.cpp
@@ -1,9 +1,6 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 #include <d3d11.h>
 
@@ -19,6 +16,8 @@
 #include "wpigui.h"
 #include "wpigui_internal.h"
 
+#pragma comment(lib, "d3d11.lib")
+
 using namespace wpi::gui;
 
 namespace {
@@ -102,7 +101,9 @@
 
 namespace wpi {
 
-void gui::PlatformCreateContext() { gPlatformContext = new PlatformContext; }
+void gui::PlatformCreateContext() {
+  gPlatformContext = new PlatformContext;
+}
 
 void gui::PlatformDestroyContext() {
   CleanupDeviceD3D();
@@ -174,7 +175,9 @@
 
 ImTextureID gui::CreateTexture(PixelFormat format, int width, int height,
                                const unsigned char* data) {
-  if (!gPlatformValid) return nullptr;
+  if (!gPlatformValid) {
+    return nullptr;
+  }
 
   // Create texture
   D3D11_TEXTURE2D_DESC desc;
@@ -213,7 +216,9 @@
 
 void gui::UpdateTexture(ImTextureID texture, PixelFormat, int width, int height,
                         const unsigned char* data) {
-  if (!texture) return;
+  if (!texture) {
+    return;
+  }
 
   D3D11_BOX box;
   box.front = 0;
@@ -235,8 +240,12 @@
 }
 
 void gui::DeleteTexture(ImTextureID texture) {
-  if (!gPlatformValid) return;
-  if (texture) static_cast<ID3D11ShaderResourceView*>(texture)->Release();
+  if (!gPlatformValid) {
+    return;
+  }
+  if (texture) {
+    static_cast<ID3D11ShaderResourceView*>(texture)->Release();
+  }
 }
 
 }  // namespace wpi
diff --git a/wpigui/src/main/native/include/wpigui.h b/wpigui/src/main/native/include/wpigui.h
index c1dbc15..7860f0d 100644
--- a/wpigui/src/main/native/include/wpigui.h
+++ b/wpigui/src/main/native/include/wpigui.h
@@ -1,13 +1,12 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 #pragma once
 
 #include <functional>
+#include <string>
+#include <string_view>
 
 #include <imgui.h>
 
@@ -86,6 +85,21 @@
 GLFWwindow* GetSystemWindow();
 
 /**
+ * Adds an application icon.  Multiple icons (of different sizes) may be
+ * set.  This must be called prior to initialization to have an effect.
+ *
+ * @param data image data
+ * @param len image data length
+ * @return False if image data could not be read
+ */
+bool AddIcon(const unsigned char* data, int len);
+
+inline bool AddIcon(std::string_view data) {
+  return AddIcon(reinterpret_cast<const unsigned char*>(data.data()),
+                 data.size());
+}
+
+/**
  * Adds a font to the GUI.  The passed function is called during
  * initialization as many times as necessary to create a range of sizes.
  *
@@ -124,6 +138,15 @@
 void SetClearColor(ImVec4 color);
 
 /**
+ * Configures a save file (.ini) in a platform specific location. On Windows,
+ * the .ini is saved in %APPDATA%; on macOS the .ini is saved in
+ * ~/Library/Preferences; on Linux the .ini is stored in $XDG_CONFIG_HOME or
+ * ~/.config if the former is not defined. This must be called before
+ * gui::Initialize().
+ */
+void ConfigurePlatformSaveFile(const std::string& name);
+
+/**
  * Emits a View menu (e.g. for a main menu bar) that allows setting of
  * style and zoom.  Internally starts with ImGui::BeginMenu("View").
  */
@@ -238,14 +261,16 @@
         m_format{oth.m_format},
         m_width{oth.m_width},
         m_height{oth.m_height} {
-    oth.m_texture = 0;
+    oth.m_texture = 0;  // NOLINT
   }
 
   Texture& operator=(const Texture&) = delete;
   Texture& operator=(Texture&& oth) {
-    if (m_texture) DeleteTexture(m_texture);
+    if (m_texture) {
+      DeleteTexture(m_texture);
+    }
     m_texture = oth.m_texture;
-    oth.m_texture = 0;
+    oth.m_texture = 0;  // NOLINT
     m_format = oth.m_format;
     m_width = oth.m_width;
     m_height = oth.m_height;
@@ -253,7 +278,9 @@
   }
 
   ~Texture() {
-    if (m_texture) DeleteTexture(m_texture);
+    if (m_texture) {
+      DeleteTexture(m_texture);
+    }
   }
 
   /**
@@ -264,7 +291,7 @@
   /**
    * Implicit conversion to ImTextureID.
    */
-  operator ImTextureID() const { return m_texture; }
+  operator ImTextureID() const { return m_texture; }  // NOLINT
 
   /**
    * Gets the texture pixel format.
@@ -323,8 +350,9 @@
   static Texture CreateFromFile(const char* filename) {
     Texture texture;
     if (!CreateTextureFromFile(filename, &texture.m_texture, &texture.m_width,
-                               &texture.m_height))
+                               &texture.m_height)) {
       return {};
+    }
     return texture;
   }
 
@@ -339,8 +367,9 @@
   static Texture CreateFromImage(const unsigned char* data, int len) {
     Texture texture;
     if (!CreateTextureFromImage(data, len, &texture.m_texture, &texture.m_width,
-                                &texture.m_height))
+                                &texture.m_height)) {
       return {};
+    }
     return texture;
   }
 
diff --git a/wpigui/src/main/native/include/wpigui_internal.h b/wpigui/src/main/native/include/wpigui_internal.h
index 9a2c70f..13e504c 100644
--- a/wpigui/src/main/native/include/wpigui_internal.h
+++ b/wpigui/src/main/native/include/wpigui_internal.h
@@ -1,9 +1,6 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 #pragma once
 
@@ -56,6 +53,11 @@
 
   int fontScale = 2;  // updated by main loop
   std::vector<Font> fonts;
+
+  std::vector<GLFWimage> icons;
+
+  std::string iniPath = "imgui.ini";
+  bool resetOnExit = false;
 };
 
 extern Context* gContext;
diff --git a/wpigui/src/main/native/metal/wpigui_metal.mm b/wpigui/src/main/native/metal/wpigui_metal.mm
index cf46247..95c78c4 100644
--- a/wpigui/src/main/native/metal/wpigui_metal.mm
+++ b/wpigui/src/main/native/metal/wpigui_metal.mm
@@ -1,9 +1,6 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 #define GLFW_INCLUDE_NONE
 #define GLFW_EXPOSE_NATIVE_COCOA
diff --git a/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp b/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp
index bf14700..c85ad04 100644
--- a/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp
+++ b/wpigui/src/main/native/opengl3/wpigui_opengl3.cpp
@@ -1,9 +1,6 @@
-/*----------------------------------------------------------------------------*/
-/* Copyright (c) 2019-2020 FIRST. All Rights Reserved.                        */
-/* Open Source Software - may be modified and shared by FRC teams. The code   */
-/* must be accompanied by the FIRST BSD license file in the root directory of */
-/* the project.                                                               */
-/*----------------------------------------------------------------------------*/
+// Copyright (c) FIRST and other WPILib contributors.
+// Open Source Software; you can modify and/or share it under the terms of
+// the WPILib BSD license file in the root directory of this project.
 
 #include <cstdio>
 
@@ -114,7 +111,9 @@
 
 ImTextureID gui::CreateTexture(PixelFormat format, int width, int height,
                                const unsigned char* data) {
-  if (!gPlatformValid) return nullptr;
+  if (!gPlatformValid) {
+    return nullptr;
+  }
 
   // Create a OpenGL texture identifier
   GLuint texture;
@@ -136,16 +135,22 @@
 void gui::UpdateTexture(ImTextureID texture, PixelFormat format, int width,
                         int height, const unsigned char* data) {
   GLuint glTexture = static_cast<GLuint>(reinterpret_cast<uintptr_t>(texture));
-  if (glTexture == 0) return;
+  if (glTexture == 0) {
+    return;
+  }
   glBindTexture(GL_TEXTURE_2D, glTexture);
   glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, width, height, GLPixelFormat(format),
                   GL_UNSIGNED_BYTE, data);
 }
 
 void gui::DeleteTexture(ImTextureID texture) {
-  if (!gPlatformValid) return;
+  if (!gPlatformValid) {
+    return;
+  }
   GLuint glTexture = static_cast<GLuint>(reinterpret_cast<uintptr_t>(texture));
-  if (glTexture != 0) glDeleteTextures(1, &glTexture);
+  if (glTexture != 0) {
+    glDeleteTextures(1, &glTexture);
+  }
 }
 
 }  // namespace wpi
