00:00so about a year and a half ago I made a
00:01couple of videos talking about the best
00:02way to make desktop applications in C
00:04plus plus there's this one this is the
00:07OG basically talking about how I think
00:09I'm going is a really good choice for a
00:10lot of people but then I kind of took it
00:11a little bit further and I made my own
00:13kind of application framework called
00:15Walnut I wanted a nice clean kind of but
00:19lightweight platform that you could use
00:21to make UI apps for desktop in C plus
00:24plus and I think really this stemmed
00:26from us needing to have a launcher so
00:28that we could like distribute games with
00:30hazel and have a launcher that like lets
00:32you pick your graphic settings and all
00:33of that and hit play I kind of wanted it
00:35to look nice almost like Hazel's UI but
00:37I definitely didn't wanted to use Hazel
00:39I didn't want launcher to have Hazel as
00:40a dependency because that's just crazy
00:42imagine having a 3D game engine powering
00:45your little launcher
00:47I'm sure some people have done that so
00:49yeah that's Walnut and it's just
00:50available on GitHub for free aside from
00:52UI stuff I also wanted to kind of you
00:54know just build it into a just a nice
00:56useful C plus application framework with
00:58just like a useful library and it's all
01:00based on Hardware rendering it uses
01:01Vulcan to render all of the graphics
01:03which makes it super graphicsy
01:05compatible so if you're building an
01:06application that needs to render
01:08graphics on the GPU then it's kind of a
01:10perfect fit but again even if you're not
01:12still works it doesn't quite have the
01:14same compatibility as just a native
01:16application that wouldn't require you
01:18know like a Vulcan graphics driver but
01:20for most people on decent systems it
01:22works fine I think Hazel's UI is
01:24probably a good indication of my goals
01:25for Walnut like I'd essentially want to
01:27be able to make an app like Hazel's
01:29editor in it more recently I made an app
01:31using Walnut called Walnut chat it's
01:33like an instant messaging kind of chat
01:35application using Walnut networking a
01:37networking module for Walnut there's
01:39actually a big video all about that I'll
01:40leave it linked up there networking in C
01:42plus plus anyway basically my point is
01:43I've been kind of on a roll with Walnut
01:45I've been really enjoying working on it
01:47and just extending it adding features
01:48that people have been requesting kind of
01:50taking a lot of the code from Hazel and
01:53effectively I guess open sourcing it in
01:56the form of Walnut and not just UI stuff
01:58like for example Hazel's serialization
02:00library was put into Walnut so that we
02:02could make that Walnut chat kind of
02:04application work but one of the most
02:06requested features since the very
02:08beginning of Walnut because that's kind
02:10of how I showed it being used even
02:11though it wasn't officially released yet
02:13was custom title bars so being able to
02:16make that launcher that I showed you how
02:18does one make a custom title bar lots of
02:21people seem to think that again that's a
02:22limitation of I am gooey thus maybe you
02:25should use like a real GUI library or
02:27whatever now if you don't know exactly
02:29what a custom title bar is usually
02:30native Windows applications look like
02:32this you have this kind of like you know
02:34title bar you have like the minimize
02:36maximize close buttons over there that's
02:39kind of the Native look and feel of
02:41applications on this operating system
02:43which by the way in my examples is
02:45Windows 11. but lots of applications
02:47like to take matters into their own
02:49hands like visual studio for example
02:51looks like this Unreal Engine also has
02:53this kind of custom look and it just
02:55looks really Sleek it just looks really
02:57modern is there any functional
02:58difference really well actually yeah
03:01there might be because you can position
03:02more kind of controls in your actual
03:05title bar if you need to Microsoft
03:06Office for example has that whole kind
03:08of ribbon system in the save icon and
03:10stuff is up there there's an article
03:12even talking about how you can achieve
03:13stuff like that because it can be quite
03:15useful so can you get that done with I
03:19of course the thing with I'm gooey that
03:22I still like this is why I just get like
03:24I feel something every time someone says
03:26that oh you can't do that with I'm gooey
03:28or I didn't think that was an I'm good
03:29application like what do you not
03:31understand about the fact I'm just
03:33getting angry here your window is
03:34literally a canvas like with something
03:37like I am gooey you can control every
03:40single Pixel that gets rendered within
03:43that kind of client area and since at
03:45the end of the day we use a library like
03:47jlfw to actually make the window using
03:49like the win32 API we can for example
03:52expand the client area over the title
03:54bar we could also not decorate the
03:56window but I prefer to leave my windows
03:58decorated but we'll talk about that
03:59later the point is of course it's
04:00possible is it easy well yes and no I
04:03feel like some things might be easier
04:04than you think but then there's all
04:06these edge cases that kind of are
04:08annoying but yeah obviously it's
04:09possible we've had a custom title bar in
04:11Hazel for like years now this was
04:13actually first introduced by Jay Jay is
04:15like our volunteer audio person who
04:18wrote the entire audio engine for hazel
04:20he also really likes UI so he took the
04:21time to actually make this beautiful
04:23design that Hazel uses but anyway long
04:25story short Walnut now also has this
04:27custom title bar I've taken it from
04:29Hazel I've kind of made it more generic
04:31changed it a little bit so that it's a
04:33little bit more kind of native we'll
04:36talk about the details later in this
04:37video it's really as simple as just
04:39setting custom title bar to true and
04:41that's that's it so in this video I'm
04:43going to show you how you can make an
04:45application using Walnut that uses this
04:47custom title bar and then I'll also go
04:49through some of the code of how it
04:51actually works and what it takes to make
04:53a custom title bar using I'm GUI on
04:56Windows and if you want to just download
04:57and play with an application that
04:59actually uses this custom title bar and
05:02just Walnut in general then at the
05:04moment Walnut chat is like the biggest
05:06thing that we have just publicly
05:07available that uses Walnut with this
05:10kind of new UI and custom title bar so
05:12I'll leave the link to that in the
05:13description of this video as well but be
05:15warned Walnut chat is a little bit
05:17insecure I'll actually as of recording
05:20this video the server is up and no one
05:21has um hacked it yet but I'm expecting
05:23someone to hack at any minute now
05:25speaking of security though this video
05:26is sponsored by nordpass business
05:28nordpass business keeps you and your
05:30business a sensitive information secure
05:32and accessible it's basically like a
05:35password manager plus plus aside from
05:37just password stuff you know like
05:39helping you generate secure passwords
05:40store those secure passwords check to
05:42see if those passwords are part of data
05:44breaches you know that kind of stuff
05:45aside from that nordpass business is
05:47designed to handle all of your company's
05:49sensitive information like for example
05:51payment information which by the way is
05:53super helpful in an office environment
05:54like if someone needs to make a payment
05:56they don't have to look for like a
05:57physical card or something it's all just
05:59stored in nordpass I also really like
06:01that you can just store arbitrary pieces
06:03of sensitive information so for example
06:05like a physical lock security code or
06:08like the alarm code for the office
06:09whoever you share it with through
06:11nordpass business like they'll have
06:13access to it and they'll be able to read
06:14it speaking of sharing though that's one
06:16of the best features of norpass business
06:18it's really easy to give people access
06:20and take it away like for example if
06:22your team changes and and there's an
06:25activity log that you can use to see
06:27who's doing what check out nordpass
06:29business for yourselves with a generous
06:31three-month free trial just go to
06:33nordpass.com the journo and use code the
06:36Cherno huge thank you to norpass
06:37business for sponsoring this video
06:39alright let's take a look at some of
06:40this new Walnut stuff step one obviously
06:42is acquiring this Walnut uh the link to
06:45the GitHub repository will be in the
06:46description below of course but it has
06:48moved from the chono Walnut to Studio
06:50Cherno Walnut I think if you still go to
06:52the Cherno Walnut yeah it'll just take
06:55you to Studio trainer Walnut so that
06:56should be fine the other really
06:57important thing to note though is as of
06:59recording this video though right now
07:00the new stuff is in the dev branch and
07:02the reason for that is there are still
07:04some edge cases that I would like to
07:06like fully iron out I probably could
07:08merge this to master in all seriousness
07:10it's very very stable and in fact it's
07:12probably better than the current Master
07:13but for the time being it just yeah
07:15hasn't been merged yet okay so let's
07:18open up a command prompts get clone
07:22we can immediately specify also that we
07:25want the dev Branch one other important
07:27thing to note though is that there is
07:29also this Walnut app template you can
07:31use this template and that will kind of
07:33set up a walnut app that is somewhat
07:35external to the actual Walnut there's
07:38also a viable way of making a walnut app
07:40that's probably the preferred way
07:41actually in fact that's how I made will
07:42not chat but the actual Walnut
07:44repository does come with an example app
07:46like a little sandbox so that's also
07:48fine and it's probably a bit easier you
07:50don't have to like use a template or
07:51anything you just claim the repository
07:52and you can play with it now note that
07:53as of now as well this does actually
07:56come with this kind of optional Walnut
07:59networking module optional in the sense
08:00that you can delete it you don't need it
08:02to run Walnut of course but that's going
08:04to give it like the networking
08:05functionality that was covered in that
08:07networking in C plus plus video and also
08:09part of Walnut chat okay cool so got
08:11everything checked out here's our Walnut
08:13folder just go to scripts run setup
08:14example project there we go back over
08:17here we now have a walnut app dot
08:19Solutions Visual Studio solution I know
08:21a lot of you want Linux support what and
08:23I promise you that is on the table I
08:26have I am planning to do that and I will
08:28make a video about it okay so here's
08:29Walnut app let's just open that up well
08:33um this example actually has a bit more
08:35code I added some more stuff to it just
08:36like an about dialog box you know
08:39nothing too fancy but you will see here
08:41that by default in the application
08:43specification under the create
08:44application function custom title bar is
08:47set to true that means that if you just
08:49run this so I've just cloned this I've
08:51run the setup script I've opened the
08:52visual studio solution and I just hit F5
08:55we get this so here is our Walnut
08:58example application you can see I can
09:00you know do normal application stuff
09:03with it very exciting it actually is a
09:06little bit exciting when you get all
09:07this working because as you'll see in a
09:08minute all this stuff basically had to
09:10be somewhat implemented manually not all
09:12of it though all of this stuff needed to
09:13be considered as kind of what I meant um
09:15and then we can of course drag windows
09:17out we can see that you can't even tell
09:19oh it's in uh now it's not it's out
09:21that's great that works as you would
09:23expect yeah I don't really know what
09:25else to say again normal application
09:26stuff how exciting and then we have like
09:29our menu bar up here help about we'll
09:32and that's kind of the Walnut example
09:35now if you set custom title bar to false
09:37then you'll get the exact same thing as
09:40you can see but it's going to have that
09:43default kind of Windows native title bar
09:45so if this is what you want of course
09:47you can still do that in fact I think
09:49false is the default at the moment I
09:52think I might make true the default just
09:55because it does kind of look nice but
09:56you can see in the example we are in
09:58fact setting it to true
09:59so if you base your stuff off of this
10:01example then of course you'll get this
10:04we also have this beautiful Walnut logo
10:07um I yeah just had some fun in Photoshop
10:10and the only reason really was because I
10:12just I had to put something here so you
10:14would put probably your apps logo or
10:17maybe like a button or I don't know what
10:18you would do you'd put something here so
10:20in this case it's just a walnut image
10:22that yeah doesn't do anything in fact
10:24it's part of um you know it's part of
10:26this uh title bar so you can move the
10:31um yeah other than that like yeah
10:32resizing and everything works properly
10:34as you you would expect I'm just
10:35noticing now actually that it looks like
10:37the client area is a bit too big you see
10:40how that pixel is this is this is this
10:43is what it's all about though spoiler
10:44alert this is what it's all about it's
10:46about taking screenshots putting them
10:48into Photoshop zooming in until you can
10:50see like the individual pixels and then
10:52aligning everything and playing with it
10:54being like is that right is this not
10:55using Zoom it by the way this is a lot
10:58of people ask me what on Earth I use
10:59it's called Zoom it it's like assist
11:01internals kind of app I'll leave a link
11:03to the description below this is what I
11:04use to draw on the screen and zoom in
11:06it's very useful because again you know
11:08if I see something I'm like oh that
11:10doesn't look quite right I could just
11:12press Ctrl 2 and zoom in and I can
11:15immediately see oh that pixel's a bit
11:16weird that I feel like that should be a
11:18little bit lower or something like that
11:21um so that's basically the gist of it
11:23download it play it you know GitHub dot
11:26com slash Studio Channel Walnut now I'm
11:29going to show you a closer look of I
11:33um how I made it happen we're not going
11:35to go too deep because it's tremendously
11:36boring and also I feel like if you're
11:38gonna implement it or something you're
11:40probably gonna want to read the source
11:42code and not watch a video um but I will
11:44cover uh how it works so basically at
11:47the moment Walnut is very simple we
11:50basically have this application.gy
11:53um file it's now that there are now two
11:56different applications there's an
11:57application headless and an application
11:58GUI again that was part of Walnut chat
12:01because I needed the server to run using
12:03Walnut but on Linux in a terminal so
12:05headless so no I'm GUI no glfw no Vulcan
12:08obviously and that's why we can actually
12:10have like a a headless wire
12:12configuration I'll probably talk about
12:13that in a later video if people are
12:15interested but uh in this file we have
12:18the whole app at the moment this I I
12:20really do want to change this to be
12:21honest I just haven't gotten around to
12:23it yet because it's a little bit it's a
12:25little bit messy in fact I even have
12:27some um to Do's or like some notes that
12:31say that like hey yeah like for example
12:33we shouldn't store resources in this
12:34application class because then we have
12:36to manually release them before we um
12:38you know make sure that Vulcan has
12:40finished and shot Vulcan down because
12:41these resources are kind of you know
12:43textures on the GPU so thus they're made
12:46using Vulcan and handled by Vulcan so
12:48there's a lot of kind of you know I
12:50wouldn't look at this class or this file
12:54this is Peak programming by Cherno or by
12:58um you know this is definitely work in
13:00progress and uh I would like to clean it
13:02up maybe that would be a fun kind of
13:04video I don't know we'll see a bit let's
13:06talk about the title bust off so the
13:08first thing that we do
13:10um is when we initialize the application
13:12we check to see again if that
13:13specification custom title bar which I
13:15talked about earlier if that is enabled
13:17if that's on and if it is true then we
13:22two are false so what is glfw Title by
13:25you can see it's added by Hazel so it's
13:27actually not a standard glfw thing we
13:30added that I believe Jay added that
13:33um to to our Fork of glfw which uh if we
13:36go over here into let's go into this
13:38this is the Walnut repository if we go
13:41into vendor and then glfw you'll see
13:43this glfw is actually my Fork so the
13:46Cherno Jeff W is my Fork of JFW with
13:50some modifications such as this title
13:52bar so honestly like if you're a
13:54programmer and you're interested in how
13:55this is implemented first of all feel
13:57free to use my Branch it's jlw with
14:00premix Sports Linux as well by the way
14:02but if you want to know how it differs
14:04from you know original JFW and what we
14:07need to do here to get the custom title
14:08bust off you know you can just look at
14:10the commands that we made you can look
14:11at the diff between this repository and
14:12Jeff W like that would probably be the
14:16um rather than me walking you through
14:17all of the win32 API code that had to go
14:19into this but you can also you know
14:21search for this inside not inside this
14:24uh inside uh let's just go to like Jeff
14:26W well win32 window is where most of
14:29this stuff is uh and then we have this
14:31title bar yes job W window hints title
14:35bar um and lots of stuff kind of
14:37involving the title bar uh has been kind
14:39of modified so this function over here
14:41for example this is the main kind of
14:43messaging uh function right it's window
14:45proc these are all of the Callback this
14:47is basically like all the window events
14:49that happen this is like the Callback
14:51function uh for all of those so they'll
14:53basically get put into here and then for
14:55the most part you know there is there
14:58are some details into how it's handled
14:59but this is like kind of the type of
15:01message it is and these are all of the
15:02different event types so you can see for
15:04example when we get to some of the
15:06interesting ones that show kind of how
15:07this custom title bar stuff is
15:09implemented you know for example this
15:11one uh n n c calc size I'm not going to
15:15pretend that I know exactly I don't even
15:16know what NC means to be completely
15:18honest but basically the point of this
15:20I've written these comments here so it
15:22makes sense but the point of this is you
15:24can see we don't do this first of all if
15:26we're using like the default kind of
15:27native title bar instead we just break
15:29which essentially means that we go down
15:32here and we return the default kind of
15:35window procedure but otherwise if we are
15:38kind of in a custom frame scenario then
15:40we have to for example shrink the client
15:42area by the border thickness so that we
15:44can resize the window and see the
15:45borders so basically what this does is
15:47it kind of determines the client area so
15:49the client area is where we can render
15:51stuff and so this for example will tell
15:52us like the thickness of the borders top
15:55borders are handled differently which is
15:57another kind of issue that I don't know
15:59I actually couldn't solve this uh within
16:01the time period that I had I'm probably
16:03going to keep stabbing it but what tends
16:05to happen is if we do actually take the
16:07top border and we kind of try and you
16:09know we're increasing that so we're kind
16:13um you know these are the rectangle
16:14bounds by the way not the rectangle size
16:16so when we do plus equals you know we're
16:18kind of pushing the top boundary kind of
16:20down so in a way you know we're
16:22shrinking it if I run this we get this
16:25kind of classic white border that um
16:27I've seen a lot of people online talk
16:29about uh yeah very very weird and on
16:33Windows 10 it actually draws an
16:35additional native but a weird version of
16:38the Native kind of um uh title bar on
16:41top of that even if you do as little as
16:43plus one here so and I and I did note
16:47that down so this is like honestly just
16:50um the reason why you'd even want to do
16:52uh plus one here is because if we look
16:55at this you see that very clear resize
16:58Mouse button thing like when I put my
17:00mouse over this when I hover my mouse
17:02over that top border we see that resize
17:04and we can just click it and resize that
17:07doesn't work if you do zero you can
17:09still resize the window but you'll never
17:11see that icon see I can't see that icon
17:14now now I can still even if I'm a few
17:16pixels off actually I can still click
17:18and drag right because I suspect that
17:21the way that that's working is there's
17:23this other window event called Hit test
17:25and this is another juicy one that you
17:27have to implement if you have a custom
17:28title bar and that is basically you have
17:30to tell the application every time the
17:32mouse moves you have to be like this is
17:35where you are in the window right so
17:38there are basically a few options
17:39there's either I'm in the client area
17:40which is like the main drawing area
17:42that's like the main application area
17:44I'm in the caption which caption sounds
17:48intriguing what the heck does that mean
17:50caption is the title bar that's how
17:52Windows calls the title but I don't know
17:54the history behind that I don't know why
17:55it's called that no idea I'm actually
17:57kind of interested I should probably
17:58look that up that would be nice that way
17:59I could tell you guys and this this
18:01video here would actually be interesting
18:02and informative but nevertheless uh this
18:05basically tells us that we're in the
18:07title bar and we actually have a custom
18:09callback function which we'll get to in
18:11a minute that is used to determine that
18:13you can see this comment basically
18:16um so client area the title bar area or
18:19we're on a border right which is what
18:21this part does uh obviously it doesn't
18:23apply if the windows maximized that
18:25doesn't make sense you can't like resize
18:26the window by the borders if the app is
18:29maximized but over here we just do some
18:32really basic math I guess you go like
18:34there's not really math but we do some
18:36really basic kind of logic here just to
18:38see where we are and then that way we
18:40determine like if we're in the top left
18:42border which is like you know this
18:44corner basically like are we over here
18:47um and then you know all of the kind of
18:49diagonals all of the kind of Corners the
18:51diagonals and then also just like the
18:53left side of the right side um and the
18:55reason why that's important is because
18:57that way we can actually click and drag
18:59here so you can see that's the left
19:00border if I just not if I just don't do
19:04and we never return left you can see I
19:07can't actually do anything now yeah look
19:10I can't resize this on the left side
19:12anymore because it never tells me that
19:15I'm on left and so windows will not kind
19:17of let you resize it
19:20um so yeah that's very obviously
19:23important so that's another really
19:24important one uh those are kind of like
19:26the main ones yeah this title bar hit
19:28test is so so important because this is
19:30what lets you move the application and
19:32this is like a huge thing if I get rid
19:34of this let's just set this to um false
19:38ah sorry false I'm in C so zero
19:42um then you can see look
19:44I can't move this thing man
19:46yeah look I'm clicking I'm dragging I
19:49can't move my window I need this to be
19:52properly implemented because that tells
19:55me that I'm in the you know the hit test
19:56returns that I'm in the caption I'm in
19:58the title bar which means that if I
20:00click and drag I should move that so
20:02this is what I mean like it's you can
20:03theoretically Implement all of these
20:05like you can build this whole system
20:06from scratch like you can basically say
20:09if I click the mouse and I drag the
20:11mouse then I am supposed to set the
20:14window position every frame to the
20:16mouse's Delta or whatever right you can
20:18actually do that I think from memory the
20:21first version of the J made for hazel
20:22actually did do that but there is a
20:24better way and that is obviously just
20:25using the functionality in the operating
20:27system in Windows that makes this stuff
20:29happen like for the windows and that's
20:31exactly what we can do like with this
20:33kind of hit test function so what does
20:35this callback do that is a client-side
20:37callback meaning that back in our Walnut
20:40code inside application we actually set
20:43that so here test gel FW set Title by
20:46head test callback which again is a
20:48Hazel function well a function from
20:49outkana system and then all this does is
20:51it returns or basically outputs this hit
20:54variable here it just calls app is title
20:56bar hovered which returns Title by
20:57Harvard which we actually set inside
21:01um the I'm GUI code so inside the IM GUI
21:03code UI draw title bar is what actually
21:06draws all of that so we do all the
21:07drawings still inside Miami or with I'm
21:10GUI rather you can see like it's all
21:12here again if you're interested in this
21:13stuff just read the code it's on GitHub
21:16no point me kind of going through
21:17explaining this line by line there are
21:19some good kind of debug boundaries that
21:21I've added so for example if we get this
21:23title bar bounds to be active it will
21:27actually I'll use the invalid prefab
21:29color from Hazel but you can see it kind
21:31of draws uh you know these Title by
21:33bounds the top one's a bit cut off there
21:34but this is important because this shows
21:37you like which area is the title bar and
21:40thus what area can I use to drag the
21:42application because the hit test will um
21:45return caption you know when when we're
21:47within that area which by the way how do
21:49we do that well we have an invisible
21:52button called title bar drag zone and
21:54then is just equal to is that I'm GUI
21:58item hovered which is that and that size
22:00obviously which we can um
22:03we can pop this uh rectangle in if we
22:06wanted to draw it by the way so there it
22:07is you can see it it excludes
22:10this guy over here right it does not
22:13include this by the way the reason why
22:15it's not drawing that top area is
22:16because that uh that client area is cut
22:19off so if I change this to be even like
22:22just one pixel to the top you can see I
22:24now see it but the problem is the reason
22:26why I didn't leave it like that is
22:27because Windows 10 it ruins everything
22:29so unless I want to like run time you
22:31know figure out what operating system
22:33I'm on and then like switch the numbers
22:35around uh for now I'm like you know
22:37whatever let's just keep it at zero
22:39which means we technically do clip a
22:42um but and we don't get by the way you
22:44can see we don't get that thing I think
22:45I mentioned that earlier I'm getting
22:47um uh but we can't still resize
22:49everything anyway so that's obviously
22:51this kind of debugging stuff is really
22:52useful when you're trying to figure this
22:54out but you can kind of see the gist of
22:55how this works right you have to kind of
22:57go through draw every little piece
22:59um the uh you know the kind of minimize
23:02maximize slash restore and close buttons
23:05as well that you see over here in this
23:07kind of top right corner they're all
23:09just yeah icons they're all implemented
23:11over here so you can see here's the
23:13minimize button what does it do if we
23:14press it it cues an event to iconify
23:17which is just like to minimize basically
23:19the maximize button will either if it's
23:21maximized it'll restore otherwise it'll
23:22maximize close button will close the
23:25application that's pretty
23:26self-explanatory and then the the images
23:28uh you know one last thing I'll quickly
23:30imagine here is that the images are
23:33actually embedded which is really cool
23:34because we can ship without external
23:36files and the way that that's done is uh
23:39well I just have a little python script
23:41that will take any input kind of file
23:43and just generate kind of some C plus
23:45ish code of it being embedded as you can
23:49see we have um Walnut embed Windows
23:51window images dot embed and if we go to
23:53that we have a whole bunch of we
23:55basically have these like un at arrays
23:58of just bytes basically and these bytes
24:01make up in this case an actual like
24:03compressed PNG image that represents
24:06that particular icon so the idea is I
24:09export an image in Photoshop up and uh
24:11you know you know what this is probably
24:12good enough for to be its own video uh
24:15because it's quite a useful thing to
24:17um but over here you can see all these
24:18images are basically being decoded
24:21um over here because they need to be PNG
24:22decoded and unloaded and then that makes
24:24up a walnut image which we can then use
24:26kind of you know for drawing um and
24:28that's what happens so we have to
24:30manually go through obviously and draw
24:31every button but again the benefit we
24:33get full control over this you want to
24:35stick another button you know you're not
24:37satisfied with your classic you know
24:39minimize close whatever buttons you can
24:41I don't know you can make a whole row of
24:42buttons up here you could omit some of
24:44them you could change them you could
24:45change the location of them around you
24:47could make it like this
24:50right like you or you could be like you
24:51could be like Mac OS and put them on the
24:53left side and like uh I don't know make
24:55them all red in circles and you know
24:57what I mean like you could do anything
24:58and that's kind of the the power here uh
25:01and at the moment it's obviously just
25:03all implemented in applications so you
25:04technically need to modify a walnut code
25:06to put anything there you know maybe
25:07we'll make some more kind of friendly
25:10kind of callbacks or ways to inject code
25:12into this so that you could just uh you
25:14know do this without modifying wall at
25:18um but yeah I just think it's a really
25:20really useful thing to have it obviously
25:22looks very nice it can potentially just
25:24make the workflow of the app be more
25:26intuitive and just be nicer to use
25:29anyway I hope you guys enjoyed this
25:30video if you did please don't forget to
25:32hit the like button if you want to see
25:33more Walnut videos I am happy to see it
25:36here and talk about Walnut all day so
25:38please let me know in the comment
25:39section below don't forget to check out
25:41nordpass business just go to
25:43nordpass.com the journo and use my code
25:46the Cherno thanks for watching I'll see
25:48you guys next time goodbye