From patchwork Mon Jun 13 05:19:00 2005 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "C.Y.M" X-Patchwork-Id: 11912 Received: from c-24-10-6-146.hsd1.ca.comcast.net ([24.10.6.146] helo=nofear.bounceme.net) by www.linuxtv.org with esmtp (Exim 4.34) id 1DhhLp-0002dF-Hw for vdr@linuxtv.org; Mon, 13 Jun 2005 07:19:09 +0200 Received: from [10.1.1.66] (hades [10.1.1.66]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client did not present a certificate) by nofear.bounceme.net (Postfix) with ESMTP id A6F4173534 for ; Sun, 12 Jun 2005 22:18:35 -0700 (PDT) Message-ID: <42AD1744.9000203@syphir.sytes.net> Date: Sun, 12 Jun 2005 22:19:00 -0700 From: "C.Y.M" Organization: CooLNeT User-Agent: Mozilla Thunderbird 1.0.2 (Windows/20050317) X-Accept-Language: en-us, en MIME-Version: 1.0 To: Vdr X-Enigmail-Version: 0.91.0.0 Subject: [vdr] vdr-1.3.26 and wrap around menus (backport of natural menu cursor) X-BeenThere: vdr@linuxtv.org X-Mailman-Version: 2.1.5 Precedence: list Reply-To: syphir@syphir.sytes.net, Klaus Schmidinger's VDR List-Id: Klaus Schmidinger's VDR List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 13 Jun 2005 05:19:10 -0000 Status: O X-Status: X-Keywords: X-UID: 3002 Hello, On 2004-12-01, Patrick Gleichmann wrote a nice patch for vdr to give the menu a wrap around scrolling effect. After the release of vdr-1.3.26, and all the changes to osdbase.c, the patch no longer worked. I have backported Patrick's patch for vdr-1.3.26. If anyone knows a better way to fix this patch, please let me know. Best Regards, --- vdr-1.3.26/osdbase.c 2005-06-12 03:44:22.000000000 -0700 +++ vdr-1.3.25/osdbase.c 2005-06-12 21:05:25.000000000 -0700 @@ -259,116 +254,128 @@ return item && item->Selectable(); } -void cOsdMenu::CursorUp(void) -{ - if (current > 0) { - int tmpCurrent = current; - while (--tmpCurrent >= 0 && !SelectableItem(tmpCurrent)) - ; - if (tmpCurrent < 0) - return; - if (tmpCurrent >= first) - DisplayCurrent(false); - current = tmpCurrent; - if (current < first) { - first = first > displayMenuItems - 1 ? first - (displayMenuItems - 1) : 0; - if (Setup.MenuScrollPage) - current = !SelectableItem(first) ? first + 1 : first; - Display(); - } - else - DisplayCurrent(true); - } -} - void cOsdMenu::CursorDown(void) { int last = Count() - 1; int lastOnScreen = first + displayMenuItems - 1; + bool wrapped = false; - if (current < last) { - int tmpCurrent = current; - while (++tmpCurrent <= last && !SelectableItem(tmpCurrent)) - ; - if (tmpCurrent > last) - return; - if (tmpCurrent <= lastOnScreen) - DisplayCurrent(false); - current = tmpCurrent; - if (current > lastOnScreen) { - first += displayMenuItems - 1; - lastOnScreen = first + displayMenuItems - 1; - if (lastOnScreen > last) { - first = last - (displayMenuItems - 1); - lastOnScreen = last; - } - if (Setup.MenuScrollPage) - current = !SelectableItem(lastOnScreen) ? lastOnScreen - 1 : lastOnScreen; - Display(); - } - else - DisplayCurrent(true); + // Search the next selectable item + int tmpCurrent = current; + do { + tmpCurrent++; + if (tmpCurrent > last) { //wrapped + tmpCurrent = 0; + wrapped = Count() > displayMenuItems; + } + } while (!SelectableItem(tmpCurrent)); + + // Hide "cursor" + if ((tmpCurrent <= lastOnScreen) && !wrapped) + DisplayCurrent(false); + + current = tmpCurrent; + + // Adjust first - repaint the whole list + if (wrapped) { + first = 0; + Display(); + + } else if (current > lastOnScreen) { + if (Setup.MenuScrollPage) { + first = lastOnScreen; + } else { + first = current - (displayMenuItems - 1); + if (first < 0) + first = 0; + } + + Display(); } + + // Update cursor + else + DisplayCurrent(true); } +void cOsdMenu::CursorUp(void) +{ + int tmpCurrent = current; + bool wrapped = false; + + // Search a selectable item + do { + tmpCurrent--; + if (tmpCurrent < 0) { // wrap + // if (Setup.DontWrap) return; + tmpCurrent = Count() - 1; + wrapped = Count() > displayMenuItems; + } + } while (!SelectableItem(tmpCurrent)); + + // Hide "cursor" + if ((tmpCurrent >= first) && !wrapped) + DisplayCurrent(false); + + current = tmpCurrent; + + // Adjust first - repaint the whole list + if (wrapped) { + first = current - (displayMenuItems - 1); + if (first < 0) + first = 0; + + Display(); + } else if (current < first) { + if (Setup.MenuScrollPage) { + first -= displayMenuItems - 1; + if (first < 0) + first = 0; + } else + first = current; + + Display(); + + // Update cursor + } else + DisplayCurrent(true); +} + void cOsdMenu::PageUp(void) { - int oldCurrent = current; - int oldFirst = first; current -= displayMenuItems; first -= displayMenuItems; - int last = Count() - 1; - if (current < 0) - current = 0; + if (first < 0) { // wrap + current = Count() - 1; + first = current - (displayMenuItems - 1); if (first < 0) - first = 0; - int tmpCurrent = current; - while (!SelectableItem(tmpCurrent) && --tmpCurrent >= 0) - ; - if (tmpCurrent < 0) { - tmpCurrent = current; - while (++tmpCurrent <= last && !SelectableItem(tmpCurrent)) - ; - } - current = tmpCurrent <= last ? tmpCurrent : -1; - if (current >= 0) { - if (current < first) - first = current; - else if (current - first >= displayMenuItems) - first = current - displayMenuItems + 1; - } - if (current != oldCurrent || first != oldFirst) { - Display(); - DisplayCurrent(true); - } + first = 0; + } + + while (!SelectableItem(current)) { + current--; + first = min(first, current - 1); + } + + Display(); + DisplayCurrent(true); } void cOsdMenu::PageDown(void) { - int oldCurrent = current; - int oldFirst = first; current += displayMenuItems; first += displayMenuItems; - int last = Count() - 1; - int tmpCurrent = current; - while (!SelectableItem(tmpCurrent) && ++tmpCurrent <= last) - ; - if (tmpCurrent > last) { - tmpCurrent = current; - while (--tmpCurrent >= 0 && !SelectableItem(tmpCurrent)) - ; - } - current = tmpCurrent > 0 ? tmpCurrent : -1; - if (current >= 0) { - if (current < first) - first = current; - else if (current - first >= displayMenuItems) - first = current - displayMenuItems + 1; - } - if (current != oldCurrent || first != oldFirst) { - Display(); - DisplayCurrent(true); - } + int count = Count(); + if (current > count - 1) // wrap + first = current = 0; + + while (!SelectableItem(current)) { + current++; + first = max(first, current - displayMenuItems); + } + + Display(); + DisplayCurrent(true); } void cOsdMenu::Mark(void)