From 8aaf2cfda70bbcbc51c3919d0f249242f1c81b4e Mon Sep 17 00:00:00 2001 From: foudfou Date: Mon, 17 Jun 2013 23:45:38 +0200 Subject: [PATCH] fix: add long-living references to timers for ChatStatusIcon blinking --- src/modules/FiretrayChat.jsm | 24 ++- src/modules/FiretrayHandler.jsm | 6 +- src/modules/linux/FiretrayChatStatusIcon.jsm | 147 +++++++++++-------- 3 files changed, 98 insertions(+), 79 deletions(-) diff --git a/src/modules/FiretrayChat.jsm b/src/modules/FiretrayChat.jsm index 981d3b9..456ec24 100644 --- a/src/modules/FiretrayChat.jsm +++ b/src/modules/FiretrayChat.jsm @@ -15,11 +15,6 @@ let log = firetray.Logging.getLogger("firetray.Chat"); firetray.Chat = { initialized: false, observedTopics: {}, - shouldAcknowledgeConvs: { // TODO: FOUDIL: rename to convsToAcknoledge - ids: {}, - length: function(){return Object.keys(this.ids).length;} - }, - get isBlinking () {return (this.shouldAcknowledgeConvs.length() > 0);}, init: function() { if (this.initialized) { @@ -132,16 +127,17 @@ firetray.Chat = { this.startGetAttention(conv); - this.shouldAcknowledgeConvs.ids[conv.id] = conv; - log.debug(conv.id+' added to shouldAcknowledgeConvs, length='+this.shouldAcknowledgeConvs.length()); + firetray.ChatStatusIcon.convsToAcknowledge.ids[conv.id] = conv; + log.debug(conv.id+' added to convsToAcknowledge, length='+firetray.ChatStatusIcon.convsToAcknowledge.length()); }, startGetAttention: function(conv) { log.debug("startGetAttention"); this.setUrgencyMaybe(conv); - log.debug("this.isBlinking="+this.isBlinking); - if (this.isBlinking) return; + log.debug("firetray.ChatStatusIcon.isBlinking="+firetray.ChatStatusIcon.isBlinking); + if (firetray.ChatStatusIcon.isBlinking) return; + let blinkStyle = firetray.Utils.prefService.getIntPref("chat_icon_blink_style"); log.debug("chat_icon_blink_style="+blinkStyle); if (blinkStyle === FIRETRAY_CHAT_ICON_BLINK_STYLE_NORMAL) @@ -157,21 +153,21 @@ firetray.Chat = { */ stopGetAttentionMaybe: function(xid) { log.debug("stopGetAttentionMaybe"); - log.debug("shouldAcknowledgeConvsLength="+this.shouldAcknowledgeConvs.length()); - if (!this.isBlinking) return; // instead of pref chat_icon_blink — if pref was just unset + log.debug("convsToAcknowledgeLength="+firetray.ChatStatusIcon.convsToAcknowledge.length()); + if (!firetray.ChatStatusIcon.isBlinking) return; // instead of pref chat_icon_blink — if pref was just unset let selectedConv = this.getSelectedConv(xid); if (!selectedConv) return; - for (let convId in this.shouldAcknowledgeConvs.ids) { + for (let convId in firetray.ChatStatusIcon.convsToAcknowledge.ids) { log.debug(convId+" == "+selectedConv.id); if (convId == selectedConv.id) { - delete this.shouldAcknowledgeConvs.ids[convId]; + delete firetray.ChatStatusIcon.convsToAcknowledge.ids[convId]; break; } } - if (this.shouldAcknowledgeConvs.length() === 0) + if (firetray.ChatStatusIcon.convsToAcknowledge.length() === 0) this.stopGetAttention(xid); }, diff --git a/src/modules/FiretrayHandler.jsm b/src/modules/FiretrayHandler.jsm index 26fc424..f6cc031 100644 --- a/src/modules/FiretrayHandler.jsm +++ b/src/modules/FiretrayHandler.jsm @@ -483,7 +483,7 @@ firetray.PrefListener = new PrefListener( case 'chat_icon_blink': if (!firetray.Utils.prefService.getBoolPref('chat_icon_blink') && - firetray.Chat.isBlinking) { + firetray.ChatStatusIcon.isBlinking) { /* FIXME: stopGetAttention() needs a window id. For now just pass the active window */ firetray.Chat.stopGetAttention(firetray.Handler.findActiveWindow()); @@ -491,8 +491,8 @@ firetray.PrefListener = new PrefListener( break; case 'chat_icon_blink_style': - if (!(firetray.Utils.prefService.getBoolPref('chat_icon_blink') && - firetray.Chat.isBlinking)) + if (!firetray.Utils.prefService.getBoolPref('chat_icon_blink') || + !firetray.ChatStatusIcon.isBlinking) break; switch (firetray.Utils.prefService.getIntPref("chat_icon_blink_style")) { diff --git a/src/modules/linux/FiretrayChatStatusIcon.jsm b/src/modules/linux/FiretrayChatStatusIcon.jsm index b582440..1a007b0 100644 --- a/src/modules/linux/FiretrayChatStatusIcon.jsm +++ b/src/modules/linux/FiretrayChatStatusIcon.jsm @@ -23,6 +23,10 @@ if ("undefined" == typeof(firetray.Handler)) let log = firetray.Logging.getLogger("firetray.ChatStatusIcon"); +const ALPHA_STEP = 5; +const ALPHA_STEP_SLEEP_MILLISECONDS = 10; +const FADE_OVER_SLEEP_MILLISECONDS = 500; + firetray.ChatStatusIcon = { GTK_THEME_ICON_PATH: null, @@ -41,6 +45,13 @@ firetray.ChatStatusIcon = { signals: {'focus-in': {callback: {}, handler: {}}}, timers: {}, events: {}, + generators: {}, + pixBuffer: {}, + convsToAcknowledge: { + ids: {}, + length: function(){return Object.keys(this.ids).length;} + }, + get isBlinking () {return (this.convsToAcknowledge.length() > 0);}, init: function() { if (!firetray.Handler.inMailApp) throw "ChatStatusIcon for mail app only"; @@ -84,7 +95,7 @@ firetray.ChatStatusIcon = { let blinkStyle = firetray.Utils.prefService.getIntPref("chat_icon_blink_style"); if (blinkStyle === FIRETRAY_CHAT_ICON_BLINK_STYLE_FADE && - firetray.Chat.shouldAcknowledgeConvs.length()) { + this.isBlinking) { this.events['icon-changed'] = true; return; } @@ -137,7 +148,7 @@ firetray.ChatStatusIcon = { alpha_bak[(i-3)/n_channels] = pixels.contents[i]; log.debug("pixbuf created"); - return { + this.pixBuffer = { pixbuf: pixbuf, // TO BE UNREFED WITH to g_object_unref() !! width: width, height: height, @@ -148,71 +159,83 @@ firetray.ChatStatusIcon = { alpha_bak: alpha_bak }; }, - dropPixBuf: function(p) { - gobject.g_object_unref(p.pixbuf); + dropPixBuf: function() { + gobject.g_object_unref(this.pixBuffer.pixbuf); log.debug("pixbuf unref'd"); + this.pixBuffer = {}; + }, + + fadeGenerator: function() { + let pixbuf = firetray.ChatStatusIcon.pixBuffer; + + for (let a=255; a>0; a-=ALPHA_STEP) { + for(let i=3; i0) + pixbuf.pixels.contents[i] -= ALPHA_STEP; + gtk.gtk_status_icon_set_from_pixbuf(firetray.ChatStatusIcon.trayIcon, pixbuf.pixbuf); + yield true; + } + + for (let a=255; a>0; a-=ALPHA_STEP) { + for(let i=3; i 0"); + firetray.ChatStatusIcon.timers['fade-loop'] = firetray.Utils.timer( + FADE_OVER_SLEEP_MILLISECONDS, Ci.nsITimer.TYPE_ONE_SHOT, function(){ + log.warn("fadeLoop else -> 1"); + firetray.ChatStatusIcon.fadeLoop();} + ); + } + }; + }, + + fadeLoop: function() { + log.warn("stop-fade 0:"+firetray.ChatStatusIcon.events['stop-fade']); + firetray.ChatStatusIcon.generators['fade'] = firetray.ChatStatusIcon.fadeGenerator(); + firetray.ChatStatusIcon.fadeStep(); }, startFading: function() { log.debug("startFading"); - const ALPHA_STEP = 5; - const ALPHA_STEP_SLEEP_MILLISECONDS = 10; - const FADE_OVER_SLEEP_MILLISECONDS = 500; - - function fadeGen(p) { - for (let a=255; a>0; a-=ALPHA_STEP) { - for(let i=3; i0) - p.pixels.contents[i] -= ALPHA_STEP; - gtk.gtk_status_icon_set_from_pixbuf(firetray.ChatStatusIcon.trayIcon, p.pixbuf); - yield true; - } - - for (let a=255; a>0; a-=ALPHA_STEP) { - for(let i=3; i