Skip to content

Commit

Permalink
Fixed some problems creating that would make the program crash
Browse files Browse the repository at this point in the history
if the mouse was over the icon too fast
  • Loading branch information
taksan committed Aug 2, 2011
1 parent ef7b681 commit 13b8cd4
Show file tree
Hide file tree
Showing 7 changed files with 34 additions and 19 deletions.
2 changes: 1 addition & 1 deletion src-native/linux/Makefile
Expand Up @@ -59,7 +59,7 @@ tray_linux_NativeLinuxTray.h: ../../src/main/java/tray/linux/NativeLinuxTray.jav
.c.o:
$(CC) -c $(CFLAGS) $(INCPATH) -m32 -o $@ $<

nativeTrayTest:
nativeTrayTest: nativeTrayMainTest.c
gcc -o nativeTrayTest nativeTrayMainTest.c -g -lpthread -L$(TRAY_PATH) -llinuxtray_x64

clean:
Expand Down
4 changes: 3 additions & 1 deletion src-native/linux/commonFunctions.c
Expand Up @@ -10,7 +10,9 @@ int nextInstanceId = 0;
JavaVM *javaVM = NULL;

jobject getLinuxTrayIconAdapter(JNIEnv* env, int nativeId) {

if (gtkMainThreadJniEnv == NULL) {
return NULL;
}
jclass classRef = (*gtkMainThreadJniEnv)->FindClass(gtkMainThreadJniEnv, LINUX_NATIVE_TRAY_ADAPTER_CLASS);
jmethodID mid = (*env)->GetStaticMethodID(env, classRef, "getLinuxTrayIconAdapter", "(I)L" JAVA_TRAY_ICON_ADAPTER_CLASS ";");
if (mid == 0) {
Expand Down
38 changes: 22 additions & 16 deletions src-native/linux/nativeCreateTrayIcon.c
Expand Up @@ -43,18 +43,27 @@ int createTrayIconForIconAndWithTooltip(char * iconFileName, char * tooltipText)
waitUntilTheTrayIconIsCreatedWhenGtkMainIsIdle(trayIconData);

int newInstanceId = trayIconData->nativeId;

pthread_cond_destroy(&trayIconData->condToWaitInit);
pthread_mutex_destroy(&trayIconData->lockToWaitInit);
free(trayIconData);

printf(" Tray icon creation finished. **\n");
return newInstanceId;
}


gboolean createTrayIconWhenGtkMainIsIdle(TrayIconData * trayIconData)
{
GtkStatusIcon *trayIcon = gtk_status_icon_new_from_file (trayIconData->iconFileName);
gtk_status_icon_set_visible(trayIcon, FALSE);

TrayIconInstance * trayIconInstance = &nativeInstance[trayIconData->nativeId];
trayIconInstance->trayIcon = trayIcon;

gtk_status_icon_set_tooltip (trayIcon, trayIconData->tooltipText);
const char * tooltipText = strdup(trayIconData->tooltipText);

gtk_status_icon_set_tooltip (trayIcon, tooltipText);

trayIconInstance->trayIconMenu = createTrayIconMenu(trayIcon);
gtk_widget_show_all (trayIconInstance->trayIconMenu);
Expand All @@ -63,19 +72,11 @@ gboolean createTrayIconWhenGtkMainIsIdle(TrayIconData * trayIconData)
*nativeIdParam = trayIconData->nativeId;
g_signal_connect(GTK_STATUS_ICON (trayIcon), "activate", GTK_SIGNAL_FUNC (trayIconActivatedHandler), nativeIdParam);

gtk_status_icon_set_visible(trayIcon, TRUE);


printf("Will lock before sending signal\n");
pthread_mutex_lock(&trayIconData->lockToWaitInit);


printf("Will send signal\n");
pthread_cond_signal(&trayIconData->condToWaitInit);

printf("Signal sent, releasing lock\n");
pthread_mutex_unlock(&trayIconData->lockToWaitInit);
printf("Lock released\n");

gtk_status_icon_set_visible(trayIcon, TRUE);

return 0;
}
Expand All @@ -100,23 +101,30 @@ void initializeMutexToWaitUntilActualTrayIconCreation(TrayIconData * trayIconDat

void waitUntilTheTrayIconIsCreatedWhenGtkMainIsIdle(TrayIconData * trayIconData)
{
printf(" -- will wait condition -- \n");
// wait until the tray icon is created
pthread_cond_wait(&trayIconData->condToWaitInit, &trayIconData->lockToWaitInit);
pthread_mutex_unlock(&trayIconData->lockToWaitInit);

printf(" -- condition met -- \n");
sleep(1);
}

void trayIconActivatedHandler(GObject *trayIcon, gpointer nativeIdPointer)
{
(void) trayIcon; // avoid warning
if (gtkMainThreadJniEnv == NULL) {
print_debugger("gtkMainThreadJniEnv is NULL. This situation should be impossible.");
return;
}
jobject trayAdapter = getLinuxTrayIconAdapter(gtkMainThreadJniEnv, *((int*)nativeIdPointer));
if (trayAdapter == NULL){
print_debugger("Tray adapter is NULL.");
return;
}
jclass classRef = (*gtkMainThreadJniEnv)->GetObjectClass(gtkMainThreadJniEnv, trayAdapter);

jmethodID mid = (*gtkMainThreadJniEnv)->GetMethodID(gtkMainThreadJniEnv, classRef, ACTION_CALLBACK_METHOD_NAME, "()V");

if (mid == 0) {
print_debugger(ACTION_CALLBACK_METHOD_NAME " was not found.");
return;
}

Expand Down Expand Up @@ -147,9 +155,7 @@ int getNextInstanceId() {
GtkWidget *createTrayIconMenu(GtkStatusIcon *trayIcon)
{
GtkWidget *trayIconMenu = gtk_menu_new();

g_signal_connect(GTK_STATUS_ICON (trayIcon), "popup-menu", GTK_SIGNAL_FUNC (trayIconPopupHandler), trayIconMenu);

return trayIconMenu;
}

Expand Down
8 changes: 7 additions & 1 deletion src-native/linux/nativeInit.c
@@ -1,10 +1,12 @@
#include <stdlib.h>
#include <pthread.h>
#include "commonFunctions.h"

void * gtkMainThread(void * nothingUseful);
JNIEXPORT void JNICALL Java_tray_linux_NativeLinuxTray_nativeInit0
(JNIEnv *env, jobject invokingObject)
{
(void)invokingObject;//avoid warning
(*env)->GetJavaVM(env, &javaVM);

gtk_init_with_empty_args();
Expand All @@ -15,15 +17,19 @@ JNIEXPORT void JNICALL Java_tray_linux_NativeLinuxTray_nativeInit0

void * gtkMainThread(void * nothingUseful)
{
(void)nothingUseful;
(*javaVM)->AttachCurrentThread(javaVM, (void**) &gtkMainThreadJniEnv, NULL );
gtk_main();
(*javaVM)->DetachCurrentThread(javaVM);
return NULL;
}

void gtk_init_with_empty_args()
{
int argc = 0;
char ** argv = malloc(sizeof(char*));
argv[0] = "";
gtk_init (&argc, &argv);
if (gtk_init_check (&argc, &argv) == FALSE) {
fprintf(stderr, "Failed to start GTK\n");
}
}
1 change: 1 addition & 0 deletions src-native/linux/nativeTrayMainTest.c
Expand Up @@ -12,6 +12,7 @@ int main()
pthread_t mainThreadId;
pthread_create(&mainThreadId, NULL, mainThread , NULL);

createTrayIconForIconAndWithTooltip("/home/takeuchi/projects/trayicon-tests/skype2gmail.svg", "some tip");
createTrayIconForIconAndWithTooltip("/home/takeuchi/projects/trayicon-tests/skype2gmail.svg", "some tip");

pthread_join(mainThreadId, NULL);
Expand Down
Binary file modified src/main/resources/liblinuxtray_x64.so
Binary file not shown.
Binary file modified src/main/resources/liblinuxtray_x86.so
Binary file not shown.

0 comments on commit 13b8cd4

Please sign in to comment.