# SystemTrayIconComponent in console application

**URL:** <https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628>\
**Category:** General JUCE discussion\
**Created:** [November 30, 2018, 8:46pm UTC](https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628 "2018-11-30T20:46:04Z")\
**Posts on this page:** 6\
**Page:** 1

<div class="post-metadata">

**Author:** ![drkoss](https://avatars.discourse-cdn.com/v4/letter/d/b77776/32.png) [@drkoss](https://forum.juce.com/u/drkoss)\
**Post date:** [November 30, 2018, 8:46pm UTC](https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628/1 "2018-11-30T20:46:04Z")

</div>

Trying to use a SystemTrayIconComponent in a console application.

Icon appears as expected but PopupMenu only appears for moment when icon is clicked (using showMenuAsync)

This is because `window.doesAnyJuceCompHaveFocus` in `checkButtonState` in MouseSourceState (found in juce\_PopupMenu.cpp - line 1082) returns false - I assume because it is a console application and there aren’t any components to focus.

Is there another way around this?

example code pretty much lifted out of the JUCE demo:

```
class TestTrayIcon : public SystemTrayIconComponent, private Timer
{
public:
    TestTrayIcon(){
        setIconImage (ImageFileFormat::loadFrom(BinaryData::TestTrayIcon_png,BinaryData::TestTrayIcon_pngSize));
        setIconTooltip ("TestTrayIcon");
        m.addItem (1, "Quit");
    }
    ~TestTrayIcon(){
        
    }
    void mouseDown(const MouseEvent& event) override{
        startTimer (50);
    }
    static void menuInvocationCallback (int chosenItemID, TestTrayIcon*)
    {
        if (chosenItemID == 1)
            JUCEApplication::getInstance()->systemRequestedQuit();
    }
    void timerCallback() override
    {
        stopTimer();
        m.showMenuAsync (PopupMenu::Options(), ModalCallbackFunction::forComponent (menuInvocationCallback, this));
    }
private:
    PopupMenu m;
};
```

---

<div class="post-metadata">

**Author:** ![drkoss](https://avatars.discourse-cdn.com/v4/letter/d/b77776/32.png) [@drkoss](https://forum.juce.com/u/drkoss)\
**Post date:** [December 12, 2018, 7:50pm UTC](https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628/2 "2018-12-12T19:50:22Z")

</div>

_friendly bump_

---

<div class="post-metadata">

**Author:** ![ed95](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/ed95/32/7635_2.png) [@ed95](https://forum.juce.com/u/ed95)\
**Post date:** [December 14, 2018, 2:53pm UTC](https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628/3 "2018-12-14T14:53:57Z")

</div>

It looks like your `mouseDown()` is missing a call to `Process::makeForegroundProcess()`, like so:

```auto
void mouseDown (const MouseEvent&) override
{
    Process::makeForegroundProcess();
    startTimer (50);
}

```

---

<div class="post-metadata">

**Author:** ![drkoss](https://avatars.discourse-cdn.com/v4/letter/d/b77776/32.png) [@drkoss](https://forum.juce.com/u/drkoss)\
**Post date:** [December 14, 2018, 4:12pm UTC](https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628/4 "2018-12-14T16:12:55Z")

</div>

@ed95 - thanks for the reply. I had tried that but removed it as it made no difference. Here is the example code with that included and still same issue - clicking on the menu bar icon only shows the popup temporarily.

```
class TestTrayIcon : public SystemTrayIconComponent, private Timer
{
public:
    TestTrayIcon(){
        setIconImage (ImageFileFormat::loadFrom(BinaryData::TestTrayIcon_png,BinaryData::TestTrayIcon_pngSize));
        setIconTooltip ("TestTrayIcon");
        m.addItem (1, "Quit");
    }
    ~TestTrayIcon(){
        
    }
    void mouseDown(const MouseEvent& event) override{
        Process::makeForegroundProcess();
        startTimer (50);
    }
    static void menuInvocationCallback (int chosenItemID, TestTrayIcon*)
    {
        if (chosenItemID == 1)
            JUCEApplication::getInstance()->systemRequestedQuit();
    }
    void timerCallback() override
    {
        stopTimer();
        m.showMenuAsync (PopupMenu::Options(), ModalCallbackFunction::forComponent (menuInvocationCallback, this));
    }
private:
    PopupMenu m;
};
```

---

<div class="post-metadata">

**Author:** ![drkoss](https://avatars.discourse-cdn.com/v4/letter/d/b77776/32.png) [@drkoss](https://forum.juce.com/u/drkoss)\
**Post date:** [January 8, 2019, 11:41am UTC](https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628/5 "2019-01-08T11:41:42Z")

</div>

@ed95 - any other things to try here? thanks

---

<div class="post-metadata">

**Author:** ![ed95](https://sea2.discourse-cdn.com/flex026/user_avatar/forum.juce.com/ed95/32/7635_2.png) [@ed95](https://forum.juce.com/u/ed95)\
**Post date:** [January 9, 2019, 3:07pm UTC](https://forum.juce.com/t/systemtrayiconcomponent-in-console-application/30628/6 "2019-01-09T15:07:29Z")

</div>

It looks like this is a macOS specific issue and `Process::isForegroundProcess()` (which on macOS calls `[NSApp isActive]`) is always returning false for a console application, which in turn causes the `doesAnyJuceCompHaveFocus()` method to return false and immediately dismisses the popup. I’ve tried a few things, such as using the PID to check whether our process is the foreground instead of `isActive` but that didn’t work, and I’ve tried forcing the app to be the foreground process but that fails too. I’m not sure what else we can do here.
