Skip to content
This repository has been archived by the owner on Oct 16, 2020. It is now read-only.

Commit

Permalink
example of using libfirtray to display gtk version
Browse files Browse the repository at this point in the history
  • Loading branch information
foudfou committed Mar 21, 2013
1 parent d91bfd1 commit 2708073
Show file tree
Hide file tree
Showing 8 changed files with 89 additions and 15 deletions.
1 change: 1 addition & 0 deletions src/chrome.manifest
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ skin firetray classic/1.0 chrome/skin/
locale firetray en-US chrome/locale/en-US/
locale firetray sk-SK chrome/locale/sk-SK/
resource firetray modules/
resource firetray-lib lib/linux/firetray_x86_64-gcc4.so abi=Linux_x86_64-gcc3

overlay chrome://browser/content/browser.xul chrome://firetray/content/overlay.xul
overlay chrome://messenger/content/messenger.xul chrome://firetray/content/overlay.xul
Expand Down
6 changes: 2 additions & 4 deletions src/lib/linux/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -14,13 +14,11 @@ libs = firetray_$(platform)-gcc$(GCCVERSION).so
all: $(libs)
@echo
@echo add this line to chrome.manifest:
@echo "resource firetray-lib lib/linux/$(libs)"
@echo "resource firetray-lib lib/linux/$(libs) abi=Linux_x86_64-gcc3"
@echo
@echo and use
@echo 'Cu.import("resource://firetray/ctypes/libfiretray.jsm");'
@echo 'libfiretray.init();'
@echo '//...'
@echo 'libfiretray.shutdown();'
@echo 'firetray.Handler.subscribeLibsForClosing([libfiretray]);'
@echo

