"
+ /***** 1st. row *****/
+ /* 1st. row, 1st. column: logo */
+ fprintf (Gbl.F.Out,""
+ ""
+ ""
""
"",
+ ClassHeadRow1[Gbl.Prefs.Theme],
+ LogoLayout.Width + 20,
Cfg_HTTPS_URL_SWAD_CGI,Gbl.Prefs.PathTheme,
- LogoLayout[Gbl.Prefs.Layout].Icon,
+ LogoLayout.Icon,
Cfg_PLATFORM_SHORT_NAME,Cfg_PLATFORM_FULL_NAME,
- LogoLayout[Gbl.Prefs.Layout].Width,
- LogoLayout[Gbl.Prefs.Layout].Height);
+ LogoLayout.Width,
+ LogoLayout.Height);
fprintf (Gbl.F.Out," | ");
+
+ /* 1st. row, 2nd. column:
+ search, and logged user / language selection */
+ /* Search courses / teachers */
fprintf (Gbl.F.Out,""
""
- "");
- /***** 1st. row, 2nd. column:
- search, and logged user / language selection *****/
- if (Gbl.Prefs.Layout == Lay_LAYOUT_DESKTOP)
- {
- /* Search courses / teachers */
- fprintf (Gbl.F.Out,"",
- The_ClassHead[Gbl.Prefs.Theme]);
- Act_FormStart ( Gbl.CurrentCrs.Crs.CrsCod > 0 ? ActCrsSch :
- (Gbl.CurrentDeg.Deg.DegCod > 0 ? ActDegSch :
- (Gbl.CurrentCtr.Ctr.CtrCod > 0 ? ActCtrSch :
- (Gbl.CurrentIns.Ins.InsCod > 0 ? ActInsSch :
- (Gbl.CurrentCty.Cty.CtyCod > 0 ? ActCtySch :
- ActSysSch)))));
- Sco_PutParamScope (Sco_SCOPE_SYS);
- Sch_PutFormToSearch (Gbl.Prefs.PathTheme);
- Act_FormEnd ();
- fprintf (Gbl.F.Out," | ");
- }
+ " "
+ "",
+ The_ClassHead[Gbl.Prefs.Theme]);
+ Act_FormStart ( Gbl.CurrentCrs.Crs.CrsCod > 0 ? ActCrsSch :
+ (Gbl.CurrentDeg.Deg.DegCod > 0 ? ActDegSch :
+ (Gbl.CurrentCtr.Ctr.CtrCod > 0 ? ActCtrSch :
+ (Gbl.CurrentIns.Ins.InsCod > 0 ? ActInsSch :
+ (Gbl.CurrentCty.Cty.CtyCod > 0 ? ActCtySch :
+ ActSysSch)))));
+ Sco_PutParamScope (Sco_SCOPE_SYS);
+ Sch_PutFormToSearch (Gbl.Prefs.PathTheme);
+ Act_FormEnd ();
+ fprintf (Gbl.F.Out," | ");
/* Logged user or language selection */
fprintf (Gbl.F.Out,"",
@@ -775,6 +770,141 @@ static void Lay_WritePageTopHeading (void)
" | "
" | ");
+ /* 1st. row, 3rd. column: link to open/close session */
+ fprintf (Gbl.F.Out,"",
+ The_ClassHead[Gbl.Prefs.Theme]);
+ if (Gbl.Usrs.Me.Logged)
+ Usr_PutFormLogOut ();
+ else
+ Usr_PutFormLogIn ();
+ fprintf (Gbl.F.Out," | "
+ "
");
+
+ /***** 2nd. row *****/
+ /* 2nd. row, 1st. column
+ Clock with hour:minute (server hour is shown) */
+ fprintf (Gbl.F.Out,""
+ "");
+ Dat_ShowClientLocalTime ();
+ fprintf (Gbl.F.Out," | "); // End of first column
+
+ /* 2nd. row, 2nd. column: degree and course */
+ fprintf (Gbl.F.Out,""
+ " ");
+ Deg_WriteCtyInsCtrDeg ();
+ Crs_WriteSelectorMyCourses ();
+ Deg_WriteBigNameCtyInsCtrDegCrs ();
+ fprintf (Gbl.F.Out," "
+ " | ");
+
+ /* 2nd. row, 3rd. column */
+ fprintf (Gbl.F.Out,"");
+ if (Gbl.Usrs.Me.Logged)
+ {
+ /* Number of new messages (not seen) */
+ fprintf (Gbl.F.Out," ");
+ Ntf_WriteNumberOfNewNtfs ();
+ fprintf (Gbl.F.Out," "); // Used for AJAX based refresh
+ }
+ fprintf (Gbl.F.Out," | "
+ "
");
+
+ /***** 3rd. row *****/
+ fprintf (Gbl.F.Out,"");
+
+ /* 3rd. row, 1st. column */
+ if (Gbl.Prefs.SideCols & Lay_SHOW_LEFT_COLUMN) // Left column visible
+ fprintf (Gbl.F.Out,""
+ " | ");
+
+ /* 3rd. row, 2nd. column */
+ Tab_DrawTabs ();
+
+ /* 3rd. row, 3rd. column */
+ if (Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) // Right column visible
+ {
+ fprintf (Gbl.F.Out,"");
+ Lay_ShowRightColumn ();
+ fprintf (Gbl.F.Out," | ");
+ }
+
+ fprintf (Gbl.F.Out,"
");
+
+ /***** 4th. row *****/
+ fprintf (Gbl.F.Out,"");
+
+ /* 4th. row, 1st. column */
+ if (Gbl.Prefs.SideCols & Lay_SHOW_LEFT_COLUMN) // Left column visible
+ {
+ fprintf (Gbl.F.Out,"");
+ Lay_ShowLeftColumn ();
+ fprintf (Gbl.F.Out," | ");
+ }
+ }
+
+static void Lay_WritePageTopHeadingMobile (void)
+ {
+ extern const char *The_ClassHead[The_NUM_THEMES];
+ const struct
+ {
+ const char *Icon;
+ const unsigned Width;
+ const unsigned Height;
+ } LogoLayout =
+ {
+ // Lay_LAYOUT_MOBILE
+ "swad168x48.gif",
+ 210,
+ 60,
+ };
+ const char *ClassHeadRow1[The_NUM_THEMES] =
+ {
+ "WHITE_HEAD_ROW_1", // The_THEME_WHITE
+ "GREY_HEAD_ROW_1", // The_THEME_GREY
+ "BLUE_HEAD_ROW_1", // The_THEME_BLUE
+ "YELLOW_HEAD_ROW_1", // The_THEME_YELLOW
+ };
+
+ /***** 1st. row, 1st. column: logo *****/
+ fprintf (Gbl.F.Out,"
"
+ ""
+ ""
+ ""
+ ""
+ " | ",
+ ClassHeadRow1[Gbl.Prefs.Theme],
+ LogoLayout.Width + 20,
+ Cfg_HTTPS_URL_SWAD_CGI,Gbl.Prefs.PathTheme,
+ LogoLayout.Icon,
+ Cfg_PLATFORM_SHORT_NAME,Cfg_PLATFORM_FULL_NAME,
+ LogoLayout.Width,
+ LogoLayout.Height);
+
+ /***** 1st. row, 2nd. column:
+ logged user / language selection *****/
+ fprintf (Gbl.F.Out,""
+ ""
+ ""
+ "",
+ The_ClassHead[Gbl.Prefs.Theme]);
+ if (Gbl.Usrs.Me.Logged)
+ Usr_WriteLoggedUsrHead ();
+ else
+ Pre_PutSelectorToSelectLanguage ();
+ fprintf (Gbl.F.Out," | "
+ " "
+ " "
+ " | ");
+
/***** 1st. row, 3rd. column: link to open/close session *****/
fprintf (Gbl.F.Out,"",
The_ClassHead[Gbl.Prefs.Theme]);
@@ -786,95 +916,19 @@ static void Lay_WritePageTopHeading (void)
" |
");
/***** 2nd. row *****/
- fprintf (Gbl.F.Out,"");
-
- switch (Gbl.Prefs.Layout)
- {
- case Lay_LAYOUT_DESKTOP:
- /***** 2nd. row, 1st. column *****/
- /* Clock with hour:minute (server hour is shown) */
- fprintf (Gbl.F.Out,"");
- Dat_ShowClientLocalTime ();
- fprintf (Gbl.F.Out," | "); // End of first column
-
- /***** 2nd. row, 2nd. column: degree and course *****/
- fprintf (Gbl.F.Out,""
- " ");
- Deg_WriteCtyInsCtrDeg ();
- Crs_WriteSelectorMyCourses ();
- Deg_WriteBigNameCtyInsCtrDegCrs ();
- fprintf (Gbl.F.Out," "
- " | ");
-
- /***** 2nd. row, 3rd. column *****/
- fprintf (Gbl.F.Out,"");
- if (Gbl.Usrs.Me.Logged)
- {
- /* Number of new messages (not seen) */
- fprintf (Gbl.F.Out," ");
- Ntf_WriteNumberOfNewNtfs ();
- fprintf (Gbl.F.Out," "); // Used for AJAX based refresh
- }
- break;
- case Lay_LAYOUT_MOBILE:
- fprintf (Gbl.F.Out," | ");
- Deg_WriteCtyInsCtrDeg ();
- Crs_WriteSelectorMyCourses ();
- break;
- default:
- break;
- }
- fprintf (Gbl.F.Out," | ");
+ fprintf (Gbl.F.Out,"
"
+ "");
+ Deg_WriteCtyInsCtrDeg ();
+ Crs_WriteSelectorMyCourses ();
+ fprintf (Gbl.F.Out," | "
+ "
");
/***** 3rd. row *****/
+ fprintf (Gbl.F.Out,"");
+ Tab_DrawTabs ();
fprintf (Gbl.F.Out,"
"
- "");
-
- switch (Gbl.Prefs.Layout)
- {
- case Lay_LAYOUT_DESKTOP:
- /***** 3rd. row, 1st. column *****/
- if (Gbl.Prefs.SideCols & Lay_SHOW_LEFT_COLUMN) // Left column visible
- fprintf (Gbl.F.Out,""
- " | ");
-
- /***** 3rd. row, 2nd. column *****/
- Tab_DrawTabs ();
-
- /***** 3rd. row, 3rd. column *****/
- if (Gbl.Prefs.SideCols & Lay_SHOW_RIGHT_COLUMN) // Right column visible
- {
- fprintf (Gbl.F.Out,"");
- Lay_ShowRightColumn ();
- fprintf (Gbl.F.Out," | ");
- }
-
- fprintf (Gbl.F.Out,"
"
- "");
-
- /***** 4th. row, 1st. column *****/
- if (Gbl.Prefs.SideCols & Lay_SHOW_LEFT_COLUMN) // Left column visible
- {
- fprintf (Gbl.F.Out,"");
- Lay_ShowLeftColumn ();
- fprintf (Gbl.F.Out," | ");
- }
- break;
- case Lay_LAYOUT_MOBILE:
- Tab_DrawTabs ();
- fprintf (Gbl.F.Out,"
"
- "");
- break;
- default:
- break;
- }
+ "
");
}
/*****************************************************************************/
diff --git a/swad_user.c b/swad_user.c
index c16fc850c..b72a38d76 100644
--- a/swad_user.c
+++ b/swad_user.c
@@ -4148,8 +4148,10 @@ static void Usr_GetAdmsLst (Sco_Scope_t Scope)
char Query[1024];
/***** Build query *****/
- // Very important: use UNION instead OR in the following queries
- // (OR with different tables is very slow)
+ // Important: it is better to use:
+ // SELECT... WHERE UsrCod IN (SELECT...) OR UsrCod IN (SELECT...) <-- fast
+ // instead of using or with different joins:
+ // SELECT... WHERE (...) OR (...) <-- very slow
switch (Scope)
{
case Sco_SCOPE_SYS: // All admins
@@ -4811,7 +4813,7 @@ void Usr_AllocateListSelectedUsrCodStd (void)
{
if (!Gbl.Usrs.Select.Std)
{
- if ((Gbl.Usrs.Select.Std = (char *) malloc (Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS+1)) == NULL)
+ if ((Gbl.Usrs.Select.Std = (char *) malloc (Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store list of users.");
Gbl.Usrs.Select.Std[0] = '\0';
}
@@ -4825,7 +4827,7 @@ void Usr_AllocateListSelectedUsrCodTch (void)
{
if (!Gbl.Usrs.Select.Tch)
{
- if ((Gbl.Usrs.Select.Tch = (char *) malloc (Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS+1)) == NULL)
+ if ((Gbl.Usrs.Select.Tch = (char *) malloc (Usr_MAX_BYTES_LIST_ENCRYPTED_USR_CODS + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store list of users.");
Gbl.Usrs.Select.Tch[0] = '\0';
}
@@ -4862,7 +4864,7 @@ static void Usr_AllocateListOtherRecipients (void)
{
if (!Gbl.Usrs.ListOtherRecipients)
{
- if ((Gbl.Usrs.ListOtherRecipients = malloc (Nck_MAX_BYTES_LIST_NICKS+1)) == NULL)
+ if ((Gbl.Usrs.ListOtherRecipients = malloc (Nck_MAX_BYTES_LIST_NICKS + 1)) == NULL)
Lay_ShowErrorAndExit ("Not enough memory to store list of recipients.");
Gbl.Usrs.ListOtherRecipients[0] = '\0';
}