forked from Yadciel/c_tray
Add icon; Add platform-specific examples; Update readme with pre-requisites.
This commit is contained in:
59
README.md
59
README.md
@@ -11,6 +11,65 @@ Works well on:
|
||||
|
||||
There is also a stub implementation that returns errors on attempt to create a tray menu.
|
||||
|
||||
# Setup
|
||||
|
||||
Before you can compile `tray`, you'll need to add an environment definition before the line where you include `tray.h`.
|
||||
|
||||
**For Windows:**
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define TRAY_WINAPI 1
|
||||
|
||||
#include "tray.h"
|
||||
...
|
||||
```
|
||||
|
||||
**For Linux:**
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define TRAY_APPINDICATOR 1
|
||||
|
||||
#include "tray.h"
|
||||
...
|
||||
```
|
||||
|
||||
**For Mac:**
|
||||
**For Windows:**
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#define TRAY_APPKIT 1
|
||||
|
||||
#include "tray.h"
|
||||
...
|
||||
```
|
||||
|
||||
// For Linux:
|
||||
//#define TRAY_APPINDICATOR 1
|
||||
// For Mac:
|
||||
//#define TRAY_APPKIT 1
|
||||
|
||||
# Demo
|
||||
|
||||
The included example `.c` files can be compiled based on your environment.
|
||||
|
||||
For example, to compile and run the program on Windows:
|
||||
|
||||
```shell
|
||||
$> gcc example_windows.c [Enter]
|
||||
```
|
||||
|
||||
This will compile and build `a.out`. To run it:
|
||||
|
||||
```
|
||||
$> a [Enter]
|
||||
```
|
||||
|
||||
# Example
|
||||
|
||||
```c
|
||||
|
||||
96
example_linux.c
Normal file
96
example_linux.c
Normal file
@@ -0,0 +1,96 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
// For Linux
|
||||
#define TRAY_APPINDICATOR 1
|
||||
|
||||
#include "tray.h"
|
||||
|
||||
#if TRAY_APPINDICATOR
|
||||
#define TRAY_ICON1 "indicator-messages"
|
||||
#define TRAY_ICON2 "indicator-messages-new"
|
||||
#elif TRAY_APPKIT
|
||||
#define TRAY_ICON1 "icon.png"
|
||||
#define TRAY_ICON2 "icon.png"
|
||||
#elif TRAY_WINAPI
|
||||
#define TRAY_ICON1 "icon.ico"
|
||||
#define TRAY_ICON2 "icon.ico"
|
||||
#endif
|
||||
|
||||
static struct tray tray;
|
||||
|
||||
static void toggle_cb(struct tray_menu *item) {
|
||||
printf("toggle cb\n");
|
||||
item->checked = !item->checked;
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
static void hello_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("hello cb\n");
|
||||
if (strcmp(tray.icon, TRAY_ICON1) == 0) {
|
||||
tray.icon = TRAY_ICON2;
|
||||
} else {
|
||||
tray.icon = TRAY_ICON1;
|
||||
}
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
static void quit_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("quit cb\n");
|
||||
tray_exit();
|
||||
}
|
||||
|
||||
static void submenu_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("submenu: clicked on %s\n", item->text);
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
// Test tray init
|
||||
static struct tray tray = {
|
||||
.icon = TRAY_ICON1,
|
||||
.menu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "Hello", .cb = hello_cb},
|
||||
{.text = "Checked", .checked = 1, .cb = toggle_cb},
|
||||
{.text = "Disabled", .disabled = 1},
|
||||
{.text = "-"},
|
||||
{.text = "SubMenu",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "FIRST", .checked = 1, .cb = submenu_cb},
|
||||
{.text = "SECOND",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "THIRD",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "7", .cb = submenu_cb},
|
||||
{.text = "-"},
|
||||
{.text = "8", .cb = submenu_cb},
|
||||
{.text = NULL}}},
|
||||
{.text = "FOUR",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "5", .cb = submenu_cb},
|
||||
{.text = "6", .cb = submenu_cb},
|
||||
{.text = NULL}}},
|
||||
{.text = NULL}}},
|
||||
{.text = NULL}}},
|
||||
{.text = "-"},
|
||||
{.text = "Quit", .cb = quit_cb},
|
||||
{.text = NULL}},
|
||||
};
|
||||
|
||||
int main() {
|
||||
if (tray_init(&tray) < 0) {
|
||||
printf("failed to create tray\n");
|
||||
return 1;
|
||||
}
|
||||
while (tray_loop(1) == 0) {
|
||||
printf("iteration\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
96
example_mac.c
Normal file
96
example_mac.c
Normal file
@@ -0,0 +1,96 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
// For Mac
|
||||
#define TRAY_APPKIT 1
|
||||
|
||||
#include "tray.h"
|
||||
|
||||
#if TRAY_APPINDICATOR
|
||||
#define TRAY_ICON1 "indicator-messages"
|
||||
#define TRAY_ICON2 "indicator-messages-new"
|
||||
#elif TRAY_APPKIT
|
||||
#define TRAY_ICON1 "icon.png"
|
||||
#define TRAY_ICON2 "icon.png"
|
||||
#elif TRAY_WINAPI
|
||||
#define TRAY_ICON1 "icon.ico"
|
||||
#define TRAY_ICON2 "icon.ico"
|
||||
#endif
|
||||
|
||||
static struct tray tray;
|
||||
|
||||
static void toggle_cb(struct tray_menu *item) {
|
||||
printf("toggle cb\n");
|
||||
item->checked = !item->checked;
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
static void hello_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("hello cb\n");
|
||||
if (strcmp(tray.icon, TRAY_ICON1) == 0) {
|
||||
tray.icon = TRAY_ICON2;
|
||||
} else {
|
||||
tray.icon = TRAY_ICON1;
|
||||
}
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
static void quit_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("quit cb\n");
|
||||
tray_exit();
|
||||
}
|
||||
|
||||
static void submenu_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("submenu: clicked on %s\n", item->text);
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
// Test tray init
|
||||
static struct tray tray = {
|
||||
.icon = TRAY_ICON1,
|
||||
.menu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "Hello", .cb = hello_cb},
|
||||
{.text = "Checked", .checked = 1, .cb = toggle_cb},
|
||||
{.text = "Disabled", .disabled = 1},
|
||||
{.text = "-"},
|
||||
{.text = "SubMenu",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "FIRST", .checked = 1, .cb = submenu_cb},
|
||||
{.text = "SECOND",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "THIRD",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "7", .cb = submenu_cb},
|
||||
{.text = "-"},
|
||||
{.text = "8", .cb = submenu_cb},
|
||||
{.text = NULL}}},
|
||||
{.text = "FOUR",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "5", .cb = submenu_cb},
|
||||
{.text = "6", .cb = submenu_cb},
|
||||
{.text = NULL}}},
|
||||
{.text = NULL}}},
|
||||
{.text = NULL}}},
|
||||
{.text = "-"},
|
||||
{.text = "Quit", .cb = quit_cb},
|
||||
{.text = NULL}},
|
||||
};
|
||||
|
||||
int main() {
|
||||
if (tray_init(&tray) < 0) {
|
||||
printf("failed to create tray\n");
|
||||
return 1;
|
||||
}
|
||||
while (tray_loop(1) == 0) {
|
||||
printf("iteration\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
96
example_windows.c
Normal file
96
example_windows.c
Normal file
@@ -0,0 +1,96 @@
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
// For Windows:
|
||||
#define TRAY_WINAPI 1
|
||||
|
||||
#include "tray.h"
|
||||
|
||||
#if TRAY_APPINDICATOR
|
||||
#define TRAY_ICON1 "indicator-messages"
|
||||
#define TRAY_ICON2 "indicator-messages-new"
|
||||
#elif TRAY_APPKIT
|
||||
#define TRAY_ICON1 "icon.png"
|
||||
#define TRAY_ICON2 "icon.png"
|
||||
#elif TRAY_WINAPI
|
||||
#define TRAY_ICON1 "icon.ico"
|
||||
#define TRAY_ICON2 "icon.ico"
|
||||
#endif
|
||||
|
||||
static struct tray tray;
|
||||
|
||||
static void toggle_cb(struct tray_menu *item) {
|
||||
printf("toggle cb\n");
|
||||
item->checked = !item->checked;
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
static void hello_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("hello cb\n");
|
||||
if (strcmp(tray.icon, TRAY_ICON1) == 0) {
|
||||
tray.icon = TRAY_ICON2;
|
||||
} else {
|
||||
tray.icon = TRAY_ICON1;
|
||||
}
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
static void quit_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("quit cb\n");
|
||||
tray_exit();
|
||||
}
|
||||
|
||||
static void submenu_cb(struct tray_menu *item) {
|
||||
(void)item;
|
||||
printf("submenu: clicked on %s\n", item->text);
|
||||
tray_update(&tray);
|
||||
}
|
||||
|
||||
// Test tray init
|
||||
static struct tray tray = {
|
||||
.icon = TRAY_ICON1,
|
||||
.menu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "Hello", .cb = hello_cb},
|
||||
{.text = "Checked", .checked = 1, .cb = toggle_cb},
|
||||
{.text = "Disabled", .disabled = 1},
|
||||
{.text = "-"},
|
||||
{.text = "SubMenu",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "FIRST", .checked = 1, .cb = submenu_cb},
|
||||
{.text = "SECOND",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "THIRD",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "7", .cb = submenu_cb},
|
||||
{.text = "-"},
|
||||
{.text = "8", .cb = submenu_cb},
|
||||
{.text = NULL}}},
|
||||
{.text = "FOUR",
|
||||
.submenu =
|
||||
(struct tray_menu[]){
|
||||
{.text = "5", .cb = submenu_cb},
|
||||
{.text = "6", .cb = submenu_cb},
|
||||
{.text = NULL}}},
|
||||
{.text = NULL}}},
|
||||
{.text = NULL}}},
|
||||
{.text = "-"},
|
||||
{.text = "Quit", .cb = quit_cb},
|
||||
{.text = NULL}},
|
||||
};
|
||||
|
||||
int main() {
|
||||
if (tray_init(&tray) < 0) {
|
||||
printf("failed to create tray\n");
|
||||
return 1;
|
||||
}
|
||||
while (tray_loop(1) == 0) {
|
||||
printf("iteration\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
35
main.c
Normal file
35
main.c
Normal file
@@ -0,0 +1,35 @@
|
||||
#include <stdio.h>
|
||||
#include "tray.h"
|
||||
|
||||
extern void toggle_cb(struct tray_menu *item);
|
||||
extern void quit_cb(struct tray_menu *item);
|
||||
|
||||
struct tray main_tray = {
|
||||
.icon = "icon.ico",
|
||||
.menu = (struct tray_menu[]){{"Toggle me", 0, 0, toggle_cb, NULL},
|
||||
{"-", 0, 0, NULL, NULL},
|
||||
{"Quit", 0, 0, quit_cb, NULL},
|
||||
{NULL, 0, 0, NULL, NULL}},
|
||||
};
|
||||
|
||||
void toggle_cb(struct tray_menu *item) {
|
||||
item->checked = !item->checked;
|
||||
tray_update(&main_tray);
|
||||
}
|
||||
|
||||
void quit_cb(struct tray_menu *item) {
|
||||
tray_exit();
|
||||
}
|
||||
|
||||
|
||||
int main() {
|
||||
|
||||
|
||||
|
||||
tray_init(&main_tray);
|
||||
while (tray_loop(1) == 0);
|
||||
tray_exit();
|
||||
|
||||
|
||||
return 0;
|
||||
}
|
||||
Reference in New Issue
Block a user