$(libs): firetray.o
Expand Down
4 changes: 4 additions & 0 deletions src/lib/linux/firetray.c
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,7 @@ int gtk_is_window(void* obj) {
int gtk_is_widget(void* obj) {
return GTK_IS_WIDGET(obj) ? 1 : 0;
}

unsigned int gtk_get_major_version(void) {return (unsigned int)gtk_major_version;}
unsigned int gtk_get_minor_version(void) {return (unsigned int)gtk_minor_version;}
unsigned int gtk_get_micro_version(void) {return (unsigned int)gtk_micro_version;}
8 changes: 8 additions & 0 deletions src/lib/linux/firetray.h
Original file line number Diff line number Diff line change
@@ -1,3 +1,11 @@
#include <gdk/gdk.h>

extern int gdk_is_window(void* obj);
extern int gtk_is_window(void* obj);
extern int gtk_is_widget(void* obj);

/* the library version (not headers). These functions are provided natively in
* gtk+-3.0 */
extern unsigned int gtk_get_major_version(void);
extern unsigned int gtk_get_minor_version(void);
extern unsigned int gtk_get_micro_version(void);
45 changes: 42 additions & 3 deletions src/modules/ctypes/libfiretray.jsm
Original file line number Diff line number Diff line change
Expand Up @@ -9,18 +9,36 @@ const Cu = Components.utils;
Cu.import("resource://gre/modules/Services.jsm");
Cu.import("resource://firetray/logging.jsm");

let log = firetray.Logging.getLogger("firetray.libfiretray");

const _path = (function(){
var uri = Services.io.newURI('resource://firetray-lib', null, null);
if (uri instanceof Ci.nsIFileURL)
return uri.file.path;
throw new Error("path not resolved");
path = null;
try {
if (uri instanceof Ci.nsIFileURL)
path = uri.file.path;
} catch(error) {
log.error(error);
throw new Error("path not resolved");
}
return path;
})();

/*
* the firetray is not a standard lib, with standard naming, so we have to
* mimic ctypes-utils
*/
var libfiretray = {

_lib: null,
name: 'libfiretray',
_available: false,
available: function(){return this._available;}, // compliance with ctypes-utils

init: function() {
log.info("__URI__1="+this.__URI__);
log.info("__URI__2="+this.global.__URI__);

// If ctypes doesn't exist, try to get it
Cu.import("resource://gre/modules/ctypes.jsm");
// If we still don't have ctypes, this isn't going to work...
Expand All @@ -41,20 +59,41 @@ var libfiretray = {
throw(e);
}

this._available = true;

// Ok, we got everything - let's declare.
this._declare();
},

shutdown: function() {
log.debug("Closing library " + this.name);
// Close our connection to the library.
if (this._lib)
this._lib.close();

this._available = false;

if (!("__URI__" in this.global) || !this.global.__URI__) {
// We could have already been unloaded by now
return;
}

log.debug("Unloading JS module " + this.global.__URI__);
Cu.unload(this.global.__URI__);
},

_declare: function() {
this.gdk_is_window = this._lib.declare("gdk_is_window", ctypes.default_abi, ctypes.int, ctypes.void_t.ptr);
this.gtk_is_window = this._lib.declare("gtk_is_window", ctypes.default_abi, ctypes.int, ctypes.void_t.ptr);
this.gtk_is_widget = this._lib.declare("gtk_is_widget", ctypes.default_abi, ctypes.int, ctypes.void_t.ptr);
this.gtk_get_major_version = this._lib.declare("gtk_get_major_version", ctypes.default_abi, ctypes.unsigned_int);
this.gtk_get_minor_version = this._lib.declare("gtk_get_minor_version", ctypes.default_abi, ctypes.unsigned_int);
this.gtk_get_micro_version = this._lib.declare("gtk_get_micro_version", ctypes.default_abi, ctypes.unsigned_int);
}

};
libfiretray.global = this;

libfiretray.close = libfiretray.shutdown; // compliance with ctypes-utils

libfiretray.init();
7 changes: 7 additions & 0 deletions src/modules/linux/FiretrayWindow.jsm
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,13 @@ firetray.Window = {
if (!gtkVersionCheck.isNull())
log.error("gtk_check_version="+gtkVersionCheck.readString());

Cu.import("resource://firetray/ctypes/libfiretray.jsm");
firetray.Handler.subscribeLibsForClosing([libfiretray]);
log.info("GTK VERSION="+
libfiretray.gtk_get_major_version()+"."+
libfiretray.gtk_get_minor_version()+"."+
libfiretray.gtk_get_micro_version());

if (firetray.Handler.isChatEnabled()) {
Cu.import("resource://firetray/FiretrayChat.jsm");
Cu.import("resource://firetray/linux/FiretrayChatStatusIcon.jsm");
Expand Down
20 changes: 12 additions & 8 deletions testing/Makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
includes := $(shell pkg-config --libs --cflags gtk+-2.0)
includes_gtk := $(shell pkg-config --libs --cflags gtk+-2.0)
includes_gdk_gtk := $(shell pkg-config --libs --cflags gdk-2.0 gtk+-2.0)
executables := gtk_icon_example trayicon hide xtypes x11XGetWindowProp \
window_state_event xev_desktop teststatusicon
window_state_event xev_desktop teststatusicon gtk-version

.PHONY: all
all: $(executables)
Expand All @@ -10,25 +11,28 @@ clean:
rm $(executables)

gtk_icon_example: gtk_icon_example.c
gcc $(includes) -o gtk_icon_example gtk_icon_example.c
gcc $(includes_gtk) -o gtk_icon_example gtk_icon_example.c

trayicon: trayicon.c
gcc $(includes) -o trayicon trayicon.c
gcc $(includes_gtk) -o trayicon trayicon.c

hide: hide.c
gcc $(includes) -o hide hide.c
gcc $(includes_gtk) -o hide hide.c

xtypes: xtypes.c
gcc $(includes) -o xtypes xtypes.c
gcc $(includes_gtk) -o xtypes xtypes.c

x11XGetWindowProp: x11XGetWindowProp.c
gcc -Wall x11XGetWindowProp.c -o x11XGetWindowProp -lm -lXext -lX11

window_state_event: window_state_event.c
gcc $(includes) -o window_state_event window_state_event.c
gcc $(includes_gtk) -o window_state_event window_state_event.c

xev_desktop: xev_desktop.c
gcc -lXm -lXt -lX11 -o xev_desktop xev_desktop.c

teststatusicon: teststatusicon.c prop-editor.c
gcc $(includes) -o teststatusicon teststatusicon.c prop-editor.c
gcc $(includes_gtk) -o teststatusicon teststatusicon.c prop-editor.c

gtk-version: gtk-version.c ../src/lib/linux/firetray_x86_64-gcc4.so
gcc $(includes_gdk_gtk) ../src/lib/linux/firetray_x86_64-gcc4.so -o gtk-version gtk-version.c
13 changes: 13 additions & 0 deletions testing/gtk-version.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
#include <stdio.h>
#include <stdlib.h>
#include "../src/lib/linux/firetray.h"

int main(int argc, char** argv) {
printf("gtk version: %d.%d.%d\n",
gtk_get_major_version(),
gtk_get_minor_version(),
gtk_get_micro_version()
);

return(EXIT_SUCCESS);
}

0 comments on commit 2708073

Please sign in to comment.