00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00031 #include <stdio.h>
00032 #include <time.h>
00033
00034 #include <gtk/gtk.h>
00035 #include <gdk/gdk.h>
00036 #include <gdk/gdkx.h>
00037 #include <glib.h>
00038
00039 #include "setupLog.h"
00040 #include "displayStatus.h"
00041 #include "liberdm/erdm.h"
00042 #include "erbusy.h"
00043
00044 static int g_currentLevel = LOWEST_LEVEL;
00045
00046 #if ST_LOGGING_ON
00047 static int counter = 0;
00048 #endif
00049
00050
00058 gboolean display_update_during_idle_handling(gpointer data)
00059 {
00060 int level = (int) data;
00061 int nQuality;
00062 eDmQuality quality;
00063 XImage *xi;
00064
00065
00066 gdk_threads_enter();
00067 xi = XGetImage(GDK_DISPLAY(), GDK_ROOT_WINDOW(), 0, 0, 1, 1, AllPlanes, XYPixmap);
00068 gdk_flush();
00069 XDestroyImage(xi);
00070 gdk_threads_leave();
00071
00072 erbusy_off();
00073
00074
00075
00076
00077
00078 level = (int) data & 0x0000FFFF;
00079 nQuality = (int) data >> 16;
00080
00081 #if (ST_SCREEN_ON)
00082 static int counter = 0;
00083 ST_WARNPRINTF(" **** (%d.%d) ***** [%d]", level, nQuality, counter++);
00084 #endif
00085
00086 switch (nQuality)
00087 {
00088 case WAVEFORM_BW:
00089 ST_LOGPRINTF("Request for BW waveform");
00090 quality = dmQBW;
00091 break;
00092 case WAVEFORM_TYPING:
00093 ST_LOGPRINTF("Request for Typing waveform");
00094 quality = dmQTyping;
00095 break;
00096 default:
00097 quality = dmQFull;
00098 }
00099
00100 if ((level == MAIN_WINDOW_EXPOSE_LEVEL) ||
00101 (level == SETUP_SCREEN_EXPOSE_LEVEL) ||
00102 (level == ONE_BUTTON_ITEM_CLICKED_LEVEL) || (level == SETUP_PAGE_LAYOUT_CHANGE) || (level == SETTING_ITEM_CHANGE))
00103 {
00104
00105 dmDisplay(dmCmdPriorUrgent, quality);
00106 }
00107 else if ((level == BUTTON_FOCUS_IN_LEVEL) || (level == SELECTION_FOCUS_IN_LEVEL) || (level == TEXT_ENTRY_FOCUS_IN_LEVEL))
00108 {
00109
00110 dmDisplay(dmCmdPriorNormal, quality);
00111
00112 }
00113 else if (level == TEXT_ENTRY_CHANGED_LEVEL)
00114 {
00115
00116 dmDisplay(dmCmdPriorUrgent, quality);
00117 }
00118 else if (level == SELECTION_CLICKED_LEVEL)
00119 {
00120
00121 dmDisplay(dmCmdPriorUrgent, quality);
00122 }
00123 else
00124 {
00125 dmDisplay(dmCmdPriorUrgent, quality);
00126 }
00127
00128
00129 g_currentLevel = LOWEST_LEVEL;
00130
00131
00132 return FALSE;
00133 }
00134
00135 #undef display_update_request_screen_refresh
00136 gboolean display_update_request_screen_refresh(int level, int waveform)
00137 {
00138 ST_LOGPRINTF("[%d] entry level %d currentlevel %d", counter++, level, g_currentLevel);
00139
00140 if (level >= g_currentLevel)
00141 {
00142 if (waveform != 0)
00143 {
00144 ST_LOGPRINTF("Special waveform request");
00145 level += waveform << 16;
00146 }
00147
00148 gtk_idle_add(display_update_during_idle_handling, (gpointer) level);
00149
00150 g_currentLevel = level + 1;
00151 }
00152 return TRUE;
00153 }
00154
00155 int display_update_get_level(void)
00156 {
00157 return g_currentLevel;
00158 }
00159
00160 #undef display_update_increase_level
00161 void display_update_increase_level(int level)
00162 {
00163 ST_LOGPRINTF("increase from %d to %d", g_currentLevel, level);
00164
00165 if (level > g_currentLevel)
00166 {
00167 g_currentLevel = level;
00168 }
00169 }
00170
00171 #undef display_update_decrease_level
00172 void display_update_decrease_level(int level)
00173 {
00174 ST_LOGPRINTF("new level %d - currentlevel %d", level, g_currentLevel);
00175
00176 if (level < g_currentLevel)
00177 {
00178 g_currentLevel = level;
00179 }
00180 }